commit deaf7eb80628d7b9d8b94b4d0b2984ea7f203b75
Author: airlongdian
Date: Sat Jun 13 21:53:43 2026 +0800
feat(aircoding): AirCoding V2 baseline — deterministic multi-agent architecture
Forked from OpenCode v1.17.4 with multi-agent system:
- 5 agents: aircoding, scheduler, worker, architect, reviewer
- Deterministic DAG scheduling engine (coordinator_tick)
- Tool whitelists as hard enforcement
- AirCoding validation plugin
- V1 requirements: C4 docs, ADR, AGENTS.md, debug-log.md
- Design documents in docs/
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..b6d8d73
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,12 @@
+.git
+.opencode
+.sst
+.turbo
+.wrangler
+node_modules
+**/node_modules
+**/.output
+**/dist
+**/.turbo
+**/.vite
+**/coverage
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..aada95f
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+insert_final_newline = true
+end_of_line = lf
+indent_style = space
+indent_size = 2
+max_line_length = 80
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..18177b3
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+packages/core/migration/**/snapshot.json linguist-generated
+packages/core/src/database/migration.gen.ts linguist-generated
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..c6dfb0e
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,3 @@
+# web + desktop packages
+packages/app/ @Hona @Brendonovich
+packages/desktop/ @Hona @Brendonovich
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
new file mode 100644
index 0000000..da82bde
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -0,0 +1,66 @@
+name: Bug report
+description: Report an issue that should be fixed (avoid pasting giant AI generated summaries or your issue may be closed/ignored)
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the bug you encountered
+ placeholder: What happened?
+ validations:
+ required: true
+
+ - type: input
+ id: plugins
+ attributes:
+ label: Plugins
+ description: What plugins are you using?
+ validations:
+ required: false
+
+ - type: input
+ id: opencode-version
+ attributes:
+ label: OpenCode version
+ description: What version of OpenCode are you using?
+ validations:
+ required: false
+
+ - type: textarea
+ id: reproduce
+ attributes:
+ label: Steps to reproduce
+ description: How can we reproduce this issue?
+ placeholder: |
+ 1.
+ 2.
+ 3.
+ validations:
+ required: false
+
+ - type: textarea
+ id: screenshot-or-link
+ attributes:
+ label: Screenshot and/or share link
+ description: Run `/share` to get a share link, or attach a screenshot
+ placeholder: Paste link or drag and drop screenshot here
+ validations:
+ required: false
+
+ - type: input
+ id: os
+ attributes:
+ label: Operating System
+ description: what OS are you using?
+ placeholder: e.g., macOS 26.0.1, Ubuntu 22.04, Windows 11
+ validations:
+ required: false
+
+ - type: input
+ id: terminal
+ attributes:
+ label: Terminal
+ description: what terminal are you using?
+ placeholder: e.g., iTerm2, Ghostty, Alacritty, Windows Terminal
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..52eec90
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: 💬 Discord Community
+ url: https://discord.gg/opencode
+ about: For quick questions or real-time discussion. Note that issues are searchable and help others with the same question.
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
new file mode 100644
index 0000000..42f1d3c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -0,0 +1,19 @@
+name: 🚀 Feature Request
+description: Suggest an idea, feature, or enhancement
+title: "[FEATURE]:"
+
+body:
+ - type: checkboxes
+ id: verified
+ attributes:
+ label: Feature hasn't been suggested before.
+ options:
+ - label: I have verified this feature I'm about to request hasn't been suggested before.
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Describe the enhancement you want to request
+ description: What do you want to change or add? What are the benefits of implementing this? Try to be detailed so we can understand your request better :)
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml
new file mode 100644
index 0000000..8930ba6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.yml
@@ -0,0 +1,10 @@
+name: Question
+description: Ask a question
+body:
+ - type: textarea
+ id: question
+ attributes:
+ label: Question
+ description: What's your question?
+ validations:
+ required: true
diff --git a/.github/TEAM_MEMBERS b/.github/TEAM_MEMBERS
new file mode 100644
index 0000000..f892eb9
--- /dev/null
+++ b/.github/TEAM_MEMBERS
@@ -0,0 +1,17 @@
+adamdotdevin
+Brendonovich
+fwang
+Hona
+iamdavidhill
+jayair
+jlongster
+kitlangton
+kommander
+MrMushrooooom
+nexxeln
+R44VC0RP
+rekram1-node
+thdxr
+simonklee
+vimtor
+starptech
diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml
new file mode 100644
index 0000000..5b44517
--- /dev/null
+++ b/.github/actions/setup-bun/action.yml
@@ -0,0 +1,66 @@
+name: "Setup Bun"
+description: "Setup Bun with caching and install dependencies"
+inputs:
+ install-flags:
+ description: "Additional flags to pass to 'bun install'"
+ required: false
+ default: ""
+runs:
+ using: "composite"
+ steps:
+ - name: Get baseline download URL
+ id: bun-url
+ shell: bash
+ run: |
+ if [ "$RUNNER_ARCH" = "X64" ]; then
+ V=$(node -p "require('./package.json').packageManager.split('@')[1]")
+ case "$RUNNER_OS" in
+ macOS) OS=darwin ;;
+ Linux) OS=linux ;;
+ Windows) OS=windows ;;
+ esac
+ echo "url=https://github.com/oven-sh/bun/releases/download/bun-v${V}/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
+ with:
+ bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }}
+ bun-download-url: ${{ steps.bun-url.outputs.url }}
+
+ - name: Get cache directory
+ id: cache
+ shell: bash
+ run: echo "dir=$(bun pm cache)" >> "$GITHUB_OUTPUT"
+
+ - name: Restore Bun dependencies
+ id: bun-cache
+ uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
+ with:
+ path: ${{ steps.cache.outputs.dir }}
+ key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-bun-
+
+ - name: Install setuptools for distutils compatibility
+ run: python3 -m pip install setuptools || pip install setuptools || true
+ shell: bash
+
+ - name: Install dependencies
+ run: |
+ # Workaround for patched peer variants
+ # e.g. ./patches/ for standard-openapi
+ # https://github.com/oven-sh/bun/issues/28147
+ if [ "$RUNNER_OS" = "Windows" ]; then
+ bun install --linker hoisted ${{ inputs.install-flags }}
+ else
+ bun install ${{ inputs.install-flags }}
+ fi
+ shell: bash
+
+ - name: Save Bun dependencies
+ if: steps.bun-cache.outputs.cache-hit != 'true' && github.event_name != 'pull_request' && github.event_name != 'pull_request_target'
+ uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
+ with:
+ path: ${{ steps.cache.outputs.dir }}
+ key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
diff --git a/.github/actions/setup-git-committer/action.yml b/.github/actions/setup-git-committer/action.yml
new file mode 100644
index 0000000..65c974c
--- /dev/null
+++ b/.github/actions/setup-git-committer/action.yml
@@ -0,0 +1,43 @@
+name: "Setup Git Committer"
+description: "Create app token and configure git user"
+inputs:
+ opencode-app-id:
+ description: "OpenCode GitHub App ID"
+ required: true
+ opencode-app-secret:
+ description: "OpenCode GitHub App private key"
+ required: true
+outputs:
+ token:
+ description: "GitHub App token"
+ value: ${{ steps.apptoken.outputs.token }}
+ app-slug:
+ description: "GitHub App slug"
+ value: ${{ steps.apptoken.outputs.app-slug }}
+runs:
+ using: "composite"
+ steps:
+ - name: Create app token
+ id: apptoken
+ uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2.2.2
+ with:
+ app-id: ${{ inputs.opencode-app-id }}
+ private-key: ${{ inputs.opencode-app-secret }}
+ owner: ${{ github.repository_owner }}
+
+ - name: Configure git user
+ run: |
+ slug="${{ steps.apptoken.outputs.app-slug }}"
+ git config --global user.name "${slug}[bot]"
+ git config --global user.email "${slug}[bot]@users.noreply.github.com"
+ shell: bash
+
+ - name: Clear checkout auth
+ run: |
+ git config --local --unset-all http.https://github.com/.extraheader || true
+ shell: bash
+
+ - name: Configure git remote
+ run: |
+ git remote set-url origin https://x-access-token:${{ steps.apptoken.outputs.token }}@github.com/${{ github.repository }}
+ shell: bash
diff --git a/.github/publish-python-sdk.yml b/.github/publish-python-sdk.yml
new file mode 100644
index 0000000..151ecb9
--- /dev/null
+++ b/.github/publish-python-sdk.yml
@@ -0,0 +1,71 @@
+#
+# This file is intentionally in the wrong dir, will move and add later....
+#
+
+# name: publish-python-sdk
+
+# on:
+# release:
+# types: [published]
+# workflow_dispatch:
+
+# jobs:
+# publish:
+# runs-on: ubuntu-latest
+# permissions:
+# contents: read
+# steps:
+# - name: Checkout repository
+# uses: actions/checkout@v4
+
+# - name: Setup Bun
+# uses: oven-sh/setup-bun@v1
+# with:
+# bun-version: 1.2.21
+
+# - name: Install dependencies (JS/Bun)
+# run: bun install
+
+# - name: Install uv
+# shell: bash
+# run: curl -LsSf https://astral.sh/uv/install.sh | sh
+
+# - name: Generate Python SDK from OpenAPI (CLI)
+# shell: bash
+# run: |
+# ~/.local/bin/uv run --project packages/sdk/python python packages/sdk/python/scripts/generate.py --source cli
+
+# - name: Sync Python dependencies
+# shell: bash
+# run: |
+# ~/.local/bin/uv sync --dev --project packages/sdk/python
+
+# - name: Set version from release tag
+# shell: bash
+# run: |
+# TAG="${GITHUB_REF_NAME:-}"
+# if [ -z "$TAG" ]; then
+# TAG="$(git describe --tags --abbrev=0 || echo 0.0.0)"
+# fi
+# echo "Using version: $TAG"
+# VERSION="$TAG" ~/.local/bin/uv run --project packages/sdk/python python - <<'PY'
+# import os, re, pathlib
+# root = pathlib.Path('packages/sdk/python')
+# pt = (root / 'pyproject.toml').read_text()
+# version = os.environ.get('VERSION','0.0.0').lstrip('v')
+# pt = re.sub(r'(?m)^(version\s*=\s*")[^"]+("\s*)$', f"\\1{version}\\2", pt)
+# (root / 'pyproject.toml').write_text(pt)
+# # Also update generator config override for consistency
+# cfgp = root / 'openapi-python-client.yaml'
+# if cfgp.exists():
+# cfg = cfgp.read_text()
+# cfg = re.sub(r'(?m)^(package_version_override:\s*)\S+$', f"\\1{version}", cfg)
+# cfgp.write_text(cfg)
+# PY
+
+# - name: Build and publish to PyPI
+# env:
+# PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
+# shell: bash
+# run: |
+# ~/.local/bin/uv run --project packages/sdk/python python packages/sdk/python/scripts/publish.py
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..393bf90
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,29 @@
+### Issue for this PR
+
+Closes #
+
+### Type of change
+
+- [ ] Bug fix
+- [ ] New feature
+- [ ] Refactor / code improvement
+- [ ] Documentation
+
+### What does this PR do?
+
+Please provide a description of the issue, the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the PR.
+
+**If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED!**
+
+### How did you verify your code works?
+
+### Screenshots / recordings
+
+_If this is a UI change, please include a screenshot or recording._
+
+### Checklist
+
+- [ ] I have tested my changes locally
+- [ ] I have not included unrelated changes in this PR
+
+_If you do not follow this template your PR will be automatically rejected._
diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml
new file mode 100644
index 0000000..e93d5fb
--- /dev/null
+++ b/.github/workflows/beta.yml
@@ -0,0 +1,37 @@
+name: beta
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: "0 * * * *"
+
+jobs:
+ sync:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: write
+ pull-requests: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 0
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Setup Git Committer
+ id: setup-git-committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Install OpenCode
+ run: bun i -g opencode-ai
+
+ - name: Sync beta branch
+ env:
+ GH_TOKEN: ${{ steps.setup-git-committer.outputs.token }}
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ run: bun script/beta.ts
diff --git a/.github/workflows/close-issues.yml b/.github/workflows/close-issues.yml
new file mode 100644
index 0000000..b8a2e3f
--- /dev/null
+++ b/.github/workflows/close-issues.yml
@@ -0,0 +1,24 @@
+name: close-issues
+
+on:
+ schedule:
+ - cron: "0 2 * * *" # Daily at 2:00 AM
+ workflow_dispatch:
+
+jobs:
+ close:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ issues: write
+ steps:
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
+ with:
+ bun-version: latest
+
+ - name: Close stale issues
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ run: bun script/github/close-issues.ts
diff --git a/.github/workflows/close-prs.yml b/.github/workflows/close-prs.yml
new file mode 100644
index 0000000..a1e603a
--- /dev/null
+++ b/.github/workflows/close-prs.yml
@@ -0,0 +1,50 @@
+name: close-prs
+
+on:
+ schedule:
+ - cron: "0 22 * * *" # Daily at 10:00 PM UTC
+ workflow_dispatch:
+ inputs:
+ dry-run:
+ description: "Log matching PRs without closing them"
+ type: boolean
+ default: true
+ max-close:
+ description: "Maximum matching PRs to close"
+ type: string
+ required: false
+ default: "50"
+
+jobs:
+ close:
+ runs-on: ubuntu-latest
+ timeout-minutes: 240
+ permissions:
+ contents: read
+ issues: write
+ pull-requests: write
+ steps:
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
+ with:
+ bun-version: latest
+
+ - name: Close old PRs without enough positive reactions
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ run: |
+ max_close="${{ inputs['max-close'] }}"
+ if [ -z "$max_close" ]; then
+ max_close="50"
+ fi
+
+ args=("--threshold" "2" "--age-months" "1" "--sleep-ms" "20000" "--max-close" "$max_close")
+
+ if [ "${{ github.event_name }}" = "schedule" ]; then
+ args+=("--execute")
+ elif [ "${{ inputs['dry-run'] }}" = "false" ]; then
+ args+=("--execute")
+ fi
+
+ bun script/github/close-prs.ts "${args[@]}"
diff --git a/.github/workflows/compliance-close.yml b/.github/workflows/compliance-close.yml
new file mode 100644
index 0000000..14e6870
--- /dev/null
+++ b/.github/workflows/compliance-close.yml
@@ -0,0 +1,95 @@
+name: compliance-close
+
+on:
+ schedule:
+ # Run every 30 minutes to check for expired compliance windows
+ - cron: "*/30 * * * *"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ issues: write
+ pull-requests: write
+
+jobs:
+ close-non-compliant:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Close non-compliant issues and PRs after 2 hours
+ uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
+ with:
+ script: |
+ const { data: items } = await github.rest.issues.listForRepo({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ labels: 'needs:compliance',
+ state: 'open',
+ per_page: 100,
+ });
+
+ if (items.length === 0) {
+ core.info('No open issues/PRs with needs:compliance label');
+ return;
+ }
+
+ const now = Date.now();
+ const twoHours = 2 * 60 * 60 * 1000;
+
+ for (const item of items) {
+ const isPR = !!item.pull_request;
+ const kind = isPR ? 'PR' : 'issue';
+
+ const { data: comments } = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: item.number,
+ });
+
+ const complianceComment = comments.find(c => c.body.includes(''));
+ if (!complianceComment) continue;
+
+ const commentAge = now - new Date(complianceComment.created_at).getTime();
+ if (commentAge < twoHours) {
+ core.info(`${kind} #${item.number} still within 2-hour window (${Math.round(commentAge / 60000)}m elapsed)`);
+ continue;
+ }
+
+ const closeMessage = isPR
+ ? 'This pull request has been automatically closed because it was not updated to meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) within the 2-hour window.\n\nFeel free to open a new pull request that follows our guidelines.'
+ : 'This issue has been automatically closed because it was not updated to meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) within the 2-hour window.\n\nFeel free to open a new issue that follows our issue templates.';
+
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: item.number,
+ body: closeMessage,
+ });
+
+ try {
+ await github.rest.issues.removeLabel({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: item.number,
+ name: 'needs:compliance',
+ });
+ } catch (e) {}
+
+ if (isPR) {
+ await github.rest.pulls.update({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ pull_number: item.number,
+ state: 'closed',
+ });
+ } else {
+ await github.rest.issues.update({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: item.number,
+ state: 'closed',
+ state_reason: 'not_planned',
+ });
+ }
+
+ core.info(`Closed non-compliant ${kind} #${item.number} after 2-hour window`);
+ }
diff --git a/.github/workflows/containers.yml b/.github/workflows/containers.yml
new file mode 100644
index 0000000..15bf078
--- /dev/null
+++ b/.github/workflows/containers.yml
@@ -0,0 +1,45 @@
+name: containers
+
+on:
+ push:
+ branches:
+ - dev
+ paths:
+ - packages/containers/**
+ - .github/workflows/containers.yml
+ - package.json
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ packages: write
+
+jobs:
+ build:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ env:
+ REGISTRY: ghcr.io/${{ github.repository_owner }}
+ TAG: "24.04"
+ steps:
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
+
+ - name: Login to GHCR
+ uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push containers
+ run: bun ./packages/containers/script/build.ts --push
+ env:
+ REGISTRY: ${{ env.REGISTRY }}
+ TAG: ${{ env.TAG }}
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..18e6cf7
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,48 @@
+name: deploy
+
+on:
+ push:
+ branches:
+ - dev
+ - production
+ workflow_dispatch:
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: read
+ id-token: write
+
+jobs:
+ deploy:
+ if: github.repository == 'anomalyco/opencode' && (github.ref_name == 'dev' || github.ref_name == 'production')
+ runs-on: ubuntu-latest
+ environment: ${{ github.ref_name }}
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+
+ - uses: ./.github/actions/setup-bun
+
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+ with:
+ node-version: "24"
+
+ - uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4.3.1
+ with:
+ role-to-assume: ${{ vars.AWS_DEPLOY_ROLE_ARN }}
+ role-session-name: opencode-${{ github.run_id }}
+ aws-region: us-east-1
+
+ - run: bun sst deploy --stage=${{ github.ref_name }}
+ env:
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ PLANETSCALE_SERVICE_TOKEN_NAME: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_NAME }}
+ PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
+ STRIPE_SECRET_KEY: ${{ github.ref_name == 'production' && secrets.STRIPE_SECRET_KEY_PROD || secrets.STRIPE_SECRET_KEY_DEV }}
+ HONEYCOMB_API_KEY: ${{ secrets.HONEYCOMB_API_KEY }}
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
+ SENTRY_ORG: ${{ vars.SENTRY_ORG }}
+ SENTRY_PROJECT: ${{ vars.WEB_SENTRY_PROJECT }}
+ SENTRY_RELEASE: web@${{ github.sha }}
+ VITE_SENTRY_DSN: ${{ vars.WEB_SENTRY_DSN }}
+ VITE_SENTRY_RELEASE: web@${{ github.sha }}
diff --git a/.github/workflows/docs-locale-sync.yml b/.github/workflows/docs-locale-sync.yml
new file mode 100644
index 0000000..5f921e8
--- /dev/null
+++ b/.github/workflows/docs-locale-sync.yml
@@ -0,0 +1,100 @@
+name: docs-locale-sync
+
+on:
+ push:
+ branches:
+ - dev
+ paths:
+ - packages/web/src/content/docs/*.mdx
+
+jobs:
+ sync-locales:
+ if: false
+ #if: github.actor != 'opencode-agent[bot]'
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ persist-credentials: false
+ fetch-depth: 0
+ ref: ${{ github.ref_name }}
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Compute changed English docs
+ id: changes
+ run: |
+ FILES=$(git diff --name-only "${{ github.event.before }}" "${{ github.sha }}" -- ':(glob)packages/web/src/content/docs/*.mdx' || true)
+ if [ -z "$FILES" ]; then
+ echo "has_changes=false" >> "$GITHUB_OUTPUT"
+ echo "No English docs changed in push range"
+ exit 0
+ fi
+ echo "has_changes=true" >> "$GITHUB_OUTPUT"
+ {
+ echo "files<> "$GITHUB_OUTPUT"
+
+ - name: Install OpenCode
+ if: steps.changes.outputs.has_changes == 'true'
+ run: curl -fsSL https://opencode.ai/install | bash
+
+ - name: Sync locale docs with OpenCode
+ if: steps.changes.outputs.has_changes == 'true'
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ OPENCODE_CONFIG_CONTENT: |
+ {
+ "permission": {
+ "*": "deny",
+ "read": "allow",
+ "edit": "allow",
+ "glob": "allow",
+ "task": "allow"
+ }
+ }
+ run: |
+ opencode run --agent docs --model opencode/gpt-5.3-codex <<'EOF'
+ Update localized docs to match the latest English docs changes.
+
+ Changed English doc files:
+
+ ${{ steps.changes.outputs.files }}
+
+
+ Requirements:
+ 1. Update all relevant locale docs under packages/web/src/content/docs// so they reflect these English page changes.
+ 2. You MUST use the Task tool for translation work and launch subagents with subagent_type `translator` (defined in .opencode/agent/translator.md).
+ 3. Do not translate directly in the primary agent. Use translator subagent output as the source for locale text updates.
+ 4. Run translator subagent Task calls in parallel whenever file/locale translation work is independent.
+ 5. Use only the minimum tools needed for this task (read/glob, file edits, and translator Task). Do not use shell, web, search, or GitHub tools for translation work.
+ 6. Preserve frontmatter keys, internal links, code blocks, and existing locale-specific metadata unless the English change requires an update.
+ 7. Keep locale docs structure aligned with their corresponding English pages.
+ 8. Do not modify English source docs in packages/web/src/content/docs/*.mdx.
+ 9. If no locale updates are needed, make no changes.
+ EOF
+
+ - name: Commit and push locale docs updates
+ if: steps.changes.outputs.has_changes == 'true'
+ run: |
+ if [ -z "$(git status --porcelain)" ]; then
+ echo "No locale docs changes to commit"
+ exit 0
+ fi
+ git add -A
+ git commit -m "docs(i18n): sync locale docs from english changes"
+ git pull --rebase --autostash origin "$GITHUB_REF_NAME"
+ git push origin HEAD:"$GITHUB_REF_NAME"
diff --git a/.github/workflows/docs-update.yml b/.github/workflows/docs-update.yml
new file mode 100644
index 0000000..4767dec
--- /dev/null
+++ b/.github/workflows/docs-update.yml
@@ -0,0 +1,72 @@
+name: docs-update
+
+on:
+ schedule:
+ - cron: "0 */12 * * *"
+ workflow_dispatch:
+
+env:
+ LOOKBACK_HOURS: 4
+
+jobs:
+ update-docs:
+ if: github.repository == 'sst/opencode'
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ id-token: write
+ contents: write
+ pull-requests: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 0 # Fetch full history to access commits
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Get recent commits
+ id: commits
+ run: |
+ COMMITS=$(git log --since="${{ env.LOOKBACK_HOURS }} hours ago" --pretty=format:"- %h %s" 2>/dev/null || echo "")
+ if [ -z "$COMMITS" ]; then
+ echo "No commits in the last ${{ env.LOOKBACK_HOURS }} hours"
+ echo "has_commits=false" >> $GITHUB_OUTPUT
+ else
+ echo "has_commits=true" >> $GITHUB_OUTPUT
+ {
+ echo "list<> $GITHUB_OUTPUT
+ fi
+
+ - name: Run opencode
+ if: steps.commits.outputs.has_commits == 'true'
+ uses: sst/opencode/github@2c14fc5586fe0b88e5c04732d2e846769cc35671 # latest
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ with:
+ model: opencode/gpt-5.2
+ agent: docs
+ prompt: |
+ Review the following commits from the last ${{ env.LOOKBACK_HOURS }} hours and identify any new features that may need documentation.
+
+
+ ${{ steps.commits.outputs.list }}
+
+
+ Steps:
+ 1. For each commit that looks like a new feature or significant change:
+ - Read the changed files to understand what was added
+ - Check if the feature is already documented in packages/web/src/content/docs/*
+ 2. If you find undocumented features:
+ - Update the relevant documentation files in packages/web/src/content/docs/*
+ - Follow the existing documentation style and structure
+ - Make sure to document the feature clearly with examples where appropriate
+ 3. If all new features are already documented, report that no updates are needed
+ 4. If you are creating a new documentation file be sure to update packages/web/astro.config.mjs too.
+
+ Focus on user-facing features and API changes. Skip internal refactors, bug fixes, and test updates unless they affect user-facing behavior.
+ Don't feel the need to document every little thing. It is perfectly okay to make 0 changes at all.
+ Try to keep documentation only for large features or changes that already have a good spot to be documented.
diff --git a/.github/workflows/duplicate-issues.yml b/.github/workflows/duplicate-issues.yml
new file mode 100644
index 0000000..4648a2d
--- /dev/null
+++ b/.github/workflows/duplicate-issues.yml
@@ -0,0 +1,177 @@
+name: duplicate-issues
+
+on:
+ issues:
+ types: [opened, edited]
+
+jobs:
+ check-duplicates:
+ if: github.event.action == 'opened'
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: read
+ issues: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 1
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Install opencode
+ run: curl -fsSL https://opencode.ai/install | bash
+
+ - name: Check duplicates and compliance
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ OPENCODE_PERMISSION: |
+ {
+ "bash": {
+ "*": "deny",
+ "gh issue*": "allow"
+ },
+ "webfetch": "deny"
+ }
+ run: |
+ opencode run -m opencode/claude-sonnet-4-6 "A new issue has been created:
+
+ Issue number: ${{ github.event.issue.number }}
+
+ Lookup this issue with gh issue view ${{ github.event.issue.number }}.
+
+ You have TWO tasks. Perform both, then post a SINGLE comment (if needed).
+
+ ---
+
+ TASK 1: CONTRIBUTING GUIDELINES COMPLIANCE CHECK
+
+ Check whether the issue follows our contributing guidelines and issue templates.
+
+ This project has three issue templates that every issue MUST use one of:
+
+ 1. Bug Report - requires a Description field with real content
+ 2. Feature Request - requires a verification checkbox and description, title should start with [FEATURE]:
+ 3. Question - requires the Question field with real content
+
+ Additionally check:
+ - No AI-generated walls of text (long, AI-generated descriptions are not acceptable)
+ - The issue has real content, not just template placeholder text left unchanged
+ - Bug reports should include some context about how to reproduce
+ - Feature requests should explain the problem or need
+ - We want to push for having the user provide system description & information
+
+ Do NOT be nitpicky about optional fields. Only flag real problems like: no template used, required fields empty or placeholder text only, obviously AI-generated walls of text, or completely empty/nonsensical content.
+
+ ---
+
+ TASK 2: DUPLICATE CHECK
+
+ Search through existing issues (excluding #${{ github.event.issue.number }}) to find potential duplicates.
+ Consider:
+ 1. Similar titles or descriptions
+ 2. Same error messages or symptoms
+ 3. Related functionality or components
+ 4. Similar feature requests
+
+ Additionally, if the issue mentions keybinds, keyboard shortcuts, or key bindings, note the pinned keybinds issue #4997.
+
+ ---
+
+ POSTING YOUR COMMENT:
+
+ Based on your findings, post a SINGLE comment on issue #${{ github.event.issue.number }}. Build the comment as follows:
+
+ If the issue is NOT compliant, start the comment with:
+
+ Then explain what needs to be fixed and that they have 2 hours to edit the issue before it is automatically closed. Also add the label needs:compliance to the issue using: gh issue edit ${{ github.event.issue.number }} --add-label needs:compliance
+
+ If duplicates were found, include a section about potential duplicates with links.
+
+ If the issue mentions keybinds/keyboard shortcuts, include a note about #4997.
+
+ If the issue IS compliant AND no duplicates were found AND no keybind reference, do NOT comment at all.
+
+ Use this format for the comment:
+
+ [If not compliant:]
+
+ This issue doesn't fully meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md).
+
+ **What needs to be fixed:**
+ - [specific reasons]
+
+ Please edit this issue to address the above within **2 hours**, or it will be automatically closed.
+
+ [If duplicates found, add:]
+ ---
+ This issue might be a duplicate of existing issues. Please check:
+ - #[issue_number]: [brief description of similarity]
+
+ [If keybind-related, add:]
+ For keybind-related issues, please also check our pinned keybinds documentation: #4997
+
+ [End with if not compliant:]
+ If you believe this was flagged incorrectly, please let a maintainer know.
+
+ Remember: post at most ONE comment combining all findings. If everything is fine, post nothing."
+
+ recheck-compliance:
+ if: github.event.action == 'edited' && contains(github.event.issue.labels.*.name, 'needs:compliance')
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: read
+ issues: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 1
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Install opencode
+ run: curl -fsSL https://opencode.ai/install | bash
+
+ - name: Recheck compliance
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ OPENCODE_PERMISSION: |
+ {
+ "bash": {
+ "*": "deny",
+ "gh issue*": "allow"
+ },
+ "webfetch": "deny"
+ }
+ run: |
+ opencode run -m opencode/claude-sonnet-4-6 "Issue #${{ github.event.issue.number }} was previously flagged as non-compliant and has been edited.
+
+ Lookup this issue with gh issue view ${{ github.event.issue.number }}.
+
+ Re-check whether the issue now follows our contributing guidelines and issue templates.
+
+ This project has three issue templates that every issue MUST use one of:
+
+ 1. Bug Report - requires a Description field with real content
+ 2. Feature Request - requires a verification checkbox and description, title should start with [FEATURE]:
+ 3. Question - requires the Question field with real content
+
+ Additionally check:
+ - No AI-generated walls of text (long, AI-generated descriptions are not acceptable)
+ - The issue has real content, not just template placeholder text left unchanged
+ - Bug reports should include some context about how to reproduce
+ - Feature requests should explain the problem or need
+ - We want to push for having the user provide system description & information
+
+ Do NOT be nitpicky about optional fields. Only flag real problems like: no template used, required fields empty or placeholder text only, obviously AI-generated walls of text, or completely empty/nonsensical content.
+
+ If the issue is NOW compliant:
+ 1. Remove the needs:compliance label: gh issue edit ${{ github.event.issue.number }} --remove-label needs:compliance
+ 2. Find and delete the previous compliance comment (the one containing ) using: gh api repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments --jq '.[] | select(.body | contains(\"\")) | .id' then delete it with: gh api -X DELETE repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments/{id}
+ 3. Post a short comment thanking them for updating the issue.
+
+ If the issue is STILL not compliant:
+ Post a comment explaining what still needs to be fixed. Keep the needs:compliance label."
diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml
new file mode 100644
index 0000000..324cfec
--- /dev/null
+++ b/.github/workflows/generate.yml
@@ -0,0 +1,51 @@
+name: generate
+
+on:
+ push:
+ branches:
+ - dev
+
+jobs:
+ generate:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: write
+ pull-requests: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Generate
+ run: ./script/generate.ts
+
+ - name: Commit and push
+ run: |
+ if [ -z "$(git status --porcelain)" ]; then
+ echo "No changes to commit"
+ exit 0
+ fi
+ git add -A
+ git commit -m "chore: generate" --allow-empty
+ git push origin HEAD:${{ github.ref_name }} --no-verify
+ # if ! git push origin HEAD:${{ github.event.pull_request.head.ref || github.ref_name }} --no-verify; then
+ # echo ""
+ # echo "============================================"
+ # echo "Failed to push generated code."
+ # echo "Please run locally and push:"
+ # echo ""
+ # echo " ./script/generate.ts"
+ # echo " git add -A && git commit -m \"chore: generate\" && git push"
+ # echo ""
+ # echo "============================================"
+ # exit 1
+ # fi
diff --git a/.github/workflows/nix-eval.yml b/.github/workflows/nix-eval.yml
new file mode 100644
index 0000000..7533269
--- /dev/null
+++ b/.github/workflows/nix-eval.yml
@@ -0,0 +1,95 @@
+name: nix-eval
+
+on:
+ push:
+ branches: [dev]
+ pull_request:
+ branches: [dev]
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ nix-eval:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ timeout-minutes: 15
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Setup Nix
+ uses: nixbuild/nix-quick-install-action@2c9db80fb984ceb1bcaa77cdda3fdf8cfba92035 # v34
+
+ - name: Evaluate flake outputs (all systems)
+ run: |
+ set -euo pipefail
+ nix --version
+
+ echo "=== Flake metadata ==="
+ nix flake metadata
+
+ echo ""
+ echo "=== Flake structure ==="
+ nix flake show --all-systems
+
+ SYSTEMS="x86_64-linux aarch64-linux x86_64-darwin aarch64-darwin"
+ PACKAGES="opencode"
+ # TODO: move 'desktop' to PACKAGES when #11755 is fixed
+ OPTIONAL_PACKAGES="desktop"
+
+ echo ""
+ echo "=== Evaluating packages for all systems ==="
+ for system in $SYSTEMS; do
+ echo ""
+ echo "--- $system ---"
+ for pkg in $PACKAGES; do
+ printf " %s: " "$pkg"
+ if output=$(nix eval ".#packages.$system.$pkg.drvPath" --raw 2>&1); then
+ echo "✓"
+ else
+ echo "✗"
+ echo "::error::Evaluation failed for packages.$system.$pkg"
+ echo "$output"
+ exit 1
+ fi
+ done
+ done
+
+ echo ""
+ echo "=== Evaluating optional packages ==="
+ for system in $SYSTEMS; do
+ echo ""
+ echo "--- $system ---"
+ for pkg in $OPTIONAL_PACKAGES; do
+ printf " %s: " "$pkg"
+ if output=$(nix eval ".#packages.$system.$pkg.drvPath" --raw 2>&1); then
+ echo "✓"
+ else
+ echo "✗"
+ echo "::warning::Evaluation failed for packages.$system.$pkg"
+ echo "$output"
+ fi
+ done
+ done
+
+ echo ""
+ echo "=== Evaluating devShells for all systems ==="
+ for system in $SYSTEMS; do
+ printf "%s: " "$system"
+ if output=$(nix eval ".#devShells.$system.default.drvPath" --raw 2>&1); then
+ echo "✓"
+ else
+ echo "✗"
+ echo "::error::Evaluation failed for devShells.$system.default"
+ echo "$output"
+ exit 1
+ fi
+ done
+
+ echo ""
+ echo "=== All evaluations passed ==="
diff --git a/.github/workflows/nix-hashes.yml b/.github/workflows/nix-hashes.yml
new file mode 100644
index 0000000..ce1d923
--- /dev/null
+++ b/.github/workflows/nix-hashes.yml
@@ -0,0 +1,162 @@
+name: nix-hashes
+
+permissions:
+ contents: write
+
+on:
+ workflow_dispatch:
+ push:
+ branches: [dev, beta]
+ paths:
+ - "bun.lock"
+ - "package.json"
+ - "packages/*/package.json"
+ - "flake.lock"
+ - "nix/node_modules.nix"
+ - "nix/scripts/**"
+ - "patches/**"
+ - ".github/workflows/nix-hashes.yml"
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ # Native runners required: bun install cross-compilation flags (--os/--cpu)
+ # do not produce byte-identical node_modules as native installs.
+ compute-hash:
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - system: x86_64-linux
+ runner: blacksmith-4vcpu-ubuntu-2404
+ - system: aarch64-linux
+ runner: blacksmith-4vcpu-ubuntu-2404-arm
+ - system: x86_64-darwin
+ runner: macos-15-intel
+ - system: aarch64-darwin
+ runner: macos-latest
+ runs-on: ${{ matrix.runner }}
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+
+ - name: Setup Nix
+ uses: nixbuild/nix-quick-install-action@2c9db80fb984ceb1bcaa77cdda3fdf8cfba92035 # v34
+
+ - name: Compute node_modules hash
+ id: hash
+ env:
+ SYSTEM: ${{ matrix.system }}
+ run: |
+ set -euo pipefail
+
+ BUILD_LOG=$(mktemp)
+ trap 'rm -f "$BUILD_LOG"' EXIT
+
+ HASH=""
+ MAX_ATTEMPTS=3
+ for ((ATTEMPT = 1; ATTEMPT <= MAX_ATTEMPTS; ATTEMPT++)); do
+ # Build with fakeHash to trigger hash mismatch and reveal correct hash
+ nix build ".#packages.${SYSTEM}.node_modules_updater" --no-link 2>&1 | tee "$BUILD_LOG" || true
+
+ HASH="$(nix run --inputs-from . nixpkgs#gnugrep -- -oP 'got:\s*\Ksha256-[A-Za-z0-9+/=]+' "$BUILD_LOG" | tail -n1 || true)"
+
+ [ -n "$HASH" ] && break
+
+ if [ "$ATTEMPT" -lt "$MAX_ATTEMPTS" ]; then
+ echo "::warning::Attempt ${ATTEMPT}/${MAX_ATTEMPTS} produced no hash for ${SYSTEM}; retrying in $((ATTEMPT * 10))s"
+ sleep $((ATTEMPT * 10))
+ fi
+ done
+
+ if [ -z "$HASH" ]; then
+ echo "::error::Failed to compute hash for ${SYSTEM} after ${MAX_ATTEMPTS} attempts"
+ cat "$BUILD_LOG"
+ exit 1
+ fi
+
+ echo "$HASH" > hash.txt
+ echo "Computed hash for ${SYSTEM}: $HASH"
+
+ - name: Upload hash
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: hash-${{ matrix.system }}
+ path: hash.txt
+ retention-days: 1
+
+ update-hashes:
+ needs: compute-hash
+ if: github.event_name != 'pull_request'
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ persist-credentials: false
+ fetch-depth: 0
+ ref: ${{ github.ref_name }}
+
+ - name: Setup git committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Pull latest changes
+ run: |
+ git pull --rebase --autostash origin "$GITHUB_REF_NAME"
+
+ - name: Download hash artifacts
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ path: hashes
+ pattern: hash-*
+
+ - name: Update hashes.json
+ run: |
+ set -euo pipefail
+
+ HASH_FILE="nix/hashes.json"
+
+ [ -f "$HASH_FILE" ] || echo '{"nodeModules":{}}' > "$HASH_FILE"
+
+ for SYSTEM in x86_64-linux aarch64-linux x86_64-darwin aarch64-darwin; do
+ FILE="hashes/hash-${SYSTEM}/hash.txt"
+ if [ -f "$FILE" ]; then
+ HASH="$(tr -d '[:space:]' < "$FILE")"
+ echo "${SYSTEM}: ${HASH}"
+ jq --arg sys "$SYSTEM" --arg h "$HASH" '.nodeModules[$sys] = $h' "$HASH_FILE" > tmp.json
+ mv tmp.json "$HASH_FILE"
+ else
+ echo "::warning::Missing hash for ${SYSTEM}"
+ fi
+ done
+
+ cat "$HASH_FILE"
+
+ - name: Commit changes
+ run: |
+ set -euo pipefail
+
+ HASH_FILE="nix/hashes.json"
+
+ if [ -z "$(git status --short -- "$HASH_FILE")" ]; then
+ echo "No changes to commit"
+ echo "### Nix hashes" >> "$GITHUB_STEP_SUMMARY"
+ echo "Status: no changes" >> "$GITHUB_STEP_SUMMARY"
+ exit 0
+ fi
+
+ git add "$HASH_FILE"
+ git commit -m "chore: update nix node_modules hashes"
+
+ git pull --rebase --autostash origin "$GITHUB_REF_NAME"
+ git push origin HEAD:"$GITHUB_REF_NAME"
+
+ echo "### Nix hashes" >> "$GITHUB_STEP_SUMMARY"
+ echo "Status: committed $(git rev-parse --short HEAD)" >> "$GITHUB_STEP_SUMMARY"
diff --git a/.github/workflows/notify-discord.yml b/.github/workflows/notify-discord.yml
new file mode 100644
index 0000000..0b2b1cd
--- /dev/null
+++ b/.github/workflows/notify-discord.yml
@@ -0,0 +1,14 @@
+name: notify-discord
+
+on:
+ release:
+ types: [released] # fires when a draft release is published
+
+jobs:
+ notify:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - name: Send nicely-formatted embed to Discord
+ uses: SethCohen/github-releases-to-discord@24d166886aee4646d448c8a389ff9e1ebcab3682 # v1.20.0
+ with:
+ webhook_url: ${{ secrets.DISCORD_WEBHOOK }}
diff --git a/.github/workflows/opencode.yml b/.github/workflows/opencode.yml
new file mode 100644
index 0000000..3469c21
--- /dev/null
+++ b/.github/workflows/opencode.yml
@@ -0,0 +1,34 @@
+name: opencode
+
+on:
+ issue_comment:
+ types: [created]
+ pull_request_review_comment:
+ types: [created]
+
+jobs:
+ opencode:
+ if: |
+ contains(github.event.comment.body, ' /oc') ||
+ startsWith(github.event.comment.body, '/oc') ||
+ contains(github.event.comment.body, ' /opencode') ||
+ startsWith(github.event.comment.body, '/opencode')
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ id-token: write
+ contents: read
+ pull-requests: read
+ issues: read
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Run opencode
+ uses: anomalyco/opencode/github@2c14fc5586fe0b88e5c04732d2e846769cc35671 # latest
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ OPENCODE_PERMISSION: '{"bash": "deny"}'
+ with:
+ model: opencode/claude-opus-4-5
diff --git a/.github/workflows/pr-management.yml b/.github/workflows/pr-management.yml
new file mode 100644
index 0000000..b6aa4e5
--- /dev/null
+++ b/.github/workflows/pr-management.yml
@@ -0,0 +1,95 @@
+name: pr-management
+
+on:
+ pull_request_target:
+ types: [opened]
+
+jobs:
+ check-duplicates:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: read
+ pull-requests: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 1
+
+ - name: Check team membership
+ id: team-check
+ run: |
+ LOGIN="${{ github.event.pull_request.user.login }}"
+ if [ "$LOGIN" = "opencode-agent[bot]" ] || grep -qxF "$LOGIN" .github/TEAM_MEMBERS; then
+ echo "is_team=true" >> "$GITHUB_OUTPUT"
+ echo "Skipping: $LOGIN is a team member or bot"
+ else
+ echo "is_team=false" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Setup Bun
+ if: steps.team-check.outputs.is_team != 'true'
+ uses: ./.github/actions/setup-bun
+
+ - name: Install dependencies
+ if: steps.team-check.outputs.is_team != 'true'
+ run: bun install
+
+ - name: Install opencode
+ if: steps.team-check.outputs.is_team != 'true'
+ run: curl -fsSL https://opencode.ai/install | bash
+
+ - name: Build prompt
+ if: steps.team-check.outputs.is_team != 'true'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ PR_NUMBER: ${{ github.event.pull_request.number }}
+ run: |
+ {
+ echo "Check for duplicate PRs related to this new PR:"
+ echo ""
+ echo "CURRENT_PR_NUMBER: $PR_NUMBER"
+ echo ""
+ echo "Title: $(gh pr view "$PR_NUMBER" --json title --jq .title)"
+ echo ""
+ echo "Description:"
+ gh pr view "$PR_NUMBER" --json body --jq .body
+ } > pr_info.txt
+
+ - name: Check for duplicate PRs
+ if: steps.team-check.outputs.is_team != 'true'
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ PR_NUMBER: ${{ github.event.pull_request.number }}
+ run: |
+ COMMENT=$(bun script/duplicate-pr.ts -f pr_info.txt "Check the attached file for PR details and search for duplicates")
+
+ if [ "$COMMENT" != "No duplicate PRs found" ]; then
+ gh pr comment "$PR_NUMBER" --body "_The following comment was made by an LLM, it may be inaccurate:_
+
+ $COMMENT"
+ fi
+
+ add-contributor-label:
+ runs-on: ubuntu-latest
+ permissions:
+ pull-requests: write
+ issues: write
+ steps:
+ - name: Add Contributor Label
+ uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
+ with:
+ script: |
+ const isPR = !!context.payload.pull_request;
+ const issueNumber = isPR ? context.payload.pull_request.number : context.payload.issue.number;
+ const authorAssociation = isPR ? context.payload.pull_request.author_association : context.payload.issue.author_association;
+
+ if (authorAssociation === 'CONTRIBUTOR') {
+ await github.rest.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: issueNumber,
+ labels: ['contributor']
+ });
+ }
diff --git a/.github/workflows/pr-standards.yml b/.github/workflows/pr-standards.yml
new file mode 100644
index 0000000..0683808
--- /dev/null
+++ b/.github/workflows/pr-standards.yml
@@ -0,0 +1,351 @@
+name: pr-standards
+
+on:
+ pull_request_target:
+ types: [opened, edited, synchronize]
+
+jobs:
+ check-standards:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: write
+ steps:
+ - name: Check PR standards
+ uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
+ with:
+ script: |
+ const pr = context.payload.pull_request;
+ const login = pr.user.login;
+
+ // Skip PRs older than Feb 18, 2026 at 6PM EST (Feb 19, 2026 00:00 UTC)
+ const cutoff = new Date('2026-02-19T00:00:00Z');
+ const prCreated = new Date(pr.created_at);
+ if (prCreated < cutoff) {
+ console.log(`Skipping: PR #${pr.number} was created before cutoff (${prCreated.toISOString()})`);
+ return;
+ }
+
+ // Check if author is a team member or bot
+ if (login === 'opencode-agent[bot]') return;
+ const { data: file } = await github.rest.repos.getContent({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ path: '.github/TEAM_MEMBERS',
+ ref: 'dev'
+ });
+ const members = Buffer.from(file.content, 'base64').toString().split('\n').map(l => l.trim()).filter(Boolean);
+ if (members.includes(login)) {
+ console.log(`Skipping: ${login} is a team member`);
+ return;
+ }
+
+ const title = pr.title;
+
+ async function addLabel(label) {
+ await github.rest.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ labels: [label]
+ });
+ }
+
+ async function removeLabel(label) {
+ try {
+ await github.rest.issues.removeLabel({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ name: label
+ });
+ } catch (e) {
+ // Label wasn't present, ignore
+ }
+ }
+
+ async function comment(marker, body) {
+ const markerText = ``;
+ const { data: comments } = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number
+ });
+
+ const existing = comments.find(c => c.body.includes(markerText));
+ if (existing) return;
+
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ body: markerText + '\n' + body
+ });
+ }
+
+ // Step 1: Check title format
+ // Matches: feat:, feat(scope):, feat (scope):, etc.
+ const titlePattern = /^(feat|fix|docs|chore|refactor|test)\s*(\([a-zA-Z0-9-]+\))?\s*:/;
+ const hasValidTitle = titlePattern.test(title);
+
+ if (!hasValidTitle) {
+ await addLabel('needs:title');
+ await comment('title', `Hey! Your PR title \`${title}\` doesn't follow conventional commit format.
+
+ Please update it to start with one of:
+ - \`feat:\` or \`feat(scope):\` new feature
+ - \`fix:\` or \`fix(scope):\` bug fix
+ - \`docs:\` or \`docs(scope):\` documentation changes
+ - \`chore:\` or \`chore(scope):\` maintenance tasks
+ - \`refactor:\` or \`refactor(scope):\` code refactoring
+ - \`test:\` or \`test(scope):\` adding or updating tests
+
+ Where \`scope\` is the package name (e.g., \`app\`, \`desktop\`, \`opencode\`).
+
+ See [CONTRIBUTING.md](../blob/dev/CONTRIBUTING.md#pr-titles) for details.`);
+ return;
+ }
+
+ await removeLabel('needs:title');
+
+ // Step 2: Check for linked issue (skip for docs/refactor/feat PRs)
+ const skipIssueCheck = /^(docs|refactor|feat)\s*(\([a-zA-Z0-9-]+\))?\s*:/.test(title);
+ if (skipIssueCheck) {
+ await removeLabel('needs:issue');
+ console.log('Skipping issue check for docs/refactor/feat PR');
+ return;
+ }
+ const query = `
+ query($owner: String!, $repo: String!, $number: Int!) {
+ repository(owner: $owner, name: $repo) {
+ pullRequest(number: $number) {
+ closingIssuesReferences(first: 1) {
+ totalCount
+ }
+ }
+ }
+ }
+ `;
+
+ const result = await github.graphql(query, {
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ number: pr.number
+ });
+
+ const linkedIssues = result.repository.pullRequest.closingIssuesReferences.totalCount;
+
+ if (linkedIssues === 0) {
+ await addLabel('needs:issue');
+ await comment('issue', `Thanks for your contribution!
+
+ This PR doesn't have a linked issue. All PRs must reference an existing issue.
+
+ Please:
+ 1. Open an issue describing the bug/feature (if one doesn't exist)
+ 2. Add \`Fixes #\` or \`Closes #\` to this PR description
+
+ See [CONTRIBUTING.md](../blob/dev/CONTRIBUTING.md#issue-first-policy) for details.`);
+ return;
+ }
+
+ await removeLabel('needs:issue');
+ console.log('PR meets all standards');
+
+ check-compliance:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: write
+ steps:
+ - name: Check PR template compliance
+ uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
+ with:
+ script: |
+ const pr = context.payload.pull_request;
+ const login = pr.user.login;
+
+ // Skip PRs older than Feb 18, 2026 at 6PM EST (Feb 19, 2026 00:00 UTC)
+ const cutoff = new Date('2026-02-19T00:00:00Z');
+ const prCreated = new Date(pr.created_at);
+ if (prCreated < cutoff) {
+ console.log(`Skipping: PR #${pr.number} was created before cutoff (${prCreated.toISOString()})`);
+ return;
+ }
+
+ // Check if author is a team member or bot
+ if (login === 'opencode-agent[bot]') return;
+ const { data: file } = await github.rest.repos.getContent({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ path: '.github/TEAM_MEMBERS',
+ ref: 'dev'
+ });
+ const members = Buffer.from(file.content, 'base64').toString().split('\n').map(l => l.trim()).filter(Boolean);
+ if (members.includes(login)) {
+ console.log(`Skipping: ${login} is a team member`);
+ return;
+ }
+
+ const body = pr.body || '';
+ const title = pr.title;
+ const isDocsRefactorOrFeat = /^(docs|refactor|feat)\s*(\([a-zA-Z0-9-]+\))?\s*:/.test(title);
+
+ const issues = [];
+
+ // Check: template sections exist
+ const hasWhatSection = /### What does this PR do\?/.test(body);
+ const hasTypeSection = /### Type of change/.test(body);
+ const hasVerifySection = /### How did you verify your code works\?/.test(body);
+ const hasChecklistSection = /### Checklist/.test(body);
+ const hasIssueSection = /### Issue for this PR/.test(body);
+
+ if (!hasWhatSection || !hasTypeSection || !hasVerifySection || !hasChecklistSection || !hasIssueSection) {
+ issues.push('PR description is missing required template sections. Please use the [PR template](../blob/dev/.github/pull_request_template.md).');
+ }
+
+ // Check: "What does this PR do?" has real content (not just placeholder text)
+ if (hasWhatSection) {
+ const whatMatch = body.match(/### What does this PR do\?\s*\n([\s\S]*?)(?=###|$)/);
+ const whatContent = whatMatch ? whatMatch[1].trim() : '';
+ const placeholder = 'Please provide a description of the issue';
+ const onlyPlaceholder = whatContent.includes(placeholder) && whatContent.replace(placeholder, '').replace(/[*\s]/g, '').length < 20;
+ if (!whatContent || onlyPlaceholder) {
+ issues.push('"What does this PR do?" section is empty or only contains placeholder text. Please describe your changes.');
+ }
+ }
+
+ // Check: at least one "Type of change" checkbox is checked
+ if (hasTypeSection) {
+ const typeMatch = body.match(/### Type of change\s*\n([\s\S]*?)(?=###|$)/);
+ const typeContent = typeMatch ? typeMatch[1] : '';
+ const hasCheckedBox = /- \[x\]/i.test(typeContent);
+ if (!hasCheckedBox) {
+ issues.push('No "Type of change" checkbox is checked. Please select at least one.');
+ }
+ }
+
+ // Check: issue reference (skip for docs/refactor/feat)
+ if (!isDocsRefactorOrFeat && hasIssueSection) {
+ const issueMatch = body.match(/### Issue for this PR\s*\n([\s\S]*?)(?=###|$)/);
+ const issueContent = issueMatch ? issueMatch[1].trim() : '';
+ const hasIssueRef = /(closes|fixes|resolves)\s+#\d+/i.test(issueContent) || /#\d+/.test(issueContent);
+ if (!hasIssueRef) {
+ issues.push('No issue referenced. Please add `Closes #` linking to the relevant issue.');
+ }
+ }
+
+ // Check: "How did you verify" has content
+ if (hasVerifySection) {
+ const verifyMatch = body.match(/### How did you verify your code works\?\s*\n([\s\S]*?)(?=###|$)/);
+ const verifyContent = verifyMatch ? verifyMatch[1].trim() : '';
+ if (!verifyContent) {
+ issues.push('"How did you verify your code works?" section is empty. Please explain how you tested.');
+ }
+ }
+
+ // Check: checklist boxes are checked
+ if (hasChecklistSection) {
+ const checklistMatch = body.match(/### Checklist\s*\n([\s\S]*?)(?=###|$)/);
+ const checklistContent = checklistMatch ? checklistMatch[1] : '';
+ const unchecked = (checklistContent.match(/- \[ \]/g) || []).length;
+ const checked = (checklistContent.match(/- \[x\]/gi) || []).length;
+ if (checked < 2) {
+ issues.push('Not all checklist items are checked. Please confirm you have tested locally and have not included unrelated changes.');
+ }
+ }
+
+ // Helper functions
+ async function addLabel(label) {
+ await github.rest.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ labels: [label]
+ });
+ }
+
+ async function removeLabel(label) {
+ try {
+ await github.rest.issues.removeLabel({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ name: label
+ });
+ } catch (e) {}
+ }
+
+ const hasComplianceLabel = pr.labels.some(l => l.name === 'needs:compliance');
+
+ if (issues.length > 0) {
+ // Non-compliant
+ if (!hasComplianceLabel) {
+ await addLabel('needs:compliance');
+ }
+
+ const marker = '';
+ const { data: comments } = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number
+ });
+ const existing = comments.find(c => c.body.includes(marker));
+
+ const body_text = `${marker}
+ This PR doesn't fully meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md) and [PR template](../blob/dev/.github/pull_request_template.md).
+
+ **What needs to be fixed:**
+ ${issues.map(i => `- ${i}`).join('\n')}
+
+ Please edit this PR description to address the above within **2 hours**, or it will be automatically closed.
+
+ If you believe this was flagged incorrectly, please let a maintainer know.`;
+
+ if (existing) {
+ await github.rest.issues.updateComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: existing.id,
+ body: body_text
+ });
+ } else {
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ body: body_text
+ });
+ }
+
+ console.log(`PR #${pr.number} is non-compliant: ${issues.join(', ')}`);
+ } else if (hasComplianceLabel) {
+ // Was non-compliant, now fixed
+ await removeLabel('needs:compliance');
+
+ const { data: comments } = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number
+ });
+ const marker = '';
+ const existing = comments.find(c => c.body.includes(marker));
+ if (existing) {
+ await github.rest.issues.deleteComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: existing.id
+ });
+ }
+
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ body: 'Thanks for updating your PR! It now meets our contributing guidelines. :+1:'
+ });
+
+ console.log(`PR #${pr.number} is now compliant, label removed`);
+ } else {
+ console.log(`PR #${pr.number} is compliant`);
+ }
diff --git a/.github/workflows/publish-github-action.yml b/.github/workflows/publish-github-action.yml
new file mode 100644
index 0000000..e5ca91b
--- /dev/null
+++ b/.github/workflows/publish-github-action.yml
@@ -0,0 +1,30 @@
+name: publish-github-action
+
+on:
+ workflow_dispatch:
+ push:
+ tags:
+ - "github-v*.*.*"
+ - "!github-v1"
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: write
+
+jobs:
+ publish:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+ with:
+ fetch-depth: 0
+
+ - run: git fetch --force --tags
+
+ - name: Publish
+ run: |
+ git config --global user.email "opencode@sst.dev"
+ git config --global user.name "opencode"
+ ./script/publish
+ working-directory: ./github
diff --git a/.github/workflows/publish-vscode.yml b/.github/workflows/publish-vscode.yml
new file mode 100644
index 0000000..00c7e26
--- /dev/null
+++ b/.github/workflows/publish-vscode.yml
@@ -0,0 +1,37 @@
+name: publish-vscode
+
+on:
+ workflow_dispatch:
+ push:
+ tags:
+ - "vscode-v*.*.*"
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: write
+
+jobs:
+ publish:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+ with:
+ fetch-depth: 0
+
+ - uses: ./.github/actions/setup-bun
+
+ - run: git fetch --force --tags
+ - run: bun install -g @vscode/vsce
+
+ - name: Install extension dependencies
+ run: bun install
+ working-directory: ./sdks/vscode
+
+ - name: Publish
+ run: |
+ ./script/publish
+ working-directory: ./sdks/vscode
+ env:
+ VSCE_PAT: ${{ secrets.VSCE_PAT }}
+ OPENVSX_TOKEN: ${{ secrets.OPENVSX_TOKEN }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..29b5aa3
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,520 @@
+name: publish
+run-name: "${{ format('release {0}', inputs.bump) }}"
+
+on:
+ push:
+ branches:
+ - ci
+ - dev
+ - beta
+ - fix/npm-native-binary-install
+ - snapshot-*
+ workflow_dispatch:
+ inputs:
+ bump:
+ description: "Bump major, minor, or patch"
+ required: false
+ type: choice
+ options:
+ - major
+ - minor
+ - patch
+ version:
+ description: "Override version (optional)"
+ required: false
+ type: string
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.version || inputs.bump }}
+
+permissions:
+ id-token: write
+ contents: write
+ packages: write
+
+jobs:
+ version:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ if: github.repository == 'anomalyco/opencode'
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+ with:
+ fetch-depth: 0
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Install OpenCode
+ if: inputs.bump || inputs.version
+ run: bun i -g opencode-ai
+
+ - id: version
+ run: |
+ ./script/version.ts
+ env:
+ GH_TOKEN: ${{ steps.committer.outputs.token }}
+ OPENCODE_BUMP: ${{ inputs.bump }}
+ OPENCODE_VERSION: ${{ inputs.version }}
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GH_REPO: ${{ (github.ref_name == 'beta' && 'anomalyco/opencode-beta') || github.repository }}
+ outputs:
+ version: ${{ steps.version.outputs.version }}
+ release: ${{ steps.version.outputs.release }}
+ tag: ${{ steps.version.outputs.tag }}
+ repo: ${{ steps.version.outputs.repo }}
+
+ build-cli:
+ needs: version
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ if: github.repository == 'anomalyco/opencode'
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+ with:
+ fetch-tags: true
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Build
+ id: build
+ run: |
+ ./packages/opencode/script/build.ts ${{ (github.ref_name == 'beta' && '--sourcemaps') || '' }}
+ ./packages/cli/script/build.ts ${{ (github.ref_name == 'beta' && '--sourcemaps') || '' }}
+ env:
+ OPENCODE_VERSION: ${{ needs.version.outputs.version }}
+ OPENCODE_RELEASE: ${{ needs.version.outputs.release }}
+ GH_REPO: ${{ needs.version.outputs.repo }}
+ GH_TOKEN: ${{ steps.committer.outputs.token }}
+
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: opencode-cli
+ path: |
+ packages/opencode/dist/opencode-darwin*
+ packages/opencode/dist/opencode-linux*
+
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: opencode-cli-windows
+ path: packages/opencode/dist/opencode-windows*
+
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: opencode-preview-cli
+ path: packages/cli/dist/cli-*
+
+ outputs:
+ version: ${{ needs.version.outputs.version }}
+
+ sign-cli-windows:
+ needs:
+ - build-cli
+ - version
+ runs-on: blacksmith-4vcpu-windows-2025
+ if: github.repository == 'anomalyco/opencode'
+ env:
+ AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
+ AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
+ AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
+ AZURE_TRUSTED_SIGNING_ACCOUNT_NAME: ${{ secrets.AZURE_TRUSTED_SIGNING_ACCOUNT_NAME }}
+ AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE: ${{ secrets.AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE }}
+ AZURE_TRUSTED_SIGNING_ENDPOINT: ${{ secrets.AZURE_TRUSTED_SIGNING_ENDPOINT }}
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: opencode-cli-windows
+ path: packages/opencode/dist
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Azure login
+ uses: azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0
+ with:
+ client-id: ${{ env.AZURE_CLIENT_ID }}
+ tenant-id: ${{ env.AZURE_TENANT_ID }}
+ subscription-id: ${{ env.AZURE_SUBSCRIPTION_ID }}
+
+ - uses: azure/artifact-signing-action@b443cf8ea4124818d2ea9f043cba29fc3ec47b16 # v1.2.0
+ with:
+ endpoint: ${{ env.AZURE_TRUSTED_SIGNING_ENDPOINT }}
+ signing-account-name: ${{ env.AZURE_TRUSTED_SIGNING_ACCOUNT_NAME }}
+ certificate-profile-name: ${{ env.AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE }}
+ files: |
+ ${{ github.workspace }}\packages\opencode\dist\opencode-windows-arm64\bin\opencode.exe
+ ${{ github.workspace }}\packages\opencode\dist\opencode-windows-x64\bin\opencode.exe
+ ${{ github.workspace }}\packages\opencode\dist\opencode-windows-x64-baseline\bin\opencode.exe
+ exclude-environment-credential: true
+ exclude-workload-identity-credential: true
+ exclude-managed-identity-credential: true
+ exclude-shared-token-cache-credential: true
+ exclude-visual-studio-credential: true
+ exclude-visual-studio-code-credential: true
+ exclude-azure-cli-credential: false
+ exclude-azure-powershell-credential: true
+ exclude-azure-developer-cli-credential: true
+ exclude-interactive-browser-credential: true
+
+ - name: Verify Windows CLI signatures
+ shell: pwsh
+ run: |
+ $files = @(
+ "${{ github.workspace }}\packages\opencode\dist\opencode-windows-arm64\bin\opencode.exe",
+ "${{ github.workspace }}\packages\opencode\dist\opencode-windows-x64\bin\opencode.exe",
+ "${{ github.workspace }}\packages\opencode\dist\opencode-windows-x64-baseline\bin\opencode.exe"
+ )
+
+ foreach ($file in $files) {
+ $sig = Get-AuthenticodeSignature $file
+ if ($sig.Status -ne "Valid") {
+ throw "Invalid signature for ${file}: $($sig.Status)"
+ }
+ }
+
+ - name: Repack Windows CLI archives
+ working-directory: packages/opencode/dist
+ shell: pwsh
+ run: |
+ Compress-Archive -Path "opencode-windows-arm64\bin\*" -DestinationPath "opencode-windows-arm64.zip" -Force
+ Compress-Archive -Path "opencode-windows-x64\bin\*" -DestinationPath "opencode-windows-x64.zip" -Force
+ Compress-Archive -Path "opencode-windows-x64-baseline\bin\*" -DestinationPath "opencode-windows-x64-baseline.zip" -Force
+
+ - name: Upload signed Windows CLI release assets
+ if: needs.version.outputs.release != ''
+ shell: pwsh
+ env:
+ GH_TOKEN: ${{ steps.committer.outputs.token }}
+ run: |
+ gh release upload "v${{ needs.version.outputs.version }}" `
+ "${{ github.workspace }}\packages\opencode\dist\opencode-windows-arm64.zip" `
+ "${{ github.workspace }}\packages\opencode\dist\opencode-windows-x64.zip" `
+ "${{ github.workspace }}\packages\opencode\dist\opencode-windows-x64-baseline.zip" `
+ --clobber `
+ --repo "${{ needs.version.outputs.repo }}"
+
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: opencode-cli-signed-windows
+ path: |
+ packages/opencode/dist/opencode-windows-arm64
+ packages/opencode/dist/opencode-windows-x64
+ packages/opencode/dist/opencode-windows-x64-baseline
+
+ build-electron:
+ needs:
+ - build-cli
+ - version
+ if: github.repository == 'anomalyco/opencode'
+ continue-on-error: false
+ env:
+ AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
+ AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
+ AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
+ AZURE_TRUSTED_SIGNING_ACCOUNT_NAME: ${{ secrets.AZURE_TRUSTED_SIGNING_ACCOUNT_NAME }}
+ AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE: ${{ secrets.AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE }}
+ AZURE_TRUSTED_SIGNING_ENDPOINT: ${{ secrets.AZURE_TRUSTED_SIGNING_ENDPOINT }}
+ strategy:
+ fail-fast: false
+ matrix:
+ settings:
+ - host: macos-26-intel
+ target: x86_64-apple-darwin
+ platform_flag: --mac --x64
+ bun_install_flags: --os=darwin --cpu=x64
+ - host: macos-26
+ target: aarch64-apple-darwin
+ platform_flag: --mac --arm64
+ bun_install_flags: --os=darwin --cpu=arm64
+ # github-hosted: blacksmith lacks ARM64 MSVC cross-compilation toolchain
+ - host: "windows-2025"
+ target: aarch64-pc-windows-msvc
+ platform_flag: --win --arm64
+ - host: "blacksmith-4vcpu-windows-2025"
+ target: x86_64-pc-windows-msvc
+ platform_flag: --win
+ - host: "blacksmith-4vcpu-ubuntu-2404"
+ target: x86_64-unknown-linux-gnu
+ platform_flag: --linux
+ - host: "blacksmith-4vcpu-ubuntu-2404-arm"
+ target: aarch64-unknown-linux-gnu
+ platform_flag: --linux --arm64
+ runs-on: ${{ matrix.settings.host }}
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+
+ - uses: apple-actions/import-codesign-certs@8f3fb608891dd2244cdab3d69cd68c0d37a7fe93 # v2.0.0
+ if: runner.os == 'macOS'
+ with:
+ keychain: build
+ p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
+ p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
+
+ - name: Setup Apple API Key
+ if: runner.os == 'macOS'
+ run: echo "${{ secrets.APPLE_API_KEY_PATH }}" > $RUNNER_TEMP/apple-api-key.p8
+
+ - uses: ./.github/actions/setup-bun
+ with:
+ install-flags: ${{ matrix.settings.bun_install_flags }}
+
+ - name: Azure login
+ if: runner.os == 'Windows'
+ uses: azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0
+ with:
+ client-id: ${{ env.AZURE_CLIENT_ID }}
+ tenant-id: ${{ env.AZURE_TENANT_ID }}
+ subscription-id: ${{ env.AZURE_SUBSCRIPTION_ID }}
+
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+ with:
+ node-version: "24"
+
+ - name: Cache apt packages
+ if: contains(matrix.settings.host, 'ubuntu')
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
+ with:
+ path: ~/apt-cache
+ key: ${{ runner.os }}-${{ matrix.settings.target }}-apt-electron-${{ hashFiles('.github/workflows/publish.yml') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ matrix.settings.target }}-apt-electron-
+
+ - name: Install dependencies (ubuntu only)
+ if: contains(matrix.settings.host, 'ubuntu')
+ run: |
+ mkdir -p ~/apt-cache && chmod -R a+rw ~/apt-cache
+ sudo apt-get update
+ sudo apt-get install -y --no-install-recommends -o dir::cache::archives="$HOME/apt-cache" rpm
+ sudo chmod -R a+rw ~/apt-cache
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Prepare
+ run: bun ./scripts/prepare.ts
+ working-directory: packages/desktop
+ env:
+ OPENCODE_VERSION: ${{ needs.version.outputs.version }}
+ OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
+ OPENCODE_CLI_ARTIFACT: ${{ (runner.os == 'Windows' && 'opencode-cli-windows') || 'opencode-cli' }}
+ RUST_TARGET: ${{ matrix.settings.target }}
+ GH_TOKEN: ${{ github.token }}
+ GITHUB_RUN_ID: ${{ github.run_id }}
+
+ - name: Build
+ run: bun run build
+ working-directory: packages/desktop
+ env:
+ OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
+ SENTRY_ORG: ${{ vars.SENTRY_ORG }}
+ SENTRY_PROJECT: ${{ vars.WEB_SENTRY_PROJECT }}
+ SENTRY_RELEASE: desktop@${{ needs.version.outputs.version }}
+ VITE_SENTRY_DSN: ${{ vars.WEB_SENTRY_DSN }}
+ VITE_SENTRY_ENVIRONMENT: ${{ (github.ref_name == 'beta' && 'beta') || 'production' }}
+ VITE_SENTRY_RELEASE: desktop@${{ needs.version.outputs.version }}
+
+ - name: Package
+ if: needs.version.outputs.release
+ run: npx electron-builder ${{ matrix.settings.platform_flag }} --publish never --config electron-builder.config.ts
+ working-directory: packages/desktop
+ timeout-minutes: 60
+ env:
+ OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
+ GH_TOKEN: ${{ steps.committer.outputs.token }}
+ CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
+ CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
+ APPLE_API_KEY: ${{ runner.temp }}/apple-api-key.p8
+ APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY }}
+ APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
+
+ - name: Package (no publish)
+ if: ${{ !needs.version.outputs.release }}
+ run: npx electron-builder ${{ matrix.settings.platform_flag }} --publish never --config electron-builder.config.ts
+ working-directory: packages/desktop
+ timeout-minutes: 60
+ env:
+ OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
+
+ - name: Create macOS .app.tar.gz
+ if: runner.os == 'macOS' && needs.version.outputs.release
+ working-directory: packages/desktop/dist
+ run: |
+ if [[ "${{ matrix.settings.target }}" == "x86_64-apple-darwin" ]]; then
+ APP_DIR="mac"
+ OUT_NAME="opencode-desktop-mac-x64.app.tar.gz"
+ elif [[ "${{ matrix.settings.target }}" == "aarch64-apple-darwin" ]]; then
+ APP_DIR="mac-arm64"
+ OUT_NAME="opencode-desktop-mac-arm64.app.tar.gz"
+ else
+ echo "Unknown macOS target: ${{ matrix.settings.target }}"
+ exit 1
+ fi
+ APP_PATH=$(find "$APP_DIR" -maxdepth 1 -name "*.app" -type d | head -1)
+ if [ -z "$APP_PATH" ]; then
+ echo "No .app bundle found in $APP_DIR"
+ exit 1
+ fi
+ tar -czf "$OUT_NAME" -C "$(dirname "$APP_PATH")" "$(basename "$APP_PATH")"
+
+ - name: Verify signed Windows Electron artifacts
+ if: runner.os == 'Windows'
+ shell: pwsh
+ run: |
+ $files = @()
+ $files += Get-ChildItem "${{ github.workspace }}\packages\desktop\dist\*.exe" | Select-Object -ExpandProperty FullName
+ $files += Get-ChildItem "${{ github.workspace }}\packages\desktop\dist\*unpacked\*.exe" | Select-Object -ExpandProperty FullName
+ $files += Get-ChildItem "${{ github.workspace }}\packages\desktop\dist\*unpacked\resources\opencode-cli.exe" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
+
+ foreach ($file in $files | Select-Object -Unique) {
+ $sig = Get-AuthenticodeSignature $file
+ if ($sig.Status -ne "Valid") {
+ throw "Invalid signature for ${file}: $($sig.Status)"
+ }
+ }
+
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: opencode-desktop-${{ matrix.settings.target }}
+ path: packages/desktop/dist/*
+
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ if: needs.version.outputs.release
+ with:
+ name: latest-yml-${{ matrix.settings.target }}
+ path: packages/desktop/dist/latest*.yml
+
+ publish:
+ needs:
+ - version
+ - build-cli
+ - sign-cli-windows
+ - build-electron
+ if: always() && !failure() && !cancelled()
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
+
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+ with:
+ node-version: "24"
+ registry-url: "https://registry.npmjs.org"
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: opencode-cli
+ path: packages/opencode/dist
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: opencode-cli-windows
+ path: packages/opencode/dist
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: opencode-cli-signed-windows
+ path: packages/opencode/dist
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: opencode-preview-cli
+ path: packages/cli/dist
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ if: needs.version.outputs.release
+ with:
+ pattern: latest-yml-*
+ path: /tmp/latest-yml
+
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ if: needs.version.outputs.release
+ with:
+ pattern: opencode-desktop-*
+ path: /tmp/desktop
+ merge-multiple: true
+
+ - name: Setup git committer
+ id: committer
+ uses: ./.github/actions/setup-git-committer
+ with:
+ opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
+ opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}
+
+ - name: Cache apt packages (AUR)
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
+ with:
+ path: /var/cache/apt/archives
+ key: ${{ runner.os }}-apt-aur-${{ hashFiles('.github/workflows/publish.yml') }}
+ restore-keys: |
+ ${{ runner.os }}-apt-aur-
+
+ - name: Setup SSH for AUR
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y pacman-package-manager
+ mkdir -p ~/.ssh
+ echo "${{ secrets.AUR_KEY }}" > ~/.ssh/id_rsa
+ chmod 600 ~/.ssh/id_rsa
+ git config --global user.email "opencode@sst.dev"
+ git config --global user.name "opencode"
+ ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts || true
+
+ - name: Upload desktop release assets
+ if: needs.version.outputs.release
+ env:
+ GH_TOKEN: ${{ steps.committer.outputs.token }}
+ run: |
+ shopt -s nullglob
+ files=(/tmp/desktop/*.{exe,blockmap,dmg,zip,AppImage,deb,rpm} /tmp/desktop/*.app.tar.gz)
+ if (( ${#files[@]} == 0 )); then
+ echo "No desktop release assets found"
+ exit 1
+ fi
+ gh release upload "v${{ needs.version.outputs.version }}" "${files[@]}" --clobber --repo "${{ needs.version.outputs.repo }}"
+
+ - run: ./script/publish.ts
+ env:
+ OPENCODE_VERSION: ${{ needs.version.outputs.version }}
+ OPENCODE_RELEASE: ${{ needs.version.outputs.release }}
+ AUR_KEY: ${{ secrets.AUR_KEY }}
+ GITHUB_TOKEN: ${{ steps.committer.outputs.token }}
+ GH_REPO: ${{ needs.version.outputs.repo }}
+ NPM_CONFIG_PROVENANCE: false
+ LATEST_YML_DIR: /tmp/latest-yml
+ TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
+ TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
diff --git a/.github/workflows/release-github-action.yml b/.github/workflows/release-github-action.yml
new file mode 100644
index 0000000..4a1d721
--- /dev/null
+++ b/.github/workflows/release-github-action.yml
@@ -0,0 +1,29 @@
+name: release-github-action
+
+on:
+ push:
+ branches:
+ - dev
+ paths:
+ - "github/**"
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: write
+
+jobs:
+ release:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 0
+
+ - run: git fetch --force --tags
+
+ - name: Release
+ run: |
+ git config --global user.email "opencode@sst.dev"
+ git config --global user.name "opencode"
+ ./github/script/release
diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml
new file mode 100644
index 0000000..00a4fba
--- /dev/null
+++ b/.github/workflows/review.yml
@@ -0,0 +1,83 @@
+name: review
+
+on:
+ issue_comment:
+ types: [created]
+
+jobs:
+ check-guidelines:
+ if: |
+ github.event.issue.pull_request &&
+ startsWith(github.event.comment.body, '/review') &&
+ contains(fromJson('["OWNER","MEMBER"]'), github.event.comment.author_association)
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: read
+ pull-requests: write
+ steps:
+ - name: Get PR number
+ id: pr-number
+ run: |
+ if [ "${{ github.event_name }}" = "pull_request_target" ]; then
+ echo "number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
+ else
+ echo "number=${{ github.event.issue.number }}" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 1
+
+ - uses: ./.github/actions/setup-bun
+
+ - name: Install opencode
+ run: curl -fsSL https://opencode.ai/install | bash
+
+ - name: Get PR details
+ id: pr-details
+ run: |
+ gh api /repos/${{ github.repository }}/pulls/${{ steps.pr-number.outputs.number }} > pr_data.json
+ echo "title=$(jq -r .title pr_data.json)" >> $GITHUB_OUTPUT
+ echo "sha=$(jq -r .head.sha pr_data.json)" >> $GITHUB_OUTPUT
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Check PR guidelines compliance
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ OPENCODE_PERMISSION: '{ "bash": { "*": "deny", "gh*": "allow", "gh pr review*": "deny" } }'
+ PR_TITLE: ${{ steps.pr-details.outputs.title }}
+ run: |
+ PR_BODY=$(jq -r .body pr_data.json)
+ opencode run -m opencode/gpt-5.5 --variant medium "A new pull request has been created: '${PR_TITLE}'
+
+
+ ${{ steps.pr-number.outputs.number }}
+
+
+
+ $PR_BODY
+
+
+ Please check all the code changes in this pull request against the style guide, also look for any bugs if they exist. Diffs are important but make sure you read the entire file to get proper context. Make it clear the suggestions are merely suggestions and the human can decide what to do
+
+ When critiquing code against the style guide, be sure that the code is ACTUALLY in violation, don't complain about else statements if they already use early returns there. You may complain about excessive nesting though, regardless of else statement usage.
+ When critiquing code style don't be a zealot, we don't like "let" statements but sometimes they are the simplest option, if someone does a bunch of nesting with let, they should consider using iife (see packages/opencode/src/util.iife.ts)
+
+ Use the gh cli to create comments on the files for the violations. Try to leave the comment on the exact line number. If you have a suggested fix include it in a suggestion code block.
+ If you are writing suggested fixes, BE SURE THAT the change you are recommending is actually valid typescript, often I have seen missing closing "}" or other syntax errors.
+ Generally, write a comment instead of writing suggested change if you can help it.
+
+ Command MUST be like this.
+ \`\`\`
+ gh api \
+ --method POST \
+ -H \"Accept: application/vnd.github+json\" \
+ -H \"X-GitHub-Api-Version: 2022-11-28\" \
+ /repos/${{ github.repository }}/pulls/${{ steps.pr-number.outputs.number }}/comments \
+ -f 'body=[summary of issue]' -f 'commit_id=${{ steps.pr-details.outputs.sha }}' -f 'path=[path-to-file]' -F \"line=[line]\" -f 'side=RIGHT'
+ \`\`\`
+
+ Only create comments for actual violations. If the code follows all guidelines, comment on the issue using gh cli: 'lgtm' AND NOTHING ELSE!!!!."
diff --git a/.github/workflows/stats.yml b/.github/workflows/stats.yml
new file mode 100644
index 0000000..bc97cfc
--- /dev/null
+++ b/.github/workflows/stats.yml
@@ -0,0 +1,35 @@
+name: stats
+
+on:
+ schedule:
+ - cron: "0 12 * * *" # Run daily at 12:00 UTC
+ workflow_dispatch: # Allow manual trigger
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+jobs:
+ stats:
+ if: github.repository == 'anomalyco/opencode'
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: write
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Run stats script
+ run: bun script/stats.ts
+
+ - name: Commit stats
+ run: |
+ git config --local user.email "action@github.com"
+ git config --local user.name "GitHub Action"
+ git add STATS.md
+ git diff --staged --quiet || git commit -m "ignore: update download stats $(date -I)"
+ git push
+ env:
+ POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }}
diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml
new file mode 100644
index 0000000..1e65210
--- /dev/null
+++ b/.github/workflows/storybook.yml
@@ -0,0 +1,38 @@
+name: storybook
+
+on:
+ push:
+ branches: [dev]
+ paths:
+ - ".github/workflows/storybook.yml"
+ - "package.json"
+ - "bun.lock"
+ - "packages/storybook/**"
+ - "packages/ui/**"
+ pull_request:
+ branches: [dev]
+ paths:
+ - ".github/workflows/storybook.yml"
+ - "package.json"
+ - "bun.lock"
+ - "packages/storybook/**"
+ - "packages/ui/**"
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ build:
+ name: storybook build
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Build Storybook
+ run: bun --cwd packages/storybook build
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..4c36f41
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,145 @@
+name: test
+
+on:
+ push:
+ branches:
+ - dev
+ pull_request:
+ workflow_dispatch:
+
+concurrency:
+ # Keep every run on dev so cancelled checks do not pollute the default branch
+ # commit history. PRs and other branches still share a group and cancel stale runs.
+ group: ${{ case(github.ref == 'refs/heads/dev', format('{0}-{1}', github.workflow, github.run_id), format('{0}-{1}', github.workflow, github.event.pull_request.number || github.ref)) }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ checks: write
+
+env:
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
+
+jobs:
+ unit:
+ name: unit (${{ matrix.settings.name }})
+ strategy:
+ fail-fast: false
+ matrix:
+ settings:
+ - name: linux
+ host: blacksmith-4vcpu-ubuntu-2404
+ - name: windows
+ host: blacksmith-4vcpu-windows-2025
+ runs-on: ${{ matrix.settings.host }}
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Setup Node
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+ with:
+ node-version: "24"
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Configure git identity
+ run: |
+ git config --global user.email "bot@opencode.ai"
+ git config --global user.name "opencode"
+
+ - name: Cache Turbo
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
+ with:
+ path: node_modules/.cache/turbo
+ key: turbo-${{ runner.os }}-${{ hashFiles('turbo.json', '**/package.json') }}-${{ github.sha }}
+ restore-keys: |
+ turbo-${{ runner.os }}-${{ hashFiles('turbo.json', '**/package.json') }}-
+ turbo-${{ runner.os }}-
+
+ - name: Run unit tests
+ timeout-minutes: 20
+ run: bun turbo test --output-logs=errors-only --log-order=grouped --log-prefix=task
+ env:
+ OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: ${{ runner.os == 'Windows' && 'true' || 'false' }}
+
+ - name: Run HttpApi exerciser gates
+ if: runner.os == 'Linux'
+ working-directory: packages/opencode
+ run: bun run test:httpapi
+
+ e2e:
+ name: e2e (${{ matrix.settings.name }})
+ strategy:
+ fail-fast: false
+ matrix:
+ settings:
+ - name: linux
+ host: blacksmith-4vcpu-ubuntu-2404
+ - name: windows
+ host: blacksmith-4vcpu-windows-2025
+ runs-on: ${{ matrix.settings.host }}
+ env:
+ PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Setup Node
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+ with:
+ node-version: "24"
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Read Playwright version
+ id: playwright-version
+ run: |
+ version=$(node -e 'console.log(require("./package.json").workspaces.catalog["@playwright/test"])')
+ echo "version=$version" >> "$GITHUB_OUTPUT"
+
+ - name: Cache Playwright browsers
+ id: playwright-cache
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
+ with:
+ path: ${{ github.workspace }}/.playwright-browsers
+ key: ${{ runner.os }}-${{ runner.arch }}-playwright-${{ steps.playwright-version.outputs.version }}-chromium
+
+ - name: Install Playwright system dependencies
+ if: runner.os == 'Linux'
+ working-directory: packages/app
+ run: bunx playwright install-deps chromium
+
+ - name: Install Playwright browsers
+ if: steps.playwright-cache.outputs.cache-hit != 'true'
+ working-directory: packages/app
+ run: bunx playwright install chromium
+
+ - name: Run app e2e tests
+ run: bun --cwd packages/app test:e2e:local
+ env:
+ CI: true
+ timeout-minutes: 30
+
+ - name: Upload Playwright artifacts
+ if: always()
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: playwright-${{ matrix.settings.name }}-${{ github.run_attempt }}
+ if-no-files-found: ignore
+ retention-days: 7
+ path: |
+ packages/app/e2e/test-results
+ packages/app/e2e/playwright-report
diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml
new file mode 100644
index 0000000..27852a1
--- /dev/null
+++ b/.github/workflows/triage.yml
@@ -0,0 +1,37 @@
+name: triage
+
+on:
+ issues:
+ types: [opened]
+
+jobs:
+ triage:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ permissions:
+ contents: read
+ issues: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+ with:
+ fetch-depth: 1
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Install opencode
+ run: curl -fsSL https://opencode.ai/install | bash
+
+ - name: Triage issue
+ env:
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ ISSUE_NUMBER: ${{ github.event.issue.number }}
+ ISSUE_TITLE: ${{ github.event.issue.title }}
+ ISSUE_BODY: ${{ github.event.issue.body }}
+ run: |
+ opencode run --agent triage "The following issue was just opened, triage it:
+
+ Title: $ISSUE_TITLE
+
+ $ISSUE_BODY"
diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml
new file mode 100644
index 0000000..fc9a527
--- /dev/null
+++ b/.github/workflows/typecheck.yml
@@ -0,0 +1,21 @@
+name: typecheck
+
+on:
+ push:
+ branches: [dev]
+ pull_request:
+ branches: [dev]
+ workflow_dispatch:
+
+jobs:
+ typecheck:
+ runs-on: blacksmith-4vcpu-ubuntu-2404
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
+
+ - name: Setup Bun
+ uses: ./.github/actions/setup-bun
+
+ - name: Run typecheck
+ run: bun typecheck
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..81c1ca5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+.DS_Store
+node_modules
+.worktrees
+.sst
+.env
+.env.local
+.idea
+.vscode
+.codex
+*~
+playground
+tmp
+dist
+ts-dist
+.turbo
+**/.serena
+.serena/
+**/.omo
+.omo/
+/result
+refs
+Session.vim
+/opencode.json
+a.out
+target
+.scripts
+.direnv/
+
+# AirCoding local state
+.air/
+
+# Local dev files
+opencode-dev
+UPCOMING_CHANGELOG.md
+logs/
+*.bun-build
+tsconfig.tsbuildinfo
diff --git a/.gitleaksignore b/.gitleaksignore
new file mode 100644
index 0000000..cc01a28
--- /dev/null
+++ b/.gitleaksignore
@@ -0,0 +1,5 @@
+# Fake secret-looking strings used by HTTP recorder redaction tests.
+afa57acfda894e0ebf3c637dd710310b705c0a2f:packages/http-recorder/test/record-replay.test.ts:generic-api-key:69
+afa57acfda894e0ebf3c637dd710310b705c0a2f:packages/http-recorder/test/record-replay.test.ts:generic-api-key:92
+afa57acfda894e0ebf3c637dd710310b705c0a2f:packages/http-recorder/test/record-replay.test.ts:generic-api-key:146
+afa57acfda894e0ebf3c637dd710310b705c0a2f:packages/http-recorder/test/record-replay.test.ts:gcp-api-key:71
diff --git a/.husky/pre-push b/.husky/pre-push
new file mode 100755
index 0000000..5d3cc53
--- /dev/null
+++ b/.husky/pre-push
@@ -0,0 +1,20 @@
+#!/bin/sh
+set -e
+# Check if bun version matches package.json
+# keep in sync with packages/script/src/index.ts semver qualifier
+bun -e '
+import { semver } from "bun";
+const pkg = await Bun.file("package.json").json();
+const expectedBunVersion = pkg.packageManager?.split("@")[1];
+if (!expectedBunVersion) {
+ throw new Error("packageManager field not found in root package.json");
+}
+const expectedBunVersionRange = `^${expectedBunVersion}`;
+if (!semver.satisfies(process.versions.bun, expectedBunVersionRange)) {
+ throw new Error(`This script requires bun@${expectedBunVersionRange}, but you are using bun@${process.versions.bun}`);
+}
+if (process.versions.bun !== expectedBunVersion) {
+ console.warn(`Warning: Bun version ${process.versions.bun} differs from expected ${expectedBunVersion}`);
+}
+'
+bun typecheck
diff --git a/.opencode/.gitignore b/.opencode/.gitignore
new file mode 100644
index 0000000..c072cfe
--- /dev/null
+++ b/.opencode/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+plans
+package.json
+bun.lock
+.gitignore
+package-lock.json
+references/
diff --git a/.opencode/agent/duplicate-pr.md b/.opencode/agent/duplicate-pr.md
new file mode 100644
index 0000000..c9c932e
--- /dev/null
+++ b/.opencode/agent/duplicate-pr.md
@@ -0,0 +1,26 @@
+---
+mode: primary
+hidden: true
+model: opencode/claude-haiku-4-5
+color: "#E67E22"
+tools:
+ "*": false
+ "github-pr-search": true
+---
+
+You are a duplicate PR detection agent. When a PR is opened, your job is to search for potentially duplicate or related open PRs.
+
+Use the github-pr-search tool to search for PRs that might be addressing the same issue or feature.
+
+IMPORTANT: The input will contain a line `CURRENT_PR_NUMBER: NNNN`. This is the current PR number, you should not mark that the current PR as a duplicate of itself.
+
+Search using keywords from the PR title and description. Try multiple searches with different relevant terms.
+
+If you find potential duplicates:
+
+- List them with their titles and URLs
+- Briefly explain why they might be related
+
+If no duplicates are found, say so clearly. BUT ONLY SAY "No duplicate PRs found" (don't say anything else if no dups)
+
+Keep your response concise and actionable.
diff --git a/.opencode/agent/triage.md b/.opencode/agent/triage.md
new file mode 100644
index 0000000..11c4c81
--- /dev/null
+++ b/.opencode/agent/triage.md
@@ -0,0 +1,43 @@
+---
+mode: primary
+hidden: true
+model: opencode/gpt-5.4-mini
+color: "#44BA81"
+tools:
+ "*": false
+ "github-triage": true
+---
+
+You are a triage agent responsible for triaging github issues.
+
+Use your github-triage tool to triage issues.
+
+This file is the source of truth for ownership/routing rules.
+
+Assign issues by choosing the team with the strongest overlap. The github-triage tool will assign a random member from that team.
+
+Do not add labels to issues. Only assign an owner.
+
+When calling github-triage, pass one of these team values: tui, desktop_web, core, inference, windows.
+
+## Teams
+
+### TUI
+
+Terminal UI issues, including rendering, keybindings, scrolling, terminal compatibility, SSH behavior, crashes in the TUI, and low-level TUI performance.
+
+### Desktop / Web
+
+Desktop application and browser-based app issues, including `opencode web`, desktop-specific UI behavior, packaging, and web view problems.
+
+### Core
+
+Core opencode server and harness issues, including sqlite, snapshots, memory, API behavior, agent context construction, tool execution, provider integrations, model behavior, documentation, and larger architectural features.
+
+### Inference
+
+OpenCode Zen, OpenCode Go, and billing issues.
+
+### Windows
+
+Windows-specific issues, including native Windows behavior, WSL interactions, path handling, shell compatibility, and installation or runtime problems that only happen on Windows.
diff --git a/.opencode/command/ai-deps.md b/.opencode/command/ai-deps.md
new file mode 100644
index 0000000..83783d5
--- /dev/null
+++ b/.opencode/command/ai-deps.md
@@ -0,0 +1,24 @@
+---
+description: "Bump AI sdk dependencies minor / patch versions only"
+---
+
+Please read @package.json and @packages/opencode/package.json.
+
+Your job is to look into AI SDK dependencies, figure out if they have versions that can be upgraded (minor or patch versions ONLY no major ignore major changes).
+
+I want a report of every dependency and the version that can be upgraded to.
+What would be even better is if you can give me brief summary of the changes for each dep and a link to the changelog for each dependency, or at least some reference info so I can see what bugs were fixed or new features were added.
+
+Consider using subagents for each dep to save your context window.
+
+Here is a short list of some deps (please be comprehensive tho):
+
+- "ai"
+- "@ai-sdk/openai"
+- "@ai-sdk/anthropic"
+- "@openrouter/ai-sdk-provider"
+- etc, etc
+
+DO NOT upgrade the dependencies yet, just make a list of all dependencies and their versions that can be upgraded to minor or patch versions only.
+
+Write up your findings to ai-sdk-updates.md
diff --git a/.opencode/command/changelog.md b/.opencode/command/changelog.md
new file mode 100644
index 0000000..b28d963
--- /dev/null
+++ b/.opencode/command/changelog.md
@@ -0,0 +1,49 @@
+---
+model: opencode/gpt-5.4
+---
+
+Create `UPCOMING_CHANGELOG.md` from the structured changelog input below.
+If `UPCOMING_CHANGELOG.md` already exists, ignore its current contents completely.
+Do not preserve, merge, or reuse text from the existing file.
+
+The input already contains the exact commit range since the last non-draft release.
+The commits are already filtered to the release-relevant packages and grouped into
+the release sections. Do not fetch GitHub releases, PRs, or build your own commit list.
+The input may also include a `## Community Contributors Input` section.
+
+Before writing any entry you keep, inspect the real diff with
+`git show --stat --format='' ` or `git show --format='' ` so you can
+understand the actual code changes and not just the commit message (they may be misleading).
+Do not use `git log` or author metadata when deciding attribution.
+
+Rules:
+
+- Write the final file with release sections in this order:
+ `## Core`, `## TUI`, `## Desktop`, `## SDK`, `## Extensions`
+- Only include sections that have at least one notable entry
+- Within each release section, keep bug fixes grouped under `### Bugfixes`
+- Keep other notable entries under `### Improvements` when a section has bug fixes too
+- Omit empty subsections
+- Keep one bullet per commit you keep
+- Skip commits that are entirely internal, CI, tests, refactors, or otherwise not user-facing
+- Start each bullet with a capital letter
+- Prefer what changed for users over what code changed internally
+- Do not copy raw commit prefixes like `fix:` or `feat:` or trailing PR numbers like `(#123)`
+- Community attribution is deterministic: only preserve an existing `(@username)` suffix from the changelog input
+- If an input bullet has no `(@username)` suffix, do not add one
+- Never add a new `(@username)` suffix from `git show`, commit authors, names, or email addresses
+- If no notable entries remain and there is no contributor block, write exactly `No notable changes.`
+- If no notable entries remain but there is a contributor block, omit all release sections and return only the contributor block
+- If the input contains `## Community Contributors Input`, append the block below that heading to the end of the final file verbatim
+- Do not add, remove, rewrite, or reorder contributor names or commit titles in that block
+- Do not derive the thank-you section from the main summary bullets
+- Do not include the heading `## Community Contributors Input` in the final file
+- Focus on writing the least words to get your point across - users will skim read the changelog, so we should be precise
+
+**Importantly, the changelog is for users (who are at least slightly technical), they may use the TUI, Desktop, SDK, Plugins and so forth. Be thorough in understanding flow on effects may not be immediately apparent. e.g. a package upgrade looks internal but may patch a bug. Or a refactor may also stabilise some race condition that fixes bugs for users. The PR title/body + commit message will give you the authors context, usually containing the outcome not just technical detail**
+
+
+
+!`bun script/raw-changelog.ts $ARGUMENTS`
+
+
diff --git a/.opencode/command/commit.md b/.opencode/command/commit.md
new file mode 100644
index 0000000..e88932a
--- /dev/null
+++ b/.opencode/command/commit.md
@@ -0,0 +1,37 @@
+---
+description: git commit and push
+model: opencode/kimi-k2.5
+subtask: true
+---
+
+commit and push
+
+make sure it includes a prefix like
+docs:
+tui:
+core:
+ci:
+ignore:
+wip:
+
+For anything in the packages/web use the docs: prefix.
+
+prefer to explain WHY something was done from an end user perspective instead of
+WHAT was done.
+
+do not do generic messages like "improved agent experience" be very specific
+about what user facing changes were made
+
+if there are conflicts DO NOT FIX THEM. notify me and I will fix them
+
+## GIT DIFF
+
+!`git diff`
+
+## GIT DIFF --cached
+
+!`git diff --cached`
+
+## GIT STATUS --short
+
+!`git status --short`
diff --git a/.opencode/command/issues.md b/.opencode/command/issues.md
new file mode 100644
index 0000000..75b5961
--- /dev/null
+++ b/.opencode/command/issues.md
@@ -0,0 +1,23 @@
+---
+description: "find issue(s) on github"
+model: opencode/claude-haiku-4-5
+---
+
+Search through existing issues in anomalyco/opencode using the gh cli to find issues matching this query:
+
+$ARGUMENTS
+
+Consider:
+
+1. Similar titles or descriptions
+2. Same error messages or symptoms
+3. Related functionality or components
+4. Similar feature requests
+
+Please list any matching issues with:
+
+- Issue number and title
+- Brief explanation of why it matches the query
+- Link to the issue
+
+If no clear matches are found, say so.
diff --git a/.opencode/command/learn.md b/.opencode/command/learn.md
new file mode 100644
index 0000000..fe4965a
--- /dev/null
+++ b/.opencode/command/learn.md
@@ -0,0 +1,42 @@
+---
+description: Extract non-obvious learnings from session to AGENTS.md files to build codebase understanding
+---
+
+Analyze this session and extract non-obvious learnings to add to AGENTS.md files.
+
+AGENTS.md files can exist at any directory level, not just the project root. When an agent reads a file, any AGENTS.md in parent directories are automatically loaded into the context of the tool read. Place learnings as close to the relevant code as possible:
+
+- Project-wide learnings → root AGENTS.md
+- Package/module-specific → packages/foo/AGENTS.md
+- Feature-specific → src/auth/AGENTS.md
+
+What counts as a learning (non-obvious discoveries only):
+
+- Hidden relationships between files or modules
+- Execution paths that differ from how code appears
+- Non-obvious configuration, env vars, or flags
+- Debugging breakthroughs when error messages were misleading
+- API/tool quirks and workarounds
+- Build/test commands not in README
+- Architectural decisions and constraints
+- Files that must change together
+
+What NOT to include:
+
+- Obvious facts from documentation
+- Standard language/framework behavior
+- Things already in an AGENTS.md
+- Verbose explanations
+- Session-specific details
+
+Process:
+
+1. Review session for discoveries, errors that took multiple attempts, unexpected connections
+2. Determine scope - what directory does each learning apply to?
+3. Read existing AGENTS.md files at relevant levels
+4. Create or update AGENTS.md at the appropriate level
+5. Keep entries to 1-3 lines per insight
+
+After updating, summarize which AGENTS.md files were created/updated and how many learnings per file.
+
+$ARGUMENTS
diff --git a/.opencode/command/rmslop.md b/.opencode/command/rmslop.md
new file mode 100644
index 0000000..02c9fc0
--- /dev/null
+++ b/.opencode/command/rmslop.md
@@ -0,0 +1,15 @@
+---
+description: Remove AI code slop
+---
+
+Check the diff against dev, and remove all AI generated slop introduced in this branch.
+
+This includes:
+
+- Extra comments that a human wouldn't add or is inconsistent with the rest of the file
+- Extra defensive checks or try/catch blocks that are abnormal for that area of the codebase (especially if called by trusted / validated codepaths)
+- Casts to any to get around type issues
+- Any other style that is inconsistent with the file
+- Unnecessary emoji usage
+
+Report at the end with only a 1-3 sentence summary of what you changed
diff --git a/.opencode/command/spellcheck.md b/.opencode/command/spellcheck.md
new file mode 100644
index 0000000..0abf23c
--- /dev/null
+++ b/.opencode/command/spellcheck.md
@@ -0,0 +1,5 @@
+---
+description: spellcheck all markdown file changes
+---
+
+Look at all the unstaged changes to markdown (.md, .mdx) files, pull out the lines that have changed, and check for spelling and grammar errors.
diff --git a/.opencode/command/translate.md b/.opencode/command/translate.md
new file mode 100644
index 0000000..8d493f4
--- /dev/null
+++ b/.opencode/command/translate.md
@@ -0,0 +1,14 @@
+---
+description: translate English to other languages
+model: opencode/claude-opus-4-8
+---
+
+run git diff and translate changed english doc and UI copy files to other international languages. Translate all languages in parallel to save time.
+
+Requirements:
+
+- Preserve meaning, intent, tone, and formatting (including Markdown/MDX structure).
+- Preserve all technical terms and artifacts exactly: product/company names, API names, identifiers, code, commands/flags, file paths, URLs, versions, error messages, config keys/values, and anything inside inline code or code blocks.
+- Also preserve every term listed in the Do-Not-Translate glossary below.
+- Also apply locale-specific guidance from `.opencode/glossary/.md` when available (for example, `zh-cn.md`).
+- Do not modify fenced code blocks.
diff --git a/.opencode/env.d.ts b/.opencode/env.d.ts
new file mode 100644
index 0000000..f2b13a9
--- /dev/null
+++ b/.opencode/env.d.ts
@@ -0,0 +1,4 @@
+declare module "*.txt" {
+ const content: string
+ export default content
+}
diff --git a/.opencode/glossary/README.md b/.opencode/glossary/README.md
new file mode 100644
index 0000000..9839003
--- /dev/null
+++ b/.opencode/glossary/README.md
@@ -0,0 +1,63 @@
+# Locale Glossaries
+
+Use this folder for locale-specific translation guidance that supplements `.opencode/agent/translator.md`.
+
+The global glossary in `translator.md` remains the source of truth for shared do-not-translate terms (commands, code, paths, product names, etc.). These locale files capture community learnings about phrasing and terminology preferences.
+
+## File Naming
+
+- One file per locale
+- Use lowercase locale slugs that match docs locales when possible (for example, `zh-cn.md`, `zh-tw.md`)
+- If only language-level guidance exists, use the language code (for example, `fr.md`)
+- Some repo locale slugs may be aliases/non-BCP47 for consistency (for example, `br` for Brazilian Portuguese / `pt-BR`)
+
+## What To Put In A Locale File
+
+- **Sources**: PRs/issues/discussions that motivated the guidance
+- **Do Not Translate (Locale Additions)**: locale-specific terms or casing decisions
+- **Preferred Terms**: recurring UI/docs words with preferred translations
+- **Guidance**: tone, style, and consistency notes
+- **Avoid** (optional): common literal translations or wording we should avoid
+- If the repo uses a locale alias slug, document the alias in **Guidance** (for example, prose may mention `pt-BR` while config/examples use `br`)
+
+Prefer guidance that is:
+
+- Repeated across multiple docs/screens
+- Easy to apply consistently
+- Backed by a community contribution or review discussion
+
+## Template
+
+```md
+# Glossary
+
+## Sources
+
+- PR #12345: https://github.com/anomalyco/opencode/pull/12345
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing)
+
+## Preferred Terms
+
+| English | Preferred | Notes |
+| ------- | --------- | --------- |
+| prompt | ... | preferred |
+| session | ... | preferred |
+
+## Guidance
+
+- Prefer natural phrasing over literal translation
+
+## Avoid
+
+- Avoid ... when ...
+```
+
+## Contribution Notes
+
+- Mark entries as preferred when they may evolve
+- Keep examples short
+- Add or update the `Sources` section whenever you add a new rule
+- Prefer PR-backed guidance over invented term mappings; start with general guidance if no term-level corrections exist yet
diff --git a/.opencode/glossary/ar.md b/.opencode/glossary/ar.md
new file mode 100644
index 0000000..3735552
--- /dev/null
+++ b/.opencode/glossary/ar.md
@@ -0,0 +1,28 @@
+# ar Glossary
+
+## Sources
+
+- PR #9947: https://github.com/anomalyco/opencode/pull/9947
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Arabic phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- For RTL text, treat code, commands, and paths as LTR artifacts and keep their character order unchanged
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Arabic terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/br.md b/.opencode/glossary/br.md
new file mode 100644
index 0000000..fd3e725
--- /dev/null
+++ b/.opencode/glossary/br.md
@@ -0,0 +1,34 @@
+# br Glossary
+
+## Sources
+
+- PR #10086: https://github.com/anomalyco/opencode/pull/10086
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Locale code `br` in repo config, code, and paths (repo alias for Brazilian Portuguese)
+
+## Preferred Terms
+
+These are PR-backed locale naming preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ---------------------------------------- | ------------------------------ | ------------------------------------------------------------- |
+| Brazilian Portuguese (prose locale name) | `pt-BR` | Use standard locale naming in prose when helpful |
+| Repo locale slug (code/config) | `br` | PR #10086 uses `br` for consistency/simplicity |
+| Browser locale detection | `pt`, `pt-br`, `pt-BR` -> `br` | Preserve this mapping in docs/examples about locale detection |
+
+## Guidance
+
+- This file covers Brazilian Portuguese (`pt-BR`), but the repo locale code is `br`
+- Use natural Brazilian Portuguese phrasing over literal translation
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep repo locale identifiers as implemented in code/config (`br`) even when prose mentions `pt-BR`
+
+## Avoid
+
+- Avoid changing repo locale code references from `br` to `pt-br` in code snippets, paths, or config examples
+- Avoid mixing Portuguese variants when a Brazilian Portuguese form is established
diff --git a/.opencode/glossary/bs.md b/.opencode/glossary/bs.md
new file mode 100644
index 0000000..aa3bd96
--- /dev/null
+++ b/.opencode/glossary/bs.md
@@ -0,0 +1,33 @@
+# bs Glossary
+
+## Sources
+
+- PR #12283: https://github.com/anomalyco/opencode/pull/12283
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed locale naming preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ---------------------------------- | ---------- | ------------------------------------------------- |
+| Bosnian language label (UI) | `Bosanski` | PR #12283 tested switching language to `Bosanski` |
+| Repo locale slug (code/config) | `bs` | Preserve in code, config, paths, and examples |
+| Browser locale detection (Bosnian) | `bs` | PR #12283 added `bs` locale auto-detection |
+
+## Guidance
+
+- Use natural Bosnian phrasing over literal translation
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep repo locale references as `bs` in code/config, and use `Bosanski` for the user-facing language name when applicable
+
+## Avoid
+
+- Avoid changing repo locale references from `bs` to another slug in code snippets or config examples
+- Avoid translating product and protocol names that are fixed identifiers
diff --git a/.opencode/glossary/da.md b/.opencode/glossary/da.md
new file mode 100644
index 0000000..e632221
--- /dev/null
+++ b/.opencode/glossary/da.md
@@ -0,0 +1,27 @@
+# da Glossary
+
+## Sources
+
+- PR #9821: https://github.com/anomalyco/opencode/pull/9821
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Danish phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Danish terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/de.md b/.opencode/glossary/de.md
new file mode 100644
index 0000000..0d2c49f
--- /dev/null
+++ b/.opencode/glossary/de.md
@@ -0,0 +1,27 @@
+# de Glossary
+
+## Sources
+
+- PR #9817: https://github.com/anomalyco/opencode/pull/9817
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural German phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple German terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/es.md b/.opencode/glossary/es.md
new file mode 100644
index 0000000..dc9b977
--- /dev/null
+++ b/.opencode/glossary/es.md
@@ -0,0 +1,27 @@
+# es Glossary
+
+## Sources
+
+- PR #9817: https://github.com/anomalyco/opencode/pull/9817
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Spanish phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Spanish terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/fr.md b/.opencode/glossary/fr.md
new file mode 100644
index 0000000..074c4de
--- /dev/null
+++ b/.opencode/glossary/fr.md
@@ -0,0 +1,27 @@
+# fr Glossary
+
+## Sources
+
+- PR #9821: https://github.com/anomalyco/opencode/pull/9821
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural French phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple French terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/ja.md b/.opencode/glossary/ja.md
new file mode 100644
index 0000000..f0159ca
--- /dev/null
+++ b/.opencode/glossary/ja.md
@@ -0,0 +1,33 @@
+# ja Glossary
+
+## Sources
+
+- PR #9821: https://github.com/anomalyco/opencode/pull/9821
+- PR #13160: https://github.com/anomalyco/opencode/pull/13160
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed wording preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| --------------------------- | ----------------------- | ------------------------------------- |
+| WSL integration (UI label) | `WSL連携` | PR #13160 prefers this over `WSL統合` |
+| WSL integration description | `WindowsのWSL環境で...` | PR #13160 improved phrasing naturally |
+
+## Guidance
+
+- Prefer natural Japanese phrasing over literal translation
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- In WSL integration text, follow PR #13160 wording direction for more natural Japanese phrasing
+
+## Avoid
+
+- Avoid `WSL統合` in the WSL integration UI context where `WSL連携` is the reviewed wording
+- Avoid translating product and protocol names that are fixed identifiers
diff --git a/.opencode/glossary/ko.md b/.opencode/glossary/ko.md
new file mode 100644
index 0000000..71385c8
--- /dev/null
+++ b/.opencode/glossary/ko.md
@@ -0,0 +1,27 @@
+# ko Glossary
+
+## Sources
+
+- PR #9817: https://github.com/anomalyco/opencode/pull/9817
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Korean phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Korean terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/no.md b/.opencode/glossary/no.md
new file mode 100644
index 0000000..d7159dc
--- /dev/null
+++ b/.opencode/glossary/no.md
@@ -0,0 +1,38 @@
+# no Glossary
+
+## Sources
+
+- PR #10018: https://github.com/anomalyco/opencode/pull/10018
+- PR #12935: https://github.com/anomalyco/opencode/pull/12935
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Sound names (PR #10018 notes these were intentionally left untranslated)
+
+## Preferred Terms
+
+These are PR-backed corrections and may evolve.
+
+| English / Context | Preferred | Notes |
+| ----------------------------------- | ------------ | ----------------------------- |
+| Save (data persistence action) | `Lagre` | Prefer over `Spare` |
+| Disabled (feature/state) | `deaktivert` | Prefer over `funksjonshemmet` |
+| API keys | `API Nøkler` | Prefer over `API Taster` |
+| Cost (noun) | `Kostnad` | Prefer over verb form `Koste` |
+| Show/View (imperative button label) | `Vis` | Prefer over `Utsikt` |
+
+## Guidance
+
+- Prefer natural Norwegian Bokmal (Bokmål) wording over literal translation
+- Keep tone clear and practical in UI labels
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep recurring UI terms consistent once a preferred term is chosen
+
+## Avoid
+
+- Avoid `Spare` for save actions in persistence contexts
+- Avoid `funksjonshemmet` for disabled feature states
+- Avoid `API Taster`, `Koste`, and `Utsikt` in the corrected contexts above
diff --git a/.opencode/glossary/pl.md b/.opencode/glossary/pl.md
new file mode 100644
index 0000000..e9bad7a
--- /dev/null
+++ b/.opencode/glossary/pl.md
@@ -0,0 +1,27 @@
+# pl Glossary
+
+## Sources
+
+- PR #9884: https://github.com/anomalyco/opencode/pull/9884
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Polish phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Polish terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/ru.md b/.opencode/glossary/ru.md
new file mode 100644
index 0000000..6fee0f9
--- /dev/null
+++ b/.opencode/glossary/ru.md
@@ -0,0 +1,27 @@
+# ru Glossary
+
+## Sources
+
+- PR #9882: https://github.com/anomalyco/opencode/pull/9882
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Russian phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Russian terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/glossary/th.md b/.opencode/glossary/th.md
new file mode 100644
index 0000000..7b5a31d
--- /dev/null
+++ b/.opencode/glossary/th.md
@@ -0,0 +1,34 @@
+# th Glossary
+
+## Sources
+
+- PR #10809: https://github.com/anomalyco/opencode/pull/10809
+- PR #11496: https://github.com/anomalyco/opencode/pull/11496
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ------------------------------------- | --------------------- | -------------------------------------------------------------------------------- |
+| Thai language label in language lists | `ไทย` | PR #10809 standardized this across locales |
+| Language names in language pickers | Native names (static) | PR #11496: keep names like `English`, `Deutsch`, `ไทย` consistent across locales |
+
+## Guidance
+
+- Prefer natural Thai phrasing over literal translation
+- Keep tone short and clear for buttons and labels
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep language names static/native in language pickers instead of translating them per current locale (PR #11496)
+
+## Avoid
+
+- Avoid translating language names differently per current locale in language lists
+- Avoid changing `ไทย` to another display form for the Thai language option unless the product standard changes
diff --git a/.opencode/glossary/tr.md b/.opencode/glossary/tr.md
new file mode 100644
index 0000000..72b1cdf
--- /dev/null
+++ b/.opencode/glossary/tr.md
@@ -0,0 +1,38 @@
+# tr Glossary
+
+## Sources
+
+- PR #15835: https://github.com/anomalyco/opencode/pull/15835
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose, docs, and UI copy)
+- Keep lowercase `opencode` in commands, package names, paths, URLs, and other exact identifiers
+- `` stays the literal key token in code blocks; use `Tab` for the nearby explanatory label in prose
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed wording preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ------------------------- | --------------------------------------- | ------------------------------------------------------------- |
+| available in beta | `beta olarak mevcut` | Prefer this over `beta olarak kullanılabilir` |
+| privacy-first | `Gizlilik öncelikli tasarlandı` | Prefer this over `Önce gizlilik için tasarlandı` |
+| connect your local models | `yerel modellerinizi bağlayabilirsiniz` | Use the fuller, more direct action phrase |
+| `` key label | `Tab` | Use `Tab` in prose; keep `` in literal UI or code blocks |
+| cross-platform | `cross-platform (tüm platformlarda)` | Keep the English term, add a short clarification when helpful |
+
+## Guidance
+
+- Prefer natural Turkish phrasing over literal translation
+- Merge broken sentence fragments into one clear sentence when the source is a single thought
+- Keep product naming consistent: `OpenCode` in prose, `opencode` only for exact technical identifiers
+- When an English technical term is intentionally kept, add a short Turkish clarification only if it improves readability
+
+## Avoid
+
+- Avoid `beta olarak kullanılabilir` when `beta olarak mevcut` fits
+- Avoid `Önce gizlilik için tasarlandı`; use the more natural reviewed wording instead
+- Avoid `Sekme` for the translated key label in prose when referring to ``
+- Avoid changing `opencode` to `OpenCode` inside commands, URLs, package names, or code literals
diff --git a/.opencode/glossary/zh-cn.md b/.opencode/glossary/zh-cn.md
new file mode 100644
index 0000000..054e94b
--- /dev/null
+++ b/.opencode/glossary/zh-cn.md
@@ -0,0 +1,42 @@
+# zh-cn Glossary
+
+## Sources
+
+- PR #13942: https://github.com/anomalyco/opencode/pull/13942
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only when it is part of commands, package names, paths, or code)
+- `OpenCode Zen`
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- `Model Context Protocol` (prefer the English expansion when introducing `MCP`)
+
+## Preferred Terms
+
+These are preferred terms for docs/UI prose and may evolve.
+
+| English | Preferred | Notes |
+| ----------------------- | --------- | ------------------------------------------- |
+| prompt | 提示词 | Keep `--prompt` unchanged in flags/code |
+| session | 会话 | |
+| provider | 提供商 | |
+| share link / shared URL | 分享链接 | Prefer `分享` for user-facing share actions |
+| headless (server) | 无界面 | Docs wording |
+| authentication | 认证 | Prefer in auth/OAuth contexts |
+| cache | 缓存 | |
+| keybind / shortcut | 快捷键 | User-facing docs wording |
+| workflow | 工作流 | e.g. GitHub Actions workflow |
+
+## Guidance
+
+- Prefer natural, concise phrasing over literal translation
+- Keep the tone direct and friendly (PR #13942 consistently moved wording in this direction)
+- Preserve technical artifacts exactly: commands, flags, code, inline code, URLs, file paths, model IDs
+- Keep enum-like values in English when they are literals (for example, `default`, `json`)
+- Prefer consistent terminology across pages once a term is chosen (`会话`, `提供商`, `提示词`, etc.)
+
+## Avoid
+
+- Avoid `opencode` in prose when referring to the product name; use `OpenCode`
+- Avoid mixing alternative terms for the same concept across docs when a preferred term is already established
diff --git a/.opencode/glossary/zh-tw.md b/.opencode/glossary/zh-tw.md
new file mode 100644
index 0000000..283660e
--- /dev/null
+++ b/.opencode/glossary/zh-tw.md
@@ -0,0 +1,42 @@
+# zh-tw Glossary
+
+## Sources
+
+- PR #13942: https://github.com/anomalyco/opencode/pull/13942
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only when it is part of commands, package names, paths, or code)
+- `OpenCode Zen`
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- `Model Context Protocol` (prefer the English expansion when introducing `MCP`)
+
+## Preferred Terms
+
+These are preferred terms for docs/UI prose and may evolve.
+
+| English | Preferred | Notes |
+| ----------------------- | --------- | ------------------------------------------- |
+| prompt | 提示詞 | Keep `--prompt` unchanged in flags/code |
+| session | 工作階段 | |
+| provider | 供應商 | |
+| share link / shared URL | 分享連結 | Prefer `分享` for user-facing share actions |
+| headless (server) | 無介面 | Docs wording |
+| authentication | 認證 | Prefer in auth/OAuth contexts |
+| cache | 快取 | |
+| keybind / shortcut | 快捷鍵 | User-facing docs wording |
+| workflow | 工作流程 | e.g. GitHub Actions workflow |
+
+## Guidance
+
+- Prefer natural, concise phrasing over literal translation
+- Keep the tone direct and friendly (PR #13942 consistently moved wording in this direction)
+- Preserve technical artifacts exactly: commands, flags, code, inline code, URLs, file paths, model IDs
+- Keep enum-like values in English when they are literals (for example, `default`, `json`)
+- Prefer consistent terminology across pages once a term is chosen (`工作階段`, `供應商`, `提示詞`, etc.)
+
+## Avoid
+
+- Avoid `opencode` in prose when referring to the product name; use `OpenCode`
+- Avoid mixing alternative terms for the same concept across docs when a preferred term is already established
diff --git a/.opencode/opencode.jsonc b/.opencode/opencode.jsonc
new file mode 100644
index 0000000..b0f7d59
--- /dev/null
+++ b/.opencode/opencode.jsonc
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://opencode.ai/config.json",
+ "provider": {},
+ "permission": {},
+ "references": {
+ "effect": {
+ "repository": "github.com/Effect-TS/effect-smol",
+ "description": "Use for Effect v4 and effect-smol implementation details",
+ },
+ "opencode-local": {
+ "path": "~/.local/share/opencode",
+ "description": "Contains opencode logs and data",
+ },
+ },
+ "mcp": {},
+ "tools": {
+ "github-triage": false,
+ "github-pr-search": false,
+ },
+}
diff --git a/.opencode/plugins/smoke-theme.json b/.opencode/plugins/smoke-theme.json
new file mode 100644
index 0000000..6e4595d
--- /dev/null
+++ b/.opencode/plugins/smoke-theme.json
@@ -0,0 +1,223 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "nord0": "#2E3440",
+ "nord1": "#3B4252",
+ "nord2": "#434C5E",
+ "nord3": "#4C566A",
+ "nord4": "#D8DEE9",
+ "nord5": "#E5E9F0",
+ "nord6": "#ECEFF4",
+ "nord7": "#8FBCBB",
+ "nord8": "#88C0D0",
+ "nord9": "#81A1C1",
+ "nord10": "#5E81AC",
+ "nord11": "#BF616A",
+ "nord12": "#D08770",
+ "nord13": "#EBCB8B",
+ "nord14": "#A3BE8C",
+ "nord15": "#B48EAD"
+ },
+ "theme": {
+ "primary": {
+ "dark": "nord10",
+ "light": "nord9"
+ },
+ "secondary": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "accent": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "error": {
+ "dark": "nord11",
+ "light": "nord11"
+ },
+ "warning": {
+ "dark": "nord12",
+ "light": "nord12"
+ },
+ "success": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "info": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "text": {
+ "dark": "nord6",
+ "light": "nord0"
+ },
+ "textMuted": {
+ "dark": "#8B95A7",
+ "light": "nord1"
+ },
+ "background": {
+ "dark": "nord0",
+ "light": "nord6"
+ },
+ "backgroundPanel": {
+ "dark": "nord1",
+ "light": "nord5"
+ },
+ "backgroundElement": {
+ "dark": "nord2",
+ "light": "nord4"
+ },
+ "border": {
+ "dark": "nord2",
+ "light": "nord3"
+ },
+ "borderActive": {
+ "dark": "nord3",
+ "light": "nord2"
+ },
+ "borderSubtle": {
+ "dark": "nord2",
+ "light": "nord3"
+ },
+ "diffAdded": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "diffRemoved": {
+ "dark": "nord11",
+ "light": "nord11"
+ },
+ "diffContext": {
+ "dark": "#8B95A7",
+ "light": "nord3"
+ },
+ "diffHunkHeader": {
+ "dark": "#8B95A7",
+ "light": "nord3"
+ },
+ "diffHighlightAdded": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "diffHighlightRemoved": {
+ "dark": "nord11",
+ "light": "nord11"
+ },
+ "diffAddedBg": {
+ "dark": "#36413C",
+ "light": "#E6EBE7"
+ },
+ "diffRemovedBg": {
+ "dark": "#43393D",
+ "light": "#ECE6E8"
+ },
+ "diffContextBg": {
+ "dark": "nord1",
+ "light": "nord5"
+ },
+ "diffLineNumber": {
+ "dark": "nord2",
+ "light": "nord4"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#303A35",
+ "light": "#DDE4DF"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#3C3336",
+ "light": "#E4DDE0"
+ },
+ "markdownText": {
+ "dark": "nord4",
+ "light": "nord0"
+ },
+ "markdownHeading": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "markdownLink": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "markdownLinkText": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "markdownCode": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "markdownBlockQuote": {
+ "dark": "#8B95A7",
+ "light": "nord3"
+ },
+ "markdownEmph": {
+ "dark": "nord12",
+ "light": "nord12"
+ },
+ "markdownStrong": {
+ "dark": "nord13",
+ "light": "nord13"
+ },
+ "markdownHorizontalRule": {
+ "dark": "#8B95A7",
+ "light": "nord3"
+ },
+ "markdownListItem": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "markdownListEnumeration": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "markdownImage": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "markdownImageText": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "markdownCodeBlock": {
+ "dark": "nord4",
+ "light": "nord0"
+ },
+ "syntaxComment": {
+ "dark": "#8B95A7",
+ "light": "nord3"
+ },
+ "syntaxKeyword": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "syntaxFunction": {
+ "dark": "nord8",
+ "light": "nord8"
+ },
+ "syntaxVariable": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "syntaxString": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "syntaxNumber": {
+ "dark": "nord15",
+ "light": "nord15"
+ },
+ "syntaxType": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "syntaxOperator": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "syntaxPunctuation": {
+ "dark": "nord4",
+ "light": "nord0"
+ }
+ }
+}
diff --git a/.opencode/plugins/tui-smoke.tsx b/.opencode/plugins/tui-smoke.tsx
new file mode 100644
index 0000000..2d3095a
--- /dev/null
+++ b/.opencode/plugins/tui-smoke.tsx
@@ -0,0 +1,1019 @@
+/** @jsxImportSource @opentui/solid */
+import { useTerminalDimensions, type JSX } from "@opentui/solid"
+import { useBindings, useKeymapSelector } from "@opentui/keymap/solid"
+import { RGBA, VignetteEffect, type KeyEvent, type Renderable } from "@opentui/core"
+import { createBindingLookup, type BindingConfig } from "@opentui/keymap/extras"
+import type { TuiPlugin, TuiPluginApi, TuiPluginMeta, TuiPluginModule, TuiSlotPlugin } from "@opencode-ai/plugin/tui"
+
+const tabs = ["overview", "counter", "help"]
+const command = {
+ modal: "smoke_modal",
+ screen: "smoke_screen",
+ alert: "smoke_alert",
+ confirm: "smoke_confirm",
+ prompt: "smoke_prompt",
+ select: "smoke_select",
+ host: "smoke_host",
+ home: "smoke_home",
+ toast: "smoke_toast",
+ dialog_close: "smoke_dialog_close",
+ local_push: "smoke_local_push",
+ local_pop: "smoke_local_pop",
+ screen_home: "smoke_screen_home",
+ screen_left: "smoke_screen_left",
+ screen_right: "smoke_screen_right",
+ screen_up: "smoke_screen_up",
+ screen_down: "smoke_screen_down",
+ screen_modal: "smoke_screen_modal",
+ screen_local: "smoke_screen_local",
+ screen_host: "smoke_screen_host",
+ screen_alert: "smoke_screen_alert",
+ screen_confirm: "smoke_screen_confirm",
+ screen_prompt: "smoke_screen_prompt",
+ screen_select: "smoke_screen_select",
+ modal_accept: "smoke_modal_accept",
+ modal_close: "smoke_modal_close",
+}
+
+type SmokeBindings = BindingConfig
+
+const defaultKeymap = {
+ [command.modal]: "ctrl+shift+m",
+ [command.screen]: "ctrl+shift+o",
+ [command.dialog_close]: "escape",
+ [command.local_push]: "enter,return",
+ [command.local_pop]: "escape,q,backspace",
+ [command.screen_home]: "escape,ctrl+h",
+ [command.screen_left]: "left,h",
+ [command.screen_right]: "right,l",
+ [command.screen_up]: "up,k",
+ [command.screen_down]: "down,j",
+ [command.screen_modal]: "ctrl+shift+m",
+ [command.screen_local]: "x",
+ [command.screen_host]: "z",
+ [command.screen_alert]: "a",
+ [command.screen_confirm]: "c",
+ [command.screen_prompt]: "p",
+ [command.screen_select]: "s",
+ [command.modal_accept]: "enter,return",
+ [command.modal_close]: "escape",
+}
+
+const pick = (value: unknown, fallback: string) => {
+ if (typeof value !== "string") return fallback
+ if (!value.trim()) return fallback
+ return value
+}
+
+const num = (value: unknown, fallback: number) => {
+ if (typeof value !== "number") return fallback
+ return value
+}
+
+const record = (value: unknown): value is Record =>
+ !!value && typeof value === "object" && !Array.isArray(value)
+
+type Cfg = {
+ label: string
+ route: string
+ vignette: number
+ keybinds: SmokeBindings | undefined
+}
+
+type Route = {
+ modal: string
+ screen: string
+}
+
+type State = {
+ tab: number
+ count: number
+ source: string
+ note: string
+ selected: string
+ local: number
+}
+
+const cfg = (options: Record | undefined) => {
+ return {
+ label: pick(options?.label, "smoke"),
+ route: pick(options?.route, "workspace-smoke"),
+ vignette: Math.max(0, num(options?.vignette, 0.35)),
+ keybinds: record(options?.keybinds) ? (options.keybinds as SmokeBindings) : undefined,
+ }
+}
+
+const names = (input: Cfg) => {
+ return {
+ modal: `${input.route}.modal`,
+ screen: `${input.route}.screen`,
+ }
+}
+
+function createKeys(input: SmokeBindings | undefined) {
+ return createBindingLookup({ ...defaultKeymap, ...input })
+}
+
+type Keys = ReturnType
+
+const ui = {
+ panel: "#1d1d1d",
+ border: "#4a4a4a",
+ text: "#f0f0f0",
+ muted: "#a5a5a5",
+ accent: "#5f87ff",
+}
+
+type Color = RGBA | string
+
+const ink = (map: Record, name: string, fallback: string): Color => {
+ const value = map[name]
+ if (typeof value === "string") return value
+ if (value instanceof RGBA) return value
+ return fallback
+}
+
+const look = (map: Record) => {
+ return {
+ panel: ink(map, "backgroundPanel", ui.panel),
+ border: ink(map, "border", ui.border),
+ text: ink(map, "text", ui.text),
+ muted: ink(map, "textMuted", ui.muted),
+ accent: ink(map, "primary", ui.accent),
+ selected: ink(map, "selectedListItemText", ui.text),
+ }
+}
+
+const tone = (api: TuiPluginApi) => {
+ return look(api.theme.current)
+}
+
+type Skin = {
+ panel: Color
+ border: Color
+ text: Color
+ muted: Color
+ accent: Color
+ selected: Color
+}
+
+const Btn = (props: { txt: string; run: () => void; skin: Skin; on?: boolean }) => {
+ return (
+ {
+ props.run()
+ }}
+ backgroundColor={props.on ? props.skin.accent : props.skin.border}
+ paddingLeft={1}
+ paddingRight={1}
+ >
+ {props.txt}
+
+ )
+}
+
+const parse = (params: Record | undefined) => {
+ const tab = typeof params?.tab === "number" ? params.tab : 0
+ const count = typeof params?.count === "number" ? params.count : 0
+ const source = typeof params?.source === "string" ? params.source : "unknown"
+ const note = typeof params?.note === "string" ? params.note : ""
+ const selected = typeof params?.selected === "string" ? params.selected : ""
+ const local = typeof params?.local === "number" ? params.local : 0
+ return {
+ tab: Math.max(0, Math.min(tab, tabs.length - 1)),
+ count,
+ source,
+ note,
+ selected,
+ local: Math.max(0, local),
+ }
+}
+
+const current = (api: TuiPluginApi, route: Route) => {
+ const value = api.route.current
+ const ok = Object.values(route).includes(value.name)
+ if (!ok) return parse(undefined)
+ if (!("params" in value)) return parse(undefined)
+ return parse(value.params)
+}
+
+const opts = [
+ {
+ title: "Overview",
+ value: 0,
+ description: "Switch to overview tab",
+ },
+ {
+ title: "Counter",
+ value: 1,
+ description: "Switch to counter tab",
+ },
+ {
+ title: "Help",
+ value: 2,
+ description: "Switch to help tab",
+ },
+]
+
+const host = (api: TuiPluginApi, input: Cfg, skin: Skin) => {
+ api.ui.dialog.setSize("medium")
+ api.ui.dialog.replace(() => (
+
+
+ {input.label} host overlay
+
+ Using api.ui.dialog stack with built-in backdrop
+ esc closes · depth {api.ui.dialog.depth}
+
+ api.ui.dialog.clear()} skin={skin} on />
+
+
+ ))
+}
+
+const warn = (api: TuiPluginApi, route: Route, value: State) => {
+ const DialogAlert = api.ui.DialogAlert
+ api.ui.dialog.setSize("medium")
+ api.ui.dialog.replace(() => (
+ api.route.navigate(route.screen, { ...value, source: "alert" })}
+ />
+ ))
+}
+
+const check = (api: TuiPluginApi, route: Route, value: State) => {
+ const DialogConfirm = api.ui.DialogConfirm
+ api.ui.dialog.setSize("medium")
+ api.ui.dialog.replace(() => (
+ api.route.navigate(route.screen, { ...value, count: value.count + 1, source: "confirm" })}
+ onCancel={() => api.route.navigate(route.screen, { ...value, source: "confirm-cancel" })}
+ />
+ ))
+}
+
+const entry = (api: TuiPluginApi, route: Route, value: State) => {
+ const DialogPrompt = api.ui.DialogPrompt
+ api.ui.dialog.setSize("medium")
+ api.ui.dialog.replace(() => (
+ {
+ api.ui.dialog.clear()
+ api.route.navigate(route.screen, { ...value, note, source: "prompt" })
+ }}
+ onCancel={() => {
+ api.ui.dialog.clear()
+ api.route.navigate(route.screen, value)
+ }}
+ />
+ ))
+}
+
+const picker = (api: TuiPluginApi, route: Route, value: State) => {
+ const DialogSelect = api.ui.DialogSelect
+ api.ui.dialog.setSize("medium")
+ api.ui.dialog.replace(() => (
+ {
+ api.ui.dialog.clear()
+ api.route.navigate(route.screen, {
+ ...value,
+ tab: typeof item.value === "number" ? item.value : value.tab,
+ selected: item.title,
+ source: "select",
+ })
+ }}
+ />
+ ))
+}
+
+const Screen = (props: {
+ api: TuiPluginApi
+ input: Cfg
+ route: Route
+ keys: Keys
+ meta: TuiPluginMeta
+ params?: Record
+}) => {
+ const dim = useTerminalDimensions()
+ const value = parse(props.params)
+ const skin = tone(props.api)
+ const set = (local: number, base?: State) => {
+ const next = base ?? current(props.api, props.route)
+ props.api.route.navigate(props.route.screen, { ...next, local: Math.max(0, local), source: "local" })
+ }
+ const push = (base?: State) => {
+ const next = base ?? current(props.api, props.route)
+ set(next.local + 1, next)
+ }
+ const open = () => {
+ const next = current(props.api, props.route)
+ if (next.local > 0) return
+ set(1, next)
+ }
+ const pop = (base?: State) => {
+ const next = base ?? current(props.api, props.route)
+ set(Math.max(0, next.local - 1), next)
+ }
+ const show = () => {
+ setTimeout(() => {
+ open()
+ }, 0)
+ }
+ const screenActive = () => props.api.route.current.name === props.route.screen
+
+ useBindings(() => ({
+ enabled: () => screenActive() && props.api.ui.dialog.open,
+ commands: [
+ {
+ name: command.dialog_close,
+ run() {
+ props.api.ui.dialog.clear()
+ },
+ },
+ ],
+ bindings: props.keys.gather("smoke.dialog", [command.dialog_close]),
+ }))
+
+ useBindings(() => ({
+ enabled: () => screenActive() && !props.api.ui.dialog.open && current(props.api, props.route).local > 0,
+ commands: [
+ {
+ name: command.local_push,
+ run() {
+ push(current(props.api, props.route))
+ },
+ },
+ {
+ name: command.local_pop,
+ run() {
+ pop(current(props.api, props.route))
+ },
+ },
+ ],
+ bindings: props.keys.gather("smoke.local", [command.local_push, command.local_pop]),
+ }))
+
+ useBindings(() => ({
+ enabled: () => screenActive() && !props.api.ui.dialog.open && current(props.api, props.route).local === 0,
+ commands: [
+ {
+ name: command.screen_home,
+ run() {
+ props.api.route.navigate("home")
+ },
+ },
+ {
+ name: command.screen_left,
+ run() {
+ const next = current(props.api, props.route)
+ props.api.route.navigate(props.route.screen, { ...next, tab: (next.tab - 1 + tabs.length) % tabs.length })
+ },
+ },
+ {
+ name: command.screen_right,
+ run() {
+ const next = current(props.api, props.route)
+ props.api.route.navigate(props.route.screen, { ...next, tab: (next.tab + 1) % tabs.length })
+ },
+ },
+ {
+ name: command.screen_up,
+ run() {
+ const next = current(props.api, props.route)
+ props.api.route.navigate(props.route.screen, { ...next, count: next.count + 1 })
+ },
+ },
+ {
+ name: command.screen_down,
+ run() {
+ const next = current(props.api, props.route)
+ props.api.route.navigate(props.route.screen, { ...next, count: next.count - 1 })
+ },
+ },
+ {
+ name: command.screen_modal,
+ run() {
+ props.api.route.navigate(props.route.modal, current(props.api, props.route))
+ },
+ },
+ {
+ name: command.screen_local,
+ run() {
+ open()
+ },
+ },
+ {
+ name: command.screen_host,
+ run() {
+ host(props.api, props.input, skin)
+ },
+ },
+ {
+ name: command.screen_alert,
+ run() {
+ warn(props.api, props.route, current(props.api, props.route))
+ },
+ },
+ {
+ name: command.screen_confirm,
+ run() {
+ check(props.api, props.route, current(props.api, props.route))
+ },
+ },
+ {
+ name: command.screen_prompt,
+ run() {
+ entry(props.api, props.route, current(props.api, props.route))
+ },
+ },
+ {
+ name: command.screen_select,
+ run() {
+ picker(props.api, props.route, current(props.api, props.route))
+ },
+ },
+ ],
+ bindings: props.keys.gather("smoke.screen", [
+ command.screen_home,
+ command.screen_left,
+ command.screen_right,
+ command.screen_up,
+ command.screen_down,
+ command.screen_modal,
+ command.screen_local,
+ command.screen_host,
+ command.screen_alert,
+ command.screen_confirm,
+ command.screen_prompt,
+ command.screen_select,
+ ]),
+ }))
+ const shortcuts = useKeymapSelector((keymap) => {
+ const bindings = keymap.getCommandBindings({
+ visibility: "registered",
+ commands: [
+ command.screen_home,
+ command.screen_up,
+ command.screen_down,
+ command.screen_modal,
+ command.screen_alert,
+ command.screen_confirm,
+ command.screen_prompt,
+ command.screen_select,
+ command.screen_local,
+ command.screen_host,
+ command.local_push,
+ command.local_pop,
+ ],
+ })
+
+ return {
+ screen_home: props.api.keys.formatBindings(bindings.get(command.screen_home)) ?? "",
+ screen_up: props.api.keys.formatBindings(bindings.get(command.screen_up)) ?? "",
+ screen_down: props.api.keys.formatBindings(bindings.get(command.screen_down)) ?? "",
+ screen_modal: props.api.keys.formatBindings(bindings.get(command.screen_modal)) ?? "",
+ screen_alert: props.api.keys.formatBindings(bindings.get(command.screen_alert)) ?? "",
+ screen_confirm: props.api.keys.formatBindings(bindings.get(command.screen_confirm)) ?? "",
+ screen_prompt: props.api.keys.formatBindings(bindings.get(command.screen_prompt)) ?? "",
+ screen_select: props.api.keys.formatBindings(bindings.get(command.screen_select)) ?? "",
+ screen_local: props.api.keys.formatBindings(bindings.get(command.screen_local)) ?? "",
+ screen_host: props.api.keys.formatBindings(bindings.get(command.screen_host)) ?? "",
+ local_push: props.api.keys.formatBindings(bindings.get(command.local_push)) ?? "",
+ local_pop: props.api.keys.formatBindings(bindings.get(command.local_pop)) ?? "",
+ }
+ })
+
+ return (
+
+
+
+
+ {props.input.label} screen
+ plugin route
+
+ {shortcuts().screen_home} home
+
+
+
+ {tabs.map((item, i) => {
+ const on = value.tab === i
+ return (
+ props.api.route.navigate(props.route.screen, { ...value, tab: i })}
+ skin={skin}
+ on={on}
+ />
+ )
+ })}
+
+
+
+ {value.tab === 0 ? (
+
+ Route: {props.route.screen}
+ plugin state: {props.meta.state}
+
+ first: {props.meta.state === "first" ? "yes" : "no"} · updated:{" "}
+ {props.meta.state === "updated" ? "yes" : "no"} · loads: {props.meta.load_count}
+
+ plugin source: {props.meta.source}
+ source: {value.source}
+ note: {value.note || "(none)"}
+ selected: {value.selected || "(none)"}
+ local stack depth: {value.local}
+ host stack open: {props.api.ui.dialog.open ? "yes" : "no"}
+
+ ) : null}
+
+ {value.tab === 1 ? (
+
+ Counter: {value.count}
+
+ {shortcuts().screen_up} / {shortcuts().screen_down} change value
+
+
+ ) : null}
+
+ {value.tab === 2 ? (
+
+
+ {shortcuts().screen_modal} modal | {shortcuts().screen_alert} alert | {shortcuts().screen_confirm}{" "}
+ confirm | {shortcuts().screen_prompt} prompt | {shortcuts().screen_select} select
+
+
+ {shortcuts().screen_local} local stack | {shortcuts().screen_host} host stack
+
+
+ local open: {shortcuts().local_push} push nested · {shortcuts().local_pop} close
+
+ {shortcuts().screen_home} returns home
+
+ ) : null}
+
+
+
+ props.api.route.navigate("home")} skin={skin} />
+ props.api.route.navigate(props.route.modal, value)} skin={skin} on />
+
+ host(props.api, props.input, skin)} skin={skin} />
+ warn(props.api, props.route, value)} skin={skin} />
+ check(props.api, props.route, value)} skin={skin} />
+ entry(props.api, props.route, value)} skin={skin} />
+ picker(props.api, props.route, value)} skin={skin} />
+
+
+
+ 0}
+ width={dim().width}
+ height={dim().height}
+ alignItems="center"
+ position="absolute"
+ zIndex={3000}
+ paddingTop={dim().height / 4}
+ left={0}
+ top={0}
+ backgroundColor={RGBA.fromInts(0, 0, 0, 160)}
+ onMouseUp={() => {
+ pop()
+ }}
+ >
+ {
+ evt.stopPropagation()
+ }}
+ width={60}
+ maxWidth={dim().width - 2}
+ backgroundColor={skin.panel}
+ border
+ borderColor={skin.border}
+ paddingTop={1}
+ paddingBottom={1}
+ paddingLeft={2}
+ paddingRight={2}
+ gap={1}
+ flexDirection="column"
+ >
+
+ {props.input.label} local overlay
+
+ Plugin-owned stack depth: {value.local}
+
+ {shortcuts().local_push} push nested · {shortcuts().local_pop} pop/close
+
+
+
+
+
+
+
+
+ )
+}
+
+const Modal = (props: {
+ api: TuiPluginApi
+ input: Cfg
+ route: Route
+ keys: Keys
+ params?: Record
+}) => {
+ const Dialog = props.api.ui.Dialog
+ const value = parse(props.params)
+ const skin = tone(props.api)
+
+ useBindings(() => ({
+ enabled: () => props.api.route.current.name === props.route.modal,
+ commands: [
+ {
+ name: command.modal_accept,
+ run() {
+ props.api.route.navigate(props.route.screen, { ...parse(props.params), source: "modal" })
+ },
+ },
+ {
+ name: command.modal_close,
+ run() {
+ props.api.route.navigate("home")
+ },
+ },
+ ],
+ bindings: props.keys.gather("smoke.modal", [command.modal_accept, command.modal_close]),
+ }))
+ const shortcuts = useKeymapSelector((keymap) => {
+ const bindings = keymap.getCommandBindings({
+ visibility: "registered",
+ commands: [command.modal, command.screen, command.modal_accept, command.modal_close],
+ })
+
+ return {
+ modal: props.api.keys.formatBindings(bindings.get(command.modal)) ?? "",
+ screen: props.api.keys.formatBindings(bindings.get(command.screen)) ?? "",
+ modal_accept: props.api.keys.formatBindings(bindings.get(command.modal_accept)) ?? "",
+ modal_close: props.api.keys.formatBindings(bindings.get(command.modal_close)) ?? "",
+ }
+ })
+
+ return (
+
+ props.api.route.navigate("home")}>
+
+
+ {props.input.label} modal
+
+ {shortcuts().modal} modal command
+ {shortcuts().screen} screen command
+
+ {shortcuts().modal_accept} opens screen · {shortcuts().modal_close} closes
+
+
+ props.api.route.navigate(props.route.screen, { ...value, source: "modal" })}
+ skin={skin}
+ on
+ />
+ props.api.route.navigate("home")} skin={skin} />
+
+
+
+
+ )
+}
+
+const home = (api: TuiPluginApi, input: Cfg) => ({
+ slots: {
+ home_logo(ctx) {
+ const map = ctx.theme.current
+ const skin = look(map)
+ const art = [
+ " $$\\",
+ " $$ |",
+ " $$$$$$$\\ $$$$$$\\$$$$\\ $$$$$$\\ $$ | $$\\ $$$$$$\\",
+ "$$ _____|$$ _$$ _$$\\ $$ __$$\\ $$ | $$ |$$ __$$\\",
+ "\\$$$$$$\\ $$ / $$ / $$ |$$ / $$ |$$$$$$ / $$$$$$$$ |",
+ " \\____$$\\ $$ | $$ | $$ |$$ | $$ |$$ _$$< $$ ____|",
+ "$$$$$$$ |$$ | $$ | $$ |\\$$$$$$ |$$ | \\$$\\ \\$$$$$$$\\",
+ "\\_______/ \\__| \\__| \\__| \\______/ \\__| \\__| \\_______|",
+ ]
+ const fill = [
+ skin.accent,
+ skin.muted,
+ ink(map, "info", ui.accent),
+ skin.text,
+ ink(map, "success", ui.accent),
+ ink(map, "warning", ui.accent),
+ ink(map, "secondary", ui.accent),
+ ink(map, "error", ui.accent),
+ ]
+
+ return (
+
+ {art.map((line, i) => (
+ {line}
+ ))}
+
+ )
+ },
+ home_prompt(ctx, value) {
+ const skin = look(ctx.theme.current)
+ const Prompt = api.ui.Prompt
+ const Slot = api.ui.Slot
+ const normal = [
+ `[SMOKE] route check for ${input.label}`,
+ "[SMOKE] confirm home_prompt slot override",
+ "[SMOKE] verify prompt-right slot passthrough",
+ ]
+ const shell = ["printf '[SMOKE] home prompt\n'", "git status --short", "bun --version"]
+ const hint = (
+
+
+ • smoke home prompt
+
+
+ )
+
+ return (
+
+
+
+
+ }
+ placeholders={{ normal, shell }}
+ />
+ )
+ },
+ home_prompt_right(ctx, value) {
+ const skin = look(ctx.theme.current)
+ const id = value.workspace_id?.slice(0, 8) ?? "none"
+ return (
+
+ {input.label} home:{id}
+
+ )
+ },
+ session_prompt_right(ctx, value) {
+ const skin = look(ctx.theme.current)
+ return (
+
+ {input.label} session:{value.session_id.slice(0, 8)}
+
+ )
+ },
+ smoke_prompt_right(ctx, value) {
+ const skin = look(ctx.theme.current)
+ const id = typeof value.workspace_id === "string" ? value.workspace_id.slice(0, 8) : "none"
+ const label = typeof value.label === "string" ? value.label : input.label
+ return (
+
+ {label} custom:{id}
+
+ )
+ },
+ home_bottom(ctx) {
+ const skin = look(ctx.theme.current)
+ const text = "extra content in the unified home bottom slot"
+
+ return (
+
+
+
+ {input.label} {text}
+
+
+
+ )
+ },
+ },
+})
+
+const block = (input: Cfg, order: number, title: string, text: string): TuiSlotPlugin => ({
+ order,
+ slots: {
+ sidebar_content(ctx, value) {
+ const skin = look(ctx.theme.current)
+
+ return (
+
+
+ {title}
+
+ {text}
+
+ {input.label} order {order} · session {value.session_id.slice(0, 8)}
+
+
+ )
+ },
+ },
+})
+
+const slot = (api: TuiPluginApi, input: Cfg): TuiSlotPlugin[] => [
+ home(api, input),
+ block(input, 50, "Smoke above", "renders above internal sidebar blocks"),
+ block(input, 250, "Smoke between", "renders between internal sidebar blocks"),
+ block(input, 650, "Smoke below", "renders below internal sidebar blocks"),
+]
+
+const reg = (api: TuiPluginApi, input: Cfg, keys: Keys) => {
+ const route = names(input)
+ api.keymap.registerLayer({
+ commands: [
+ {
+ name: command.modal,
+ title: `${input.label} modal`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke",
+ run() {
+ api.route.navigate(route.modal, { source: "command" })
+ },
+ },
+ {
+ name: command.screen,
+ title: `${input.label} screen`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke-screen",
+ run() {
+ api.route.navigate(route.screen, { source: "command", tab: 0, count: 0 })
+ },
+ },
+ {
+ name: command.alert,
+ title: `${input.label} alert dialog`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke-alert",
+ run() {
+ warn(api, route, current(api, route))
+ },
+ },
+ {
+ name: command.confirm,
+ title: `${input.label} confirm dialog`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke-confirm",
+ run() {
+ check(api, route, current(api, route))
+ },
+ },
+ {
+ name: command.prompt,
+ title: `${input.label} prompt dialog`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke-prompt",
+ run() {
+ entry(api, route, current(api, route))
+ },
+ },
+ {
+ name: command.select,
+ title: `${input.label} select dialog`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke-select",
+ run() {
+ picker(api, route, current(api, route))
+ },
+ },
+ {
+ name: command.host,
+ title: `${input.label} host overlay`,
+ category: "Plugin",
+ namespace: "palette",
+ slashName: "smoke-host",
+ run() {
+ host(api, input, tone(api))
+ },
+ },
+ {
+ name: command.home,
+ title: `${input.label} go home`,
+ category: "Plugin",
+ namespace: "palette",
+ enabled: () => api.route.current.name !== "home",
+ run() {
+ api.route.navigate("home")
+ },
+ },
+ {
+ name: command.toast,
+ title: `${input.label} toast`,
+ category: "Plugin",
+ namespace: "palette",
+ run() {
+ api.ui.toast({
+ variant: "info",
+ title: "Smoke",
+ message: "Plugin toast works",
+ duration: 2000,
+ })
+ },
+ },
+ ],
+ bindings: keys.gather("smoke.global", [
+ command.modal,
+ command.screen,
+ command.alert,
+ command.confirm,
+ command.prompt,
+ command.select,
+ command.host,
+ command.home,
+ command.toast,
+ ]),
+ })
+}
+
+const tui: TuiPlugin = async (api, options, meta) => {
+ if (options?.enabled === false) return
+
+ await api.theme.install("./smoke-theme.json")
+ api.theme.set("smoke-theme")
+
+ const value = cfg(options)
+ const route = names(value)
+ const keys = createKeys(value.keybinds)
+ const fx = new VignetteEffect(value.vignette)
+ const post = fx.apply.bind(fx)
+ api.renderer.addPostProcessFn(post)
+ api.lifecycle.onDispose(() => {
+ api.renderer.removePostProcessFn(post)
+ })
+
+ api.route.register([
+ {
+ name: route.screen,
+ render: ({ params }) => ,
+ },
+ {
+ name: route.modal,
+ render: ({ params }) => ,
+ },
+ ])
+
+ reg(api, value, keys)
+ for (const item of slot(api, value)) {
+ api.slots.register(item)
+ }
+}
+
+const plugin: TuiPluginModule & { id: string } = {
+ id: "tui-smoke",
+ tui,
+}
+
+export default plugin
diff --git a/.opencode/skills/effect/SKILL.md b/.opencode/skills/effect/SKILL.md
new file mode 100644
index 0000000..3a44fa8
--- /dev/null
+++ b/.opencode/skills/effect/SKILL.md
@@ -0,0 +1,38 @@
+---
+name: effect
+description: Work with Effect v4 / effect-smol TypeScript code in this repo
+---
+
+# Effect
+
+This codebase uses Effect for typed, composable TypeScript services, schemas, and workflows.
+
+## Source Of Truth
+
+Use the current Effect v4 / effect-smol source, not memory or older Effect v2/v3 examples.
+
+1. If `.opencode/references/effect-smol` is missing, clone `https://github.com/Effect-TS/effect-smol` there. Do this in the project, not in the skill folder.
+2. Search `.opencode/references/effect-smol` for exact APIs, examples, tests, and naming patterns before answering or implementing Effect-specific code.
+3. Also inspect existing repo code for local house style before introducing new patterns.
+4. Prefer answers and implementations backed by specific source files or nearby repo examples.
+
+## Guidelines
+
+- Prefer current Effect v4 APIs and project-local patterns over old blog posts, examples, or package-memory guesses.
+- Use `Effect.gen(function* () { ... })` for multi-step workflows.
+- Use `Effect.fn("Name")` or `Effect.fnUntraced(...)` for named effects when adding reusable service methods or important workflows.
+- Prefer Effect `Schema` for API and domain data shapes. Use branded schemas for IDs and `Schema.TaggedErrorClass` for typed domain errors when modeling new error surfaces.
+- Keep HTTP handlers thin: decode input, read request context, call services, and map transport errors. Put business rules in services.
+- In Effect service code, prefer Effect-aware platform abstractions and dependencies over ad hoc promises where the surrounding code already does so.
+- Keep layer composition explicit. Avoid broad hidden provisioning that makes missing dependencies hard to see.
+- In tests, prefer the repo's existing Effect test helpers and live tests for filesystem, git, child process, locks, or timing behavior.
+- Do not introduce `any`, non-null assertions, unchecked casts, or older Effect APIs just to satisfy types.
+- Do not answer from memory. Verify against `.opencode/references/effect-smol` or nearby code first.
+
+## Testing Patterns
+
+- Use `testEffect(...)` from `packages/opencode/test/lib/effect.ts` for tests that exercise Effect services, layers, runtime context, scoped resources, or platform integrations.
+- Use `it.live(...)` for filesystem, git repositories, HTTP servers, sockets, child processes, locks, real time, and other live platform behavior.
+- Run tests from package directories such as `packages/opencode`; never run package tests from the repo root.
+- Prefer explicit test layers over ad hoc managed runtimes. Keep dependency provisioning visible in the test file.
+- Use scoped fixtures and finalizers for resources that must be cleaned up, including temporary directories, flags, databases, fibers, servers, and global state.
diff --git a/.opencode/themes/.gitignore b/.opencode/themes/.gitignore
new file mode 100644
index 0000000..5b41319
--- /dev/null
+++ b/.opencode/themes/.gitignore
@@ -0,0 +1 @@
+smoke-theme.json
diff --git a/.opencode/themes/mytheme.json b/.opencode/themes/mytheme.json
new file mode 100644
index 0000000..0e6b948
--- /dev/null
+++ b/.opencode/themes/mytheme.json
@@ -0,0 +1,223 @@
+{
+ "$schema": "https://opencode.ai/theme.json",
+ "defs": {
+ "nord0": "#2E3440",
+ "nord1": "#3B4252",
+ "nord2": "#434C5E",
+ "nord3": "#4C566A",
+ "nord4": "#D8DEE9",
+ "nord5": "#E5E9F0",
+ "nord6": "#ECEFF4",
+ "nord7": "#8FBCBB",
+ "nord8": "#88C0D0",
+ "nord9": "#81A1C1",
+ "nord10": "#5E81AC",
+ "nord11": "#BF616A",
+ "nord12": "#D08770",
+ "nord13": "#EBCB8B",
+ "nord14": "#A3BE8C",
+ "nord15": "#B48EAD"
+ },
+ "theme": {
+ "primary": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "secondary": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "accent": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "error": {
+ "dark": "nord11",
+ "light": "nord11"
+ },
+ "warning": {
+ "dark": "nord12",
+ "light": "nord12"
+ },
+ "success": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "info": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "text": {
+ "dark": "nord4",
+ "light": "nord0"
+ },
+ "textMuted": {
+ "dark": "nord3",
+ "light": "nord1"
+ },
+ "background": {
+ "dark": "nord0",
+ "light": "nord6"
+ },
+ "backgroundPanel": {
+ "dark": "nord1",
+ "light": "nord5"
+ },
+ "backgroundElement": {
+ "dark": "nord1",
+ "light": "nord4"
+ },
+ "border": {
+ "dark": "nord2",
+ "light": "nord3"
+ },
+ "borderActive": {
+ "dark": "nord3",
+ "light": "nord2"
+ },
+ "borderSubtle": {
+ "dark": "nord2",
+ "light": "nord3"
+ },
+ "diffAdded": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "diffRemoved": {
+ "dark": "nord11",
+ "light": "nord11"
+ },
+ "diffContext": {
+ "dark": "nord3",
+ "light": "nord3"
+ },
+ "diffHunkHeader": {
+ "dark": "nord3",
+ "light": "nord3"
+ },
+ "diffHighlightAdded": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "diffHighlightRemoved": {
+ "dark": "nord11",
+ "light": "nord11"
+ },
+ "diffAddedBg": {
+ "dark": "#3B4252",
+ "light": "#E5E9F0"
+ },
+ "diffRemovedBg": {
+ "dark": "#3B4252",
+ "light": "#E5E9F0"
+ },
+ "diffContextBg": {
+ "dark": "nord1",
+ "light": "nord5"
+ },
+ "diffLineNumber": {
+ "dark": "#abafb7",
+ "light": "textMuted"
+ },
+ "diffAddedLineNumberBg": {
+ "dark": "#3B4252",
+ "light": "#E5E9F0"
+ },
+ "diffRemovedLineNumberBg": {
+ "dark": "#3B4252",
+ "light": "#E5E9F0"
+ },
+ "markdownText": {
+ "dark": "nord4",
+ "light": "nord0"
+ },
+ "markdownHeading": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "markdownLink": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "markdownLinkText": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "markdownCode": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "markdownBlockQuote": {
+ "dark": "nord3",
+ "light": "nord3"
+ },
+ "markdownEmph": {
+ "dark": "nord12",
+ "light": "nord12"
+ },
+ "markdownStrong": {
+ "dark": "nord13",
+ "light": "nord13"
+ },
+ "markdownHorizontalRule": {
+ "dark": "nord3",
+ "light": "nord3"
+ },
+ "markdownListItem": {
+ "dark": "nord8",
+ "light": "nord10"
+ },
+ "markdownListEnumeration": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "markdownImage": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "markdownImageText": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "markdownCodeBlock": {
+ "dark": "nord4",
+ "light": "nord0"
+ },
+ "syntaxComment": {
+ "dark": "nord3",
+ "light": "nord3"
+ },
+ "syntaxKeyword": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "syntaxFunction": {
+ "dark": "nord8",
+ "light": "nord8"
+ },
+ "syntaxVariable": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "syntaxString": {
+ "dark": "nord14",
+ "light": "nord14"
+ },
+ "syntaxNumber": {
+ "dark": "nord15",
+ "light": "nord15"
+ },
+ "syntaxType": {
+ "dark": "nord7",
+ "light": "nord7"
+ },
+ "syntaxOperator": {
+ "dark": "nord9",
+ "light": "nord9"
+ },
+ "syntaxPunctuation": {
+ "dark": "nord4",
+ "light": "nord0"
+ }
+ }
+}
diff --git a/.opencode/tool/github-pr-search.ts b/.opencode/tool/github-pr-search.ts
new file mode 100644
index 0000000..8bc8c55
--- /dev/null
+++ b/.opencode/tool/github-pr-search.ts
@@ -0,0 +1,64 @@
+///
+import { tool } from "@opencode-ai/plugin"
+async function githubFetch(endpoint: string, options: RequestInit = {}) {
+ const response = await fetch(`https://api.github.com${endpoint}`, {
+ ...options,
+ headers: {
+ Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
+ Accept: "application/vnd.github+json",
+ "Content-Type": "application/json",
+ ...(options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers),
+ },
+ })
+ if (!response.ok) {
+ throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
+ }
+ return response.json()
+}
+
+interface PR {
+ title: string
+ html_url: string
+}
+
+export default tool({
+ description: `Use this tool to search GitHub pull requests by title and description.
+
+This tool searches PRs in the anomalyco/opencode repository and returns LLM-friendly results including:
+- PR number and title
+- Author
+- State (open/closed/merged)
+- Labels
+- Description snippet
+
+Use the query parameter to search for keywords that might appear in PR titles or descriptions.`,
+ args: {
+ query: tool.schema.string().describe("Search query for PR titles and descriptions"),
+ limit: tool.schema.number().describe("Maximum number of results to return").default(10),
+ offset: tool.schema.number().describe("Number of results to skip for pagination").default(0),
+ },
+ async execute(args) {
+ const owner = "anomalyco"
+ const repo = "opencode"
+
+ const page = Math.floor(args.offset / args.limit) + 1
+ const searchQuery = encodeURIComponent(`${args.query} repo:${owner}/${repo} type:pr state:open`)
+ const result = await githubFetch(
+ `/search/issues?q=${searchQuery}&per_page=${args.limit}&page=${page}&sort=updated&order=desc`,
+ )
+
+ if (result.total_count === 0) {
+ return `No PRs found matching "${args.query}"`
+ }
+
+ const prs = result.items as PR[]
+
+ if (prs.length === 0) {
+ return `No other PRs found matching "${args.query}"`
+ }
+
+ const formatted = prs.map((pr) => `${pr.title}\n${pr.html_url}`).join("\n\n")
+
+ return `Found ${result.total_count} PRs (showing ${prs.length}):\n\n${formatted}`
+ },
+})
diff --git a/.opencode/tool/github-triage.ts b/.opencode/tool/github-triage.ts
new file mode 100644
index 0000000..f25ca48
--- /dev/null
+++ b/.opencode/tool/github-triage.ts
@@ -0,0 +1,60 @@
+///
+import { tool } from "@opencode-ai/plugin"
+
+const TEAM = {
+ tui: ["kommander", "simonklee"],
+ desktop_web: ["Hona", "Brendonovich"],
+ core: ["jlongster", "rekram1-node", "nexxeln", "kitlangton", "starptech"],
+ inference: ["fwang", "MrMushrooooom", "starptech"],
+ windows: ["Hona"],
+} as const
+
+function pick(items: readonly T[]) {
+ return items[Math.floor(Math.random() * items.length)]!
+}
+
+function getIssueNumber(): number {
+ const issue = parseInt(process.env.ISSUE_NUMBER ?? "", 10)
+ if (!issue) throw new Error("ISSUE_NUMBER env var not set")
+ return issue
+}
+
+async function githubFetch(endpoint: string, options: RequestInit = {}) {
+ const response = await fetch(`https://api.github.com${endpoint}`, {
+ ...options,
+ headers: {
+ Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
+ Accept: "application/vnd.github+json",
+ "Content-Type": "application/json",
+ ...(options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers),
+ },
+ })
+ if (!response.ok) {
+ throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
+ }
+ return response.json()
+}
+
+export default tool({
+ description: `Use this tool to assign a GitHub issue.
+
+Provide the team that should own the issue. This tool picks a random assignee from that team and does not apply labels.`,
+ args: {
+ team: tool.schema
+ .enum(Object.keys(TEAM) as [keyof typeof TEAM, ...(keyof typeof TEAM)[]])
+ .describe("The owning team"),
+ },
+ async execute(args) {
+ const issue = getIssueNumber()
+ const owner = "anomalyco"
+ const repo = "opencode"
+ const assignee = pick(TEAM[args.team])
+
+ await githubFetch(`/repos/${owner}/${repo}/issues/${issue}/assignees`, {
+ method: "POST",
+ body: JSON.stringify({ assignees: [assignee] }),
+ })
+
+ return `Assigned @${assignee} from ${args.team} to issue #${issue}`
+ },
+})
diff --git a/.opencode/tui.json b/.opencode/tui.json
new file mode 100644
index 0000000..b92e58d
--- /dev/null
+++ b/.opencode/tui.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://opencode.ai/tui.json",
+ "plugin": [
+ [
+ "./plugins/tui-smoke.tsx",
+ {
+ "enabled": false,
+ "label": "workspace",
+ "keybinds": {
+ "smoke_modal": "ctrl+alt+m",
+ "smoke_screen": "ctrl+alt+o",
+ "smoke_screen_home": "escape,ctrl+shift+h",
+ "smoke_screen_modal": "ctrl+alt+m",
+ "smoke_dialog_close": "escape,q"
+ }
+ }
+ ]
+ ]
+}
diff --git a/.oxlintrc.json b/.oxlintrc.json
new file mode 100644
index 0000000..f1ca1ff
--- /dev/null
+++ b/.oxlintrc.json
@@ -0,0 +1,51 @@
+{
+ "$schema": "https://raw.githubusercontent.com/nicolo-ribaudo/oxc-project.github.io/refs/heads/json-schema/src/public/.oxlintrc.schema.json",
+ "options": {
+ "typeAware": true
+ },
+ "categories": {
+ "suspicious": "warn"
+ },
+ "rules": {
+ "typescript/no-base-to-string": "warn",
+ // Effect uses `function*` with Effect.gen/Effect.fnUntraced that don't always yield
+ "require-yield": "off",
+ // SolidJS uses `let ref: T | undefined` for JSX ref bindings assigned at runtime
+ "no-unassigned-vars": "off",
+ // SolidJS tracks reactive deps by reading properties inside createEffect
+ "no-unused-expressions": "off",
+ // Intentional control char matching (ANSI escapes, null byte sanitization)
+ "no-control-regex": "off",
+ // SST and plugin tools require triple-slash references
+ "triple-slash-reference": "off",
+
+ // Suspicious category: suppress noisy rules
+ // Effect's nested function* closures inherently shadow outer scope
+ "no-shadow": "off",
+ // Namespace-heavy codebase makes this too noisy
+ "unicorn/consistent-function-scoping": "off",
+ // Opinionated — .sort()/.reverse() mutation is fine in this codebase
+ "unicorn/no-array-sort": "off",
+ "unicorn/no-array-reverse": "off",
+ // Not relevant — this isn't a DOM event handler codebase
+ "unicorn/prefer-add-event-listener": "off",
+ // Bundler handles module resolution
+ "unicorn/require-module-specifiers": "off",
+ // postMessage target origin not relevant for this codebase
+ "unicorn/require-post-message-target-origin": "off",
+ // Side-effectful constructors are intentional in some places
+ "no-new": "off",
+
+ // Type-aware: catch unhandled promises
+ "typescript/no-floating-promises": "warn",
+ // Warn when spreading non-plain objects (Headers, class instances, etc.)
+ "typescript/no-misused-spread": "warn"
+ },
+ "options": {
+ "typeAware": true
+ },
+ "options": {
+ "typeAware": true
+ },
+ "ignorePatterns": ["**/node_modules", "**/dist", "**/.build", "**/.sst", "**/*.d.ts", "**/sdk.gen.ts"]
+}
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..a2a2776
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,2 @@
+sst-env.d.ts
+packages/desktop/src/bindings.ts
diff --git a/.vscode/launch.example.json b/.vscode/launch.example.json
new file mode 100644
index 0000000..3f8a2a7
--- /dev/null
+++ b/.vscode/launch.example.json
@@ -0,0 +1,11 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "bun",
+ "request": "attach",
+ "name": "opencode (attach)",
+ "url": "ws://localhost:6499/"
+ }
+ ]
+}
diff --git a/.vscode/settings.example.json b/.vscode/settings.example.json
new file mode 100644
index 0000000..05bbf7f
--- /dev/null
+++ b/.vscode/settings.example.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "oven.bun-vscode"
+ ]
+}
diff --git a/.zed/settings.json b/.zed/settings.json
new file mode 100644
index 0000000..a3a5e1e
--- /dev/null
+++ b/.zed/settings.json
@@ -0,0 +1,9 @@
+{
+ "format_on_save": "on",
+ "formatter": {
+ "external": {
+ "command": "bunx",
+ "arguments": ["prettier", "--stdin-filepath", "{buffer_path}"]
+ }
+ }
+}
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..02b1c4c
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,158 @@
+- To regenerate the JavaScript SDK, run `./packages/sdk/js/script/build.ts`.
+- The default branch in this repo is `dev`.
+- Local `main` ref may not exist; use `dev` or `origin/dev` for diffs.
+
+## Branch Names
+
+Use a short branch name of at most three words, separated by hyphens. Do not use slashes or type prefixes such as `feat/` or `fix/`.
+
+Examples: `session-recovery`, `fix-scroll-state`, `regenerate-sdk`.
+
+## Commits and PR Titles
+
+Use conventional commit-style messages and PR titles: `type(scope): summary`.
+
+Valid types are `feat`, `fix`, `docs`, `chore`, `refactor`, and `test`. Scopes are optional; use the affected package or area when helpful, e.g. `core`, `opencode`, `tui`, `app`, `desktop`, `sdk`, or `plugin`.
+
+Examples: `fix(tui): simplify thinking toggle styling`, `docs: update contributing guide`, `chore(sdk): regenerate types`.
+
+## Style Guide
+
+### General Principles
+
+- Keep things in one function unless composable or reusable
+- Do not extract single-use helpers preemptively. Inline the logic at the call site unless the helper is reused, hides a genuinely complex boundary, or has a clear independent name that improves the caller.
+- Avoid `try`/`catch` where possible
+- Avoid using the `any` type
+- Use Bun APIs when possible, like `Bun.file()`
+- Rely on type inference when possible; avoid explicit type annotations or interfaces unless necessary for exports or clarity
+- Prefer functional array methods (flatMap, filter, map) over for loops; use type guards on filter to maintain type inference downstream
+- In `src/config`, follow the existing self-export pattern at the top of the file (for example `export * as ConfigAgent from "./agent"`) when adding a new config module.
+
+Reduce total variable count by inlining when a value is only used once.
+
+```ts
+// Good
+const journal = await Bun.file(path.join(dir, "journal.json")).json()
+
+// Bad
+const journalPath = path.join(dir, "journal.json")
+const journal = await Bun.file(journalPath).json()
+```
+
+### Destructuring
+
+Avoid unnecessary destructuring. Use dot notation to preserve context.
+
+```ts
+// Good
+obj.a
+obj.b
+
+// Bad
+const { a, b } = obj
+```
+
+### Imports
+
+- Never alias imports. Do not use `import { foo as bar } from "..."` or renamed imports like `resolve as pathResolve`.
+- Never use star imports. Do not use `import * as Foo from "..."` or `import type * as Foo from "..."`.
+- If a namespace-style value is needed, import the module's own exported namespace by name, for example `import { Project } from "@opencode-ai/core/project"`, then reference `Project.ID`.
+- Prefer dynamic imports for heavy modules that are only needed in selected code paths, especially in startup-sensitive entrypoints. Destructure dynamic import bindings near the top of the narrowest scope that needs them so they read like normal imports. Avoid inline chains such as `await import("./module").then((mod) => mod.value())` or `(await import("./module")).value()`. Keep branch-specific imports inside the branch that needs them to preserve lazy loading.
+
+### Variables
+
+Prefer `const` over `let`. Use ternaries or early returns instead of reassignment.
+
+```ts
+// Good
+const foo = condition ? 1 : 2
+
+// Bad
+let foo
+if (condition) foo = 1
+else foo = 2
+```
+
+### Control Flow
+
+Avoid `else` statements. Prefer early returns.
+
+```ts
+// Good
+function foo() {
+ if (condition) return 1
+ return 2
+}
+
+// Bad
+function foo() {
+ if (condition) return 1
+ else return 2
+}
+```
+
+### Complex Logic
+
+When a function has several validation branches or supporting details, make the main function read as the happy path and move supporting details into small helpers below it.
+
+```ts
+// Good
+export function loadThing(input: unknown) {
+ const config = requireConfig(input)
+ const metadata = readMetadata(input)
+ return createThing({ config, metadata })
+}
+
+function requireConfig(input: unknown) {
+ ...
+}
+```
+
+- Keep helpers close to the code they support, below the main export when that improves readability.
+- Do not over-abstract simple expressions into many single-use helpers; extract only when it names a real concept like `requireConfig` or `readMetadata`.
+- Do not return `Effect` from helpers unless they actually perform effectful work. Synchronous parsing, validation, and option building should stay synchronous.
+- Prefer Effect schema helpers such as `Schema.UnknownFromJsonString` and `Schema.decodeUnknownOption` over manual `JSON.parse` wrapped in `Effect.try` when parsing untrusted JSON strings.
+- Add comments for non-obvious constraints and surprising behavior, not for obvious assignments or control flow.
+
+### Schema Definitions (Drizzle)
+
+Use snake_case for field names so column names don't need to be redefined as strings.
+
+```ts
+// Good
+const table = sqliteTable("session", {
+ id: text().primaryKey(),
+ project_id: text().notNull(),
+ created_at: integer().notNull(),
+})
+
+// Bad
+const table = sqliteTable("session", {
+ id: text("id").primaryKey(),
+ projectID: text("project_id").notNull(),
+ createdAt: integer("created_at").notNull(),
+})
+```
+
+## Testing
+
+- Avoid mocks as much as possible
+- Test actual implementation, do not duplicate logic into tests
+- Tests cannot run from repo root (guard: `do-not-run-tests-from-root`); run from package dirs like `packages/opencode`.
+
+## Type Checking
+
+- Always run `bun typecheck` from package directories (e.g., `packages/opencode`), never `tsc` directly.
+
+## V2 Session Core
+
+- Keep durable prompt admission separate from model execution. `SessionV2.prompt(...)` admits one durable `session_input` row before scheduling advisory `SessionExecution.wake(sessionID)` unless `resume: false` requests admit-only behavior. The serialized runner promotes admitted inputs into visible user messages at safe boundaries.
+- Reusing a Session ID adopts the existing Session. Reusing a prompt message ID reconciles an exact retry only when Session, prompt, and delivery mode match; conflicting reuse fails. Historical projected prompts lazily synthesize promoted inbox records during exact retry.
+- Keep `SessionExecution` process-global and Session-ID based. Its local implementation owns the process-local Session coordinator and discovers placement through `SessionStore` plus `LocationServiceMap.get(session.location)` only when a drain starts; no layer should take a Session ID. V2 interruption targets the active process-local ownership chain for that Session; idle or missing interruption is a no-op.
+- Keep `SessionRunner`, model resolution, tool registry, permissions, and filesystem Location-scoped. Omitted `Location.workspaceID` means implicit-local placement; explicit workspace identity remains reserved for future placement semantics.
+- Preserve one explicit `llm.stream(request)` call per provider turn and reload projected history before durable continuation. Do not bridge through legacy `SessionPrompt.loop(...)` or delegate orchestration to an in-memory tool loop.
+- Keep local Session drains process-local until clustering is implemented. `SessionRunCoordinator` joins explicit same-Session resumes, coalesces prompt wakeups, and allows different Sessions to run concurrently. Advisory wakes drain eligible durable inbox rows only; post-crash activity recovery requires a separate explicit design before it may retry provider work.
+- Keep delivery vocabulary explicit. Prompts steer by default and coalesce into the active activity at the next safe provider-turn boundary. Explicit `queue` inputs open FIFO future activities one at a time after the active activity settles.
+- Keep EventV2 replay owner claims separate from clustered Session execution ownership.
+- Keep the System Context algebra, registry, and built-ins in `src/system-context`; keep Context Source producers with their observed domains, and keep Session History selection plus Context Epoch persistence Session-owned.
diff --git a/CONTEXT.md b/CONTEXT.md
new file mode 100644
index 0000000..6c94d90
--- /dev/null
+++ b/CONTEXT.md
@@ -0,0 +1,124 @@
+# OpenCode Session Runtime
+
+OpenCode sessions preserve durable conversational history while assembling the runtime context an agent needs to act correctly in its current environment.
+
+## Language
+
+**System Context**:
+The structured collection of contextual facts presented to the model as initial instructions and chronological updates.
+_Avoid_: System prompt
+
+**Session History**:
+The projected chronological conversation selected for a provider turn after applying the active compaction and **Context Epoch** cutoffs.
+_Avoid_: Session Context
+
+**Context Source**:
+One independently observed typed value within the **System Context**, represented by a stable key, JSON codec, infallible loader, pure baseline/update renderers, and an optional removal renderer for dynamic sources.
+_Avoid_: Prompt fragment
+
+**System Context Registry**:
+The Location-scoped registry of ordered, scoped producers that contribute to the current **System Context**.
+
+**Mid-Conversation System Message**:
+A durable chronological instruction that tells the model the newly effective state of a changed **Context Source**.
+_Avoid_: System update, system notification, raw text diff
+
+**Context Epoch**:
+The span during which one effective agent's initially rendered **System Context** remains immutable, ending at compaction or another baseline-replacing transition.
+
+**Baseline System Context**:
+The full **System Context** rendered at the start of a **Context Epoch**.
+_Avoid_: Live system prompt
+
+**Context Snapshot**:
+The overwriteable model-hidden JSON state used to compare each **Context Source** with the value last admitted to a provider turn.
+
+**Unavailable Context**:
+An expected temporary inability to observe a **Context Source** value; the runtime retains its prior effective state and emits no update, or omits it until first successfully loaded.
+
+**Safe Provider-Turn Boundary**:
+The point immediately before a provider call, after durable input promotion and any required tool settlement, where context changes may be admitted chronologically.
+
+**Model Tool Output**:
+The bounded projection of a Core-executed tool result persisted in Session history and replayed to the model. A tool may shape this projection semantically, but the Tool Registry enforces the final size limit.
+
+**Managed Tool Output File**:
+A temporary file created under OpenCode's shared tool-output directory to retain complete output that was too large for Session history.
+
+**Model Request Options**:
+Provider-semantic model settings selected from the Catalog and active Session variant before the LLM protocol adapter encodes them for a provider request.
+_Avoid_: Request body, wire options
+
+**Generation Controls**:
+Provider-neutral sampling and output controls, partitioned from provider semantics and compatibility wire fields when model metadata enters the Catalog.
+
+## Relationships
+
+- A **System Context** is an opaque carrier composed from zero or more **Context Sources**.
+- **Session History** contains projected conversational messages and admitted **Mid-Conversation System Messages**; the active **Baseline System Context** remains separate provider-request state.
+- The **System Context Registry** uses stable-keyed scoped contributions to assemble the current **System Context**; contributor removal naturally removes its sources at the next **Safe Provider-Turn Boundary**.
+- A changed **Context Source** may produce one **Mid-Conversation System Message** containing its newly effective state.
+- A **Mid-Conversation System Message** persists the exact combined rendered text sent to the model.
+- The current **Context Snapshot** advances atomically with the corresponding durable **Mid-Conversation System Message**.
+- A **Context Snapshot** stores one codec-encoded JSON value and, for removable dynamic sources, a pre-rendered removal message per stable **Context Source** key.
+- Changes from multiple **Context Sources** admitted at one safe boundary combine into one **Mid-Conversation System Message**.
+- Context changes are sampled and admitted lazily at a **Safe Provider-Turn Boundary**, never pushed asynchronously when their source changes.
+- At a **Safe Provider-Turn Boundary**, newly promoted user input or settled tool results precede any combined **Mid-Conversation System Message**.
+- The first provider turn renders the latest complete **Baseline System Context** and initializes its **Context Snapshot** without emitting a redundant **Mid-Conversation System Message**; unavailable initial context blocks the turn instead of persisting an incomplete baseline.
+- Initial **System Context** preparation precedes the first durable input promotion so an unavailable baseline leaves that input pending and retryable; ordinary reconciliation remains after promotion.
+- Compaction starts a new **Context Epoch** with a freshly rendered **Baseline System Context** and **Context Snapshot**; prior **Mid-Conversation System Messages** remain durable audit history but leave projected model history.
+- A newly registered core or plugin-defined **Context Source** absent from the current snapshot emits its baseline rendering once at the next **Safe Provider-Turn Boundary**.
+- **Context Source** keys are stable and namespaced; duplicate keys fail composition. `SystemContext.combine(...)` preserves caller order; the **System Context Registry** evaluates producers concurrently and combines them in stable contribution-key order so rendered context remains deterministic.
+- Each **Context Source** loader returns one coherent typed value. `SystemContext.make(...)` hides that value type so differently typed sources compose uniformly. Its codec compares and stores that value; its pure renderers produce model-visible baseline, update, and removal text only when needed.
+- `SystemContext.initialize(...)` observes a composed **System Context** once and produces a fresh **Baseline System Context** with its **Context Snapshot**.
+- `SystemContext.reconcile(...)` observes a composed **System Context** once and returns exactly one next action: unchanged, updated, replacement ready, or replacement blocked.
+- `SystemContext.replace(...)` represents an explicit baseline-replacing transition such as compaction or model/provider switch; it either produces a fresh generation or reports that replacement is blocked by unavailable admitted context.
+- Context Epoch preparation retries until stable after optimistic revision mismatches so concurrent replacement requests cannot terminate an otherwise valid safe-boundary run.
+- **Unavailable Context** uses stale-while-revalidate semantics and is distinct from a successfully loaded absence, which may emit removal text.
+- Ordinary **Context Source** loaders return values directly; loaders that intentionally use stale-while-revalidate may explicitly return **Unavailable Context**.
+- Nested project instruction discovery after successful reads remains a follow-up; when implemented, discovered instructions must be admitted durably at the next **Safe Provider-Turn Boundary**.
+- Location-scoped services naturally re-resolve effective context when a moved session next runs in its destination location.
+- Moving a Session clears its active **Context Epoch**, so the destination must initialize a complete baseline before another prompt can promote.
+- Context Epoch initialization is fenced against the authoritative Session Location, so an old-Location runner cannot recreate source context after a concurrent move.
+- Instruction discovery, source identity, persistence, and file loading belong to the instruction service; the **System Context** abstraction only composes effectful producers and renders loaded values.
+- The first instruction-service slice observes global and upward project `AGENTS.md` files as one ordered aggregate **Context Source** at each **Safe Provider-Turn Boundary**.
+- Built-in and instruction context producers register through the **System Context Registry** with stable contribution keys. Plugin-defined context registration and hot-reload lifecycle remain a follow-up built on the same scoped registry seam.
+- Selected-agent available-skill guidance is a **Context Source** composed with Location-wide registry sources immediately before Context Epoch admission. It lists only names and descriptions permitted for that agent; skill bodies and locations are exposed only through the permission-checked `skill` tool.
+- Switching the selected agent requests **Context Epoch** replacement. A switch admitted after the current **Safe Provider-Turn Boundary** applies to the next provider turn while leaving the already-prepared baseline durable. Epoch creation is fenced against the authoritative effective agent, and retries re-observe the current agent.
+- A cross-agent replacement must complete before another provider turn; unavailable admitted context blocks that replacement instead of exposing the previous agent's privileged baseline.
+- Local tool authorization and pending permission requests retain the effective agent of the provider turn that issued the call; a later agent switch cannot change that call's policy.
+- Context source changes never wake idle sessions; the next naturally scheduled **Safe Provider-Turn Boundary** loads and compares current values lazily.
+- Once admitted, a **Mid-Conversation System Message** remains durable even if the following provider attempt fails and is replayed unchanged on retry.
+- **Mid-Conversation System Messages** remain durable Session-message history; normal user-facing transcript surfaces may hide them.
+- The date **Context Source** initially preserves host-local calendar-date behavior; a configured user timezone may replace that default later.
+- A **Context Epoch** begins with one immutable **Baseline System Context**.
+- A **Context Epoch** durably records the effective agent that owns its **Baseline System Context**.
+- A **Baseline System Context** is stored durably and reused verbatim across process restarts within its **Context Epoch**.
+- A **Baseline System Context** durably preserves the exact joined text used for the active provider-cache prefix.
+- Compaction or a model/provider switch starts a new **Context Epoch** because the baseline can be replaced without preserving the prior provider cache.
+- A model/provider switch always starts a new **Context Epoch** while preserving chronological conversation history.
+- **Model Request Options** remain provider-semantic through Catalog resolution. The Session runner maps them into the LLM package's provider-option namespace; the selected protocol adapter alone owns provider wire encoding.
+- **Generation Controls**, protocol-semantic **Model Request Options**, and compatibility request body fields are separate Catalog domains. A shared ingestion adapter partitions legacy and models.dev AI-SDK-shaped options before routing.
+- A **Mid-Conversation System Message** lowers to the provider's native chronological instruction role when supported and to a wrapped chronological fallback otherwise.
+- When the effective aggregate instruction set changes, its **Mid-Conversation System Message** includes the complete current ordered set and supersedes the prior aggregate value; when no ambient instructions remain, the message states that previously loaded instructions no longer apply.
+- Ambient project instruction discovery honors `OPENCODE_DISABLE_PROJECT_CONFIG`; global instructions remain eligible.
+- Oversized textual **Model Tool Output** retains a bounded preview in Session history while its complete text moves to managed tool-output storage. Arbitrary structured-result size is a separate concern.
+- One tool settlement receives one aggregate textual limit, using the configured maximum lines or UTF-8 bytes, whichever is reached first. The limit is provider-independent; token pressure belongs to context assembly and compaction.
+- Generic truncation preserves the beginning and end of textual output. Tools may apply a more meaningful strategy before the Tool Registry enforces the final limit.
+- A truncated **Model Tool Output** identifies its complete text both in the bounded model-visible preview and as a typed managed output path. Managed output paths do not modify the tool's validated structured result.
+- A **Managed Tool Output File** is temporary and may expire after its retention period. The bounded **Model Tool Output**, not the file, is the durable replayable record.
+- Failure to retain a **Managed Tool Output File** does not change a successful tool operation into a failed one. The Session records an explicitly lossy bounded output without a path, while operators receive diagnostics for the storage failure.
+- Once a tool operation succeeds, bounding its **Model Tool Output** and publishing its one durable settlement form an interruption-safe completion region. Raw oversized success is never published before a later correction.
+- When a structured-only result would exceed the **Model Tool Output** limit, its validated structured value remains unchanged for Session consumers while model replay uses a bounded textual JSON preview and optional managed output path.
+- Existing tool-managed output paths survive generic bounding. A fallback file retains exactly the complete projected text received by the Tool Registry and never claims to reconstruct output already discarded by tool-specific shaping.
+- **Managed Tool Output Files** use globally unique names in one shared flat directory. Their absolute paths are readable and searchable by ordinary tools; other absolute paths remain outside Location-scoped filesystem authority.
+- Provider-executed tool results remain provider-native transcript facts outside generic Tool Registry bounding. Their context control requires provider-aware pruning or compaction because some providers require exact structured round-trip payloads.
+
+## Example dialogue
+
+> **Dev:** "The date changed while the session was active. Should the **Mid-Conversation System Message** say what the old date was?"
+> **Domain expert:** "No. Emit the newly effective date so the agent can act on the current **System Context**."
+
+## Flagged ambiguities
+
+- Legacy `experimental.chat.system.transform` can mutate the assembled baseline system prompt arbitrarily, but V2 plugins do not yet expose an equivalent hook. Decide separately whether to port it, replace dynamic uses with plugin-defined **Context Sources**, or narrow its semantics.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..e1a62ae
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,299 @@
+# Contributing to OpenCode
+
+We want to make it easy for you to contribute to OpenCode. Here are the most common type of changes that get merged:
+
+- Bug fixes
+- Additional LSPs / Formatters
+- Improvements to LLM performance
+- Support for new providers
+- Fixes for environment-specific quirks
+- Missing standard behavior
+- Documentation improvements
+
+However, any UI or core product feature must go through a design review with the core team before implementation.
+
+If you are unsure if a PR would be accepted, feel free to ask a maintainer or look for issues with any of the following labels:
+
+- [`help wanted`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Ahelp-wanted)
+- [`good first issue`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)
+- [`bug`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug)
+- [`perf`](https://github.com/anomalyco/opencode/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22perf%22)
+
+> [!NOTE]
+> PRs that ignore these guardrails will likely be closed.
+
+Want to take on an issue? Leave a comment and a maintainer may assign it to you unless it is something we are already working on.
+
+## Adding New Providers
+
+New providers shouldn't require many if ANY code changes, but if you want to add support for a new provider first make a PR to:
+https://github.com/anomalyco/models.dev
+
+## Developing OpenCode
+
+- Requirements: Bun 1.3+
+- Install dependencies and start the dev server from the repo root:
+
+ ```bash
+ bun install
+ bun dev
+ ```
+
+### Running against a different directory
+
+By default, `bun dev` runs OpenCode in the `packages/opencode` directory. To run it against a different directory or repository:
+
+```bash
+bun dev
+```
+
+To run OpenCode in the root of the opencode repo itself:
+
+```bash
+bun dev .
+```
+
+### Building a "localcode"
+
+To compile a standalone executable:
+
+```bash
+./packages/opencode/script/build.ts --single
+```
+
+Then run it with:
+
+```bash
+./packages/opencode/dist/opencode-/bin/opencode
+```
+
+Replace `` with your platform (e.g., `darwin-arm64`, `linux-x64`).
+
+- Core pieces:
+ - `packages/opencode`: OpenCode core business logic & server.
+ - `packages/opencode/src/cli/cmd/tui/`: The TUI code, written in SolidJS with [opentui](https://github.com/sst/opentui)
+ - `packages/app`: The shared web UI components, written in SolidJS
+ - `packages/desktop`: The native desktop app, built with Electron (wraps `packages/app`)
+ - `packages/plugin`: Source for `@opencode-ai/plugin`
+
+### Understanding bun dev vs opencode
+
+During development, `bun dev` is the local equivalent of the built `opencode` command. Both run the same CLI interface:
+
+```bash
+# Development (from project root)
+bun dev --help # Show all available commands
+bun dev serve # Start headless API server
+bun dev web # Start server + open web interface
+bun dev # Start TUI in specific directory
+
+# Production
+opencode --help # Show all available commands
+opencode serve # Start headless API server
+opencode web # Start server + open web interface
+opencode # Start TUI in specific directory
+```
+
+### Running the API Server
+
+To start the OpenCode headless API server:
+
+```bash
+bun dev serve
+```
+
+This starts the headless server on port 4096 by default. You can specify a different port:
+
+```bash
+bun dev serve --port 8080
+```
+
+### Running the Web App
+
+To test UI changes during development:
+
+1. **First, start the OpenCode server** (see [Running the API Server](#running-the-api-server) section above)
+2. **Then run the web app:**
+
+```bash
+bun run --cwd packages/app dev
+```
+
+This starts a local dev server at http://localhost:5173 (or similar port shown in output). Most UI changes can be tested here, but the server must be running for full functionality.
+
+### Running the Desktop App
+
+The desktop app is an Electron application that wraps the web UI.
+
+To run the desktop app in development:
+
+```bash
+bun run --cwd packages/desktop dev
+```
+
+To create a production build and package the app:
+
+```bash
+bun run --cwd packages/desktop build
+bun run --cwd packages/desktop package
+```
+
+> [!NOTE]
+> If you make changes to the API or SDK (e.g. `packages/opencode/src/server/server.ts`), run `./script/generate.ts` to regenerate the SDK and related files.
+
+Please try to follow the [style guide](./AGENTS.md)
+
+### Setting up a Debugger
+
+Bun debugging is currently rough around the edges. We hope this guide helps you get set up and avoid some pain points.
+
+The most reliable way to debug OpenCode is to run it manually in a terminal via `bun run --inspect= dev ...` and attach
+your debugger via that URL. Other methods can result in breakpoints being mapped incorrectly, at least in VSCode (YMMV).
+
+Caveats:
+
+- If you want to run the OpenCode TUI and have breakpoints triggered in the server code, you might need to run `bun dev spawn` instead of
+ the usual `bun dev`. This is because `bun dev` runs the server in a worker thread and breakpoints might not work there.
+- If `spawn` does not work for you, you can debug the server separately:
+ - Debug server: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode ./src/index.ts serve --port 4096`,
+ then attach TUI with `opencode attach http://localhost:4096`
+ - Debug TUI: `bun run --inspect=ws://localhost:6499/ --cwd packages/opencode --conditions=browser ./src/index.ts`
+
+Other tips and tricks:
+
+- You might want to use `--inspect-wait` or `--inspect-brk` instead of `--inspect`, depending on your workflow
+- Specifying `--inspect=ws://localhost:6499/` on every invocation can be tiresome, you may want to `export BUN_OPTIONS=--inspect=ws://localhost:6499/` instead
+
+#### VSCode Setup
+
+If you use VSCode, you can use our example configurations [.vscode/settings.example.json](.vscode/settings.example.json) and [.vscode/launch.example.json](.vscode/launch.example.json).
+
+Some debug methods that can be problematic:
+
+- Debug configurations with `"request": "launch"` can have breakpoints incorrectly mapped and thus unusable
+- The same problem arises when running OpenCode in the VSCode `JavaScript Debug Terminal`
+
+With that said, you may want to try these methods, as they might work for you.
+
+## Pull Request Expectations
+
+### Issue First Policy
+
+**All PRs must reference an existing issue.** Before opening a PR, open an issue describing the bug or feature. This helps maintainers triage and prevents duplicate work. PRs without a linked issue may be closed without review.
+
+- Use `Fixes #123` or `Closes #123` in your PR description to link the issue
+- For small fixes, a brief issue is fine - just enough context for maintainers to understand the problem
+
+### General Requirements
+
+- Keep pull requests small and focused
+- Explain the issue and why your change fixes it
+- Before adding new functionality, ensure it doesn't already exist elsewhere in the codebase
+
+### UI Changes
+
+If your PR includes UI changes, please include screenshots or videos showing the before and after. This helps maintainers review faster and gives you quicker feedback.
+
+### Logic Changes
+
+For non-UI changes (bug fixes, new features, refactors), explain **how you verified it works**:
+
+- What did you test?
+- How can a reviewer reproduce/confirm the fix?
+
+### No AI-Generated Walls of Text
+
+Long, AI-generated PR descriptions and issues are not acceptable and may be ignored. Respect the maintainers' time:
+
+- Write short, focused descriptions
+- Explain what changed and why in your own words
+- If you can't explain it briefly, your PR might be too large
+
+### PR Titles
+
+PR titles should follow conventional commit standards:
+
+- `feat:` new feature or functionality
+- `fix:` bug fix
+- `docs:` documentation or README changes
+- `chore:` maintenance tasks, dependency updates, etc.
+- `refactor:` code refactoring without changing behavior
+- `test:` adding or updating tests
+
+You can optionally include a scope to indicate which package is affected:
+
+- `feat(app):` feature in the app package
+- `fix(desktop):` bug fix in the desktop package
+- `chore(opencode):` maintenance in the opencode package
+
+Examples:
+
+- `docs: update contributing guidelines`
+- `fix: resolve crash on startup`
+- `feat: add dark mode support`
+- `feat(app): add dark mode support`
+- `fix(desktop): resolve crash on startup`
+- `chore: bump dependency versions`
+
+### Style Preferences
+
+These are not strictly enforced, they are just general guidelines:
+
+- **Functions:** Keep logic within a single function unless breaking it out adds clear reuse or composition benefits.
+- **Destructuring:** Do not do unnecessary destructuring of variables.
+- **Control flow:** Avoid `else` statements.
+- **Error handling:** Prefer `.catch(...)` instead of `try`/`catch` when possible.
+- **Types:** Reach for precise types and avoid `any`.
+- **Variables:** Stick to immutable patterns and avoid `let`.
+- **Naming:** Choose concise single-word identifiers when they remain descriptive.
+- **Runtime APIs:** Use Bun helpers such as `Bun.file()` when they fit the use case.
+
+## Feature Requests
+
+For net-new functionality, start with a design conversation. Open an issue describing the problem, your proposed approach (optional), and why it belongs in OpenCode. The core team will help decide whether it should move forward; please wait for that approval instead of opening a feature PR directly.
+
+## Trust & Vouch System
+
+This project uses [vouch](https://github.com/mitchellh/vouch) to manage contributor trust. The vouch list is maintained in [`.github/VOUCHED.td`](.github/VOUCHED.td).
+
+### How it works
+
+- **Vouched users** are explicitly trusted contributors.
+- **Denounced users** are explicitly blocked. Issues and pull requests from denounced users are automatically closed. If you have been denounced, you can request to be unvouched by reaching out to a maintainer on [Discord](https://opencode.ai/discord)
+- **Everyone else** can participate normally — you don't need to be vouched to open issues or PRs.
+
+### For maintainers
+
+Collaborators with write access can manage the vouch list by commenting on any issue:
+
+- `vouch` — vouch for the issue author
+- `vouch @username` — vouch for a specific user
+- `denounce` — denounce the issue author
+- `denounce @username` — denounce a specific user
+- `denounce @username ` — denounce with a reason
+- `unvouch` / `unvouch @username` — remove someone from the list
+
+Changes are committed automatically to `.github/VOUCHED.td`.
+
+### Denouncement policy
+
+Denouncement is reserved for users who repeatedly submit low-quality AI-generated contributions, spam, or otherwise act in bad faith. It is not used for disagreements or honest mistakes.
+
+## Issue Requirements
+
+All issues **must** use one of our issue templates:
+
+- **Bug report** — for reporting bugs (requires a description)
+- **Feature request** — for suggesting enhancements (requires verification checkbox and description)
+- **Question** — for asking questions (requires the question)
+
+Blank issues are not allowed. When a new issue is opened, an automated check verifies that it follows a template and meets our contributing guidelines. If an issue doesn't meet the requirements, you'll receive a comment explaining what needs to be fixed and have **2 hours** to edit the issue. After that, it will be automatically closed.
+
+Issues may be flagged for:
+
+- Not using a template
+- Required fields left empty or filled with placeholder text
+- AI-generated walls of text
+- Missing meaningful content
+
+If you believe your issue was incorrectly flagged, let a maintainer know.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6439474
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 opencode
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.ar.md b/README.ar.md
new file mode 100644
index 0000000..4361893
--- /dev/null
+++ b/README.ar.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### التثبيت
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# مديري الحزم
+npm i -g opencode-ai@latest # او bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS و Linux (موصى به، دائما محدث)
+brew install opencode # macOS و Linux (صيغة brew الرسمية، تحديث اقل)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # اي نظام
+nix run nixpkgs#opencode # او github:anomalyco/opencode لاحدث فرع dev
+```
+
+> [!TIP]
+> احذف الاصدارات الاقدم من 0.1.x قبل التثبيت.
+
+### تطبيق سطح المكتب (BETA)
+
+يتوفر OpenCode ايضا كتطبيق سطح مكتب. قم بالتنزيل مباشرة من [صفحة الاصدارات](https://github.com/anomalyco/opencode/releases) او من [opencode.ai/download](https://opencode.ai/download).
+
+| المنصة | التنزيل |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb` او `.rpm` او AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### مجلد التثبيت
+
+يحترم سكربت التثبيت ترتيب الاولوية التالي لمسار التثبيت:
+
+1. `$OPENCODE_INSTALL_DIR` - مجلد تثبيت مخصص
+2. `$XDG_BIN_DIR` - مسار متوافق مع مواصفات XDG Base Directory
+3. `$HOME/bin` - مجلد الثنائيات القياسي للمستخدم (ان وجد او امكن انشاؤه)
+4. `$HOME/.opencode/bin` - المسار الافتراضي الاحتياطي
+
+```bash
+# امثلة
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+يتضمن OpenCode وكيليْن (Agents) مدمجين يمكنك التبديل بينهما باستخدام زر `Tab`.
+
+- **build** - الافتراضي، وكيل بصلاحيات كاملة لاعمال التطوير
+- **plan** - وكيل للقراءة فقط للتحليل واستكشاف الكود
+ - يرفض تعديل الملفات افتراضيا
+ - يطلب الاذن قبل تشغيل اوامر bash
+ - مثالي لاستكشاف قواعد كود غير مألوفة او لتخطيط التغييرات
+
+بالاضافة الى ذلك يوجد وكيل فرعي **general** للبحث المعقد والمهام متعددة الخطوات.
+يستخدم داخليا ويمكن استدعاؤه بكتابة `@general` في الرسائل.
+
+تعرف على المزيد حول [agents](https://opencode.ai/docs/agents).
+
+### التوثيق
+
+لمزيد من المعلومات حول كيفية ضبط OpenCode، [**راجع التوثيق**](https://opencode.ai/docs).
+
+### المساهمة
+
+اذا كنت مهتما بالمساهمة في OpenCode، يرجى قراءة [contributing docs](./CONTRIBUTING.md) قبل ارسال pull request.
+
+### البناء فوق OpenCode
+
+اذا كنت تعمل على مشروع مرتبط بـ OpenCode ويستخدم "opencode" كجزء من اسمه (مثل "opencode-dashboard" او "opencode-mobile")، يرجى اضافة ملاحظة في README توضح انه ليس مبنيا بواسطة فريق OpenCode ولا يرتبط بنا بأي شكل.
+
+---
+
+**انضم الى مجتمعنا** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.bn.md b/README.bn.md
new file mode 100644
index 0000000..ce00a41
--- /dev/null
+++ b/README.bn.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+ওপেন সোর্স এআই কোডিং এজেন্ট।
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### ইনস্টলেশন (Installation)
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Package managers
+npm i -g opencode-ai@latest # or bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS and Linux (recommended, always up to date)
+brew install opencode # macOS and Linux (official brew formula, updated less)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Any OS
+nix run nixpkgs#opencode # or github:anomalyco/opencode for latest dev branch
+```
+
+> [!TIP]
+> ইনস্টল করার আগে ০.১.x এর চেয়ে পুরোনো ভার্সনগুলো মুছে ফেলুন।
+
+### ডেস্কটপ অ্যাপ (BETA)
+
+OpenCode ডেস্কটপ অ্যাপ্লিকেশন হিসেবেও উপলব্ধ। সরাসরি [রিলিজ পেজ](https://github.com/anomalyco/opencode/releases) অথবা [opencode.ai/download](https://opencode.ai/download) থেকে ডাউনলোড করুন।
+
+| প্ল্যাটফর্ম | ডাউনলোড |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, or `.AppImage` |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### ইনস্টলেশন ডিরেক্টরি (Installation Directory)
+
+ইনস্টল স্ক্রিপ্টটি ইনস্টলেশন পাতের জন্য নিম্নলিখিত অগ্রাধিকার ক্রম মেনে চলে:
+
+1. `$OPENCODE_INSTALL_DIR` - কাস্টম ইনস্টলেশন ডিরেক্টরি
+2. `$XDG_BIN_DIR` - XDG বেস ডিরেক্টরি স্পেসিফিকেশন সমর্থিত পাথ
+3. `$HOME/bin` - সাধারণ ব্যবহারকারী বাইনারি ডিরেক্টরি (যদি বিদ্যমান থাকে বা তৈরি করা যায়)
+4. `$HOME/.opencode/bin` - ডিফল্ট ফলব্যাক
+
+```bash
+# উদাহরণ
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### এজেন্টস (Agents)
+
+OpenCode এ দুটি বিল্ট-ইন এজেন্ট রয়েছে যা আপনি `Tab` কি(key) দিয়ে পরিবর্তন করতে পারবেন।
+
+- **build** - ডিফল্ট, ডেভেলপমেন্টের কাজের জন্য সম্পূর্ণ অ্যাক্সেসযুক্ত এজেন্ট
+- **plan** - বিশ্লেষণ এবং কোড এক্সপ্লোরেশনের জন্য রিড-ওনলি এজেন্ট
+ - ডিফল্টভাবে ফাইল এডিট করতে দেয় না
+ - ব্যাশ কমান্ড চালানোর আগে অনুমতি চায়
+ - অপরিচিত কোডবেস এক্সপ্লোর করা বা পরিবর্তনের পরিকল্পনা করার জন্য আদর্শ
+
+এছাড়াও জটিল অনুসন্ধান এবং মাল্টিস্টেপ টাস্কের জন্য একটি **general** সাবএজেন্ট অন্তর্ভুক্ত রয়েছে।
+এটি অভ্যন্তরীণভাবে ব্যবহৃত হয় এবং মেসেজে `@general` লিখে ব্যবহার করা যেতে পারে।
+
+এজেন্টদের সম্পর্কে আরও জানুন: [docs](https://opencode.ai/docs/agents)।
+
+### ডকুমেন্টেশন (Documentation)
+
+কিভাবে OpenCode কনফিগার করবেন সে সম্পর্কে আরও তথ্যের জন্য, [**আমাদের ডকস দেখুন**](https://opencode.ai/docs)।
+
+### অবদান (Contributing)
+
+আপনি যদি OpenCode এ অবদান রাখতে চান, অনুগ্রহ করে একটি পুল রিকোয়েস্ট সাবমিট করার আগে আমাদের [কন্ট্রিবিউটিং ডকস](./CONTRIBUTING.md) পড়ে নিন।
+
+### OpenCode এর উপর বিল্ডিং (Building on OpenCode)
+
+আপনি যদি এমন প্রজেক্টে কাজ করেন যা OpenCode এর সাথে সম্পর্কিত এবং প্রজেক্টের নামের অংশ হিসেবে "opencode" ব্যবহার করেন, উদাহরণস্বরূপ "opencode-dashboard" বা "opencode-mobile", তবে দয়া করে আপনার README তে একটি নোট যোগ করে স্পষ্ট করুন যে এই প্রজেক্টটি OpenCode দল দ্বারা তৈরি হয়নি এবং আমাদের সাথে এর কোনো সরাসরি সম্পর্ক নেই।
+
+---
+
+**আমাদের কমিউনিটিতে যুক্ত হোন** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.br.md b/README.br.md
new file mode 100644
index 0000000..976738c
--- /dev/null
+++ b/README.br.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+O agente de programação com IA de código aberto.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Instalação
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Gerenciadores de pacotes
+npm i -g opencode-ai@latest # ou bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS e Linux (recomendado, sempre atualizado)
+brew install opencode # macOS e Linux (fórmula oficial do brew, atualiza menos)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # qualquer sistema
+nix run nixpkgs#opencode # ou github:anomalyco/opencode para a branch dev mais recente
+```
+
+> [!TIP]
+> Remova versões anteriores a 0.1.x antes de instalar.
+
+### App desktop (BETA)
+
+O OpenCode também está disponível como aplicativo desktop. Baixe diretamente pela [página de releases](https://github.com/anomalyco/opencode/releases) ou em [opencode.ai/download](https://opencode.ai/download).
+
+| Plataforma | Download |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` ou AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Diretório de instalação
+
+O script de instalação respeita a seguinte ordem de prioridade para o caminho de instalação:
+
+1. `$OPENCODE_INSTALL_DIR` - Diretório de instalação personalizado
+2. `$XDG_BIN_DIR` - Caminho compatível com a especificação XDG Base Directory
+3. `$HOME/bin` - Diretório binário padrão do usuário (se existir ou puder ser criado)
+4. `$HOME/.opencode/bin` - Fallback padrão
+
+```bash
+# Exemplos
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+O OpenCode inclui dois agents integrados, que você pode alternar com a tecla `Tab`.
+
+- **build** - Padrão, agent com acesso total para trabalho de desenvolvimento
+- **plan** - Agent somente leitura para análise e exploração de código
+ - Nega edições de arquivos por padrão
+ - Pede permissão antes de executar comandos bash
+ - Ideal para explorar codebases desconhecidas ou planejar mudanças
+
+Também há um subagent **general** para buscas complexas e tarefas em várias etapas.
+Ele é usado internamente e pode ser invocado com `@general` nas mensagens.
+
+Saiba mais sobre [agents](https://opencode.ai/docs/agents).
+
+### Documentação
+
+Para mais informações sobre como configurar o OpenCode, [**veja nossa documentação**](https://opencode.ai/docs).
+
+### Contribuir
+
+Se você tem interesse em contribuir com o OpenCode, leia os [contributing docs](./CONTRIBUTING.md) antes de enviar um pull request.
+
+### Construindo com OpenCode
+
+Se você estiver trabalhando em um projeto relacionado ao OpenCode e estiver usando "opencode" como parte do nome (por exemplo, "opencode-dashboard" ou "opencode-mobile"), adicione uma nota no README para deixar claro que não foi construído pela equipe do OpenCode e não é afiliado a nós de nenhuma forma.
+
+---
+
+**Junte-se à nossa comunidade** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.bs.md b/README.bs.md
new file mode 100644
index 0000000..0adf8eb
--- /dev/null
+++ b/README.bs.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+OpenCode je open source AI agent za programiranje.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Instalacija
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Package manageri
+npm i -g opencode-ai@latest # ili bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS i Linux (preporučeno, uvijek ažurno)
+brew install opencode # macOS i Linux (zvanična brew formula, rjeđe se ažurira)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Bilo koji OS
+nix run nixpkgs#opencode # ili github:anomalyco/opencode za najnoviji dev branch
+```
+
+> [!TIP]
+> Ukloni verzije starije od 0.1.x prije instalacije.
+
+### Desktop aplikacija (BETA)
+
+OpenCode je dostupan i kao desktop aplikacija. Preuzmi je direktno sa [stranice izdanja](https://github.com/anomalyco/opencode/releases) ili sa [opencode.ai/download](https://opencode.ai/download).
+
+| Platforma | Preuzimanje |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, ili AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Instalacijski direktorij
+
+Instalacijska skripta koristi sljedeći redoslijed prioriteta za putanju instalacije:
+
+1. `$OPENCODE_INSTALL_DIR` - Prilagođeni instalacijski direktorij
+2. `$XDG_BIN_DIR` - Putanja usklađena sa XDG Base Directory specifikacijom
+3. `$HOME/bin` - Standardni korisnički bin direktorij (ako postoji ili se može kreirati)
+4. `$HOME/.opencode/bin` - Podrazumijevana rezervna lokacija
+
+```bash
+# Primjeri
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agenti
+
+OpenCode uključuje dva ugrađena agenta između kojih možeš prebacivati tasterom `Tab`.
+
+- **build** - Podrazumijevani agent sa punim pristupom za razvoj
+- **plan** - Agent samo za čitanje za analizu i istraživanje koda
+ - Podrazumijevano zabranjuje izmjene datoteka
+ - Traži dozvolu prije pokretanja bash komandi
+ - Idealan za istraživanje nepoznatih codebase-ova ili planiranje izmjena
+
+Uključen je i **general** pod-agent za složene pretrage i višekoračne zadatke.
+Koristi se interno i može se pozvati pomoću `@general` u porukama.
+
+Saznaj više o [agentima](https://opencode.ai/docs/agents).
+
+### Dokumentacija
+
+Za više informacija o konfiguraciji OpenCode-a, [**pogledaj dokumentaciju**](https://opencode.ai/docs).
+
+### Doprinosi
+
+Ako želiš doprinositi OpenCode-u, pročitaj [upute za doprinošenje](./CONTRIBUTING.md) prije slanja pull requesta.
+
+### Gradnja na OpenCode-u
+
+Ako radiš na projektu koji je povezan s OpenCode-om i koristi "opencode" kao dio naziva, npr. "opencode-dashboard" ili "opencode-mobile", dodaj napomenu u svoj README da projekat nije napravio OpenCode tim i da nije povezan s nama.
+
+---
+
+**Pridruži se našoj zajednici** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.da.md b/README.da.md
new file mode 100644
index 0000000..e8932e0
--- /dev/null
+++ b/README.da.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Den open source AI-kodeagent.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Installation
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Pakkehåndteringer
+npm i -g opencode-ai@latest # eller bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS og Linux (anbefalet, altid up to date)
+brew install opencode # macOS og Linux (officiel brew formula, opdateres sjældnere)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # alle OS
+nix run nixpkgs#opencode # eller github:anomalyco/opencode for nyeste dev-branch
+```
+
+> [!TIP]
+> Fjern versioner ældre end 0.1.x før installation.
+
+### Desktop-app (BETA)
+
+OpenCode findes også som desktop-app. Download direkte fra [releases-siden](https://github.com/anomalyco/opencode/releases) eller [opencode.ai/download](https://opencode.ai/download).
+
+| Platform | Download |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, eller AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Installationsmappe
+
+Installationsscriptet bruger følgende prioriteringsrækkefølge for installationsstien:
+
+1. `$OPENCODE_INSTALL_DIR` - Tilpasset installationsmappe
+2. `$XDG_BIN_DIR` - Sti der følger XDG Base Directory Specification
+3. `$HOME/bin` - Standard bruger-bin-mappe (hvis den findes eller kan oprettes)
+4. `$HOME/.opencode/bin` - Standard fallback
+
+```bash
+# Eksempler
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode har to indbyggede agents, som du kan skifte mellem med `Tab`-tasten.
+
+- **build** - Standard, agent med fuld adgang til udviklingsarbejde
+- **plan** - Skrivebeskyttet agent til analyse og kodeudforskning
+ - Afviser filredigering som standard
+ - Spørger om tilladelse før bash-kommandoer
+ - Ideel til at udforske ukendte kodebaser eller planlægge ændringer
+
+Derudover findes der en **general**-subagent til komplekse søgninger og flertrinsopgaver.
+Den bruges internt og kan kaldes via `@general` i beskeder.
+
+Læs mere om [agents](https://opencode.ai/docs/agents).
+
+### Dokumentation
+
+For mere info om konfiguration af OpenCode, [**se vores docs**](https://opencode.ai/docs).
+
+### Bidrag
+
+Hvis du vil bidrage til OpenCode, så læs vores [contributing docs](./CONTRIBUTING.md) før du sender en pull request.
+
+### Bygget på OpenCode
+
+Hvis du arbejder på et projekt der er relateret til OpenCode og bruger "opencode" som en del af navnet; f.eks. "opencode-dashboard" eller "opencode-mobile", så tilføj en note i din README, der tydeliggør at projektet ikke er bygget af OpenCode-teamet og ikke er tilknyttet os på nogen måde.
+
+---
+
+**Bliv en del af vores community** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.de.md b/README.de.md
new file mode 100644
index 0000000..958386c
--- /dev/null
+++ b/README.de.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Der Open-Source KI-Coding-Agent.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Installation
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Paketmanager
+npm i -g opencode-ai@latest # oder bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS und Linux (empfohlen, immer aktuell)
+brew install opencode # macOS und Linux (offizielle Brew-Formula, seltener aktualisiert)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # jedes Betriebssystem
+nix run nixpkgs#opencode # oder github:anomalyco/opencode für den neuesten dev-Branch
+```
+
+> [!TIP]
+> Entferne Versionen älter als 0.1.x vor der Installation.
+
+### Desktop-App (BETA)
+
+OpenCode ist auch als Desktop-Anwendung verfügbar. Lade sie direkt von der [Releases-Seite](https://github.com/anomalyco/opencode/releases) oder [opencode.ai/download](https://opencode.ai/download) herunter.
+
+| Plattform | Download |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` oder AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Installationsverzeichnis
+
+Das Installationsskript beachtet die folgende Prioritätsreihenfolge für den Installationspfad:
+
+1. `$OPENCODE_INSTALL_DIR` - Benutzerdefiniertes Installationsverzeichnis
+2. `$XDG_BIN_DIR` - XDG Base Directory Specification-konformer Pfad
+3. `$HOME/bin` - Standard-Binärverzeichnis des Users (falls vorhanden oder erstellbar)
+4. `$HOME/.opencode/bin` - Standard-Fallback
+
+```bash
+# Beispiele
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode enthält zwei eingebaute Agents, zwischen denen du mit der `Tab`-Taste wechseln kannst.
+
+- **build** - Standard-Agent mit vollem Zugriff für Entwicklungsarbeit
+- **plan** - Nur-Lese-Agent für Analyse und Code-Exploration
+ - Verweigert Datei-Edits standardmäßig
+ - Fragt vor dem Ausführen von bash-Befehlen nach
+ - Ideal zum Erkunden unbekannter Codebases oder zum Planen von Änderungen
+
+Außerdem ist ein **general**-Subagent für komplexe Suchen und mehrstufige Aufgaben enthalten.
+Dieser wird intern genutzt und kann in Nachrichten mit `@general` aufgerufen werden.
+
+Mehr dazu unter [Agents](https://opencode.ai/docs/agents).
+
+### Dokumentation
+
+Mehr Infos zur Konfiguration von OpenCode findest du in unseren [**Docs**](https://opencode.ai/docs).
+
+### Beitragen
+
+Wenn du zu OpenCode beitragen möchtest, lies bitte unsere [Contributing Docs](./CONTRIBUTING.md), bevor du einen Pull Request einreichst.
+
+### Auf OpenCode aufbauen
+
+Wenn du an einem Projekt arbeitest, das mit OpenCode zusammenhängt und "opencode" als Teil seines Namens verwendet (z.B. "opencode-dashboard" oder "opencode-mobile"), füge bitte einen Hinweis in deine README ein, dass es nicht vom OpenCode-Team gebaut wird und nicht in irgendeiner Weise mit uns verbunden ist.
+
+---
+
+**Tritt unserer Community bei** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.es.md b/README.es.md
new file mode 100644
index 0000000..39540bc
--- /dev/null
+++ b/README.es.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+El agente de programación con IA de código abierto.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Instalación
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Gestores de paquetes
+npm i -g opencode-ai@latest # o bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS y Linux (recomendado, siempre al día)
+brew install opencode # macOS y Linux (fórmula oficial de brew, se actualiza menos)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # cualquier sistema
+nix run nixpkgs#opencode # o github:anomalyco/opencode para la rama dev más reciente
+```
+
+> [!TIP]
+> Elimina versiones anteriores a 0.1.x antes de instalar.
+
+### App de escritorio (BETA)
+
+OpenCode también está disponible como aplicación de escritorio. Descárgala directamente desde la [página de releases](https://github.com/anomalyco/opencode/releases) o desde [opencode.ai/download](https://opencode.ai/download).
+
+| Plataforma | Descarga |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, o AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Directorio de instalación
+
+El script de instalación respeta el siguiente orden de prioridad para la ruta de instalación:
+
+1. `$OPENCODE_INSTALL_DIR` - Directorio de instalación personalizado
+2. `$XDG_BIN_DIR` - Ruta compatible con la especificación XDG Base Directory
+3. `$HOME/bin` - Directorio binario estándar del usuario (si existe o se puede crear)
+4. `$HOME/.opencode/bin` - Alternativa por defecto
+
+```bash
+# Ejemplos
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agentes
+
+OpenCode incluye dos agentes integrados que puedes alternar con la tecla `Tab`.
+
+- **build** - Por defecto, agente con acceso completo para tareas de desarrollo
+- **plan** - Agente de solo lectura para análisis y exploración de código
+ - Deniega ediciones de archivos por defecto
+ - Pide permiso antes de ejecutar comandos bash
+ - Ideal para explorar codebases desconocidas o planificar cambios
+
+Además, incluye un subagente **general** para búsquedas complejas y tareas de varios pasos.
+Se usa internamente y se puede invocar con `@general` en los mensajes.
+
+Más información sobre [agentes](https://opencode.ai/docs/agents).
+
+### Documentación
+
+Para más información sobre cómo configurar OpenCode, [**ve a nuestra documentación**](https://opencode.ai/docs).
+
+### Contribuir
+
+Si te interesa contribuir a OpenCode, lee nuestras [docs de contribución](./CONTRIBUTING.md) antes de enviar un pull request.
+
+### Proyectos basados en OpenCode
+
+Si estás trabajando en un proyecto basado en OpenCode y usas "opencode" como parte del nombre, por ejemplo, "opencode-dashboard" u "opencode-mobile", agrega una nota en tu README para aclarar que no está hecho por el equipo de OpenCode y que no está afiliado con nosotros de ninguna manera.
+
+---
+
+**Únete a nuestra comunidad** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.fr.md b/README.fr.md
new file mode 100644
index 0000000..d19c89d
--- /dev/null
+++ b/README.fr.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+L'agent de codage IA open source.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Installation
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Gestionnaires de paquets
+npm i -g opencode-ai@latest # ou bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS et Linux (recommandé, toujours à jour)
+brew install opencode # macOS et Linux (formule officielle brew, mise à jour moins fréquente)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # n'importe quel OS
+nix run nixpkgs#opencode # ou github:anomalyco/opencode pour la branche dev la plus récente
+```
+
+> [!TIP]
+> Supprimez les versions antérieures à 0.1.x avant d'installer.
+
+### Application de bureau (BETA)
+
+OpenCode est aussi disponible en application de bureau. Téléchargez-la directement depuis la [page des releases](https://github.com/anomalyco/opencode/releases) ou [opencode.ai/download](https://opencode.ai/download).
+
+| Plateforme | Téléchargement |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, ou AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Répertoire d'installation
+
+Le script d'installation respecte l'ordre de priorité suivant pour le chemin d'installation :
+
+1. `$OPENCODE_INSTALL_DIR` - Répertoire d'installation personnalisé
+2. `$XDG_BIN_DIR` - Chemin conforme à la spécification XDG Base Directory
+3. `$HOME/bin` - Répertoire binaire utilisateur standard (s'il existe ou peut être créé)
+4. `$HOME/.opencode/bin` - Repli par défaut
+
+```bash
+# Exemples
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode inclut deux agents intégrés que vous pouvez basculer avec la touche `Tab`.
+
+- **build** - Par défaut, agent avec accès complet pour le travail de développement
+- **plan** - Agent en lecture seule pour l'analyse et l'exploration du code
+ - Refuse les modifications de fichiers par défaut
+ - Demande l'autorisation avant d'exécuter des commandes bash
+ - Idéal pour explorer une base de code inconnue ou planifier des changements
+
+Un sous-agent **general** est aussi inclus pour les recherches complexes et les tâches en plusieurs étapes.
+Il est utilisé en interne et peut être invoqué via `@general` dans les messages.
+
+En savoir plus sur les [agents](https://opencode.ai/docs/agents).
+
+### Documentation
+
+Pour plus d'informations sur la configuration d'OpenCode, [**consultez notre documentation**](https://opencode.ai/docs).
+
+### Contribuer
+
+Si vous souhaitez contribuer à OpenCode, lisez nos [docs de contribution](./CONTRIBUTING.md) avant de soumettre une pull request.
+
+### Construire avec OpenCode
+
+Si vous travaillez sur un projet lié à OpenCode et que vous utilisez "opencode" dans le nom du projet (par exemple, "opencode-dashboard" ou "opencode-mobile"), ajoutez une note dans votre README pour préciser qu'il n'est pas construit par l'équipe OpenCode et qu'il n'est pas affilié à nous.
+
+---
+
+**Rejoignez notre communauté** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.gr.md b/README.gr.md
new file mode 100644
index 0000000..a8412b3
--- /dev/null
+++ b/README.gr.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Ο πράκτορας τεχνητής νοημοσύνης ανοικτού κώδικα για προγραμματισμό.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Εγκατάσταση
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Διαχειριστές πακέτων
+npm i -g opencode-ai@latest # ή bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS και Linux (προτείνεται, πάντα ενημερωμένο)
+brew install opencode # macOS και Linux (επίσημος τύπος brew, λιγότερο συχνές ενημερώσεις)
+sudo pacman -S opencode # Arch Linux (Σταθερό)
+paru -S opencode-bin # Arch Linux (Τελευταία έκδοση από AUR)
+mise use -g opencode # Οποιοδήποτε λειτουργικό σύστημα
+nix run nixpkgs#opencode # ή github:anomalyco/opencode με βάση την πιο πρόσφατη αλλαγή από το dev branch
+```
+
+> [!TIP]
+> Αφαίρεσε παλαιότερες εκδόσεις από τη 0.1.x πριν από την εγκατάσταση.
+
+### Εφαρμογή Desktop (BETA)
+
+Το OpenCode είναι επίσης διαθέσιμο ως εφαρμογή. Κατέβασε το απευθείας από τη [σελίδα εκδόσεων](https://github.com/anomalyco/opencode/releases) ή το [opencode.ai/download](https://opencode.ai/download).
+
+| Πλατφόρμα | Λήψη |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, ή AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Κατάλογος Εγκατάστασης
+
+Το script εγκατάστασης τηρεί την ακόλουθη σειρά προτεραιότητας για τη διαδρομή εγκατάστασης:
+
+1. `$OPENCODE_INSTALL_DIR` - Προσαρμοσμένος κατάλογος εγκατάστασης
+2. `$XDG_BIN_DIR` - Διαδρομή συμβατή με τις προδιαγραφές XDG Base Directory
+3. `$HOME/bin` - Τυπικός κατάλογος εκτελέσιμων αρχείων χρήστη (εάν υπάρχει ή μπορεί να δημιουργηθεί)
+4. `$HOME/.opencode/bin` - Προεπιλεγμένη εφεδρική διαδρομή
+
+```bash
+# Παραδείγματα
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Πράκτορες
+
+Το OpenCode περιλαμβάνει δύο ενσωματωμένους πράκτορες μεταξύ των οποίων μπορείτε να εναλλάσσεστε με το πλήκτρο `Tab`.
+
+- **build** - Προεπιλεγμένος πράκτορας με πλήρη πρόσβαση για εργασία πάνω σε κώδικα
+- **plan** - Πράκτορας μόνο ανάγνωσης για ανάλυση και εξερεύνηση κώδικα
+ - Αρνείται την επεξεργασία αρχείων από προεπιλογή
+ - Ζητά άδεια πριν εκτελέσει εντολές bash
+ - Ιδανικός για εξερεύνηση άγνωστων αρχείων πηγαίου κώδικα ή σχεδιασμό αλλαγών
+
+Περιλαμβάνεται επίσης ένας **general** υποπράκτορας για σύνθετες αναζητήσεις και πολυβηματικές διεργασίες.
+Χρησιμοποιείται εσωτερικά και μπορεί να κληθεί χρησιμοποιώντας `@general` στα μηνύματα.
+
+Μάθετε περισσότερα για τους [πράκτορες](https://opencode.ai/docs/agents).
+
+### Οδηγός Χρήσης
+
+Για περισσότερες πληροφορίες σχετικά με τη ρύθμιση του OpenCode, [**πλοηγήσου στον οδηγό χρήσης μας**](https://opencode.ai/docs).
+
+### Συνεισφορά
+
+Εάν ενδιαφέρεσαι να συνεισφέρεις στο OpenCode, διαβάστε τα [οδηγό χρήσης συνεισφοράς](./CONTRIBUTING.md) πριν υποβάλεις ένα pull request.
+
+### Δημιουργία πάνω στο OpenCode
+
+Εάν εργάζεσαι σε ένα έργο σχετικό με το OpenCode και χρησιμοποιείτε το "opencode" ως μέρος του ονόματός του, για παράδειγμα "opencode-dashboard" ή "opencode-mobile", πρόσθεσε μια σημείωση στο README σας για να διευκρινίσεις ότι δεν είναι κατασκευασμένο από την ομάδα του OpenCode και δεν έχει καμία σχέση με εμάς.
+
+---
+
+**Γίνε μέλος της κοινότητάς μας** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.it.md b/README.it.md
new file mode 100644
index 0000000..2ed4aeb
--- /dev/null
+++ b/README.it.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+L’agente di coding AI open source.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Installazione
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Package manager
+npm i -g opencode-ai@latest # oppure bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS e Linux (consigliato, sempre aggiornato)
+brew install opencode # macOS e Linux (formula brew ufficiale, aggiornata meno spesso)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Qualsiasi OS
+nix run nixpkgs#opencode # oppure github:anomalyco/opencode per l’ultima branch di sviluppo
+```
+
+> [!TIP]
+> Rimuovi le versioni precedenti alla 0.1.x prima di installare.
+
+### App Desktop (BETA)
+
+OpenCode è disponibile anche come applicazione desktop. Puoi scaricarla direttamente dalla [pagina delle release](https://github.com/anomalyco/opencode/releases) oppure da [opencode.ai/download](https://opencode.ai/download).
+
+| Piattaforma | Download |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, oppure AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Directory di installazione
+
+Lo script di installazione rispetta il seguente ordine di priorità per il percorso di installazione:
+
+1. `$OPENCODE_INSTALL_DIR` – Directory di installazione personalizzata
+2. `$XDG_BIN_DIR` – Percorso conforme alla XDG Base Directory Specification
+3. `$HOME/bin` – Directory binaria standard dell’utente (se esiste o può essere creata)
+4. `$HOME/.opencode/bin` – Fallback predefinito
+
+```bash
+# Esempi
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agenti
+
+OpenCode include due agenti integrati tra cui puoi passare usando il tasto `Tab`.
+
+- **build** – Predefinito, agente con accesso completo per il lavoro di sviluppo
+- **plan** – Agente in sola lettura per analisi ed esplorazione del codice
+ - Nega le modifiche ai file per impostazione predefinita
+ - Chiede il permesso prima di eseguire comandi bash
+ - Ideale per esplorare codebase sconosciute o pianificare modifiche
+
+È inoltre incluso un sotto-agente **general** per ricerche complesse e attività multi-step.
+Viene utilizzato internamente e può essere invocato usando `@general` nei messaggi.
+
+Scopri di più sugli [agenti](https://opencode.ai/docs/agents).
+
+### Documentazione
+
+Per maggiori informazioni su come configurare OpenCode, [**consulta la nostra documentazione**](https://opencode.ai/docs).
+
+### Contribuire
+
+Se sei interessato a contribuire a OpenCode, leggi la nostra [guida alla contribuzione](./CONTRIBUTING.md) prima di inviare una pull request.
+
+### Costruire su OpenCode
+
+Se stai lavorando a un progetto correlato a OpenCode e che utilizza “opencode” come parte del nome (ad esempio “opencode-dashboard” o “opencode-mobile”), aggiungi una nota nel tuo README per chiarire che non è sviluppato dal team OpenCode e che non è affiliato in alcun modo con noi.
+
+---
+
+**Unisciti alla nostra community** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.ja.md b/README.ja.md
new file mode 100644
index 0000000..75a017f
--- /dev/null
+++ b/README.ja.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+オープンソースのAIコーディングエージェント。
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### インストール
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# パッケージマネージャー
+npm i -g opencode-ai@latest # bun/pnpm/yarn でもOK
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS と Linux(推奨。常に最新)
+brew install opencode # macOS と Linux(公式 brew formula。更新頻度は低め)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # どのOSでも
+nix run nixpkgs#opencode # または github:anomalyco/opencode で最新 dev ブランチ
+```
+
+> [!TIP]
+> インストール前に 0.1.x より古いバージョンを削除してください。
+
+### デスクトップアプリ (BETA)
+
+OpenCode はデスクトップアプリとしても利用できます。[releases page](https://github.com/anomalyco/opencode/releases) から直接ダウンロードするか、[opencode.ai/download](https://opencode.ai/download) を利用してください。
+
+| プラットフォーム | ダウンロード |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`、`.rpm`、または AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### インストールディレクトリ
+
+インストールスクリプトは、インストール先パスを次の優先順位で決定します。
+
+1. `$OPENCODE_INSTALL_DIR` - カスタムのインストールディレクトリ
+2. `$XDG_BIN_DIR` - XDG Base Directory Specification に準拠したパス
+3. `$HOME/bin` - 標準のユーザー用バイナリディレクトリ(存在する場合、または作成できる場合)
+4. `$HOME/.opencode/bin` - デフォルトのフォールバック
+
+```bash
+# 例
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode には組み込みの Agent が2つあり、`Tab` キーで切り替えられます。
+
+- **build** - デフォルト。開発向けのフルアクセス Agent
+- **plan** - 分析とコード探索向けの読み取り専用 Agent
+ - デフォルトでファイル編集を拒否
+ - bash コマンド実行前に確認
+ - 未知のコードベース探索や変更計画に最適
+
+また、複雑な検索やマルチステップのタスク向けに **general** サブ Agent も含まれています。
+内部的に使用されており、メッセージで `@general` と入力して呼び出せます。
+
+[agents](https://opencode.ai/docs/agents) の詳細はこちら。
+
+### ドキュメント
+
+OpenCode の設定については [**ドキュメント**](https://opencode.ai/docs) を参照してください。
+
+### コントリビュート
+
+OpenCode に貢献したい場合は、Pull Request を送る前に [contributing docs](./CONTRIBUTING.md) を読んでください。
+
+### OpenCode の上に構築する
+
+OpenCode に関連するプロジェクトで、名前に "opencode"(例: "opencode-dashboard" や "opencode-mobile")を含める場合は、そのプロジェクトが OpenCode チームによって作られたものではなく、いかなる形でも関係がないことを README に明記してください。
+
+---
+
+**コミュニティに参加** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.ko.md b/README.ko.md
new file mode 100644
index 0000000..aa21a73
--- /dev/null
+++ b/README.ko.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+오픈 소스 AI 코딩 에이전트.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### 설치
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# 패키지 매니저
+npm i -g opencode-ai@latest # bun/pnpm/yarn 도 가능
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS 및 Linux (권장, 항상 최신)
+brew install opencode # macOS 및 Linux (공식 brew formula, 업데이트 빈도 낮음)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # 어떤 OS든
+nix run nixpkgs#opencode # 또는 github:anomalyco/opencode 로 최신 dev 브랜치
+```
+
+> [!TIP]
+> 설치 전에 0.1.x 보다 오래된 버전을 제거하세요.
+
+### 데스크톱 앱 (BETA)
+
+OpenCode 는 데스크톱 앱으로도 제공됩니다. [releases page](https://github.com/anomalyco/opencode/releases) 에서 직접 다운로드하거나 [opencode.ai/download](https://opencode.ai/download) 를 이용하세요.
+
+| 플랫폼 | 다운로드 |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, 또는 AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### 설치 디렉터리
+
+설치 스크립트는 설치 경로를 다음 우선순위로 결정합니다.
+
+1. `$OPENCODE_INSTALL_DIR` - 사용자 지정 설치 디렉터리
+2. `$XDG_BIN_DIR` - XDG Base Directory Specification 준수 경로
+3. `$HOME/bin` - 표준 사용자 바이너리 디렉터리 (존재하거나 생성 가능할 경우)
+4. `$HOME/.opencode/bin` - 기본 폴백
+
+```bash
+# 예시
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode 에는 내장 에이전트 2개가 있으며 `Tab` 키로 전환할 수 있습니다.
+
+- **build** - 기본값, 개발 작업을 위한 전체 권한 에이전트
+- **plan** - 분석 및 코드 탐색을 위한 읽기 전용 에이전트
+ - 기본적으로 파일 편집을 거부
+ - bash 명령 실행 전에 권한을 요청
+ - 낯선 코드베이스를 탐색하거나 변경을 계획할 때 적합
+
+또한 복잡한 검색과 여러 단계 작업을 위한 **general** 서브 에이전트가 포함되어 있습니다.
+내부적으로 사용되며, 메시지에서 `@general` 로 호출할 수 있습니다.
+
+[agents](https://opencode.ai/docs/agents) 에 대해 더 알아보세요.
+
+### 문서
+
+OpenCode 설정에 대한 자세한 내용은 [**문서**](https://opencode.ai/docs) 를 참고하세요.
+
+### 기여하기
+
+OpenCode 에 기여하고 싶다면, Pull Request 를 제출하기 전에 [contributing docs](./CONTRIBUTING.md) 를 읽어주세요.
+
+### OpenCode 기반으로 만들기
+
+OpenCode 와 관련된 프로젝트를 진행하면서 이름에 "opencode"(예: "opencode-dashboard" 또는 "opencode-mobile") 를 포함한다면, README 에 해당 프로젝트가 OpenCode 팀이 만든 것이 아니며 어떤 방식으로도 우리와 제휴되어 있지 않다는 점을 명시해 주세요.
+
+---
+
+**커뮤니티에 참여하기** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5588e81
--- /dev/null
+++ b/README.md
@@ -0,0 +1,81 @@
+
+
AirCoding
+
+基于 OpenCode v1.17.4 的多 Agent 协作 AI 编程系统
+
+
+
+
+---
+
+### 概述
+
+AirCoding 是一个确定性调度为主、LLM 为辅的多 Agent 协作编程框架,以 C++ 为首个深度支持语言。核心设计原则:
+
+- **工具白名单是硬阻断**:每层 Agent 的能力由代码级权限控制,不依赖 Prompt 约束
+- **确定性调度优先**:正常流程走 DAG 状态机,异常/边界才调 LLM
+- **两层审查**:Worker 自验 + Reviewer Code-to-Design 审查
+- **证据门控**:cppcheck 强制(C++ 项目),取证后才能改代码(DEBUG 模式)
+
+### 架构
+
+```
+用户 → Main Agent (aircoding) → 协调派发
+ │
+ ├─→ Architect(架构规划器)
+ │ 产出:plan.md + task-graph.json + ADR + C4 文档
+ │
+ └─→ Scheduler(调度引擎)
+ │ coordinator_tick 确定性 DAG 调度
+ │
+ ├─→ Worker(执行器/调试器)
+ │ EXECUTE: 写代码 → 编译 → 测试 → cppcheck
+ │ DEBUG: 取证 → 记录 → 修复 → 验证
+ │
+ └─→ Reviewer(代码审查器)
+ 对照 plan.md 做 Code-to-Design Review
+```
+
+### Agent 权限矩阵
+
+| Agent | 可用工具 | 禁止工具 |
+|-------|---------|---------|
+| aircoding (Main) | read, glob, grep, task, question, web | write, edit, bash |
+| Scheduler | read, glob, grep, task, coordinator_* | write, edit, bash |
+| Worker | read, write, edit, bash, glob, grep | task |
+| Architect | read, glob, grep, task, edit/write (.air/shared/plan/**) | bash, 代码文件写 |
+| Reviewer | read, glob, grep | write, edit, bash, task |
+
+### 构建
+
+```bash
+bun install # 安装依赖
+bun typecheck # 类型检查
+cd packages/opencode && bun test # 运行测试
+```
+
+### 目录约定
+
+```
+.air/shared/plan/plan.md # 架构方案(Architect 产出)
+.air/shared/plan/task-graph.json # 任务图(Architect 产出,Scheduler 执行)
+.air/shared/plan/docs/ADR-*.md # 架构决策记录
+.air/shared/plan/docs/c4/ # C4 模型文档
+.air/local/state/scheduler-state.json # 调度器状态(实时落盘)
+.air/local/debug/debug-log.md # 调试记录
+```
+
+### 设计文档
+
+详细设计文档在 `docs/` 目录:
+
+- [架构设计 MVP](docs/aircoding-architecture-mvp.md)
+- [V2 实现计划](docs/implementation-plan.md)
+- [V2 设计(详细)](docs/airplanV2-Qwen3.7-Max设计.md)
+- [V1 基线](docs/baselineV1.md)
+- [AGENTS.md](docs/AGENTS.md)
+- [集成说明](docs/INTEGRATION.md)
+
+### 致谢
+
+基于 [OpenCode](https://github.com/anomalyco/opencode) v1.17.4 fork。
diff --git a/README.no.md b/README.no.md
new file mode 100644
index 0000000..246e1db
--- /dev/null
+++ b/README.no.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+AI-kodeagent med åpen kildekode.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Installasjon
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Pakkehåndterere
+npm i -g opencode-ai@latest # eller bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS og Linux (anbefalt, alltid oppdatert)
+brew install opencode # macOS og Linux (offisiell brew-formel, oppdateres sjeldnere)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # alle OS
+nix run nixpkgs#opencode # eller github:anomalyco/opencode for nyeste dev-branch
+```
+
+> [!TIP]
+> Fjern versjoner eldre enn 0.1.x før du installerer.
+
+### Desktop-app (BETA)
+
+OpenCode er også tilgjengelig som en desktop-app. Last ned direkte fra [releases-siden](https://github.com/anomalyco/opencode/releases) eller [opencode.ai/download](https://opencode.ai/download).
+
+| Plattform | Nedlasting |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` eller AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Installasjonsmappe
+
+Installasjonsskriptet bruker følgende prioritet for installasjonsstien:
+
+1. `$OPENCODE_INSTALL_DIR` - Egendefinert installasjonsmappe
+2. `$XDG_BIN_DIR` - Sti som følger XDG Base Directory Specification
+3. `$HOME/bin` - Standard brukerbinar-mappe (hvis den finnes eller kan opprettes)
+4. `$HOME/.opencode/bin` - Standard fallback
+
+```bash
+# Eksempler
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode har to innebygde agents du kan bytte mellom med `Tab`-tasten.
+
+- **build** - Standard, agent med full tilgang for utviklingsarbeid
+- **plan** - Skrivebeskyttet agent for analyse og kodeutforsking
+ - Nekter filendringer som standard
+ - Spør om tillatelse før bash-kommandoer
+ - Ideell for å utforske ukjente kodebaser eller planlegge endringer
+
+Det finnes også en **general**-subagent for komplekse søk og flertrinnsoppgaver.
+Den brukes internt og kan kalles via `@general` i meldinger.
+
+Les mer om [agents](https://opencode.ai/docs/agents).
+
+### Dokumentasjon
+
+For mer info om hvordan du konfigurerer OpenCode, [**se dokumentasjonen**](https://opencode.ai/docs).
+
+### Bidra
+
+Hvis du vil bidra til OpenCode, les [contributing docs](./CONTRIBUTING.md) før du sender en pull request.
+
+### Bygge på OpenCode
+
+Hvis du jobber med et prosjekt som er relatert til OpenCode og bruker "opencode" som en del av navnet; for eksempel "opencode-dashboard" eller "opencode-mobile", legg inn en merknad i README som presiserer at det ikke er bygget av OpenCode-teamet og ikke er tilknyttet oss på noen måte.
+
+---
+
+**Bli med i fellesskapet** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.pl.md b/README.pl.md
new file mode 100644
index 0000000..6b86de4
--- /dev/null
+++ b/README.pl.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Otwartoźródłowy agent kodujący AI.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Instalacja
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Menedżery pakietów
+npm i -g opencode-ai@latest # albo bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS i Linux (polecane, zawsze aktualne)
+brew install opencode # macOS i Linux (oficjalna formuła brew, rzadziej aktualizowana)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # dowolny system
+nix run nixpkgs#opencode # lub github:anomalyco/opencode dla najnowszej gałęzi dev
+```
+
+> [!TIP]
+> Przed instalacją usuń wersje starsze niż 0.1.x.
+
+### Aplikacja desktopowa (BETA)
+
+OpenCode jest także dostępny jako aplikacja desktopowa. Pobierz ją bezpośrednio ze strony [releases](https://github.com/anomalyco/opencode/releases) lub z [opencode.ai/download](https://opencode.ai/download).
+
+| Platforma | Pobieranie |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` lub AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Katalog instalacji
+
+Skrypt instalacyjny stosuje następujący priorytet wyboru ścieżki instalacji:
+
+1. `$OPENCODE_INSTALL_DIR` - Własny katalog instalacji
+2. `$XDG_BIN_DIR` - Ścieżka zgodna ze specyfikacją XDG Base Directory
+3. `$HOME/bin` - Standardowy katalog binarny użytkownika (jeśli istnieje lub można go utworzyć)
+4. `$HOME/.opencode/bin` - Domyślny fallback
+
+```bash
+# Przykłady
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode zawiera dwóch wbudowanych agentów, między którymi możesz przełączać się klawiszem `Tab`.
+
+- **build** - Domyślny agent z pełnym dostępem do pracy developerskiej
+- **plan** - Agent tylko do odczytu do analizy i eksploracji kodu
+ - Domyślnie odmawia edycji plików
+ - Pyta o zgodę przed uruchomieniem komend bash
+ - Idealny do poznawania nieznanych baz kodu lub planowania zmian
+
+Dodatkowo jest subagent **general** do złożonych wyszukiwań i wieloetapowych zadań.
+Jest używany wewnętrznie i można go wywołać w wiadomościach przez `@general`.
+
+Dowiedz się więcej o [agents](https://opencode.ai/docs/agents).
+
+### Dokumentacja
+
+Więcej informacji o konfiguracji OpenCode znajdziesz w [**dokumentacji**](https://opencode.ai/docs).
+
+### Współtworzenie
+
+Jeśli chcesz współtworzyć OpenCode, przeczytaj [contributing docs](./CONTRIBUTING.md) przed wysłaniem pull requesta.
+
+### Budowanie na OpenCode
+
+Jeśli pracujesz nad projektem związanym z OpenCode i używasz "opencode" jako części nazwy (na przykład "opencode-dashboard" lub "opencode-mobile"), dodaj proszę notatkę do swojego README, aby wyjaśnić, że projekt nie jest tworzony przez zespół OpenCode i nie jest z nami w żaden sposób powiązany.
+
+---
+
+**Dołącz do naszej społeczności** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.ru.md b/README.ru.md
new file mode 100644
index 0000000..c679ce6
--- /dev/null
+++ b/README.ru.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Открытый AI-агент для программирования.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Установка
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Менеджеры пакетов
+npm i -g opencode-ai@latest # или bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS и Linux (рекомендуем, всегда актуально)
+brew install opencode # macOS и Linux (официальная формула brew, обновляется реже)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # любая ОС
+nix run nixpkgs#opencode # или github:anomalyco/opencode для самой свежей ветки dev
+```
+
+> [!TIP]
+> Перед установкой удалите версии старше 0.1.x.
+
+### Десктопное приложение (BETA)
+
+OpenCode также доступен как десктопное приложение. Скачайте его со [страницы релизов](https://github.com/anomalyco/opencode/releases) или с [opencode.ai/download](https://opencode.ai/download).
+
+| Платформа | Загрузка |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` или AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Каталог установки
+
+Скрипт установки выбирает путь установки в следующем порядке приоритета:
+
+1. `$OPENCODE_INSTALL_DIR` - Пользовательский каталог установки
+2. `$XDG_BIN_DIR` - Путь, совместимый со спецификацией XDG Base Directory
+3. `$HOME/bin` - Стандартный каталог пользовательских бинарников (если существует или можно создать)
+4. `$HOME/.opencode/bin` - Fallback по умолчанию
+
+```bash
+# Примеры
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+В OpenCode есть два встроенных агента, между которыми можно переключаться клавишей `Tab`.
+
+- **build** - По умолчанию, агент с полным доступом для разработки
+- **plan** - Агент только для чтения для анализа и изучения кода
+ - По умолчанию запрещает редактирование файлов
+ - Запрашивает разрешение перед выполнением bash-команд
+ - Идеален для изучения незнакомых кодовых баз или планирования изменений
+
+Также включен сабагент **general** для сложных поисков и многошаговых задач.
+Он используется внутренне и может быть вызван в сообщениях через `@general`.
+
+Подробнее об [agents](https://opencode.ai/docs/agents).
+
+### Документация
+
+Больше информации о том, как настроить OpenCode: [**наши docs**](https://opencode.ai/docs).
+
+### Вклад
+
+Если вы хотите внести вклад в OpenCode, прочитайте [contributing docs](./CONTRIBUTING.md) перед тем, как отправлять pull request.
+
+### Разработка на базе OpenCode
+
+Если вы делаете проект, связанный с OpenCode, и используете "opencode" как часть имени (например, "opencode-dashboard" или "opencode-mobile"), добавьте примечание в README, чтобы уточнить, что проект не создан командой OpenCode и не аффилирован с нами.
+
+---
+
+**Присоединяйтесь к нашему сообществу** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.th.md b/README.th.md
new file mode 100644
index 0000000..a70144d
--- /dev/null
+++ b/README.th.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+เอเจนต์การเขียนโค้ดด้วย AI แบบโอเพนซอร์ส
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### การติดตั้ง
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# ตัวจัดการแพ็กเกจ
+npm i -g opencode-ai@latest # หรือ bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS และ Linux (แนะนำ อัปเดตเสมอ)
+brew install opencode # macOS และ Linux (brew formula อย่างเป็นทางการ อัปเดตน้อยกว่า)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # ระบบปฏิบัติการใดก็ได้
+nix run nixpkgs#opencode # หรือ github:anomalyco/opencode สำหรับสาขาพัฒนาล่าสุด
+```
+
+> [!TIP]
+> ลบเวอร์ชันที่เก่ากว่า 0.1.x ก่อนติดตั้ง
+
+### แอปพลิเคชันเดสก์ท็อป (เบต้า)
+
+OpenCode มีให้ใช้งานเป็นแอปพลิเคชันเดสก์ท็อป ดาวน์โหลดโดยตรงจาก [หน้ารุ่น](https://github.com/anomalyco/opencode/releases) หรือ [opencode.ai/download](https://opencode.ai/download)
+
+| แพลตฟอร์ม | ดาวน์โหลด |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, หรือ AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### ไดเรกทอรีการติดตั้ง
+
+สคริปต์การติดตั้งจะใช้ลำดับความสำคัญตามเส้นทางการติดตั้ง:
+
+1. `$OPENCODE_INSTALL_DIR` - ไดเรกทอรีการติดตั้งที่กำหนดเอง
+2. `$XDG_BIN_DIR` - เส้นทางที่สอดคล้องกับ XDG Base Directory Specification
+3. `$HOME/bin` - ไดเรกทอรีไบนารีผู้ใช้มาตรฐาน (หากมีอยู่หรือสามารถสร้างได้)
+4. `$HOME/.opencode/bin` - ค่าสำรองเริ่มต้น
+
+```bash
+# ตัวอย่าง
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### เอเจนต์
+
+OpenCode รวมเอเจนต์ในตัวสองตัวที่คุณสามารถสลับได้ด้วยปุ่ม `Tab`
+
+- **build** - เอเจนต์เริ่มต้น มีสิทธิ์เข้าถึงแบบเต็มสำหรับงานพัฒนา
+- **plan** - เอเจนต์อ่านอย่างเดียวสำหรับการวิเคราะห์และการสำรวจโค้ด
+ - ปฏิเสธการแก้ไขไฟล์โดยค่าเริ่มต้น
+ - ขอสิทธิ์ก่อนเรียกใช้คำสั่ง bash
+ - เหมาะสำหรับสำรวจโค้ดเบสที่ไม่คุ้นเคยหรือวางแผนการเปลี่ยนแปลง
+
+นอกจากนี้ยังมีเอเจนต์ย่อย **general** สำหรับการค้นหาที่ซับซ้อนและงานหลายขั้นตอน
+ใช้ภายในและสามารถเรียกใช้ได้โดยใช้ `@general` ในข้อความ
+
+เรียนรู้เพิ่มเติมเกี่ยวกับ [เอเจนต์](https://opencode.ai/docs/agents)
+
+### เอกสารประกอบ
+
+สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดค่า OpenCode [**ไปที่เอกสารของเรา**](https://opencode.ai/docs)
+
+### การมีส่วนร่วม
+
+หากคุณสนใจที่จะมีส่วนร่วมใน OpenCode โปรดอ่าน [เอกสารการมีส่วนร่วม](./CONTRIBUTING.md) ก่อนส่ง Pull Request
+
+### การสร้างบน OpenCode
+
+หากคุณทำงานในโปรเจกต์ที่เกี่ยวข้องกับ OpenCode และใช้ "opencode" เป็นส่วนหนึ่งของชื่อ เช่น "opencode-dashboard" หรือ "opencode-mobile" โปรดเพิ่มหมายเหตุใน README ของคุณเพื่อชี้แจงว่าไม่ได้สร้างโดยทีม OpenCode และไม่ได้เกี่ยวข้องกับเราในทางใด
+
+---
+
+**ร่วมชุมชนของเรา** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.tr.md b/README.tr.md
new file mode 100644
index 0000000..aaab8f0
--- /dev/null
+++ b/README.tr.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Açık kaynaklı yapay zeka kodlama asistanı.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Kurulum
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Paket yöneticileri
+npm i -g opencode-ai@latest # veya bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS ve Linux (önerilir, her zaman güncel)
+brew install opencode # macOS ve Linux (resmi brew formülü, daha az güncellenir)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Tüm işletim sistemleri
+nix run nixpkgs#opencode # veya en güncel geliştirme dalı için github:anomalyco/opencode
+```
+
+> [!TIP]
+> Kurulumdan önce 0.1.x'ten eski sürümleri kaldırın.
+
+### Masaüstü Uygulaması (BETA)
+
+OpenCode ayrıca masaüstü uygulaması olarak da mevcuttur. Doğrudan [sürüm sayfasından](https://github.com/anomalyco/opencode/releases) veya [opencode.ai/download](https://opencode.ai/download) adresinden indirebilirsiniz.
+
+| Platform | İndirme |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` veya AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Kurulum Dizini (Installation Directory)
+
+Kurulum betiği (install script), kurulum yolu (installation path) için aşağıdaki öncelik sırasını takip eder:
+
+1. `$OPENCODE_INSTALL_DIR` - Özel kurulum dizini
+2. `$XDG_BIN_DIR` - XDG Base Directory Specification uyumlu yol
+3. `$HOME/bin` - Standart kullanıcı binary dizini (varsa veya oluşturulabiliyorsa)
+4. `$HOME/.opencode/bin` - Varsayılan yedek konum
+
+```bash
+# Örnekler
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Ajanlar
+
+OpenCode, `Tab` tuşuyla aralarında geçiş yapabileceğiniz iki yerleşik (built-in) ajan içerir.
+
+- **build** - Varsayılan, geliştirme çalışmaları için tam erişimli ajan
+- **plan** - Analiz ve kod keşfi için salt okunur ajan
+ - Varsayılan olarak dosya düzenlemelerini reddeder
+ - Bash komutlarını çalıştırmadan önce izin ister
+ - Tanımadığınız kod tabanlarını keşfetmek veya değişiklikleri planlamak için ideal
+
+Ayrıca, karmaşık aramalar ve çok adımlı görevler için bir **genel** alt ajan bulunmaktadır.
+Bu dahili olarak kullanılır ve mesajlarda `@general` ile çağrılabilir.
+
+[Ajanlar](https://opencode.ai/docs/agents) hakkında daha fazla bilgi edinin.
+
+### Dokümantasyon
+
+OpenCode'u nasıl yapılandıracağınız hakkında daha fazla bilgi için [**dokümantasyonumuza göz atın**](https://opencode.ai/docs).
+
+### Katkıda Bulunma
+
+OpenCode'a katkıda bulunmak istiyorsanız, lütfen bir pull request göndermeden önce [katkıda bulunma dokümanlarımızı](./CONTRIBUTING.md) okuyun.
+
+### OpenCode Üzerine Geliştirme
+
+OpenCode ile ilgili bir proje üzerinde çalışıyorsanız ve projenizin adının bir parçası olarak "opencode" kullanıyorsanız (örneğin, "opencode-dashboard" veya "opencode-mobile"), lütfen README dosyanıza projenin OpenCode ekibi tarafından geliştirilmediğini ve bizimle hiçbir şekilde bağlantılı olmadığını belirten bir not ekleyin.
+
+---
+
+**Topluluğumuza katılın** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.uk.md b/README.uk.md
new file mode 100644
index 0000000..7cd50af
--- /dev/null
+++ b/README.uk.md
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+AI-агент для програмування з відкритим кодом.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Встановлення
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Менеджери пакетів
+npm i -g opencode-ai@latest # або bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS і Linux (рекомендовано, завжди актуально)
+brew install opencode # macOS і Linux (офіційна формула Homebrew, оновлюється рідше)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Будь-яка ОС
+nix run nixpkgs#opencode # або github:anomalyco/opencode для найновішої dev-гілки
+```
+
+> [!TIP]
+> Перед встановленням видаліть версії старші за 0.1.x.
+
+### Десктопний застосунок (BETA)
+
+OpenCode також доступний як десктопний застосунок. Завантажуйте напряму зі [сторінки релізів](https://github.com/anomalyco/opencode/releases) або [opencode.ai/download](https://opencode.ai/download).
+
+| Платформа | Завантаження |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm` або AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Каталог встановлення
+
+Скрипт встановлення дотримується такого порядку пріоритету для шляху встановлення:
+
+1. `$OPENCODE_INSTALL_DIR` - Користувацький каталог встановлення
+2. `$XDG_BIN_DIR` - Шлях, сумісний зі специфікацією XDG Base Directory
+3. `$HOME/bin` - Стандартний каталог користувацьких бінарників (якщо існує або його можна створити)
+4. `$HOME/.opencode/bin` - Резервний варіант за замовчуванням
+
+```bash
+# Приклади
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Агенти
+
+OpenCode містить два вбудовані агенти, між якими можна перемикатися клавішею `Tab`.
+
+- **build** - Агент за замовчуванням із повним доступом для завдань розробки
+- **plan** - Агент лише для читання для аналізу та дослідження коду
+ - За замовчуванням забороняє редагування файлів
+ - Запитує дозвіл перед запуском bash-команд
+ - Ідеально підходить для дослідження незнайомих кодових баз або планування змін
+
+Також доступний допоміжний агент **general** для складного пошуку та багатокрокових завдань.
+Він використовується всередині системи й може бути викликаний у повідомленнях через `@general`.
+
+Дізнайтеся більше про [agents](https://opencode.ai/docs/agents).
+
+### Документація
+
+Щоб дізнатися більше про налаштування OpenCode, [**перейдіть до нашої документації**](https://opencode.ai/docs).
+
+### Внесок
+
+Якщо ви хочете зробити внесок в OpenCode, будь ласка, прочитайте нашу [документацію для контриб'юторів](./CONTRIBUTING.md) перед надсиланням pull request.
+
+### Проєкти на базі OpenCode
+
+Якщо ви працюєте над проєктом, пов'язаним з OpenCode, і використовуєте "opencode" у назві, наприклад "opencode-dashboard" або "opencode-mobile", додайте примітку до свого README.
+Уточніть, що цей проєкт не створений командою OpenCode і жодним чином не афілійований із нами.
+
+---
+
+**Приєднуйтеся до нашої спільноти** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.vi.md b/README.vi.md
new file mode 100644
index 0000000..7d1a4f3
--- /dev/null
+++ b/README.vi.md
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+Trợ lý lập trình AI mã nguồn mở.
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### Cài đặt
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Các trình quản lý gói (Package managers)
+npm i -g opencode-ai@latest # hoặc bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS và Linux (khuyên dùng, luôn cập nhật)
+brew install opencode # macOS và Linux (công thức brew chính thức, ít cập nhật hơn)
+sudo pacman -S opencode # Arch Linux (Bản ổn định)
+paru -S opencode-bin # Arch Linux (Bản mới nhất từ AUR)
+mise use -g opencode # Mọi hệ điều hành
+nix run nixpkgs#opencode # hoặc github:anomalyco/opencode cho nhánh dev mới nhất
+```
+
+> [!TIP]
+> Hãy xóa các phiên bản cũ hơn 0.1.x trước khi cài đặt.
+
+### Ứng dụng Desktop (BETA)
+
+OpenCode cũng có sẵn dưới dạng ứng dụng desktop. Tải trực tiếp từ [trang releases](https://github.com/anomalyco/opencode/releases) hoặc [opencode.ai/download](https://opencode.ai/download).
+
+| Nền tảng | Tải xuống |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, hoặc AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### Thư mục cài đặt
+
+Tập lệnh cài đặt tuân theo thứ tự ưu tiên sau cho đường dẫn cài đặt:
+
+1. `$OPENCODE_INSTALL_DIR` - Thư mục cài đặt tùy chỉnh
+2. `$XDG_BIN_DIR` - Đường dẫn tuân thủ XDG Base Directory Specification
+3. `$HOME/bin` - Thư mục nhị phân tiêu chuẩn của người dùng (nếu tồn tại hoặc có thể tạo)
+4. `$HOME/.opencode/bin` - Mặc định dự phòng
+
+```bash
+# Ví dụ
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents (Đại diện)
+
+OpenCode bao gồm hai agent được tích hợp sẵn mà bạn có thể chuyển đổi bằng phím `Tab`.
+
+- **build** - Agent mặc định, có toàn quyền truy cập cho công việc lập trình
+- **plan** - Agent chỉ đọc dùng để phân tích và khám phá mã nguồn
+ - Mặc định từ chối việc chỉnh sửa tệp
+ - Hỏi quyền trước khi chạy các lệnh bash
+ - Lý tưởng để khám phá các codebase lạ hoặc lên kế hoạch thay đổi
+
+Ngoài ra còn có một subagent **general** dùng cho các tìm kiếm phức tạp và tác vụ nhiều bước.
+Agent này được sử dụng nội bộ và có thể gọi bằng cách dùng `@general` trong tin nhắn.
+
+Tìm hiểu thêm về [agents](https://opencode.ai/docs/agents).
+
+### Tài liệu
+
+Để biết thêm thông tin về cách cấu hình OpenCode, [**hãy truy cập tài liệu của chúng tôi**](https://opencode.ai/docs).
+
+### Đóng góp
+
+Nếu bạn muốn đóng góp cho OpenCode, vui lòng đọc [tài liệu hướng dẫn đóng góp](./CONTRIBUTING.md) trước khi gửi pull request.
+
+### Xây dựng trên nền tảng OpenCode
+
+Nếu bạn đang làm việc trên một dự án liên quan đến OpenCode và sử dụng "opencode" như một phần của tên dự án, ví dụ "opencode-dashboard" hoặc "opencode-mobile", vui lòng thêm một ghi chú vào README của bạn để làm rõ rằng dự án đó không được xây dựng bởi đội ngũ OpenCode và không liên kết với chúng tôi dưới bất kỳ hình thức nào.
+
+---
+
+**Tham gia cộng đồng của chúng tôi** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.zh.md b/README.zh.md
new file mode 100644
index 0000000..93f81e8
--- /dev/null
+++ b/README.zh.md
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+开源的 AI Coding Agent。
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### 安装
+
+```bash
+# 直接安装 (YOLO)
+curl -fsSL https://opencode.ai/install | bash
+
+# 软件包管理器
+npm i -g opencode-ai@latest # 也可使用 bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS 和 Linux(推荐,始终保持最新)
+brew install opencode # macOS 和 Linux(官方 brew formula,更新频率较低)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # 任意系统
+nix run nixpkgs#opencode # 或用 github:anomalyco/opencode 获取最新 dev 分支
+```
+
+> [!TIP]
+> 安装前请先移除 0.1.x 之前的旧版本。
+
+### 桌面应用程序 (BETA)
+
+OpenCode 也提供桌面版应用。可直接从 [发布页 (releases page)](https://github.com/anomalyco/opencode/releases) 或 [opencode.ai/download](https://opencode.ai/download) 下载。
+
+| 平台 | 下载文件 |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`、`.rpm` 或 AppImage |
+
+```bash
+# macOS (Homebrew Cask)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### 安装目录
+
+安装脚本按照以下优先级决定安装路径:
+
+1. `$OPENCODE_INSTALL_DIR` - 自定义安装目录
+2. `$XDG_BIN_DIR` - 符合 XDG 基础目录规范的路径
+3. `$HOME/bin` - 如果存在或可创建的用户二进制目录
+4. `$HOME/.opencode/bin` - 默认备用路径
+
+```bash
+# 示例
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode 内置两种 Agent,可用 `Tab` 键快速切换:
+
+- **build** - 默认模式,具备完整权限,适合开发工作
+- **plan** - 只读模式,适合代码分析与探索
+ - 默认拒绝修改文件
+ - 运行 bash 命令前会询问
+ - 便于探索未知代码库或规划改动
+
+另外还包含一个 **general** 子 Agent,用于复杂搜索和多步任务,内部使用,也可在消息中输入 `@general` 调用。
+
+了解更多 [Agents](https://opencode.ai/docs/agents) 相关信息。
+
+### 文档
+
+更多配置说明请查看我们的 [**官方文档**](https://opencode.ai/docs)。
+
+### 参与贡献
+
+如有兴趣贡献代码,请在提交 PR 前阅读 [贡献指南 (Contributing Docs)](./CONTRIBUTING.md)。
+
+### 基于 OpenCode 进行开发
+
+如果你在项目名中使用了 “opencode”(如 “opencode-dashboard” 或 “opencode-mobile”),请在 README 里注明该项目不是 OpenCode 团队官方开发,且不存在隶属关系。
+
+---
+
+**加入我们的社区** [飞书](https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=738j8655-cd59-4633-a30a-1124e0096789&qr_code=true) | [X.com](https://x.com/opencode)
diff --git a/README.zht.md b/README.zht.md
new file mode 100644
index 0000000..59d9709
--- /dev/null
+++ b/README.zht.md
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+開源的 AI Coding Agent。
+
+
+
+
+
+
+
+ English |
+ 简体中文 |
+ 繁體中文 |
+ 한국어 |
+ Deutsch |
+ Español |
+ Français |
+ Italiano |
+ Dansk |
+ 日本語 |
+ Polski |
+ Русский |
+ Bosanski |
+ العربية |
+ Norsk |
+ Português (Brasil) |
+ ไทย |
+ Türkçe |
+ Українська |
+ বাংলা |
+ Ελληνικά |
+ Tiếng Việt
+
+
+[](https://opencode.ai)
+
+---
+
+### 安裝
+
+```bash
+# 直接安裝 (YOLO)
+curl -fsSL https://opencode.ai/install | bash
+
+# 套件管理員
+npm i -g opencode-ai@latest # 也可使用 bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS 與 Linux(推薦,始終保持最新)
+brew install opencode # macOS 與 Linux(官方 brew formula,更新頻率較低)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # 任何作業系統
+nix run nixpkgs#opencode # 或使用 github:anomalyco/opencode 以取得最新開發分支
+```
+
+> [!TIP]
+> 安裝前請先移除 0.1.x 以前的舊版本。
+
+### 桌面應用程式 (BETA)
+
+OpenCode 也提供桌面版應用程式。您可以直接從 [發佈頁面 (releases page)](https://github.com/anomalyco/opencode/releases) 或 [opencode.ai/download](https://opencode.ai/download) 下載。
+
+| 平台 | 下載連結 |
+| --------------------- | ---------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-mac-arm64.dmg` |
+| macOS (Intel) | `opencode-desktop-mac-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, 或 AppImage |
+
+```bash
+# macOS (Homebrew Cask)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### 安裝目錄
+
+安裝腳本會依據以下優先順序決定安裝路徑:
+
+1. `$OPENCODE_INSTALL_DIR` - 自定義安裝目錄
+2. `$XDG_BIN_DIR` - 符合 XDG 基礎目錄規範的路徑
+3. `$HOME/bin` - 標準使用者執行檔目錄 (若存在或可建立)
+4. `$HOME/.opencode/bin` - 預設備用路徑
+
+```bash
+# 範例
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### Agents
+
+OpenCode 內建了兩種 Agent,您可以使用 `Tab` 鍵快速切換。
+
+- **build** - 預設模式,具備完整權限的 Agent,適用於開發工作。
+- **plan** - 唯讀模式,適用於程式碼分析與探索。
+ - 預設禁止修改檔案。
+ - 執行 bash 指令前會詢問權限。
+ - 非常適合用來探索陌生的程式碼庫或規劃變更。
+
+此外,OpenCode 還包含一個 **general** 子 Agent,用於處理複雜搜尋與多步驟任務。此 Agent 供系統內部使用,亦可透過在訊息中輸入 `@general` 來呼叫。
+
+了解更多關於 [Agents](https://opencode.ai/docs/agents) 的資訊。
+
+### 線上文件
+
+關於如何設定 OpenCode 的詳細資訊,請參閱我們的 [**官方文件**](https://opencode.ai/docs)。
+
+### 參與貢獻
+
+如果您有興趣參與 OpenCode 的開發,請在提交 Pull Request 前先閱讀我們的 [貢獻指南 (Contributing Docs)](./CONTRIBUTING.md)。
+
+### 基於 OpenCode 進行開發
+
+如果您正在開發與 OpenCode 相關的專案,並在名稱中使用了 "opencode"(例如 "opencode-dashboard" 或 "opencode-mobile"),請在您的 README 中加入聲明,說明該專案並非由 OpenCode 團隊開發,且與我們沒有任何隸屬關係。
+
+---
+
+**加入我們的社群** [飞书](https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=738j8655-cd59-4633-a30a-1124e0096789&qr_code=true) | [X.com](https://x.com/opencode)
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..e7e59f4
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,47 @@
+# Security
+
+## IMPORTANT
+
+We do not accept AI generated security reports. We receive a large number of
+these and we absolutely do not have the resources to review them all. If you
+submit one that will be an automatic ban from the project.
+
+## Threat Model
+
+### Overview
+
+OpenCode is an AI-powered coding assistant that runs locally on your machine. It provides an agent system with access to powerful tools including shell execution, file operations, and web access.
+
+### No Sandbox
+
+OpenCode does **not** sandbox the agent. The permission system exists as a UX feature to help users stay aware of what actions the agent is taking - it prompts for confirmation before executing commands, writing files, etc. However, it is not designed to provide security isolation.
+
+If you need true isolation, run OpenCode inside a Docker container or VM.
+
+### Server Mode
+
+Server mode is opt-in only. When enabled, set `OPENCODE_SERVER_PASSWORD` to require HTTP Basic Auth. Without this, the server runs unauthenticated (with a warning). It is the end user's responsibility to secure the server - any functionality it provides is not a vulnerability.
+
+### Out of Scope
+
+| Category | Rationale |
+| ------------------------------- | ----------------------------------------------------------------------- |
+| **Server access when opted-in** | If you enable server mode, API access is expected behavior |
+| **Sandbox escapes** | The permission system is not a sandbox (see above) |
+| **LLM provider data handling** | Data sent to your configured LLM provider is governed by their policies |
+| **MCP server behavior** | External MCP servers you configure are outside our trust boundary |
+| **Malicious config files** | Users control their own config; modifying it is not an attack vector |
+
+---
+
+# Reporting Security Issues
+
+We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
+
+To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/anomalyco/opencode/security/advisories/new) tab.
+
+The team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
+
+## Escalation
+
+If you do not receive an acknowledgement of your report within 6 business days, you may send an email to security@anoma.ly
diff --git a/STATS.md b/STATS.md
new file mode 100644
index 0000000..44819a6
--- /dev/null
+++ b/STATS.md
@@ -0,0 +1,217 @@
+# Download Stats
+
+| Date | GitHub Downloads | npm Downloads | Total |
+| ---------- | -------------------- | -------------------- | --------------------- |
+| 2025-06-29 | 18,789 (+0) | 39,420 (+0) | 58,209 (+0) |
+| 2025-06-30 | 20,127 (+1,338) | 41,059 (+1,639) | 61,186 (+2,977) |
+| 2025-07-01 | 22,108 (+1,981) | 43,745 (+2,686) | 65,853 (+4,667) |
+| 2025-07-02 | 24,814 (+2,706) | 46,168 (+2,423) | 70,982 (+5,129) |
+| 2025-07-03 | 27,834 (+3,020) | 49,955 (+3,787) | 77,789 (+6,807) |
+| 2025-07-04 | 30,608 (+2,774) | 54,758 (+4,803) | 85,366 (+7,577) |
+| 2025-07-05 | 32,524 (+1,916) | 58,371 (+3,613) | 90,895 (+5,529) |
+| 2025-07-06 | 33,766 (+1,242) | 59,694 (+1,323) | 93,460 (+2,565) |
+| 2025-07-08 | 38,052 (+4,286) | 64,468 (+4,774) | 102,520 (+9,060) |
+| 2025-07-09 | 40,924 (+2,872) | 67,935 (+3,467) | 108,859 (+6,339) |
+| 2025-07-10 | 43,796 (+2,872) | 71,402 (+3,467) | 115,198 (+6,339) |
+| 2025-07-11 | 46,982 (+3,186) | 77,462 (+6,060) | 124,444 (+9,246) |
+| 2025-07-12 | 49,302 (+2,320) | 82,177 (+4,715) | 131,479 (+7,035) |
+| 2025-07-13 | 50,803 (+1,501) | 86,394 (+4,217) | 137,197 (+5,718) |
+| 2025-07-14 | 53,283 (+2,480) | 87,860 (+1,466) | 141,143 (+3,946) |
+| 2025-07-15 | 57,590 (+4,307) | 91,036 (+3,176) | 148,626 (+7,483) |
+| 2025-07-16 | 62,313 (+4,723) | 95,258 (+4,222) | 157,571 (+8,945) |
+| 2025-07-17 | 66,684 (+4,371) | 100,048 (+4,790) | 166,732 (+9,161) |
+| 2025-07-18 | 70,379 (+3,695) | 102,587 (+2,539) | 172,966 (+6,234) |
+| 2025-07-19 | 73,497 (+3,117) | 105,904 (+3,317) | 179,401 (+6,434) |
+| 2025-07-20 | 76,453 (+2,956) | 109,044 (+3,140) | 185,497 (+6,096) |
+| 2025-07-21 | 80,197 (+3,744) | 113,537 (+4,493) | 193,734 (+8,237) |
+| 2025-07-22 | 84,251 (+4,054) | 118,073 (+4,536) | 202,324 (+8,590) |
+| 2025-07-23 | 88,589 (+4,338) | 121,436 (+3,363) | 210,025 (+7,701) |
+| 2025-07-24 | 92,469 (+3,880) | 124,091 (+2,655) | 216,560 (+6,535) |
+| 2025-07-25 | 96,417 (+3,948) | 126,985 (+2,894) | 223,402 (+6,842) |
+| 2025-07-26 | 100,646 (+4,229) | 131,411 (+4,426) | 232,057 (+8,655) |
+| 2025-07-27 | 102,644 (+1,998) | 134,736 (+3,325) | 237,380 (+5,323) |
+| 2025-07-28 | 105,446 (+2,802) | 136,016 (+1,280) | 241,462 (+4,082) |
+| 2025-07-29 | 108,998 (+3,552) | 137,542 (+1,526) | 246,540 (+5,078) |
+| 2025-07-30 | 113,544 (+4,546) | 140,317 (+2,775) | 253,861 (+7,321) |
+| 2025-07-31 | 118,339 (+4,795) | 143,344 (+3,027) | 261,683 (+7,822) |
+| 2025-08-01 | 123,539 (+5,200) | 146,680 (+3,336) | 270,219 (+8,536) |
+| 2025-08-02 | 127,864 (+4,325) | 149,236 (+2,556) | 277,100 (+6,881) |
+| 2025-08-03 | 131,397 (+3,533) | 150,451 (+1,215) | 281,848 (+4,748) |
+| 2025-08-04 | 136,266 (+4,869) | 153,260 (+2,809) | 289,526 (+7,678) |
+| 2025-08-05 | 141,596 (+5,330) | 155,752 (+2,492) | 297,348 (+7,822) |
+| 2025-08-06 | 147,067 (+5,471) | 158,309 (+2,557) | 305,376 (+8,028) |
+| 2025-08-07 | 152,591 (+5,524) | 160,889 (+2,580) | 313,480 (+8,104) |
+| 2025-08-08 | 158,187 (+5,596) | 163,448 (+2,559) | 321,635 (+8,155) |
+| 2025-08-09 | 162,770 (+4,583) | 165,721 (+2,273) | 328,491 (+6,856) |
+| 2025-08-10 | 165,695 (+2,925) | 167,109 (+1,388) | 332,804 (+4,313) |
+| 2025-08-11 | 169,297 (+3,602) | 167,953 (+844) | 337,250 (+4,446) |
+| 2025-08-12 | 176,307 (+7,010) | 171,876 (+3,923) | 348,183 (+10,933) |
+| 2025-08-13 | 182,997 (+6,690) | 177,182 (+5,306) | 360,179 (+11,996) |
+| 2025-08-14 | 189,063 (+6,066) | 179,741 (+2,559) | 368,804 (+8,625) |
+| 2025-08-15 | 193,608 (+4,545) | 181,792 (+2,051) | 375,400 (+6,596) |
+| 2025-08-16 | 198,118 (+4,510) | 184,558 (+2,766) | 382,676 (+7,276) |
+| 2025-08-17 | 201,299 (+3,181) | 186,269 (+1,711) | 387,568 (+4,892) |
+| 2025-08-18 | 204,559 (+3,260) | 187,399 (+1,130) | 391,958 (+4,390) |
+| 2025-08-19 | 209,814 (+5,255) | 189,668 (+2,269) | 399,482 (+7,524) |
+| 2025-08-20 | 214,497 (+4,683) | 191,481 (+1,813) | 405,978 (+6,496) |
+| 2025-08-21 | 220,465 (+5,968) | 194,784 (+3,303) | 415,249 (+9,271) |
+| 2025-08-22 | 225,899 (+5,434) | 197,204 (+2,420) | 423,103 (+7,854) |
+| 2025-08-23 | 229,005 (+3,106) | 199,238 (+2,034) | 428,243 (+5,140) |
+| 2025-08-24 | 232,098 (+3,093) | 201,157 (+1,919) | 433,255 (+5,012) |
+| 2025-08-25 | 236,607 (+4,509) | 202,650 (+1,493) | 439,257 (+6,002) |
+| 2025-08-26 | 242,783 (+6,176) | 205,242 (+2,592) | 448,025 (+8,768) |
+| 2025-08-27 | 248,409 (+5,626) | 205,242 (+0) | 453,651 (+5,626) |
+| 2025-08-28 | 252,796 (+4,387) | 205,242 (+0) | 458,038 (+4,387) |
+| 2025-08-29 | 256,045 (+3,249) | 211,075 (+5,833) | 467,120 (+9,082) |
+| 2025-08-30 | 258,863 (+2,818) | 212,397 (+1,322) | 471,260 (+4,140) |
+| 2025-08-31 | 262,004 (+3,141) | 213,944 (+1,547) | 475,948 (+4,688) |
+| 2025-09-01 | 265,359 (+3,355) | 215,115 (+1,171) | 480,474 (+4,526) |
+| 2025-09-02 | 270,483 (+5,124) | 217,075 (+1,960) | 487,558 (+7,084) |
+| 2025-09-03 | 274,793 (+4,310) | 219,755 (+2,680) | 494,548 (+6,990) |
+| 2025-09-04 | 280,430 (+5,637) | 222,103 (+2,348) | 502,533 (+7,985) |
+| 2025-09-05 | 283,769 (+3,339) | 223,793 (+1,690) | 507,562 (+5,029) |
+| 2025-09-06 | 286,245 (+2,476) | 225,036 (+1,243) | 511,281 (+3,719) |
+| 2025-09-07 | 288,623 (+2,378) | 225,866 (+830) | 514,489 (+3,208) |
+| 2025-09-08 | 293,341 (+4,718) | 227,073 (+1,207) | 520,414 (+5,925) |
+| 2025-09-09 | 300,036 (+6,695) | 229,788 (+2,715) | 529,824 (+9,410) |
+| 2025-09-10 | 307,287 (+7,251) | 233,435 (+3,647) | 540,722 (+10,898) |
+| 2025-09-11 | 314,083 (+6,796) | 237,356 (+3,921) | 551,439 (+10,717) |
+| 2025-09-12 | 321,046 (+6,963) | 240,728 (+3,372) | 561,774 (+10,335) |
+| 2025-09-13 | 324,894 (+3,848) | 245,539 (+4,811) | 570,433 (+8,659) |
+| 2025-09-14 | 328,876 (+3,982) | 248,245 (+2,706) | 577,121 (+6,688) |
+| 2025-09-15 | 334,201 (+5,325) | 250,983 (+2,738) | 585,184 (+8,063) |
+| 2025-09-16 | 342,609 (+8,408) | 255,264 (+4,281) | 597,873 (+12,689) |
+| 2025-09-17 | 351,117 (+8,508) | 260,970 (+5,706) | 612,087 (+14,214) |
+| 2025-09-18 | 358,717 (+7,600) | 266,922 (+5,952) | 625,639 (+13,552) |
+| 2025-09-19 | 365,401 (+6,684) | 271,859 (+4,937) | 637,260 (+11,621) |
+| 2025-09-20 | 372,092 (+6,691) | 276,917 (+5,058) | 649,009 (+11,749) |
+| 2025-09-21 | 377,079 (+4,987) | 280,261 (+3,344) | 657,340 (+8,331) |
+| 2025-09-22 | 382,492 (+5,413) | 284,009 (+3,748) | 666,501 (+9,161) |
+| 2025-09-23 | 387,008 (+4,516) | 289,129 (+5,120) | 676,137 (+9,636) |
+| 2025-09-24 | 393,325 (+6,317) | 294,927 (+5,798) | 688,252 (+12,115) |
+| 2025-09-25 | 398,879 (+5,554) | 301,663 (+6,736) | 700,542 (+12,290) |
+| 2025-09-26 | 404,334 (+5,455) | 306,713 (+5,050) | 711,047 (+10,505) |
+| 2025-09-27 | 411,618 (+7,284) | 317,763 (+11,050) | 729,381 (+18,334) |
+| 2025-09-28 | 414,910 (+3,292) | 322,522 (+4,759) | 737,432 (+8,051) |
+| 2025-09-29 | 419,919 (+5,009) | 328,033 (+5,511) | 747,952 (+10,520) |
+| 2025-09-30 | 427,991 (+8,072) | 336,472 (+8,439) | 764,463 (+16,511) |
+| 2025-10-01 | 433,591 (+5,600) | 341,742 (+5,270) | 775,333 (+10,870) |
+| 2025-10-02 | 440,852 (+7,261) | 348,099 (+6,357) | 788,951 (+13,618) |
+| 2025-10-03 | 446,829 (+5,977) | 359,937 (+11,838) | 806,766 (+17,815) |
+| 2025-10-04 | 452,561 (+5,732) | 370,386 (+10,449) | 822,947 (+16,181) |
+| 2025-10-05 | 455,559 (+2,998) | 374,745 (+4,359) | 830,304 (+7,357) |
+| 2025-10-06 | 460,927 (+5,368) | 379,489 (+4,744) | 840,416 (+10,112) |
+| 2025-10-07 | 467,336 (+6,409) | 385,438 (+5,949) | 852,774 (+12,358) |
+| 2025-10-08 | 474,643 (+7,307) | 394,139 (+8,701) | 868,782 (+16,008) |
+| 2025-10-09 | 479,203 (+4,560) | 400,526 (+6,387) | 879,729 (+10,947) |
+| 2025-10-10 | 484,374 (+5,171) | 406,015 (+5,489) | 890,389 (+10,660) |
+| 2025-10-11 | 488,427 (+4,053) | 414,699 (+8,684) | 903,126 (+12,737) |
+| 2025-10-12 | 492,125 (+3,698) | 418,745 (+4,046) | 910,870 (+7,744) |
+| 2025-10-14 | 505,130 (+13,005) | 429,286 (+10,541) | 934,416 (+23,546) |
+| 2025-10-15 | 512,717 (+7,587) | 439,290 (+10,004) | 952,007 (+17,591) |
+| 2025-10-16 | 517,719 (+5,002) | 447,137 (+7,847) | 964,856 (+12,849) |
+| 2025-10-17 | 526,239 (+8,520) | 457,467 (+10,330) | 983,706 (+18,850) |
+| 2025-10-18 | 531,564 (+5,325) | 465,272 (+7,805) | 996,836 (+13,130) |
+| 2025-10-19 | 536,209 (+4,645) | 469,078 (+3,806) | 1,005,287 (+8,451) |
+| 2025-10-20 | 541,264 (+5,055) | 472,952 (+3,874) | 1,014,216 (+8,929) |
+| 2025-10-21 | 548,721 (+7,457) | 479,703 (+6,751) | 1,028,424 (+14,208) |
+| 2025-10-22 | 557,949 (+9,228) | 491,395 (+11,692) | 1,049,344 (+20,920) |
+| 2025-10-23 | 564,716 (+6,767) | 498,736 (+7,341) | 1,063,452 (+14,108) |
+| 2025-10-24 | 572,692 (+7,976) | 506,905 (+8,169) | 1,079,597 (+16,145) |
+| 2025-10-25 | 578,927 (+6,235) | 516,129 (+9,224) | 1,095,056 (+15,459) |
+| 2025-10-26 | 584,409 (+5,482) | 521,179 (+5,050) | 1,105,588 (+10,532) |
+| 2025-10-27 | 589,999 (+5,590) | 526,001 (+4,822) | 1,116,000 (+10,412) |
+| 2025-10-28 | 595,776 (+5,777) | 532,438 (+6,437) | 1,128,214 (+12,214) |
+| 2025-10-29 | 606,259 (+10,483) | 542,064 (+9,626) | 1,148,323 (+20,109) |
+| 2025-10-30 | 613,746 (+7,487) | 542,064 (+0) | 1,155,810 (+7,487) |
+| 2025-10-30 | 617,846 (+4,100) | 555,026 (+12,962) | 1,172,872 (+17,062) |
+| 2025-10-31 | 626,612 (+8,766) | 564,579 (+9,553) | 1,191,191 (+18,319) |
+| 2025-11-01 | 636,100 (+9,488) | 581,806 (+17,227) | 1,217,906 (+26,715) |
+| 2025-11-02 | 644,067 (+7,967) | 590,004 (+8,198) | 1,234,071 (+16,165) |
+| 2025-11-03 | 653,130 (+9,063) | 597,139 (+7,135) | 1,250,269 (+16,198) |
+| 2025-11-04 | 663,912 (+10,782) | 608,056 (+10,917) | 1,271,968 (+21,699) |
+| 2025-11-05 | 675,074 (+11,162) | 619,690 (+11,634) | 1,294,764 (+22,796) |
+| 2025-11-06 | 686,252 (+11,178) | 630,885 (+11,195) | 1,317,137 (+22,373) |
+| 2025-11-07 | 696,646 (+10,394) | 642,146 (+11,261) | 1,338,792 (+21,655) |
+| 2025-11-08 | 706,035 (+9,389) | 653,489 (+11,343) | 1,359,524 (+20,732) |
+| 2025-11-09 | 713,462 (+7,427) | 660,459 (+6,970) | 1,373,921 (+14,397) |
+| 2025-11-10 | 722,288 (+8,826) | 668,225 (+7,766) | 1,390,513 (+16,592) |
+| 2025-11-11 | 729,769 (+7,481) | 677,501 (+9,276) | 1,407,270 (+16,757) |
+| 2025-11-12 | 740,180 (+10,411) | 686,454 (+8,953) | 1,426,634 (+19,364) |
+| 2025-11-13 | 749,905 (+9,725) | 696,157 (+9,703) | 1,446,062 (+19,428) |
+| 2025-11-14 | 759,928 (+10,023) | 705,237 (+9,080) | 1,465,165 (+19,103) |
+| 2025-11-15 | 765,955 (+6,027) | 712,870 (+7,633) | 1,478,825 (+13,660) |
+| 2025-11-16 | 771,069 (+5,114) | 716,596 (+3,726) | 1,487,665 (+8,840) |
+| 2025-11-17 | 780,161 (+9,092) | 723,339 (+6,743) | 1,503,500 (+15,835) |
+| 2025-11-18 | 791,563 (+11,402) | 732,544 (+9,205) | 1,524,107 (+20,607) |
+| 2025-11-19 | 804,409 (+12,846) | 747,624 (+15,080) | 1,552,033 (+27,926) |
+| 2025-11-20 | 814,620 (+10,211) | 757,907 (+10,283) | 1,572,527 (+20,494) |
+| 2025-11-21 | 826,309 (+11,689) | 769,307 (+11,400) | 1,595,616 (+23,089) |
+| 2025-11-22 | 837,269 (+10,960) | 780,996 (+11,689) | 1,618,265 (+22,649) |
+| 2025-11-23 | 846,609 (+9,340) | 795,069 (+14,073) | 1,641,678 (+23,413) |
+| 2025-11-24 | 856,733 (+10,124) | 804,033 (+8,964) | 1,660,766 (+19,088) |
+| 2025-11-25 | 869,423 (+12,690) | 817,339 (+13,306) | 1,686,762 (+25,996) |
+| 2025-11-26 | 881,414 (+11,991) | 832,518 (+15,179) | 1,713,932 (+27,170) |
+| 2025-11-27 | 893,960 (+12,546) | 846,180 (+13,662) | 1,740,140 (+26,208) |
+| 2025-11-28 | 901,741 (+7,781) | 856,482 (+10,302) | 1,758,223 (+18,083) |
+| 2025-11-29 | 908,689 (+6,948) | 863,361 (+6,879) | 1,772,050 (+13,827) |
+| 2025-11-30 | 916,116 (+7,427) | 870,194 (+6,833) | 1,786,310 (+14,260) |
+| 2025-12-01 | 925,898 (+9,782) | 876,500 (+6,306) | 1,802,398 (+16,088) |
+| 2025-12-02 | 939,250 (+13,352) | 890,919 (+14,419) | 1,830,169 (+27,771) |
+| 2025-12-03 | 952,249 (+12,999) | 903,713 (+12,794) | 1,855,962 (+25,793) |
+| 2025-12-04 | 965,611 (+13,362) | 916,471 (+12,758) | 1,882,082 (+26,120) |
+| 2025-12-05 | 977,996 (+12,385) | 930,616 (+14,145) | 1,908,612 (+26,530) |
+| 2025-12-06 | 987,884 (+9,888) | 943,773 (+13,157) | 1,931,657 (+23,045) |
+| 2025-12-07 | 994,046 (+6,162) | 951,425 (+7,652) | 1,945,471 (+13,814) |
+| 2025-12-08 | 1,000,898 (+6,852) | 957,149 (+5,724) | 1,958,047 (+12,576) |
+| 2025-12-09 | 1,011,488 (+10,590) | 973,922 (+16,773) | 1,985,410 (+27,363) |
+| 2025-12-10 | 1,025,891 (+14,403) | 991,708 (+17,786) | 2,017,599 (+32,189) |
+| 2025-12-11 | 1,045,110 (+19,219) | 1,010,559 (+18,851) | 2,055,669 (+38,070) |
+| 2025-12-12 | 1,061,340 (+16,230) | 1,030,838 (+20,279) | 2,092,178 (+36,509) |
+| 2025-12-13 | 1,073,561 (+12,221) | 1,044,608 (+13,770) | 2,118,169 (+25,991) |
+| 2025-12-14 | 1,082,042 (+8,481) | 1,052,425 (+7,817) | 2,134,467 (+16,298) |
+| 2025-12-15 | 1,093,632 (+11,590) | 1,059,078 (+6,653) | 2,152,710 (+18,243) |
+| 2025-12-16 | 1,120,477 (+26,845) | 1,078,022 (+18,944) | 2,198,499 (+45,789) |
+| 2025-12-17 | 1,151,067 (+30,590) | 1,097,661 (+19,639) | 2,248,728 (+50,229) |
+| 2025-12-18 | 1,178,658 (+27,591) | 1,113,418 (+15,757) | 2,292,076 (+43,348) |
+| 2025-12-19 | 1,203,485 (+24,827) | 1,129,698 (+16,280) | 2,333,183 (+41,107) |
+| 2025-12-20 | 1,223,000 (+19,515) | 1,146,258 (+16,560) | 2,369,258 (+36,075) |
+| 2025-12-21 | 1,242,675 (+19,675) | 1,158,909 (+12,651) | 2,401,584 (+32,326) |
+| 2025-12-22 | 1,262,522 (+19,847) | 1,169,121 (+10,212) | 2,431,643 (+30,059) |
+| 2025-12-23 | 1,286,548 (+24,026) | 1,186,439 (+17,318) | 2,472,987 (+41,344) |
+| 2025-12-24 | 1,309,323 (+22,775) | 1,203,767 (+17,328) | 2,513,090 (+40,103) |
+| 2025-12-25 | 1,333,032 (+23,709) | 1,217,283 (+13,516) | 2,550,315 (+37,225) |
+| 2025-12-26 | 1,352,411 (+19,379) | 1,227,615 (+10,332) | 2,580,026 (+29,711) |
+| 2025-12-27 | 1,371,771 (+19,360) | 1,238,236 (+10,621) | 2,610,007 (+29,981) |
+| 2025-12-28 | 1,390,388 (+18,617) | 1,245,690 (+7,454) | 2,636,078 (+26,071) |
+| 2025-12-29 | 1,415,560 (+25,172) | 1,257,101 (+11,411) | 2,672,661 (+36,583) |
+| 2025-12-30 | 1,445,450 (+29,890) | 1,272,689 (+15,588) | 2,718,139 (+45,478) |
+| 2025-12-31 | 1,479,598 (+34,148) | 1,293,235 (+20,546) | 2,772,833 (+54,694) |
+| 2026-01-01 | 1,508,883 (+29,285) | 1,309,874 (+16,639) | 2,818,757 (+45,924) |
+| 2026-01-02 | 1,563,474 (+54,591) | 1,320,959 (+11,085) | 2,884,433 (+65,676) |
+| 2026-01-03 | 1,618,065 (+54,591) | 1,331,914 (+10,955) | 2,949,979 (+65,546) |
+| 2026-01-04 | 1,672,656 (+39,702) | 1,339,883 (+7,969) | 3,012,539 (+62,560) |
+| 2026-01-05 | 1,738,171 (+65,515) | 1,353,043 (+13,160) | 3,091,214 (+78,675) |
+| 2026-01-06 | 1,960,988 (+222,817) | 1,377,377 (+24,334) | 3,338,365 (+247,151) |
+| 2026-01-07 | 2,123,239 (+162,251) | 1,398,648 (+21,271) | 3,521,887 (+183,522) |
+| 2026-01-08 | 2,272,630 (+149,391) | 1,432,480 (+33,832) | 3,705,110 (+183,223) |
+| 2026-01-09 | 2,443,565 (+170,935) | 1,469,451 (+36,971) | 3,913,016 (+207,906) |
+| 2026-01-10 | 2,632,023 (+188,458) | 1,503,670 (+34,219) | 4,135,693 (+222,677) |
+| 2026-01-11 | 2,836,394 (+204,371) | 1,530,479 (+26,809) | 4,366,873 (+231,180) |
+| 2026-01-12 | 3,053,594 (+217,200) | 1,553,671 (+23,192) | 4,607,265 (+240,392) |
+| 2026-01-13 | 3,297,078 (+243,484) | 1,595,062 (+41,391) | 4,892,140 (+284,875) |
+| 2026-01-14 | 3,568,928 (+271,850) | 1,645,362 (+50,300) | 5,214,290 (+322,150) |
+| 2026-01-16 | 4,121,550 (+552,622) | 1,754,418 (+109,056) | 5,875,968 (+661,678) |
+| 2026-01-17 | 4,389,558 (+268,008) | 1,805,315 (+50,897) | 6,194,873 (+318,905) |
+| 2026-01-18 | 4,627,623 (+238,065) | 1,839,171 (+33,856) | 6,466,794 (+271,921) |
+| 2026-01-19 | 4,861,108 (+233,485) | 1,863,112 (+23,941) | 6,724,220 (+257,426) |
+| 2026-01-20 | 5,128,999 (+267,891) | 1,903,665 (+40,553) | 7,032,664 (+308,444) |
+| 2026-01-21 | 5,444,842 (+315,843) | 1,962,531 (+58,866) | 7,407,373 (+374,709) |
+| 2026-01-22 | 5,766,340 (+321,498) | 2,029,487 (+66,956) | 7,795,827 (+388,454) |
+| 2026-01-23 | 6,096,236 (+329,896) | 2,096,235 (+66,748) | 8,192,471 (+396,644) |
+| 2026-01-24 | 6,371,019 (+274,783) | 2,156,870 (+60,635) | 8,527,889 (+335,418) |
+| 2026-01-25 | 6,639,082 (+268,063) | 2,187,853 (+30,983) | 8,826,935 (+299,046) |
+| 2026-01-26 | 6,941,620 (+302,538) | 2,232,115 (+44,262) | 9,173,735 (+346,800) |
+| 2026-01-27 | 7,208,093 (+266,473) | 2,280,762 (+48,647) | 9,488,855 (+315,120) |
+| 2026-01-28 | 7,489,370 (+281,277) | 2,314,849 (+34,087) | 9,804,219 (+315,364) |
+| 2026-01-29 | 7,815,471 (+326,101) | 2,374,982 (+60,133) | 10,190,453 (+386,234) |
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 0000000..ddf5e6e
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,7238 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "opencode",
+ "dependencies": {
+ "@aws-sdk/client-s3": "3.933.0",
+ "@opencode-ai/plugin": "workspace:*",
+ "@opencode-ai/script": "workspace:*",
+ "@opencode-ai/sdk": "workspace:*",
+ "heap-snapshot-toolkit": "1.1.3",
+ "typescript": "catalog:",
+ },
+ "devDependencies": {
+ "@actions/artifact": "5.0.1",
+ "@tsconfig/bun": "catalog:",
+ "@types/mime-types": "3.0.1",
+ "@typescript/native-preview": "catalog:",
+ "glob": "13.0.5",
+ "husky": "9.1.7",
+ "oxlint": "1.60.0",
+ "oxlint-tsgolint": "0.21.0",
+ "prettier": "3.6.2",
+ "semver": "^7.6.0",
+ "sst": "catalog:",
+ "turbo": "2.8.13",
+ },
+ },
+ "packages/app": {
+ "name": "@opencode-ai/app",
+ "version": "1.17.4",
+ "dependencies": {
+ "@kobalte/core": "catalog:",
+ "@opencode-ai/core": "workspace:*",
+ "@opencode-ai/sdk": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@sentry/solid": "catalog:",
+ "@shikijs/transformers": "3.9.2",
+ "@solid-primitives/active-element": "2.1.3",
+ "@solid-primitives/audio": "1.4.2",
+ "@solid-primitives/event-bus": "1.1.2",
+ "@solid-primitives/event-listener": "2.4.5",
+ "@solid-primitives/i18n": "2.2.1",
+ "@solid-primitives/media": "2.3.3",
+ "@solid-primitives/resize-observer": "2.1.5",
+ "@solid-primitives/scheduled": "1.5.3",
+ "@solid-primitives/scroll": "2.1.3",
+ "@solid-primitives/storage": "catalog:",
+ "@solid-primitives/timer": "1.4.4",
+ "@solid-primitives/websocket": "1.3.1",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "@tanstack/solid-query": "5.91.4",
+ "@thisbeyond/solid-dnd": "0.7.5",
+ "diff": "catalog:",
+ "effect": "catalog:",
+ "fuzzysort": "catalog:",
+ "ghostty-web": "github:anomalyco/ghostty-web#main",
+ "luxon": "catalog:",
+ "marked": "catalog:",
+ "marked-shiki": "catalog:",
+ "remeda": "catalog:",
+ "shiki": "catalog:",
+ "solid-js": "catalog:",
+ "solid-list": "catalog:",
+ "tailwindcss": "catalog:",
+ "virtua": "catalog:",
+ },
+ "devDependencies": {
+ "@happy-dom/global-registrator": "20.0.11",
+ "@playwright/test": "catalog:",
+ "@sentry/vite-plugin": "catalog:",
+ "@tailwindcss/vite": "catalog:",
+ "@tsconfig/bun": "1.0.9",
+ "@types/bun": "catalog:",
+ "@types/luxon": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ "vite": "catalog:",
+ "vite-plugin-icons-spritesheet": "3.0.1",
+ "vite-plugin-solid": "catalog:",
+ },
+ },
+ "packages/cli": {
+ "name": "@opencode-ai/cli",
+ "version": "1.17.4",
+ "bin": {
+ "lildax": "./bin/lildax.cjs",
+ },
+ "dependencies": {
+ "@effect/platform-node": "catalog:",
+ "@opencode-ai/core": "workspace:*",
+ "@opencode-ai/sdk": "workspace:*",
+ "@opencode-ai/server": "workspace:*",
+ "@opencode-ai/tui": "workspace:*",
+ "@opentui/core": "catalog:",
+ "@opentui/solid": "catalog:",
+ "@parcel/watcher": "2.5.1",
+ "effect": "catalog:",
+ "solid-js": "catalog:",
+ },
+ "devDependencies": {
+ "@opencode-ai/script": "workspace:*",
+ "@tsconfig/bun": "catalog:",
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ },
+ },
+ "packages/console/app": {
+ "name": "@opencode-ai/console-app",
+ "version": "1.17.4",
+ "dependencies": {
+ "@cloudflare/vite-plugin": "1.15.2",
+ "@ibm/plex": "6.4.1",
+ "@jsx-email/render": "1.1.1",
+ "@kobalte/core": "catalog:",
+ "@openauthjs/openauth": "catalog:",
+ "@opencode-ai/console-core": "workspace:*",
+ "@opencode-ai/console-mail": "workspace:*",
+ "@opencode-ai/console-resource": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@smithy/eventstream-codec": "4.2.7",
+ "@smithy/util-utf8": "4.2.0",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "@solidjs/start": "catalog:",
+ "@stripe/stripe-js": "8.6.1",
+ "@upstash/redis": "1.38.0",
+ "chart.js": "4.5.1",
+ "nitro": "3.0.1-alpha.1",
+ "solid-js": "catalog:",
+ "solid-list": "0.3.0",
+ "solid-stripe": "0.8.1",
+ "vite": "catalog:",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "@webgpu/types": "0.1.54",
+ "typescript": "catalog:",
+ "wrangler": "4.50.0",
+ },
+ },
+ "packages/console/core": {
+ "name": "@opencode-ai/console-core",
+ "version": "1.17.4",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.782.0",
+ "@jsx-email/render": "1.1.1",
+ "@opencode-ai/console-mail": "workspace:*",
+ "@opencode-ai/console-resource": "workspace:*",
+ "@planetscale/database": "1.19.0",
+ "aws4fetch": "1.0.20",
+ "drizzle-orm": "catalog:",
+ "postgres": "3.4.7",
+ "stripe": "18.0.0",
+ "ulid": "catalog:",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tsconfig/node22": "22.0.2",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "drizzle-kit": "catalog:",
+ "mysql2": "3.14.4",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/console/function": {
+ "name": "@opencode-ai/console-function",
+ "version": "1.17.4",
+ "dependencies": {
+ "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/openai": "3.0.48",
+ "@ai-sdk/openai-compatible": "2.0.37",
+ "@openauthjs/openauth": "0.0.0-20250322224806",
+ "@opencode-ai/console-core": "workspace:*",
+ "@opencode-ai/console-resource": "workspace:*",
+ "ai": "catalog:",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tsconfig/node22": "22.0.2",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "openai": "5.11.0",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/console/mail": {
+ "name": "@opencode-ai/console-mail",
+ "version": "1.17.4",
+ "dependencies": {
+ "@jsx-email/all": "2.2.3",
+ "@jsx-email/cli": "1.4.3",
+ "@tsconfig/bun": "1.0.9",
+ "@types/react": "18.0.25",
+ "react": "18.2.0",
+ "solid-js": "catalog:",
+ },
+ },
+ "packages/console/resource": {
+ "name": "@opencode-ai/console-resource",
+ "dependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tsconfig/node22": "22.0.2",
+ "@types/node": "catalog:",
+ "cloudflare": "5.2.0",
+ },
+ },
+ "packages/console/support": {
+ "name": "@opencode-ai/console-support",
+ "version": "1.17.4",
+ "dependencies": {
+ "@cloudflare/vite-plugin": "1.15.2",
+ "@opencode-ai/console-core": "workspace:*",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "@solidjs/start": "catalog:",
+ "nitro": "3.0.1-alpha.1",
+ "solid-js": "catalog:",
+ "vite": "catalog:",
+ },
+ "devDependencies": {
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ "wrangler": "4.50.0",
+ },
+ },
+ "packages/core": {
+ "name": "@opencode-ai/core",
+ "version": "1.17.4",
+ "bin": {
+ "opencode": "./bin/opencode",
+ },
+ "dependencies": {
+ "@ai-sdk/alibaba": "1.0.17",
+ "@ai-sdk/amazon-bedrock": "4.0.112",
+ "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/azure": "3.0.49",
+ "@ai-sdk/cerebras": "2.0.41",
+ "@ai-sdk/cohere": "3.0.27",
+ "@ai-sdk/deepinfra": "2.0.41",
+ "@ai-sdk/gateway": "3.0.104",
+ "@ai-sdk/google": "3.0.73",
+ "@ai-sdk/google-vertex": "4.0.128",
+ "@ai-sdk/groq": "3.0.31",
+ "@ai-sdk/mistral": "3.0.27",
+ "@ai-sdk/openai": "3.0.53",
+ "@ai-sdk/openai-compatible": "2.0.41",
+ "@ai-sdk/perplexity": "3.0.26",
+ "@ai-sdk/provider": "3.0.8",
+ "@ai-sdk/provider-utils": "4.0.23",
+ "@ai-sdk/togetherai": "2.0.41",
+ "@ai-sdk/vercel": "2.0.39",
+ "@ai-sdk/xai": "3.0.82",
+ "@aws-sdk/credential-providers": "3.1057.0",
+ "@effect/opentelemetry": "catalog:",
+ "@effect/platform-node": "catalog:",
+ "@effect/sql-sqlite-bun": "catalog:",
+ "@ff-labs/fff-bun": "0.9.4",
+ "@lydell/node-pty": "catalog:",
+ "@npmcli/arborist": "9.4.0",
+ "@npmcli/config": "10.8.1",
+ "@opencode-ai/effect-drizzle-sqlite": "workspace:*",
+ "@opencode-ai/effect-sqlite-node": "workspace:*",
+ "@opencode-ai/llm": "workspace:*",
+ "@openrouter/ai-sdk-provider": "2.9.0",
+ "@opentelemetry/api": "1.9.0",
+ "@opentelemetry/context-async-hooks": "2.6.1",
+ "@opentelemetry/exporter-trace-otlp-http": "0.214.0",
+ "@opentelemetry/sdk-trace-base": "2.6.1",
+ "@parcel/watcher": "2.5.1",
+ "@silvia-odwyer/photon-node": "0.3.4",
+ "ai-gateway-provider": "3.1.2",
+ "bun-pty": "0.4.8",
+ "cross-spawn": "catalog:",
+ "drizzle-orm": "catalog:",
+ "effect": "catalog:",
+ "fuzzysort": "3.1.0",
+ "gitlab-ai-provider": "6.9.3",
+ "glob": "13.0.5",
+ "google-auth-library": "10.5.0",
+ "gray-matter": "4.0.3",
+ "htmlparser2": "8.0.2",
+ "ignore": "7.0.5",
+ "immer": "11.1.4",
+ "jsonc-parser": "3.3.1",
+ "mime-types": "3.0.2",
+ "minimatch": "10.2.5",
+ "npm-package-arg": "13.0.2",
+ "semver": "^7.6.3",
+ "turndown": "7.2.0",
+ "venice-ai-sdk-provider": "2.0.2",
+ "which": "6.0.1",
+ "xdg-basedir": "5.1.0",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@opencode-ai/http-recorder": "workspace:*",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1",
+ "@tsconfig/bun": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/cross-spawn": "catalog:",
+ "@types/node": "catalog:",
+ "@types/npm-package-arg": "6.1.4",
+ "@types/npmcli__arborist": "6.3.3",
+ "@types/semver": "catalog:",
+ "@types/turndown": "5.0.5",
+ "@types/which": "3.0.4",
+ "drizzle-kit": "catalog:",
+ },
+ },
+ "packages/desktop": {
+ "name": "@opencode-ai/desktop",
+ "version": "1.17.4",
+ "dependencies": {
+ "@zip.js/zip.js": "2.7.62",
+ "effect": "catalog:",
+ "electron-context-menu": "4.1.2",
+ "electron-log": "^5",
+ "electron-store": "11.0.2",
+ "electron-updater": "6.8.9",
+ "electron-window-state": "^5.0.3",
+ "marked": "^15",
+ },
+ "devDependencies": {
+ "@actions/artifact": "4.0.0",
+ "@lydell/node-pty": "catalog:",
+ "@opencode-ai/app": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@sentry/solid": "catalog:",
+ "@sentry/vite-plugin": "catalog:",
+ "@solid-primitives/i18n": "2.2.1",
+ "@solid-primitives/storage": "catalog:",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "0.15.4",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "@valibot/to-json-schema": "1.6.0",
+ "electron": "42.3.3",
+ "electron-builder": "26.15.2",
+ "electron-vite": "^5",
+ "solid-js": "catalog:",
+ "sury": "11.0.0-alpha.4",
+ "typescript": "~5.6.2",
+ "vite": "catalog:",
+ "zod-openapi": "5.4.6",
+ },
+ "optionalDependencies": {
+ "@lydell/node-pty-darwin-arm64": "1.2.0-beta.12",
+ "@lydell/node-pty-darwin-x64": "1.2.0-beta.12",
+ "@lydell/node-pty-linux-arm64": "1.2.0-beta.12",
+ "@lydell/node-pty-linux-x64": "1.2.0-beta.12",
+ "@lydell/node-pty-win32-arm64": "1.2.0-beta.12",
+ "@lydell/node-pty-win32-x64": "1.2.0-beta.12",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1",
+ },
+ },
+ "packages/effect-drizzle-sqlite": {
+ "name": "@opencode-ai/effect-drizzle-sqlite",
+ "version": "1.17.4",
+ "dependencies": {
+ "drizzle-orm": "catalog:",
+ "effect": "catalog:",
+ },
+ "devDependencies": {
+ "@effect/sql-sqlite-bun": "catalog:",
+ "@tsconfig/bun": "catalog:",
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ },
+ },
+ "packages/effect-sqlite-node": {
+ "name": "@opencode-ai/effect-sqlite-node",
+ "version": "1.17.4",
+ "dependencies": {
+ "effect": "catalog:",
+ },
+ "devDependencies": {
+ "@tsconfig/bun": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ },
+ },
+ "packages/enterprise": {
+ "name": "@opencode-ai/enterprise",
+ "version": "1.17.4",
+ "dependencies": {
+ "@hono/standard-validator": "catalog:",
+ "@opencode-ai/core": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@pierre/diffs": "catalog:",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "@solidjs/start": "catalog:",
+ "aws4fetch": "^1.0.20",
+ "hono": "catalog:",
+ "hono-openapi": "catalog:",
+ "js-base64": "3.7.7",
+ "luxon": "catalog:",
+ "nitro": "3.0.1-alpha.1",
+ "solid-js": "catalog:",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tailwindcss/vite": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/luxon": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "tailwindcss": "catalog:",
+ "typescript": "catalog:",
+ "vite": "catalog:",
+ },
+ },
+ "packages/function": {
+ "name": "@opencode-ai/function",
+ "version": "1.17.4",
+ "dependencies": {
+ "@octokit/auth-app": "8.0.1",
+ "@octokit/rest": "catalog:",
+ "hono": "catalog:",
+ "jose": "6.0.11",
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tsconfig/node22": "22.0.2",
+ "@types/node": "catalog:",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/http-recorder": {
+ "name": "@opencode-ai/http-recorder",
+ "version": "1.17.4",
+ "dependencies": {
+ "@effect/platform-node": "4.0.0-beta.74",
+ "@effect/platform-node-shared": "4.0.0-beta.74",
+ },
+ "devDependencies": {
+ "@tsconfig/node22": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "effect": "catalog:",
+ "typescript": "catalog:",
+ },
+ "peerDependencies": {
+ "effect": "4.0.0-beta.74",
+ },
+ },
+ "packages/llm": {
+ "name": "@opencode-ai/llm",
+ "version": "1.17.4",
+ "dependencies": {
+ "@smithy/eventstream-codec": "4.2.14",
+ "@smithy/util-utf8": "4.2.2",
+ "aws4fetch": "1.0.20",
+ "effect": "catalog:",
+ },
+ "devDependencies": {
+ "@clack/prompts": "1.0.0-alpha.1",
+ "@effect/platform-node": "catalog:",
+ "@opencode-ai/http-recorder": "workspace:*",
+ "@tsconfig/bun": "catalog:",
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ },
+ },
+ "packages/opencode": {
+ "name": "opencode",
+ "version": "1.17.4",
+ "bin": {
+ "opencode": "./bin/opencode",
+ },
+ "dependencies": {
+ "@actions/core": "1.11.1",
+ "@actions/github": "6.0.1",
+ "@agentclientprotocol/sdk": "0.21.0",
+ "@ai-sdk/alibaba": "1.0.17",
+ "@ai-sdk/amazon-bedrock": "4.0.112",
+ "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/azure": "3.0.49",
+ "@ai-sdk/cerebras": "2.0.41",
+ "@ai-sdk/cohere": "3.0.27",
+ "@ai-sdk/deepinfra": "2.0.41",
+ "@ai-sdk/gateway": "3.0.104",
+ "@ai-sdk/google": "3.0.73",
+ "@ai-sdk/google-vertex": "4.0.128",
+ "@ai-sdk/groq": "3.0.31",
+ "@ai-sdk/mistral": "3.0.27",
+ "@ai-sdk/openai": "3.0.53",
+ "@ai-sdk/openai-compatible": "2.0.41",
+ "@ai-sdk/perplexity": "3.0.26",
+ "@ai-sdk/provider": "3.0.8",
+ "@ai-sdk/togetherai": "2.0.41",
+ "@ai-sdk/vercel": "2.0.39",
+ "@ai-sdk/xai": "3.0.82",
+ "@aws-sdk/credential-providers": "3.1057.0",
+ "@clack/prompts": "1.0.0-alpha.1",
+ "@effect/opentelemetry": "catalog:",
+ "@effect/platform-node": "catalog:",
+ "@ff-labs/fff-bun": "0.9.4",
+ "@gitlab/opencode-gitlab-auth": "1.3.3",
+ "@modelcontextprotocol/sdk": "1.29.0",
+ "@octokit/graphql": "9.0.2",
+ "@octokit/rest": "catalog:",
+ "@openauthjs/openauth": "catalog:",
+ "@opencode-ai/llm": "workspace:*",
+ "@opencode-ai/plugin": "workspace:*",
+ "@opencode-ai/script": "workspace:*",
+ "@opencode-ai/sdk": "workspace:*",
+ "@opencode-ai/server": "workspace:*",
+ "@opencode-ai/tui": "workspace:*",
+ "@openrouter/ai-sdk-provider": "2.9.0",
+ "@opentelemetry/api": "1.9.0",
+ "@opentelemetry/context-async-hooks": "2.6.1",
+ "@opentelemetry/exporter-trace-otlp-http": "0.214.0",
+ "@opentelemetry/sdk-trace-base": "2.6.1",
+ "@opentelemetry/sdk-trace-node": "2.6.1",
+ "@opentui/core": "catalog:",
+ "@opentui/keymap": "catalog:",
+ "@opentui/solid": "catalog:",
+ "@parcel/watcher": "2.5.1",
+ "@pierre/diffs": "catalog:",
+ "@silvia-odwyer/photon-node": "0.3.4",
+ "@solid-primitives/event-bus": "1.1.2",
+ "@solid-primitives/scheduled": "1.5.2",
+ "@standard-schema/spec": "1.0.0",
+ "@types/ws": "8.18.1",
+ "@zip.js/zip.js": "2.7.62",
+ "ai": "catalog:",
+ "ai-gateway-provider": "3.1.2",
+ "bonjour-service": "1.3.0",
+ "chokidar": "4.0.3",
+ "cross-spawn": "catalog:",
+ "decimal.js": "10.5.0",
+ "diff": "catalog:",
+ "drizzle-orm": "catalog:",
+ "effect": "catalog:",
+ "fuzzysort": "3.1.0",
+ "gitlab-ai-provider": "6.9.3",
+ "glob": "13.0.5",
+ "google-auth-library": "10.5.0",
+ "gray-matter": "4.0.3",
+ "htmlparser2": "8.0.2",
+ "ignore": "7.0.5",
+ "immer": "11.1.4",
+ "jsonc-parser": "3.3.1",
+ "mime-types": "3.0.2",
+ "minimatch": "10.0.3",
+ "npm-package-arg": "13.0.2",
+ "open": "10.1.2",
+ "opencode-gitlab-auth": "2.1.0",
+ "opencode-poe-auth": "0.0.1",
+ "opentui-spinner": "catalog:",
+ "partial-json": "0.1.7",
+ "remeda": "catalog:",
+ "semver": "^7.6.3",
+ "solid-js": "catalog:",
+ "strip-ansi": "7.1.2",
+ "tree-sitter-bash": "0.25.0",
+ "tree-sitter-powershell": "0.25.10",
+ "turndown": "7.2.0",
+ "ulid": "catalog:",
+ "venice-ai-sdk-provider": "2.0.2",
+ "vscode-jsonrpc": "8.2.1",
+ "web-tree-sitter": "0.25.10",
+ "ws": "8.21.0",
+ "xdg-basedir": "5.1.0",
+ "yargs": "18.0.0",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@babel/core": "7.28.4",
+ "@octokit/webhooks-types": "7.6.1",
+ "@opencode-ai/core": "workspace:*",
+ "@opencode-ai/http-recorder": "workspace:*",
+ "@opencode-ai/script": "workspace:*",
+ "@standard-schema/spec": "1.0.0",
+ "@tsconfig/bun": "catalog:",
+ "@types/babel__core": "7.20.5",
+ "@types/bun": "catalog:",
+ "@types/cross-spawn": "catalog:",
+ "@types/mime-types": "3.0.1",
+ "@types/npm-package-arg": "6.1.4",
+ "@types/semver": "^7.5.8",
+ "@types/turndown": "5.0.5",
+ "@types/yargs": "17.0.33",
+ "@typescript/native-preview": "catalog:",
+ "drizzle-orm": "catalog:",
+ "prettier": "3.6.2",
+ "typescript": "catalog:",
+ "vscode-languageserver-types": "3.17.5",
+ "why-is-node-running": "3.2.2",
+ },
+ },
+ "packages/plugin": {
+ "name": "@opencode-ai/plugin",
+ "version": "1.17.4",
+ "dependencies": {
+ "@opencode-ai/sdk": "workspace:*",
+ "effect": "catalog:",
+ "zod": "catalog:",
+ },
+ "devDependencies": {
+ "@opentui/core": "catalog:",
+ "@opentui/keymap": "catalog:",
+ "@opentui/solid": "catalog:",
+ "@tsconfig/node22": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ },
+ "peerDependencies": {
+ "@opentui/core": ">=0.3.4",
+ "@opentui/keymap": ">=0.3.4",
+ "@opentui/solid": ">=0.3.4",
+ },
+ "optionalPeers": [
+ "@opentui/core",
+ "@opentui/keymap",
+ "@opentui/solid",
+ ],
+ },
+ "packages/script": {
+ "name": "@opencode-ai/script",
+ "dependencies": {
+ "semver": "^7.6.3",
+ },
+ "devDependencies": {
+ "@types/bun": "catalog:",
+ "@types/semver": "^7.5.8",
+ },
+ },
+ "packages/sdk/js": {
+ "name": "@opencode-ai/sdk",
+ "version": "1.17.4",
+ "dependencies": {
+ "cross-spawn": "catalog:",
+ },
+ "devDependencies": {
+ "@hey-api/openapi-ts": "0.90.10",
+ "@tsconfig/node22": "catalog:",
+ "@types/cross-spawn": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/server": {
+ "name": "@opencode-ai/server",
+ "version": "1.17.4",
+ "dependencies": {
+ "@opencode-ai/core": "workspace:*",
+ "drizzle-orm": "catalog:",
+ "effect": "catalog:",
+ },
+ "devDependencies": {
+ "@tsconfig/bun": "catalog:",
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ },
+ },
+ "packages/slack": {
+ "name": "@opencode-ai/slack",
+ "version": "1.17.4",
+ "dependencies": {
+ "@opencode-ai/sdk": "workspace:*",
+ "@slack/bolt": "^3.17.1",
+ },
+ "devDependencies": {
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/stats/app": {
+ "name": "@opencode-ai/stats-app",
+ "version": "1.17.4",
+ "dependencies": {
+ "@ibm/plex": "6.4.1",
+ "@opencode-ai/stats-core": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "@solidjs/start": "catalog:",
+ "d3-geo": "3.1.1",
+ "d3-scale": "4.0.2",
+ "effect": "catalog:",
+ "i18n-iso-countries": "7.14.0",
+ "nitro": "3.0.1-alpha.1",
+ "solid-js": "catalog:",
+ "sst": "catalog:",
+ "topojson-client": "3.1.0",
+ "vite": "catalog:",
+ "world-atlas": "2.0.2",
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/d3-geo": "3.1.0",
+ "@types/d3-scale": "4.0.9",
+ "@types/geojson": "7946.0.16",
+ "@types/topojson-client": "3.1.5",
+ "@types/topojson-specification": "1.0.5",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/stats/core": {
+ "name": "@opencode-ai/stats-core",
+ "version": "1.17.4",
+ "dependencies": {
+ "@aws-sdk/client-athena": "3.933.0",
+ "@planetscale/database": "1.19.0",
+ "drizzle-orm": "catalog:",
+ "effect": "catalog:",
+ "sst": "catalog:",
+ },
+ "devDependencies": {
+ "@tsconfig/node22": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "drizzle-kit": "catalog:",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/stats/server": {
+ "name": "@opencode-ai/stats-server",
+ "version": "1.17.4",
+ "dependencies": {
+ "@aws-sdk/client-firehose": "3.933.0",
+ "@effect/platform-node": "catalog:",
+ "@opencode-ai/stats-core": "workspace:*",
+ "effect": "catalog:",
+ "sst": "catalog:",
+ },
+ "devDependencies": {
+ "@tsconfig/node22": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "typescript": "catalog:",
+ },
+ },
+ "packages/storybook": {
+ "name": "@opencode-ai/storybook",
+ "devDependencies": {
+ "@opencode-ai/ui": "workspace:*",
+ "@solidjs/meta": "catalog:",
+ "@storybook/addon-a11y": "^10.2.13",
+ "@storybook/addon-docs": "^10.2.13",
+ "@storybook/addon-links": "^10.2.13",
+ "@storybook/addon-onboarding": "^10.2.13",
+ "@storybook/addon-vitest": "^10.2.13",
+ "@tailwindcss/vite": "catalog:",
+ "@tsconfig/node22": "catalog:",
+ "@types/node": "catalog:",
+ "@types/react": "18.0.25",
+ "react": "18.2.0",
+ "solid-js": "catalog:",
+ "storybook": "^10.2.13",
+ "storybook-solidjs-vite": "^10.0.9",
+ "typescript": "catalog:",
+ "vite": "catalog:",
+ },
+ },
+ "packages/tui": {
+ "name": "@opencode-ai/tui",
+ "version": "1.17.4",
+ "dependencies": {
+ "@opencode-ai/core": "workspace:*",
+ "@opencode-ai/plugin": "workspace:*",
+ "@opencode-ai/sdk": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@opentui/core": "catalog:",
+ "@opentui/keymap": "catalog:",
+ "@opentui/solid": "catalog:",
+ "clipboardy": "4.0.0",
+ "diff": "catalog:",
+ "effect": "catalog:",
+ "fuzzysort": "catalog:",
+ "open": "10.1.2",
+ "opentui-spinner": "catalog:",
+ "remeda": "catalog:",
+ "solid-js": "catalog:",
+ "strip-ansi": "7.1.2",
+ },
+ "devDependencies": {
+ "@tsconfig/bun": "catalog:",
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ },
+ },
+ "packages/ui": {
+ "name": "@opencode-ai/ui",
+ "version": "1.17.4",
+ "dependencies": {
+ "@kobalte/core": "catalog:",
+ "@opencode-ai/core": "workspace:*",
+ "@opencode-ai/sdk": "workspace:*",
+ "@pierre/diffs": "catalog:",
+ "@shikijs/transformers": "3.9.2",
+ "@solid-primitives/bounds": "0.1.3",
+ "@solid-primitives/event-listener": "2.4.5",
+ "@solid-primitives/media": "2.3.3",
+ "@solid-primitives/resize-observer": "2.1.3",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "diff": "catalog:",
+ "dompurify": "3.3.1",
+ "fuzzysort": "catalog:",
+ "katex": "0.16.27",
+ "luxon": "catalog:",
+ "marked": "catalog:",
+ "marked-katex-extension": "5.1.6",
+ "marked-shiki": "catalog:",
+ "morphdom": "2.7.8",
+ "motion": "12.34.5",
+ "motion-dom": "12.34.3",
+ "motion-utils": "12.29.2",
+ "remeda": "catalog:",
+ "remend": "catalog:",
+ "shiki": "catalog:",
+ "solid-js": "catalog:",
+ "solid-list": "catalog:",
+ "strip-ansi": "7.1.2",
+ "virtua": "catalog:",
+ },
+ "devDependencies": {
+ "@tailwindcss/vite": "catalog:",
+ "@tsconfig/node22": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/katex": "0.16.7",
+ "@types/luxon": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "tailwindcss": "catalog:",
+ "typescript": "catalog:",
+ "vite": "catalog:",
+ "vite-plugin-icons-spritesheet": "3.0.1",
+ "vite-plugin-solid": "catalog:",
+ },
+ },
+ "packages/web": {
+ "name": "@opencode-ai/web",
+ "version": "1.17.4",
+ "dependencies": {
+ "@astrojs/cloudflare": "12.6.3",
+ "@astrojs/markdown-remark": "6.3.1",
+ "@astrojs/solid-js": "5.1.0",
+ "@astrojs/starlight": "0.34.3",
+ "@fontsource/ibm-plex-mono": "5.2.5",
+ "@shikijs/transformers": "3.20.0",
+ "@solid-primitives/resize-observer": "2.1.5",
+ "@types/luxon": "catalog:",
+ "ai": "catalog:",
+ "astro": "5.7.13",
+ "diff": "catalog:",
+ "js-base64": "3.7.7",
+ "lang-map": "0.4.0",
+ "luxon": "catalog:",
+ "marked": "catalog:",
+ "marked-shiki": "catalog:",
+ "rehype-autolink-headings": "7.1.0",
+ "remeda": "catalog:",
+ "shiki": "catalog:",
+ "solid-js": "catalog:",
+ "toolbeam-docs-theme": "0.4.8",
+ "vscode-languageserver-types": "3.17.5",
+ },
+ "devDependencies": {
+ "@astrojs/check": "0.9.6",
+ "@types/node": "catalog:",
+ "opencode": "workspace:*",
+ "typescript": "catalog:",
+ },
+ },
+ },
+ "trustedDependencies": [
+ "esbuild",
+ "tree-sitter-powershell",
+ "protobufjs",
+ "electron",
+ "web-tree-sitter",
+ "tree-sitter-bash",
+ ],
+ "patchedDependencies": {
+ "solid-js@1.9.10": "patches/solid-js@1.9.10.patch",
+ "virtua@0.49.1": "patches/virtua@0.49.1.patch",
+ "gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
+ "@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
+ "@ai-sdk/xai@3.0.82": "patches/@ai-sdk%2Fxai@3.0.82.patch",
+ "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
+ "pacote@21.5.0": "patches/pacote@21.5.0.patch",
+ "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
+ "@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
+ },
+ "overrides": {
+ "@opentui/core": "catalog:",
+ "@opentui/keymap": "catalog:",
+ "@opentui/solid": "catalog:",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ },
+ "catalog": {
+ "@cloudflare/workers-types": "4.20251008.0",
+ "@effect/opentelemetry": "4.0.0-beta.74",
+ "@effect/platform-node": "4.0.0-beta.74",
+ "@effect/sql-sqlite-bun": "4.0.0-beta.74",
+ "@hono/standard-validator": "0.2.0",
+ "@hono/zod-validator": "0.4.2",
+ "@kobalte/core": "0.13.11",
+ "@lydell/node-pty": "1.2.0-beta.12",
+ "@npmcli/arborist": "9.4.0",
+ "@octokit/rest": "22.0.0",
+ "@openauthjs/openauth": "0.0.0-20250322224806",
+ "@opentui/core": "0.3.4",
+ "@opentui/keymap": "0.3.4",
+ "@opentui/solid": "0.3.4",
+ "@pierre/diffs": "1.1.0-beta.18",
+ "@playwright/test": "1.59.1",
+ "@sentry/solid": "10.36.0",
+ "@sentry/vite-plugin": "4.6.0",
+ "@solid-primitives/storage": "4.3.3",
+ "@solidjs/meta": "0.29.4",
+ "@solidjs/router": "0.15.4",
+ "@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020",
+ "@tailwindcss/vite": "4.1.11",
+ "@tsconfig/bun": "1.0.9",
+ "@tsconfig/node22": "22.0.2",
+ "@types/bun": "1.3.13",
+ "@types/cross-spawn": "6.0.6",
+ "@types/luxon": "3.7.1",
+ "@types/node": "24.12.2",
+ "@types/semver": "7.7.1",
+ "@typescript/native-preview": "7.0.0-dev.20251207.1",
+ "ai": "6.0.168",
+ "cross-spawn": "7.0.6",
+ "diff": "8.0.2",
+ "dompurify": "3.3.1",
+ "drizzle-kit": "1.0.0-rc.2",
+ "drizzle-orm": "1.0.0-rc.2",
+ "effect": "4.0.0-beta.74",
+ "fuzzysort": "3.1.0",
+ "hono": "4.10.7",
+ "hono-openapi": "1.1.2",
+ "luxon": "3.6.1",
+ "marked": "17.0.1",
+ "marked-shiki": "1.2.1",
+ "opentui-spinner": "0.0.7",
+ "remeda": "2.26.0",
+ "remend": "1.3.0",
+ "semver": "7.7.4",
+ "shiki": "3.20.0",
+ "solid-js": "1.9.10",
+ "solid-list": "0.3.0",
+ "sst": "4.13.1",
+ "tailwindcss": "4.1.11",
+ "typescript": "5.8.2",
+ "ulid": "3.0.1",
+ "virtua": "0.49.1",
+ "vite": "7.1.4",
+ "vite-plugin-solid": "2.11.10",
+ "zod": "4.1.8",
+ },
+ "packages": {
+ "7zip-bin": ["7zip-bin@5.2.0", "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz", {}, "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A=="],
+
+ "@actions/artifact": ["@actions/artifact@5.0.1", "https://registry.npmmirror.com/@actions/artifact/-/artifact-5.0.1.tgz", { "dependencies": { "@actions/core": "^2.0.0", "@actions/github": "^6.0.1", "@actions/http-client": "^3.0.0", "@azure/storage-blob": "^12.29.1", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-dHJ5rHduhCKUikKTT9eXeWoUvfKia3IjR1sO/VTAV3DVAL4yMTRnl2iO5mcfiBjySHLwPNezwENAVskKYU5ymw=="],
+
+ "@actions/core": ["@actions/core@1.11.1", "https://registry.npmmirror.com/@actions/core/-/core-1.11.1.tgz", { "dependencies": { "@actions/exec": "^1.1.1", "@actions/http-client": "^2.0.1" } }, "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A=="],
+
+ "@actions/exec": ["@actions/exec@1.1.1", "https://registry.npmmirror.com/@actions/exec/-/exec-1.1.1.tgz", { "dependencies": { "@actions/io": "^1.0.1" } }, "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w=="],
+
+ "@actions/github": ["@actions/github@6.0.1", "https://registry.npmmirror.com/@actions/github/-/github-6.0.1.tgz", { "dependencies": { "@actions/http-client": "^2.2.0", "@octokit/core": "^5.0.1", "@octokit/plugin-paginate-rest": "^9.2.2", "@octokit/plugin-rest-endpoint-methods": "^10.4.0", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "undici": "^5.28.5" } }, "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw=="],
+
+ "@actions/http-client": ["@actions/http-client@3.0.2", "https://registry.npmmirror.com/@actions/http-client/-/http-client-3.0.2.tgz", { "dependencies": { "tunnel": "^0.0.6", "undici": "^6.23.0" } }, "sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA=="],
+
+ "@actions/io": ["@actions/io@1.1.3", "https://registry.npmmirror.com/@actions/io/-/io-1.1.3.tgz", {}, "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q=="],
+
+ "@adobe/css-tools": ["@adobe/css-tools@4.5.0", "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.5.0.tgz", {}, "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q=="],
+
+ "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.21.0", "https://registry.npmmirror.com/@agentclientprotocol/sdk/-/sdk-0.21.0.tgz", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-ONj+Q8qOdNQp5XbH5jnMwzT9IKZJsSN0p0lkceS4GtUtNOPVLpNzSS8gqQdGMKfBvA0ESbkL8BTaSN1Rc9miEw=="],
+
+ "@ai-sdk/alibaba": ["@ai-sdk/alibaba@1.0.17", "https://registry.npmmirror.com/@ai-sdk/alibaba/-/alibaba-1.0.17.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.41", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZbE+U5bWz2JBc5DERLowx5+TKbjGBE93LqKZAWvuEn7HOSQMraxFMZuc0ST335QZJAyfBOzh7m1mPQ+y7EaaoA=="],
+
+ "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@4.0.112", "https://registry.npmmirror.com/@ai-sdk/amazon-bedrock/-/amazon-bedrock-4.0.112.tgz", { "dependencies": { "@ai-sdk/anthropic": "3.0.81", "@ai-sdk/openai": "3.0.67", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-PsSh7a6qW+3kQXPs1kD4wDwuZby0t1PIaB6j/1aMKmPFJ5LxcIcULLMF/bjITLt5o/8lc0t6TXIwG0zlhH7uZw=="],
+
+ "@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.82", "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.82.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-WKKou2wbhGGYV8PSALAPyV2YY4nfCqCPkyBzYtJtDA9yCcIFwsbtkTNgg7bqtLCVzeEsY7wwxRoCWy+EMfrw/A=="],
+
+ "@ai-sdk/azure": ["@ai-sdk/azure@3.0.49", "https://registry.npmmirror.com/@ai-sdk/azure/-/azure-3.0.49.tgz", { "dependencies": { "@ai-sdk/openai": "3.0.48", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-wskgAL+OmrHG7by/iWIxEBQCEdc1mDudha/UZav46i0auzdFfsDB/k2rXZaC4/3nWSgMZkxr0W3ncyouEGX/eg=="],
+
+ "@ai-sdk/cerebras": ["@ai-sdk/cerebras@2.0.41", "https://registry.npmmirror.com/@ai-sdk/cerebras/-/cerebras-2.0.41.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kDMEpjaRdRXIUi1EH8WHwLRahyDTYv9SAJnP6VCCeq8X+tVqZbMLCqqxSG5dRknrI65ucjvzQt+FiDKTAa7AHg=="],
+
+ "@ai-sdk/cohere": ["@ai-sdk/cohere@3.0.27", "https://registry.npmmirror.com/@ai-sdk/cohere/-/cohere-3.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-OqcCq2PiFY1dbK/0Ck45KuvE8jfdxRuuAE9Y5w46dAk6U+9vPOeg1CDcmR+ncqmrYrhRl3nmyDttyDahyjCzAw=="],
+
+ "@ai-sdk/deepgram": ["@ai-sdk/deepgram@2.0.33", "https://registry.npmmirror.com/@ai-sdk/deepgram/-/deepgram-2.0.33.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-VscTV68g6sXRY4O1yl72/O8y6+tBDvSQax6bqX06hRKWBGxsJ8Jr3LZsNmZnK9Od5Icx565ijK0QgrlNaN4TdQ=="],
+
+ "@ai-sdk/deepinfra": ["@ai-sdk/deepinfra@2.0.41", "https://registry.npmmirror.com/@ai-sdk/deepinfra/-/deepinfra-2.0.41.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-y6RoOP7DGWmDSiSxrUSt5p18sbz+Ixe5lMVPmdE7x+Tr5rlrzvftyHhjWHfqlAtoYERZTGFbP6tPW1OfQcrb4A=="],
+
+ "@ai-sdk/deepseek": ["@ai-sdk/deepseek@2.0.35", "https://registry.npmmirror.com/@ai-sdk/deepseek/-/deepseek-2.0.35.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-9DhYurbAvcurOEGN6u2myYDybrrzGfcrkG8hwmFjwTrePW6KCMggm0YxP7e8RkLYcQKqCEMgFlyEB4BM6EmiKg=="],
+
+ "@ai-sdk/elevenlabs": ["@ai-sdk/elevenlabs@2.0.33", "https://registry.npmmirror.com/@ai-sdk/elevenlabs/-/elevenlabs-2.0.33.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-EtvsWfGrqx3OhzJdoi82qH+4yzEPPKZr2utyQ+w8cHKoFeg0+8Lou9Z3uixy73WEwz8Z1+AR8QT9fZ64AWGYPA=="],
+
+ "@ai-sdk/fireworks": ["@ai-sdk/fireworks@2.0.53", "https://registry.npmmirror.com/@ai-sdk/fireworks/-/fireworks-2.0.53.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.48", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-HjeiGsdxSzrCkOf2l2V+K+opzlqxBtduBq6BCiohAdgQk2KdZmI/67SMkBM6Kdze/BjUXiZlv0d7zNICPhxVDA=="],
+
+ "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.104", "https://registry.npmmirror.com/@ai-sdk/gateway/-/gateway-3.0.104.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZKX5n74io8VIRlhIMSLWVlvT3sXC8Z7cZ9GHuWBWZDVi96+62AIsWuLGvMfcBA1STYuSoDrp6rIziZmvrTq0TA=="],
+
+ "@ai-sdk/google": ["@ai-sdk/google@3.0.73", "https://registry.npmmirror.com/@ai-sdk/google/-/google-3.0.73.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-o2MuIeyvZrFIeIbnbA8Thrr63irdyUBh0uWBZ2lY6yFeXuE/tcwyXF74bDKS4KvTu84uFpQfpbS/LXHGKKXz+g=="],
+
+ "@ai-sdk/google-vertex": ["@ai-sdk/google-vertex@4.0.128", "https://registry.npmmirror.com/@ai-sdk/google-vertex/-/google-vertex-4.0.128.tgz", { "dependencies": { "@ai-sdk/anthropic": "3.0.77", "@ai-sdk/google": "3.0.73", "@ai-sdk/openai-compatible": "2.0.47", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "google-auth-library": "^10.5.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-jK8fixb4km2yfgvb9DUFQRpV/jiDB0v9gyxHoHfPydaQvz+CpAz8DTt1quyaM+Wg9G2R8Zo68CYmHbIkUqW2AA=="],
+
+ "@ai-sdk/groq": ["@ai-sdk/groq@3.0.31", "https://registry.npmmirror.com/@ai-sdk/groq/-/groq-3.0.31.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-XbbugpnFmXGu2TlXiq8KUJskP6/VVbuFcnFIGDzDIB/Chg6XHsNnqrTF80Zxkh0Pd3+NvbM+2Uqrtsndk6bDAg=="],
+
+ "@ai-sdk/mistral": ["@ai-sdk/mistral@3.0.27", "https://registry.npmmirror.com/@ai-sdk/mistral/-/mistral-3.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZXe7nZQgliDdjz5ufH5RKpHWxbN72AzmzzKGbF/z+0K9GN5tUCnftrQRvTRFHA5jAzTapcm2BEevmGLVbMkW+A=="],
+
+ "@ai-sdk/openai": ["@ai-sdk/openai@3.0.48", "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-3.0.48.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ALmj/53EXpcRqMbGpPJPP4UOSWw0q4VGpnDo7YctvsynjkrKDmoneDG/1a7VQnSPYHnJp6tTRMf5ZdxZ5whulg=="],
+
+ "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.37", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.37.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw=="],
+
+ "@ai-sdk/perplexity": ["@ai-sdk/perplexity@3.0.26", "https://registry.npmmirror.com/@ai-sdk/perplexity/-/perplexity-3.0.26.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-dXzrVsLR5f6tr+U04jq4AXoRroGFBTvODnLgss0SWbzNjGGQg3XqtQ9j7rCLo6o8qbYGuAHvqUrIpUCuiscuFg=="],
+
+ "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.8.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="],
+
+ "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.23", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.23.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg=="],
+
+ "@ai-sdk/togetherai": ["@ai-sdk/togetherai@2.0.41", "https://registry.npmmirror.com/@ai-sdk/togetherai/-/togetherai-2.0.41.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-k3p9e3k0/gpDDyTtvafsK4HYR4D/aUQW/kzCwWo1+CzdBU84i4L14gWISC/mv6tgSicMXHcEUd521fPufQwNlg=="],
+
+ "@ai-sdk/vercel": ["@ai-sdk/vercel@2.0.39", "https://registry.npmmirror.com/@ai-sdk/vercel/-/vercel-2.0.39.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8eu3ljJpkCTP4ppcyYB+NcBrkcBoSOFthCSgk5VnjaxnDaOJFaxnPwfddM7wx3RwMk2CiK1O61Px/LlqNc7QkQ=="],
+
+ "@ai-sdk/xai": ["@ai-sdk/xai@3.0.82", "https://registry.npmmirror.com/@ai-sdk/xai/-/xai-3.0.82.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.41", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-A0VFMufnVf4wODcT3SPQUUzvYXiIO1VhFuXj9r6z/vP4rlo+QRDPw3WSTchcz93ROQWSfBE3I6Szqz342OHi5w=="],
+
+ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
+
+ "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
+
+ "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.71.2", "https://registry.npmmirror.com/@anthropic-ai/sdk/-/sdk-0.71.2.tgz", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ=="],
+
+ "@anycable/core": ["@anycable/core@0.9.2", "https://registry.npmmirror.com/@anycable/core/-/core-0.9.2.tgz", { "dependencies": { "nanoevents": "^7.0.1" } }, "sha512-x5ZXDcW/N4cxWl93CnbHs/u7qq4793jS2kNPWm+duPrXlrva+ml2ZGT7X9tuOBKzyIHf60zWCdIK7TUgMPAwXA=="],
+
+ "@astrojs/check": ["@astrojs/check@0.9.6", "https://registry.npmmirror.com/@astrojs/check/-/check-0.9.6.tgz", { "dependencies": { "@astrojs/language-server": "^2.16.1", "chokidar": "^4.0.1", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA=="],
+
+ "@astrojs/cloudflare": ["@astrojs/cloudflare@12.6.3", "https://registry.npmmirror.com/@astrojs/cloudflare/-/cloudflare-12.6.3.tgz", { "dependencies": { "@astrojs/internal-helpers": "0.7.1", "@astrojs/underscore-redirects": "1.0.0", "@cloudflare/workers-types": "^4.20250507.0", "tinyglobby": "^0.2.13", "vite": "^6.3.5", "wrangler": "^4.14.1" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-xhJptF5tU2k5eo70nIMyL1Udma0CqmUEnGSlGyFflLqSY82CRQI6nWZ/xZt0ZvmXuErUjIx0YYQNfZsz5CNjLQ=="],
+
+ "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "https://registry.npmmirror.com/@astrojs/compiler/-/compiler-2.13.1.tgz", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="],
+
+ "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.1", "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.7.1.tgz", {}, "sha512-7dwEVigz9vUWDw3nRwLQ/yH/xYovlUA0ZD86xoeKEBmkz9O6iELG1yri67PgAPW6VLL/xInA4t7H0CK6VmtkKQ=="],
+
+ "@astrojs/language-server": ["@astrojs/language-server@2.16.10", "https://registry.npmmirror.com/@astrojs/language-server/-/language-server-2.16.10.tgz", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.4", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.16", "volar-service-css": "0.0.70", "volar-service-emmet": "0.0.70", "volar-service-html": "0.0.70", "volar-service-prettier": "0.0.70", "volar-service-typescript": "0.0.70", "volar-service-typescript-twoslash-queries": "0.0.70", "volar-service-yaml": "0.0.70", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "./bin/nodeServer.js" } }, "sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w=="],
+
+ "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.1", "https://registry.npmmirror.com/@astrojs/markdown-remark/-/markdown-remark-6.3.1.tgz", { "dependencies": { "@astrojs/internal-helpers": "0.6.1", "@astrojs/prism": "3.2.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", "js-yaml": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", "shiki": "^3.0.0", "smol-toml": "^1.3.1", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "vfile": "^6.0.3" } }, "sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg=="],
+
+ "@astrojs/mdx": ["@astrojs/mdx@4.3.14", "https://registry.npmmirror.com/@astrojs/mdx/-/mdx-4.3.14.tgz", { "dependencies": { "@astrojs/markdown-remark": "6.3.11", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA=="],
+
+ "@astrojs/prism": ["@astrojs/prism@3.2.0", "https://registry.npmmirror.com/@astrojs/prism/-/prism-3.2.0.tgz", { "dependencies": { "prismjs": "^1.29.0" } }, "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw=="],
+
+ "@astrojs/sitemap": ["@astrojs/sitemap@3.7.3", "https://registry.npmmirror.com/@astrojs/sitemap/-/sitemap-3.7.3.tgz", { "dependencies": { "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", "zod": "^4.3.6" } }, "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA=="],
+
+ "@astrojs/solid-js": ["@astrojs/solid-js@5.1.0", "https://registry.npmmirror.com/@astrojs/solid-js/-/solid-js-5.1.0.tgz", { "dependencies": { "vite": "^6.3.5", "vite-plugin-solid": "^2.11.6" }, "peerDependencies": { "solid-devtools": "^0.30.1", "solid-js": "^1.8.5" }, "optionalPeers": ["solid-devtools"] }, "sha512-VmPHOU9k7m6HHCT2Y1mNzifilUnttlowBM36frGcfj5wERJE9Ci0QtWJbzdf6AlcoIirb7xVw+ByupU011Di9w=="],
+
+ "@astrojs/starlight": ["@astrojs/starlight@0.34.3", "https://registry.npmmirror.com/@astrojs/starlight/-/starlight-0.34.3.tgz", { "dependencies": { "@astrojs/markdown-remark": "^6.3.1", "@astrojs/mdx": "^4.2.3", "@astrojs/sitemap": "^3.3.0", "@pagefind/default-ui": "^1.3.0", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", "@types/mdast": "^4.0.4", "astro-expressive-code": "^0.41.1", "bcp-47": "^2.1.0", "hast-util-from-html": "^2.0.1", "hast-util-select": "^6.0.2", "hast-util-to-string": "^3.0.0", "hastscript": "^9.0.0", "i18next": "^23.11.5", "js-yaml": "^4.1.0", "klona": "^2.0.6", "mdast-util-directive": "^3.0.0", "mdast-util-to-markdown": "^2.1.0", "mdast-util-to-string": "^4.0.0", "pagefind": "^1.3.0", "rehype": "^13.0.1", "rehype-format": "^5.0.0", "remark-directive": "^3.0.0", "ultrahtml": "^1.6.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "vfile": "^6.0.2" }, "peerDependencies": { "astro": "^5.5.0" } }, "sha512-MAuD3NF+E+QXJJuVKofoR6xcPTP4BJmYWeOBd03udVdubNGVnPnSWVZAi+ZtnTofES4+mJdp8BNGf+ubUxkiiA=="],
+
+ "@astrojs/telemetry": ["@astrojs/telemetry@3.2.1", "https://registry.npmmirror.com/@astrojs/telemetry/-/telemetry-3.2.1.tgz", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-SSVM820Jqc6wjsn7qYfV9qfeQvePtVc1nSofhyap7l0/iakUKywj3hfy3UJAOV4sGV4Q/u450RD4AaCaFvNPlg=="],
+
+ "@astrojs/underscore-redirects": ["@astrojs/underscore-redirects@1.0.0", "https://registry.npmmirror.com/@astrojs/underscore-redirects/-/underscore-redirects-1.0.0.tgz", {}, "sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ=="],
+
+ "@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.4", "https://registry.npmmirror.com/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", { "dependencies": { "yaml": "^2.8.3" } }, "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A=="],
+
+ "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "https://registry.npmmirror.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="],
+
+ "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "https://registry.npmmirror.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="],
+
+ "@aws-crypto/sha1-browser": ["@aws-crypto/sha1-browser@5.2.0", "https://registry.npmmirror.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", { "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg=="],
+
+ "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "https://registry.npmmirror.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="],
+
+ "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "https://registry.npmmirror.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="],
+
+ "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "https://registry.npmmirror.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="],
+
+ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "https://registry.npmmirror.com/@aws-crypto/util/-/util-5.2.0.tgz", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="],
+
+ "@aws-sdk/client-athena": ["@aws-sdk/client-athena@3.933.0", "https://registry.npmmirror.com/@aws-sdk/client-athena/-/client-athena-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/credential-provider-node": "3.933.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-9eMUCu1Ay3C9ojo+dJcynSdpbxuwDVtZUt/Xhce+c2+mgDsmvRzjww+wfLpZwRNWxBWmeauQQAZk52tCwQgXsQ=="],
+
+ "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.1057.0", "https://registry.npmmirror.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1057.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.15", "@aws-sdk/credential-provider-node": "^3.972.47", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/fetch-http-handler": "^5.4.5", "@smithy/node-http-handler": "^4.7.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-5MliYkp2u0+2arTp5fZIaxl+xmm90LEKv/VeSxhfNQW4t0fvWJrNO429/jchWQenNoDRrOGE59VfbuZUfwFujg=="],
+
+ "@aws-sdk/client-firehose": ["@aws-sdk/client-firehose@3.933.0", "https://registry.npmmirror.com/@aws-sdk/client-firehose/-/client-firehose-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/credential-provider-node": "3.933.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-tDrtgczN2lQsflLDPYu/wdOoyCZLVYtgzmWnYzSEOBWd/cp2AbuQ7D+FemSwUTzyoMTuhhIevyEJKzqsF+QYxA=="],
+
+ "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.1057.0", "https://registry.npmmirror.com/@aws-sdk/client-lambda/-/client-lambda-3.1057.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.15", "@aws-sdk/credential-provider-node": "^3.972.47", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/fetch-http-handler": "^5.4.5", "@smithy/node-http-handler": "^4.7.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-JoaE3QNvPqOSHJtcAFfza7BRoGUNerIKlSVhsKCBsa1i54Vto1YWUS7itkUELK2rpvS8kNZMPliPxDdi/oV5dw=="],
+
+ "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.933.0", "https://registry.npmmirror.com/@aws-sdk/client-s3/-/client-s3-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/credential-provider-node": "3.933.0", "@aws-sdk/middleware-bucket-endpoint": "3.930.0", "@aws-sdk/middleware-expect-continue": "3.930.0", "@aws-sdk/middleware-flexible-checksums": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-location-constraint": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-sdk-s3": "3.932.0", "@aws-sdk/middleware-ssec": "3.930.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/signature-v4-multi-region": "3.932.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/eventstream-serde-browser": "^4.2.5", "@smithy/eventstream-serde-config-resolver": "^4.3.5", "@smithy/eventstream-serde-node": "^4.2.5", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-blob-browser": "^4.2.6", "@smithy/hash-node": "^4.2.5", "@smithy/hash-stream-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/md5-js": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" } }, "sha512-KxwZvdxdCeWK6o8mpnb+kk7Kgb8V+8AjTwSXUWH1UAD85B0tjdo1cSfE5zoR5fWGol4Ml5RLez12a6LPhsoTqA=="],
+
+ "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.933.0", "https://registry.npmmirror.com/@aws-sdk/client-sso/-/client-sso-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-zwGLSiK48z3PzKpQiDMKP85+fpIrPMF1qQOQW9OW7BGj5AuBZIisT2O4VzIgYJeh+t47MLU7VgBQL7muc+MJDg=="],
+
+ "@aws-sdk/client-sts": ["@aws-sdk/client-sts@3.782.0", "https://registry.npmmirror.com/@aws-sdk/client-sts/-/client-sts-3.782.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/credential-provider-node": "3.782.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.782.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-Q1QLY3xE2z1trgriusP/6w40mI/yJjM524bN4gs+g6YX4sZGufpa7+Dj+JjL4fz8f9BCJ3ZlI+p4WxFxH7qvdQ=="],
+
+ "@aws-sdk/core": ["@aws-sdk/core@3.932.0", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.932.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@aws-sdk/xml-builder": "3.930.0", "@smithy/core": "^3.18.2", "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA=="],
+
+ "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.972.38", "https://registry.npmmirror.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.38.tgz", { "dependencies": { "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-OHkK6xOx/IHkSbQdDWxnVCLU+j28EFl8wyWgBILQDFAPY8n240C/O4gjmFx+zFU12lL8njgJQ5GWAIWq88CnSQ=="],
+
+ "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.41", "https://registry.npmmirror.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.41.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-n1EbJ98yvPWWdHZZv8bRBMqqDQJrtgtxyJ4xLy2Uqrh25BCOZQ7nnS1CsFXvuH8r0b0KVHDZEGEH5FxmEMP8jg=="],
+
+ "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.43", "https://registry.npmmirror.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.43.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/fetch-http-handler": "^5.4.5", "@smithy/node-http-handler": "^4.7.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-TT76RN1NkI9WoyZqCNxOw6/WBMF7pYOTJcXbMokNFU+euSG40Kaf/t/FhDACVZWP+43wEM6ZynIPIkzS1wR1iA=="],
+
+ "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.46", "https://registry.npmmirror.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.46.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/credential-provider-env": "^3.972.41", "@aws-sdk/credential-provider-http": "^3.972.43", "@aws-sdk/credential-provider-login": "^3.972.45", "@aws-sdk/credential-provider-process": "^3.972.41", "@aws-sdk/credential-provider-sso": "^3.972.45", "@aws-sdk/credential-provider-web-identity": "^3.972.45", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/credential-provider-imds": "^4.3.6", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-hvcgcwOiS0nb2XFb5Op1Pz/vYaWz5K8kKullziGpdNRuG0NwzRXseuPt2CoBqknHGaSPVesu1aOn2OcctEYdCA=="],
+
+ "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.45", "https://registry.npmmirror.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.45.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-MZQv4SNjByk1iOKmrqmzcUF/uCB05wjvEHyXKxmGQTUANTIVayX6HPUF0bzkWLvtnkH7sAn9kUCfkXbSpj9sDA=="],
+
+ "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.933.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.933.0.tgz", { "dependencies": { "@aws-sdk/credential-provider-env": "3.932.0", "@aws-sdk/credential-provider-http": "3.932.0", "@aws-sdk/credential-provider-ini": "3.933.0", "@aws-sdk/credential-provider-process": "3.932.0", "@aws-sdk/credential-provider-sso": "3.933.0", "@aws-sdk/credential-provider-web-identity": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/credential-provider-imds": "^4.2.5", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-L2dE0Y7iMLammQewPKNeEh1z/fdJyYEU+/QsLBD9VEh+SXcN/FIyTi21Isw8wPZN6lMB9PDVtISzBnF8HuSFrw=="],
+
+ "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.41", "https://registry.npmmirror.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.41.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-7I/n1zkysouLOWvkEhjNEP4vMnD2v4kzzr3/3QBdrripEpn7ap1/I5DF3Hou1SUqkKWo1f3oPGMyFAA1FAMvsQ=="],
+
+ "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.45", "https://registry.npmmirror.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.45.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/token-providers": "3.1056.0", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-oHgbz/eFD8IKiksqDsz9ZMU4A59BpQq4QwJedBnGD80ZqYcHPPHZBwjBnxLVkB7iRVVHWpDclR8yWdD2PkQIUA=="],
+
+ "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.45", "https://registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.45.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-CDhzKdb2onv5bpnjn/acgdNmJOQthPDLsPizU7rZflsEcgMMp8Mlri+U5hdxf8ldvZJpvM3vLU6D56vfJm5AMQ=="],
+
+ "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.1057.0", "https://registry.npmmirror.com/@aws-sdk/credential-providers/-/credential-providers-3.1057.0.tgz", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.1057.0", "@aws-sdk/core": "^3.974.15", "@aws-sdk/credential-provider-cognito-identity": "^3.972.38", "@aws-sdk/credential-provider-env": "^3.972.41", "@aws-sdk/credential-provider-http": "^3.972.43", "@aws-sdk/credential-provider-ini": "^3.972.46", "@aws-sdk/credential-provider-login": "^3.972.45", "@aws-sdk/credential-provider-node": "^3.972.47", "@aws-sdk/credential-provider-process": "^3.972.41", "@aws-sdk/credential-provider-sso": "^3.972.45", "@aws-sdk/credential-provider-web-identity": "^3.972.45", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/credential-provider-imds": "^4.3.6", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-rbrEHtz11g0kxsSkYr3fx2HABNNblp4AhB2MgPvJHgYOWfJ2eBviU7Mvoaef0PW8QH6lbZDfJcnM7eKvtvz3sw=="],
+
+ "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.930.0", "https://registry.npmmirror.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-cnCLWeKPYgvV4yRYPFH6pWMdUByvu2cy2BAlfsPpvnm4RaVioztyvxmQj5PmVN5fvWs5w/2d6U7le8X9iye2sA=="],
+
+ "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.930.0", "https://registry.npmmirror.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-5HEQ+JU4DrLNWeY27wKg/jeVa8Suy62ivJHOSUf6e6hZdVIMx0h/kXS1fHEQNNiLu2IzSEP/bFXsKBaW7x7s0g=="],
+
+ "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.932.0", "https://registry.npmmirror.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.932.0.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-hyvRz/XS/0HTHp9/Ld1mKwpOi7bZu5olI42+T112rkCTbt1bewkygzEl4oflY4H7cKMamQusYoL0yBUD/QSEvA=="],
+
+ "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.930.0", "https://registry.npmmirror.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-x30jmm3TLu7b/b+67nMyoV0NlbnCVT5DI57yDrhXAPCtdgM1KtdLWt45UcHpKOm1JsaIkmYRh2WYu7Anx4MG0g=="],
+
+ "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.930.0", "https://registry.npmmirror.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-QIGNsNUdRICog+LYqmtJ03PLze6h2KCORXUs5td/hAEjVP5DMmubhtrGg1KhWyctACluUH/E/yrD14p4pRXxwA=="],
+
+ "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.930.0", "https://registry.npmmirror.com/@aws-sdk/middleware-logger/-/middleware-logger-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-vh4JBWzMCBW8wREvAwoSqB2geKsZwSHTa0nSt0OMOLp2PdTYIZDi0ZiVMmpfnjcx9XbS6aSluLv9sKx4RrG46A=="],
+
+ "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.933.0", "https://registry.npmmirror.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.933.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@aws/lambda-invoke-store": "^0.2.0", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-qgrMlkVKzTCAdNw2A05DC2sPBo0KRQ7wk+lbYSRJnWVzcrceJhnmhoZVV5PFv7JtchK7sHVcfm9lcpiyd+XaCA=="],
+
+ "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.932.0", "https://registry.npmmirror.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.932.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.18.2", "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-bYMHxqQzseaAP9Z5qLI918z5AtbAnZRRtFi3POb4FLZyreBMgCgBNaPkIhdgywnkqaydTWvbMBX4s9f4gUwlTw=="],
+
+ "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.930.0", "https://registry.npmmirror.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-N2/SvodmaDS6h7CWfuapt3oJyn1T2CBz0CsDIiTDv9cSagXAVFjPdm2g4PFJqrNBeqdDIoYBnnta336HmamWHg=="],
+
+ "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.932.0", "https://registry.npmmirror.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.932.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@smithy/core": "^3.18.2", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-9BGTbJyA/4PTdwQWE9hAFIJGpsYkyEW20WON3i15aDqo5oRZwZmqaVageOD57YYqG8JDJjvcwKyDdR4cc38dvg=="],
+
+ "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.13", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.997.13.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.15", "@aws-sdk/signature-v4-multi-region": "^3.996.30", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/fetch-http-handler": "^5.4.5", "@smithy/node-http-handler": "^4.7.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-2pA6eyb5nSo/ZD2cayhOTEMoGQYgspq0RI05GDLkzQ3ajZ6isS6waV6E92Am/hz4LIlLUTrbwPLurJ/fuiHvkg=="],
+
+ "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.930.0", "https://registry.npmmirror.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/config-resolver": "^4.4.3", "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw=="],
+
+ "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.932.0", "https://registry.npmmirror.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.932.0.tgz", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-NCIRJvoRc9246RZHIusY1+n/neeG2yGhBGdKhghmrNdM+mLLN6Ii7CKFZjx3DhxtpHMpl1HWLTMhdVrGwP2upw=="],
+
+ "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1056.0", "https://registry.npmmirror.com/@aws-sdk/token-providers/-/token-providers-3.1056.0.tgz", { "dependencies": { "@aws-sdk/core": "^3.974.15", "@aws-sdk/nested-clients": "^3.997.13", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-81duvlltQlsfn5K+o8zILcystBRdbT1G2JJYVCML5NZHBz4CL/zf+sAemCtBh/uh6RQUMyInGeZLQ7/8igZhbA=="],
+
+ "@aws-sdk/types": ["@aws-sdk/types@3.930.0", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.930.0.tgz", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A=="],
+
+ "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.893.0", "https://registry.npmmirror.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA=="],
+
+ "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.930.0", "https://registry.npmmirror.com/@aws-sdk/util-endpoints/-/util-endpoints-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-endpoints": "^3.2.5", "tslib": "^2.6.2" } }, "sha512-M2oEKBzzNAYr136RRc6uqw3aWlwCxqTP1Lawps9E1d2abRPvl1p1ztQmmXp1Ak4rv8eByIZ+yQyKQ3zPdRG5dw=="],
+
+ "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.5", "https://registry.npmmirror.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ=="],
+
+ "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.930.0", "https://registry.npmmirror.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.930.0.tgz", { "dependencies": { "@aws-sdk/types": "3.930.0", "@smithy/types": "^4.9.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-q6lCRm6UAe+e1LguM5E4EqM9brQlDem4XDcQ87NzEvlTW6GzmNCO0w1jS0XgCFXQHjDxjdlNFX+5sRbHijwklg=="],
+
+ "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.932.0", "https://registry.npmmirror.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.932.0.tgz", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-/kC6cscHrZL74TrZtgiIL5jJNbVsw9duGGPurmaVgoCbP7NnxyaSWEurbNV3VPNPhNE3bV3g4Ci+odq+AlsYQg=="],
+
+ "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.930.0", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", { "dependencies": { "@smithy/types": "^4.9.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA=="],
+
+ "@aws/durable-execution-sdk-js": ["@aws/durable-execution-sdk-js@1.0.2", "https://registry.npmmirror.com/@aws/durable-execution-sdk-js/-/durable-execution-sdk-js-1.0.2.tgz", { "dependencies": { "@aws-sdk/client-lambda": "^3.943.0" } }, "sha512-KIYBVqV9gArkWdPEDYOjJqLlO+NecmCXOXadNBlOspJTmqztwuiyb6aZc468bYWSGuL4Me/gyTIK97ubkwFNCw=="],
+
+ "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "https://registry.npmmirror.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="],
+
+ "@azure/abort-controller": ["@azure/abort-controller@2.1.2", "https://registry.npmmirror.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA=="],
+
+ "@azure/core-auth": ["@azure/core-auth@1.10.1", "https://registry.npmmirror.com/@azure/core-auth/-/core-auth-1.10.1.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-util": "^1.13.0", "tslib": "^2.6.2" } }, "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg=="],
+
+ "@azure/core-client": ["@azure/core-client@1.10.1", "https://registry.npmmirror.com/@azure/core-client/-/core-client-1.10.1.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "tslib": "^2.6.2" } }, "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w=="],
+
+ "@azure/core-http": ["@azure/core-http@3.0.5", "https://registry.npmmirror.com/@azure/core-http/-/core-http-3.0.5.tgz", { "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-tracing": "1.0.0-preview.13", "@azure/core-util": "^1.1.1", "@azure/logger": "^1.0.0", "@types/node-fetch": "^2.5.0", "@types/tunnel": "^0.0.3", "form-data": "^4.0.0", "node-fetch": "^2.6.7", "process": "^0.11.10", "tslib": "^2.2.0", "tunnel": "^0.0.6", "uuid": "^8.3.0", "xml2js": "^0.5.0" } }, "sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg=="],
+
+ "@azure/core-http-compat": ["@azure/core-http-compat@2.4.0", "https://registry.npmmirror.com/@azure/core-http-compat/-/core-http-compat-2.4.0.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2" }, "peerDependencies": { "@azure/core-client": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0" } }, "sha512-f1P96IB399YiN2ARYHP7EpZi3Bf3wH4SN2lGzrw7JVwm7bbsVYtf2iKSBwTywD2P62NOPZGHFSZi+6jjb75JuA=="],
+
+ "@azure/core-lro": ["@azure/core-lro@2.7.2", "https://registry.npmmirror.com/@azure/core-lro/-/core-lro-2.7.2.tgz", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" } }, "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw=="],
+
+ "@azure/core-paging": ["@azure/core-paging@1.6.2", "https://registry.npmmirror.com/@azure/core-paging/-/core-paging-1.6.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA=="],
+
+ "@azure/core-rest-pipeline": ["@azure/core-rest-pipeline@1.23.0", "https://registry.npmmirror.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.4", "tslib": "^2.6.2" } }, "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ=="],
+
+ "@azure/core-tracing": ["@azure/core-tracing@1.3.1", "https://registry.npmmirror.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ=="],
+
+ "@azure/core-util": ["@azure/core-util@1.13.1", "https://registry.npmmirror.com/@azure/core-util/-/core-util-1.13.1.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A=="],
+
+ "@azure/core-xml": ["@azure/core-xml@1.5.1", "https://registry.npmmirror.com/@azure/core-xml/-/core-xml-1.5.1.tgz", { "dependencies": { "fast-xml-parser": "^5.5.9", "tslib": "^2.8.1" } }, "sha512-xcNRHqCoSp4AunOALEae6A8f3qATb83gSrm31Iqb01OzblvC3/W/bfXozcq78EzIdzZzuH1bZ2NvRR0TdX709w=="],
+
+ "@azure/logger": ["@azure/logger@1.3.0", "https://registry.npmmirror.com/@azure/logger/-/logger-1.3.0.tgz", { "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA=="],
+
+ "@azure/storage-blob": ["@azure/storage-blob@12.31.0", "https://registry.npmmirror.com/@azure/storage-blob/-/storage-blob-12.31.0.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.3", "@azure/core-http-compat": "^2.2.0", "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.6.2", "@azure/core-rest-pipeline": "^1.19.1", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/core-xml": "^1.4.5", "@azure/logger": "^1.1.4", "@azure/storage-common": "^12.3.0", "events": "^3.0.0", "tslib": "^2.8.1" } }, "sha512-DBgNv10aCSxopt92DkTDD0o9xScXeBqPKGmR50FPZQaEcH4JLQ+GEOGEDv19V5BMkB7kxr+m4h6il/cCDPvmHg=="],
+
+ "@azure/storage-common": ["@azure/storage-common@12.3.0", "https://registry.npmmirror.com/@azure/storage-common/-/storage-common-12.3.0.tgz", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-http-compat": "^2.2.0", "@azure/core-rest-pipeline": "^1.19.1", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.1.4", "events": "^3.3.0", "tslib": "^2.8.1" } }, "sha512-/OFHhy86aG5Pe8dP5tsp+BuJ25JOAl9yaMU3WZbkeoiFMHFtJ7tu5ili7qEdBXNW9G5lDB19trwyI6V49F/8iQ=="],
+
+ "@babel/code-frame": ["@babel/code-frame@7.29.7", "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
+
+ "@babel/compat-data": ["@babel/compat-data@7.29.7", "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
+
+ "@babel/core": ["@babel/core@7.28.4", "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="],
+
+ "@babel/generator": ["@babel/generator@7.29.7", "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="],
+
+ "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.29.7", "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw=="],
+
+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
+
+ "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.29.7", "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", "@babel/helper-replace-supers": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg=="],
+
+ "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
+
+ "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.29.7", "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg=="],
+
+ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
+
+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
+
+ "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.29.7", "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong=="],
+
+ "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="],
+
+ "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.29.7", "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ=="],
+
+ "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.29.7", "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
+
+ "@babel/helpers": ["@babel/helpers@7.29.7", "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
+
+ "@babel/parser": ["@babel/parser@7.29.7", "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="],
+
+ "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.29.7", "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA=="],
+
+ "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.29.7", "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ=="],
+
+ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.29.7", "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", { "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ=="],
+
+ "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.29.7", "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw=="],
+
+ "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.29.7", "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q=="],
+
+ "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.29.7", "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", "@babel/plugin-syntax-typescript": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw=="],
+
+ "@babel/preset-typescript": ["@babel/preset-typescript@7.27.1", "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ=="],
+
+ "@babel/runtime": ["@babel/runtime@7.29.7", "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+
+ "@babel/template": ["@babel/template@7.29.7", "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
+
+ "@babel/traverse": ["@babel/traverse@7.29.7", "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.7.tgz", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="],
+
+ "@babel/types": ["@babel/types@7.29.7", "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="],
+
+ "@bufbuild/protobuf": ["@bufbuild/protobuf@2.12.0", "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.12.0.tgz", {}, "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA=="],
+
+ "@bufbuild/protoplugin": ["@bufbuild/protoplugin@2.12.0", "https://registry.npmmirror.com/@bufbuild/protoplugin/-/protoplugin-2.12.0.tgz", { "dependencies": { "@bufbuild/protobuf": "2.12.0", "@typescript/vfs": "^1.6.2", "typescript": "5.4.5" } }, "sha512-ORlDITp8AFUXzIhLRoMCG+ud+D3MPKWb5HQXBoskMMnjeyEjE1H1qLonVNPyOr8lkx3xSfYUo8a0dvOZJVAzow=="],
+
+ "@capsizecss/unpack": ["@capsizecss/unpack@2.4.0", "https://registry.npmmirror.com/@capsizecss/unpack/-/unpack-2.4.0.tgz", { "dependencies": { "blob-to-buffer": "^1.2.8", "cross-fetch": "^3.0.4", "fontkit": "^2.0.2" } }, "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q=="],
+
+ "@clack/core": ["@clack/core@1.0.0-alpha.1", "https://registry.npmmirror.com/@clack/core/-/core-1.0.0-alpha.1.tgz", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-rFbCU83JnN7l3W1nfgCqqme4ZZvTTgsiKQ6FM0l+r0P+o2eJpExcocBUWUIwnDzL76Aca9VhUdWmB2MbUv+Qyg=="],
+
+ "@clack/prompts": ["@clack/prompts@1.0.0-alpha.1", "https://registry.npmmirror.com/@clack/prompts/-/prompts-1.0.0-alpha.1.tgz", { "dependencies": { "@clack/core": "1.0.0-alpha.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-07MNT0OsxjKOcyVfX8KhXBhJiyUbDP1vuIAcHc+nx5v93MJO23pX3X/k3bWz6T3rpM9dgWPq90i4Jq7gZAyMbw=="],
+
+ "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "https://registry.npmmirror.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="],
+
+ "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.11", "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.7.11.tgz", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251106.1" }, "optionalPeers": ["workerd"] }, "sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ=="],
+
+ "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.15.2", "https://registry.npmmirror.com/@cloudflare/vite-plugin/-/vite-plugin-1.15.2.tgz", { "dependencies": { "@cloudflare/unenv-preset": "2.7.11", "@remix-run/node-fetch-server": "^0.8.0", "get-port": "^7.1.0", "miniflare": "4.20251118.1", "picocolors": "^1.1.1", "tinyglobby": "^0.2.12", "unenv": "2.0.0-rc.24", "wrangler": "4.50.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0" } }, "sha512-SPMxsesbABOjzcAa4IzW+yM+fTIjx3GG1doh229Pg16FjSEZJhknyRpcld4gnaZioK3JKwG9FWdKsUhbplKY8w=="],
+
+ "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251118.0", "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251118.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-UmWmYEYS/LkK/4HFKN6xf3Hk8cw70PviR+ftr3hUvs9HYZS92IseZEp16pkL6ZBETrPRpZC7OrzoYF7ky6kHsg=="],
+
+ "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251118.0", "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251118.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-RockU7Qzf4rxNfY1lx3j4rvwutNLjTIX7rr2hogbQ4mzLo8Ea40/oZTzXVxl+on75joLBrt0YpenGW8o/r44QA=="],
+
+ "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20251118.0", "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251118.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-aT97GnOAbJDuuOG0zPVhgRk0xFtB1dzBMrxMZ09eubDLoU4djH4BuORaqvxNRMmHgKfa4T6drthckT0NjUvBdw=="],
+
+ "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20251118.0", "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251118.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-bXZPJcwlq00MPOXqP7DMWjr+goYj0+Fqyw6zgEC2M3FR1+SWla4yjghnZ4IdpN+H1t7VbUrsi5np2LzMUFs0NA=="],
+
+ "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20251118.0", "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251118.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-2LV99AHSlpr8WcCb/BYbU2QsYkXLUL1izN6YKWkN9Eibv80JKX0RtgmD3dfmajE5sNvClavxZejgzVvHD9N9Ag=="],
+
+ "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20251008.0", "https://registry.npmmirror.com/@cloudflare/workers-types/-/workers-types-4.20251008.0.tgz", {}, "sha512-dZLkO4PbCL0qcCSKzuW7KE4GYe49lI12LCfQ5y9XeSwgYBoAUbwH4gmJ6A0qUIURiTJTkGkRkhVPqpq2XNgYRA=="],
+
+ "@corvu/utils": ["@corvu/utils@0.4.2", "https://registry.npmmirror.com/@corvu/utils/-/utils-0.4.2.tgz", { "dependencies": { "@floating-ui/dom": "^1.6.11" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA=="],
+
+ "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
+
+ "@ctrl/tinycolor": ["@ctrl/tinycolor@4.2.0", "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", {}, "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A=="],
+
+ "@develar/schema-utils": ["@develar/schema-utils@2.6.5", "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz", { "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" } }, "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig=="],
+
+ "@dot/log": ["@dot/log@0.1.5", "https://registry.npmmirror.com/@dot/log/-/log-0.1.5.tgz", { "dependencies": { "chalk": "^4.1.2", "loglevelnext": "^6.0.0", "p-defer": "^3.0.0" } }, "sha512-ECraEVJWv2f2mWK93lYiefUkphStVlKD6yKDzisuoEmxuLKrxO9iGetHK2DoEAkj7sxjE886n0OUVVCUx0YPNg=="],
+
+ "@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "https://registry.npmmirror.com/@drizzle-team/brocli/-/brocli-0.11.0.tgz", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="],
+
+ "@effect/opentelemetry": ["@effect/opentelemetry@4.0.0-beta.74", "https://registry.npmmirror.com/@effect/opentelemetry/-/opentelemetry-4.0.0-beta.74.tgz", { "peerDependencies": { "@opentelemetry/api": "^1.9", "@opentelemetry/api-logs": ">=0.203.0 <0.300.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-logs": ">=0.203.0 <0.300.0", "@opentelemetry/sdk-metrics": "^2.0.0", "@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-node": "^2.0.0", "@opentelemetry/sdk-trace-web": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.33.0", "effect": "^4.0.0-beta.74" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/api-logs", "@opentelemetry/resources", "@opentelemetry/sdk-logs", "@opentelemetry/sdk-metrics", "@opentelemetry/sdk-trace-base", "@opentelemetry/sdk-trace-node", "@opentelemetry/sdk-trace-web"] }, "sha512-flpyqLPyr+THSe6ZCGRZl6hi+FqxbIXNSkslKGiRJAjbPabam9mSp7R3aC8biIMt6xE4Fd0LNfo4p2GplUkm2Q=="],
+
+ "@effect/platform-node": ["@effect/platform-node@4.0.0-beta.74", "https://registry.npmmirror.com/@effect/platform-node/-/platform-node-4.0.0-beta.74.tgz", { "dependencies": { "@effect/platform-node-shared": "^4.0.0-beta.74", "mime": "^4.1.0", "undici": "^8.2.0" }, "peerDependencies": { "effect": "^4.0.0-beta.74", "ioredis": "^5.7.0" } }, "sha512-/W16mKqxvhWINLjufzc0log1sl57exXQfwd+em398/zKCbmU3S7snXTDMN6w0ju2TtgK35qrsoGBXEochij6Sg=="],
+
+ "@effect/platform-node-shared": ["@effect/platform-node-shared@4.0.0-beta.74", "https://registry.npmmirror.com/@effect/platform-node-shared/-/platform-node-shared-4.0.0-beta.74.tgz", { "dependencies": { "@types/ws": "^8.18.1", "ws": "^8.20.0" }, "peerDependencies": { "effect": "^4.0.0-beta.74" } }, "sha512-C6C2hXixNcZXLaFF2u7B/FtOsqpdY7luaPuiGFBJza0P7EnYDkwaT3kB6lv7l/qctmkADc24qOsSCWIKRbC4jg=="],
+
+ "@effect/sql-sqlite-bun": ["@effect/sql-sqlite-bun@4.0.0-beta.74", "https://registry.npmmirror.com/@effect/sql-sqlite-bun/-/sql-sqlite-bun-4.0.0-beta.74.tgz", { "peerDependencies": { "effect": "^4.0.0-beta.74" } }, "sha512-RVMRVY7NhSoAp9cAAyy4TT6dt6NNZjOpWeqticoho9HNBukxQSUcu/kjcz4Iq9eoQfXadmepu8kZqtdZULM/fg=="],
+
+ "@electron/asar": ["@electron/asar@3.4.1", "https://registry.npmmirror.com/@electron/asar/-/asar-3.4.1.tgz", { "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "bin": { "asar": "bin/asar.js" } }, "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA=="],
+
+ "@electron/fuses": ["@electron/fuses@1.8.0", "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.8.0.tgz", { "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", "minimist": "^1.2.5" }, "bin": { "electron-fuses": "dist/bin.js" } }, "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw=="],
+
+ "@electron/get": ["@electron/get@5.0.0", "https://registry.npmmirror.com/@electron/get/-/get-5.0.0.tgz", { "dependencies": { "debug": "^4.1.1", "env-paths": "^3.0.0", "graceful-fs": "^4.2.11", "progress": "^2.0.3", "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "optionalDependencies": { "undici": "^7.24.4" } }, "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA=="],
+
+ "@electron/notarize": ["@electron/notarize@2.5.0", "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.5.0.tgz", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", "promise-retry": "^2.0.1" } }, "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A=="],
+
+ "@electron/osx-sign": ["@electron/osx-sign@1.3.3", "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.3.3.tgz", { "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", "fs-extra": "^10.0.0", "isbinaryfile": "^4.0.8", "minimist": "^1.2.6", "plist": "^3.0.5" }, "bin": { "electron-osx-flat": "bin/electron-osx-flat.js", "electron-osx-sign": "bin/electron-osx-sign.js" } }, "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg=="],
+
+ "@electron/rebuild": ["@electron/rebuild@4.0.4", "https://registry.npmmirror.com/@electron/rebuild/-/rebuild-4.0.4.tgz", { "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.1.1", "node-abi": "^4.2.0", "node-api-version": "^0.2.1", "node-gyp": "^12.2.0", "read-binary-file-arch": "^1.0.6" }, "bin": { "electron-rebuild": "lib/cli.js" } }, "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg=="],
+
+ "@electron/universal": ["@electron/universal@2.0.3", "https://registry.npmmirror.com/@electron/universal/-/universal-2.0.3.tgz", { "dependencies": { "@electron/asar": "^3.3.1", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "dir-compare": "^4.2.0", "fs-extra": "^11.1.1", "minimatch": "^9.0.3", "plist": "^3.1.0" } }, "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g=="],
+
+ "@electron/windows-sign": ["@electron/windows-sign@1.2.2", "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.2.2.tgz", { "dependencies": { "cross-dirname": "^0.1.0", "debug": "^4.3.4", "fs-extra": "^11.1.1", "minimist": "^1.2.8", "postject": "^1.0.0-alpha.6" }, "bin": { "electron-windows-sign": "bin/electron-windows-sign.js" } }, "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ=="],
+
+ "@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "https://registry.npmmirror.com/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="],
+
+ "@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "https://registry.npmmirror.com/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="],
+
+ "@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "https://registry.npmmirror.com/@emmetio/css-parser/-/css-parser-0.4.1.tgz", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="],
+
+ "@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "https://registry.npmmirror.com/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="],
+
+ "@emmetio/scanner": ["@emmetio/scanner@1.0.4", "https://registry.npmmirror.com/@emmetio/scanner/-/scanner-1.0.4.tgz", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="],
+
+ "@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "https://registry.npmmirror.com/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="],
+
+ "@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "https://registry.npmmirror.com/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="],
+
+ "@emnapi/core": ["@emnapi/core@1.9.2", "https://registry.npmmirror.com/@emnapi/core/-/core-1.9.2.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.9.2.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+
+ "@emotion/is-prop-valid": ["@emotion/is-prop-valid@0.8.8", "https://registry.npmmirror.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", { "dependencies": { "@emotion/memoize": "0.7.4" } }, "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA=="],
+
+ "@emotion/memoize": ["@emotion/memoize@0.7.4", "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.7.4.tgz", {}, "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
+
+ "@expressive-code/core": ["@expressive-code/core@0.41.7", "https://registry.npmmirror.com/@expressive-code/core/-/core-0.41.7.tgz", { "dependencies": { "@ctrl/tinycolor": "^4.0.4", "hast-util-select": "^6.0.2", "hast-util-to-html": "^9.0.1", "hast-util-to-text": "^4.0.1", "hastscript": "^9.0.0", "postcss": "^8.4.38", "postcss-nested": "^6.0.1", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1" } }, "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg=="],
+
+ "@expressive-code/plugin-frames": ["@expressive-code/plugin-frames@0.41.7", "https://registry.npmmirror.com/@expressive-code/plugin-frames/-/plugin-frames-0.41.7.tgz", { "dependencies": { "@expressive-code/core": "^0.41.7" } }, "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA=="],
+
+ "@expressive-code/plugin-shiki": ["@expressive-code/plugin-shiki@0.41.7", "https://registry.npmmirror.com/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.7.tgz", { "dependencies": { "@expressive-code/core": "^0.41.7", "shiki": "^3.2.2" } }, "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ=="],
+
+ "@expressive-code/plugin-text-markers": ["@expressive-code/plugin-text-markers@0.41.7", "https://registry.npmmirror.com/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.7.tgz", { "dependencies": { "@expressive-code/core": "^0.41.7" } }, "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw=="],
+
+ "@fastify/ajv-compiler": ["@fastify/ajv-compiler@4.0.5", "https://registry.npmmirror.com/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A=="],
+
+ "@fastify/busboy": ["@fastify/busboy@2.1.1", "https://registry.npmmirror.com/@fastify/busboy/-/busboy-2.1.1.tgz", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="],
+
+ "@fastify/error": ["@fastify/error@4.2.0", "https://registry.npmmirror.com/@fastify/error/-/error-4.2.0.tgz", {}, "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ=="],
+
+ "@fastify/fast-json-stringify-compiler": ["@fastify/fast-json-stringify-compiler@5.0.3", "https://registry.npmmirror.com/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", { "dependencies": { "fast-json-stringify": "^6.0.0" } }, "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ=="],
+
+ "@fastify/forwarded": ["@fastify/forwarded@3.0.1", "https://registry.npmmirror.com/@fastify/forwarded/-/forwarded-3.0.1.tgz", {}, "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw=="],
+
+ "@fastify/merge-json-schemas": ["@fastify/merge-json-schemas@0.2.1", "https://registry.npmmirror.com/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A=="],
+
+ "@fastify/proxy-addr": ["@fastify/proxy-addr@5.1.0", "https://registry.npmmirror.com/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", { "dependencies": { "@fastify/forwarded": "^3.0.0", "ipaddr.js": "^2.1.0" } }, "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw=="],
+
+ "@fastify/rate-limit": ["@fastify/rate-limit@10.3.0", "https://registry.npmmirror.com/@fastify/rate-limit/-/rate-limit-10.3.0.tgz", { "dependencies": { "@lukeed/ms": "^2.0.2", "fastify-plugin": "^5.0.0", "toad-cache": "^3.7.0" } }, "sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q=="],
+
+ "@ff-labs/fff-bin-darwin-arm64": ["@ff-labs/fff-bin-darwin-arm64@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-darwin-arm64/-/fff-bin-darwin-arm64-0.9.4.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-xyivu2xB++O5xXDx5Qm50JsU2aXt8YgXlGVhH/HE7UMYDrE6L6f1RYdYs8Y0bn0D3D0+bFBrN5ELPszK9E4Wbw=="],
+
+ "@ff-labs/fff-bin-darwin-x64": ["@ff-labs/fff-bin-darwin-x64@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-darwin-x64/-/fff-bin-darwin-x64-0.9.4.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-xLooAhCnTDCipPSMMZz7kGF3lhRHx6aP5fb6DJ0Ipyw/w/UWJb+xITJFszUl/QnIBoJ/qjDc93/FZMo1dk6gVA=="],
+
+ "@ff-labs/fff-bin-linux-arm64-gnu": ["@ff-labs/fff-bin-linux-arm64-gnu@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-linux-arm64-gnu/-/fff-bin-linux-arm64-gnu-0.9.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-m5+8vA+1veaUUWonwva1WsU6m1HRm8CpYUzr06KDB65mewlmPbqz7+Fh7hjEfiD8C4mHVHe6RysULvAH1yhsdw=="],
+
+ "@ff-labs/fff-bin-linux-arm64-musl": ["@ff-labs/fff-bin-linux-arm64-musl@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-linux-arm64-musl/-/fff-bin-linux-arm64-musl-0.9.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-EMeWm7CSTVkizy4ZEzUkLDP024tVcbCUthduuIhekFQRDsiaAze0YboIylWb9HBHJCZlCCoZrWAl4nnJbsX7AA=="],
+
+ "@ff-labs/fff-bin-linux-x64-gnu": ["@ff-labs/fff-bin-linux-x64-gnu@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-linux-x64-gnu/-/fff-bin-linux-x64-gnu-0.9.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-pglE0uLkhnlE6bStXqfgUjYTSj+2sVwXaPfoA0QksidAsQor6NRt8004mygzC9DPubgHq5B9QezPfEwigKaP9Q=="],
+
+ "@ff-labs/fff-bin-linux-x64-musl": ["@ff-labs/fff-bin-linux-x64-musl@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-linux-x64-musl/-/fff-bin-linux-x64-musl-0.9.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-VNKxgl8qs3aTfXViX7lqRK1aLu311h8dtBFqG4Scv+9Oi7WprybUp5L7IZ8sxKERaDAaiJMXHodXa1c90QdK8w=="],
+
+ "@ff-labs/fff-bin-win32-arm64": ["@ff-labs/fff-bin-win32-arm64@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-win32-arm64/-/fff-bin-win32-arm64-0.9.4.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-uFEt0aNL54vQxq1ivjxRuo+thnhS4wLqa4INl4VXnXJUmwB42XXxD+gsj7vzhBLLx4cFf0aWgy/+TVDR8yjZtQ=="],
+
+ "@ff-labs/fff-bin-win32-x64": ["@ff-labs/fff-bin-win32-x64@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bin-win32-x64/-/fff-bin-win32-x64-0.9.4.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Yd2Eyxj+slWv+0QDW9/xBpu9FXq+hwD0rXQD5184/88d+xwWCLKhEP2w8I6OO9XCg+kLT79UJb+k0WwXUtBtMw=="],
+
+ "@ff-labs/fff-bun": ["@ff-labs/fff-bun@0.9.4", "https://registry.npmmirror.com/@ff-labs/fff-bun/-/fff-bun-0.9.4.tgz", { "optionalDependencies": { "@ff-labs/fff-bin-darwin-arm64": "0.9.4", "@ff-labs/fff-bin-darwin-x64": "0.9.4", "@ff-labs/fff-bin-linux-arm64-gnu": "0.9.4", "@ff-labs/fff-bin-linux-arm64-musl": "0.9.4", "@ff-labs/fff-bin-linux-x64-gnu": "0.9.4", "@ff-labs/fff-bin-linux-x64-musl": "0.9.4", "@ff-labs/fff-bin-win32-arm64": "0.9.4", "@ff-labs/fff-bin-win32-x64": "0.9.4" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ] }, "sha512-7HUraaK/g5dStAnuKAuzsXVOQvqqX0ylo5G+DxYwsCjCDc42bjoEAAHqz/3Sn3raUNw97KMoz87XR9QyrLEfVw=="],
+
+ "@floating-ui/core": ["@floating-ui/core@1.7.5", "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.5.tgz", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
+
+ "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.6.tgz", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="],
+
+ "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="],
+
+ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.11.tgz", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
+
+ "@fontsource/ibm-plex-mono": ["@fontsource/ibm-plex-mono@5.2.5", "https://registry.npmmirror.com/@fontsource/ibm-plex-mono/-/ibm-plex-mono-5.2.5.tgz", {}, "sha512-G09N3GfuT9qj3Ax2FDZvKqZttzM3v+cco2l8uXamhKyXLdmlaUDH5o88/C3vtTHj2oT7yRKsvxz9F+BXbWKMYA=="],
+
+ "@fontsource/inter": ["@fontsource/inter@5.2.8", "https://registry.npmmirror.com/@fontsource/inter/-/inter-5.2.8.tgz", {}, "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg=="],
+
+ "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "https://registry.npmmirror.com/@gar/promise-retry/-/promise-retry-1.0.3.tgz", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="],
+
+ "@gitlab/opencode-gitlab-auth": ["@gitlab/opencode-gitlab-auth@1.3.3", "https://registry.npmmirror.com/@gitlab/opencode-gitlab-auth/-/opencode-gitlab-auth-1.3.3.tgz", { "dependencies": { "@fastify/rate-limit": "^10.2.0", "@opencode-ai/plugin": "*", "fastify": "^5.2.0", "open": "^10.0.0" } }, "sha512-FT+KsCmAJjtqWr1YAq0MywGgL9kaLQ4apmsoowAXrPqHtoYf2i/nY10/A+L06kNj22EATeEDRpbB1NWXMto/SA=="],
+
+ "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "https://registry.npmmirror.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="],
+
+ "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.0.11", "https://registry.npmmirror.com/@happy-dom/global-registrator/-/global-registrator-20.0.11.tgz", { "dependencies": { "@types/node": "^20.0.0", "happy-dom": "^20.0.11" } }, "sha512-GqNqiShBT/lzkHTMC/slKBrvN0DsD4Di8ssBk4aDaVgEn+2WMzE6DXxq701ndSXj7/0cJ8mNT71pM7Bnrr6JRw=="],
+
+ "@hey-api/codegen-core": ["@hey-api/codegen-core@0.5.5", "https://registry.npmmirror.com/@hey-api/codegen-core/-/codegen-core-0.5.5.tgz", { "dependencies": { "@hey-api/types": "0.1.2", "ansi-colors": "4.1.3", "c12": "3.3.3", "color-support": "1.1.3" }, "peerDependencies": { "typescript": ">=5.5.3" } }, "sha512-f2ZHucnA2wBGAY8ipB4wn/mrEYW+WUxU2huJmUvfDO6AE2vfILSHeF3wCO39Pz4wUYPoAWZByaauftLrOfC12Q=="],
+
+ "@hey-api/json-schema-ref-parser": ["@hey-api/json-schema-ref-parser@1.2.2", "https://registry.npmmirror.com/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.2.2.tgz", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.1", "lodash": "^4.17.21" } }, "sha512-oS+5yAdwnK20lSeFO1d53Ku+yaGCsY8PcrmSq2GtSs3bsBfRnHAbpPKSVzQcaxAOrzj5NB+f34WhZglVrNayBA=="],
+
+ "@hey-api/openapi-ts": ["@hey-api/openapi-ts@0.90.10", "https://registry.npmmirror.com/@hey-api/openapi-ts/-/openapi-ts-0.90.10.tgz", { "dependencies": { "@hey-api/codegen-core": "^0.5.5", "@hey-api/json-schema-ref-parser": "1.2.2", "@hey-api/types": "0.1.2", "ansi-colors": "4.1.3", "color-support": "1.1.3", "commander": "14.0.2", "open": "11.0.0", "semver": "7.7.3" }, "peerDependencies": { "typescript": ">=5.5.3" }, "bin": { "openapi-ts": "bin/run.js" } }, "sha512-o0wlFxuLt1bcyIV/ZH8DQ1wrgODTnUYj/VfCHOOYgXUQlLp9Dm2PjihOz+WYrZLowhqUhSKeJRArOGzvLuOTsg=="],
+
+ "@hey-api/types": ["@hey-api/types@0.1.2", "https://registry.npmmirror.com/@hey-api/types/-/types-0.1.2.tgz", {}, "sha512-uNNtiVAWL7XNrV/tFXx7GLY9lwaaDazx1173cGW3+UEaw4RUPsHEmiB4DSpcjNxMIcrctfz2sGKLnVx5PBG2RA=="],
+
+ "@hono/node-server": ["@hono/node-server@1.19.14", "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.14.tgz", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="],
+
+ "@hono/standard-validator": ["@hono/standard-validator@0.2.0", "https://registry.npmmirror.com/@hono/standard-validator/-/standard-validator-0.2.0.tgz", { "peerDependencies": { "@standard-schema/spec": "1.0.0", "hono": ">=3.9.0" } }, "sha512-pFq0UVAnjzXcDAgqFpDeVL3MOUPrlIh/kPqBDvbCYoThVhhS+Vf37VcdsakdOFFGiqoiYVxp3LifXFhGhp/rgQ=="],
+
+ "@ibm/plex": ["@ibm/plex@6.4.1", "https://registry.npmmirror.com/@ibm/plex/-/plex-6.4.1.tgz", { "dependencies": { "@ibm/telemetry-js": "^1.5.1" } }, "sha512-fnsipQywHt3zWvsnlyYKMikcVI7E2fEwpiPnIHFqlbByXVfQfANAAeJk1IV4mNnxhppUIDlhU0TzwYwL++Rn2g=="],
+
+ "@ibm/telemetry-js": ["@ibm/telemetry-js@1.11.0", "https://registry.npmmirror.com/@ibm/telemetry-js/-/telemetry-js-1.11.0.tgz", { "bin": { "ibmtelemetry": "dist/collect.js" } }, "sha512-RO/9j+URJnSfseWg9ZkEX9p+a3Ousd33DBU7rOafoZB08RqdzxFVYJ2/iM50dkBuD0o7WX7GYt1sLbNgCoE+pA=="],
+
+ "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="],
+
+ "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="],
+
+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="],
+
+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="],
+
+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="],
+
+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="],
+
+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="],
+
+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="],
+
+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="],
+
+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="],
+
+ "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="],
+
+ "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="],
+
+ "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="],
+
+ "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="],
+
+ "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="],
+
+ "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="],
+
+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="],
+
+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="],
+
+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="],
+
+ "@internationalized/date": ["@internationalized/date@3.12.2", "https://registry.npmmirror.com/@internationalized/date/-/date-3.12.2.tgz", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw=="],
+
+ "@internationalized/number": ["@internationalized/number@3.6.7", "https://registry.npmmirror.com/@internationalized/number/-/number-3.6.7.tgz", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg=="],
+
+ "@ioredis/commands": ["@ioredis/commands@1.10.0", "https://registry.npmmirror.com/@ioredis/commands/-/commands-1.10.0.tgz", {}, "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q=="],
+
+ "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="],
+
+ "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.1", "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ=="],
+
+ "@isaacs/cliui": ["@isaacs/cliui@9.0.0", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-9.0.0.tgz", {}, "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg=="],
+
+ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "https://registry.npmmirror.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
+
+ "@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "https://registry.npmmirror.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="],
+
+ "@joshwooding/vite-plugin-react-docgen-typescript": ["@joshwooding/vite-plugin-react-docgen-typescript@0.7.0", "https://registry.npmmirror.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.7.0.tgz", { "dependencies": { "glob": "^13.0.1", "react-docgen-typescript": "^2.2.2" }, "peerDependencies": { "typescript": ">= 4.3.x", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["typescript"] }, "sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@js-temporal/polyfill": ["@js-temporal/polyfill@0.5.1", "https://registry.npmmirror.com/@js-temporal/polyfill/-/polyfill-0.5.1.tgz", { "dependencies": { "jsbi": "^4.3.0" } }, "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ=="],
+
+ "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "https://registry.npmmirror.com/@jsdevtools/ono/-/ono-7.1.3.tgz", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="],
+
+ "@jsx-email/all": ["@jsx-email/all@2.2.3", "https://registry.npmmirror.com/@jsx-email/all/-/all-2.2.3.tgz", { "dependencies": { "@jsx-email/body": "1.0.2", "@jsx-email/button": "1.0.4", "@jsx-email/column": "1.0.3", "@jsx-email/container": "1.0.2", "@jsx-email/font": "1.0.3", "@jsx-email/head": "1.0.2", "@jsx-email/heading": "1.0.2", "@jsx-email/hr": "1.0.2", "@jsx-email/html": "1.0.2", "@jsx-email/img": "1.0.2", "@jsx-email/link": "1.0.2", "@jsx-email/markdown": "2.0.4", "@jsx-email/preview": "1.0.2", "@jsx-email/render": "1.1.1", "@jsx-email/row": "1.0.2", "@jsx-email/section": "1.0.2", "@jsx-email/tailwind": "2.4.4", "@jsx-email/text": "1.0.2" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-OBvLe/hVSQc0LlMSTJnkjFoqs3bmxcC4zpy/5pT5agPCSKMvAKQjzmsc2xJ2wO73jSpRV1K/g38GmvdCfrhSoQ=="],
+
+ "@jsx-email/body": ["@jsx-email/body@1.0.2", "https://registry.npmmirror.com/@jsx-email/body/-/body-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-NjR2tgLH4XGfGkm+O8kcVwi9MBqZsXZCLlmk3HlMux3/n/+a5zB+yhJqXWZBJl2i+6cSF+E2O6hK11ekyK9WWQ=="],
+
+ "@jsx-email/button": ["@jsx-email/button@1.0.4", "https://registry.npmmirror.com/@jsx-email/button/-/button-1.0.4.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-NbuxtBtTdcFOKpyw166lvgA8sKpgwQzqpRVSTDZdd+2xlh5gzeckXG9VtCbfktIatD26r45ZMmP68QGK3hxIPA=="],
+
+ "@jsx-email/cli": ["@jsx-email/cli@1.4.3", "https://registry.npmmirror.com/@jsx-email/cli/-/cli-1.4.3.tgz", { "dependencies": { "@dot/log": "^0.1.3", "@fontsource/inter": "^5.0.8", "@jsx-email/doiuse-email": "^1.0.1", "@jsx-email/render": "1.1.1", "@radix-ui/colors": "1.0.1", "@radix-ui/react-collapsible": "1.0.3", "@radix-ui/react-popover": "1.0.6", "@radix-ui/react-slot": "1.0.2", "@radix-ui/react-toggle-group": "1.0.4", "@radix-ui/react-tooltip": "1.0.6", "@vitejs/plugin-react": "^4.1.0", "autoprefixer": "^10.4.16", "chalk": "4.1.2", "cheerio": "1.0.0-rc.12", "classnames": "2.3.2", "debug": "^4.3.4", "esbuild": "^0.19.3", "esbuild-plugin-copy": "^2.1.1", "framer-motion": "8.5.5", "globby": "11.0.4", "html-minifier-terser": "^7.2.0", "import-local": "^3.1.0", "js-beautify": "^1.14.9", "mustache": "^4.2.0", "postcss": "^8.4.30", "react": "18.2.0", "react-dom": "18.2.0", "react-router-dom": "6.16.0", "shikiji": "^0.6.8", "superstruct": "^1.0.3", "tailwindcss": "3.3.3", "titleize": "^4.0.0", "vite": "^4.4.9", "vite-plugin-dynamic-import": "^1.5.0", "yargs-parser": "^21.1.1" }, "bin": { "email": "dist/src/index.js" } }, "sha512-Aid5d5U3RM9sjkjzn/X/a5FFWLJSXlwh8pagBVgnUTiaBM8+nroSPZaC21Xe3rl/uwYpY9lc+2AAH9+7SmroiQ=="],
+
+ "@jsx-email/column": ["@jsx-email/column@1.0.3", "https://registry.npmmirror.com/@jsx-email/column/-/column-1.0.3.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-dto5s/INVWy4oMOETX53O53NerpPxezO8CQctriTaHLrqlR22lWoXJZoGTzMvt9uLyoUrYViA6Tj2F9Bio+fOg=="],
+
+ "@jsx-email/container": ["@jsx-email/container@1.0.2", "https://registry.npmmirror.com/@jsx-email/container/-/container-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-Muue8X2PgjxCf+YvUJ6zGTqcmo3i4S3EmsLGYpnWl7e/ZKmMLTjN4DdUeSsi27fWEdpUTjQQG4McMGdFYhZTGg=="],
+
+ "@jsx-email/doiuse-email": ["@jsx-email/doiuse-email@1.0.4", "https://registry.npmmirror.com/@jsx-email/doiuse-email/-/doiuse-email-1.0.4.tgz", { "dependencies": { "@adobe/css-tools": "^4.3.1", "css-what": "^6.1.0", "domhandler": "^5.0.3", "dot-prop": "^8.0.2", "htmlparser2": "^9.0.0", "micromatch": "^4.0.5", "style-to-object": "^1.0.4" } }, "sha512-HfLjuQsAAyAkIZWR0wHR6+P6u40RIX0jBZu/1rgsw18+jc36agZD5j84zG4CDzitRxgXJXrAohPfDFPxcrtjAA=="],
+
+ "@jsx-email/font": ["@jsx-email/font@1.0.3", "https://registry.npmmirror.com/@jsx-email/font/-/font-1.0.3.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-NRp9NBjrmYVwAFYRwuifzvavtHB8blRLEJ+q9BygY3y58+FhHENweU8FMdC5OSts2C99FbKrHUicTSanEj8+Aw=="],
+
+ "@jsx-email/head": ["@jsx-email/head@1.0.2", "https://registry.npmmirror.com/@jsx-email/head/-/head-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-M5Af6Imt7W/Vp09dY76I/v7gRe1aQLmeXjBZZSrSbvpMVQVAd6gwR/druNaAO+zHDoKhXwR50+pxXpnC+TFiIw=="],
+
+ "@jsx-email/heading": ["@jsx-email/heading@1.0.2", "https://registry.npmmirror.com/@jsx-email/heading/-/heading-1.0.2.tgz", { "dependencies": { "@radix-ui/react-slot": "1.0.2" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-yumw176gsAJQnwSx0HCamCj2DozQireayax7s+jvr+TvEvFxNLD4PQvK45c6JdYYD9OPGnjDApks102FJQ7xDQ=="],
+
+ "@jsx-email/hr": ["@jsx-email/hr@1.0.2", "https://registry.npmmirror.com/@jsx-email/hr/-/hr-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-CuJ/ADJoRwuQyUqulOf00BceTdY9kzrLQTMwGPUmFMtlsF+EFSPNULoksFg6nskVjFV7pBUm78FwiEfP2OAHMQ=="],
+
+ "@jsx-email/html": ["@jsx-email/html@1.0.2", "https://registry.npmmirror.com/@jsx-email/html/-/html-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-FOiJdZWbCwNwsAqRuXlrXo39UTVWtrezuzA0pXY0UD5nEPzwpk7N46EwW8uxBRoqNRPiuUnwnFWLXuPZNAIGlg=="],
+
+ "@jsx-email/img": ["@jsx-email/img@1.0.2", "https://registry.npmmirror.com/@jsx-email/img/-/img-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-aqqnx43Cvq/wVzALhK6n5pSJBqTRwq5wuM66/QAkEJaZgXqrXCNRx1fNeqQt/Zp2j6KmHq3Ax0AHSJX4pjKIDw=="],
+
+ "@jsx-email/link": ["@jsx-email/link@1.0.2", "https://registry.npmmirror.com/@jsx-email/link/-/link-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-+mr+WFHZ7fILkFlSdbusSm9ml6jPq7u89LGe2E71AB23JEaaF8qO5u6so6wySAme+gDIGId/+tobPcTHeI+hHQ=="],
+
+ "@jsx-email/markdown": ["@jsx-email/markdown@2.0.4", "https://registry.npmmirror.com/@jsx-email/markdown/-/markdown-2.0.4.tgz", { "dependencies": { "md-to-react-email": "5.0.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-jYf/BVGKjz7TU1FhEX0ELZGKPQj+6o0R4NjZTBJsJ3PUovgXynS4GqU83eARwGbOSUve/9qvRljsCCQHD+t/Gg=="],
+
+ "@jsx-email/preview": ["@jsx-email/preview@1.0.2", "https://registry.npmmirror.com/@jsx-email/preview/-/preview-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-dkc3hG08R0J0TEQ/cDCtdyoLYddb1MIvhh5OyTqfd5pgSxPF6MaSH8LkDqMUYpSYZ3RtUK6g4d8q3mF7tx28sQ=="],
+
+ "@jsx-email/render": ["@jsx-email/render@1.1.1", "https://registry.npmmirror.com/@jsx-email/render/-/render-1.1.1.tgz", { "dependencies": { "html-to-text": "9.0.5", "pretty": "2.0.0" } }, "sha512-0y45YofM0Ak8Rswss1AWgy7v9mlMoHMrgD0x601gvb2HBddDp2r0etNJhhN9ZwW8QOteuYluHD279e+PCr2WxA=="],
+
+ "@jsx-email/row": ["@jsx-email/row@1.0.2", "https://registry.npmmirror.com/@jsx-email/row/-/row-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-6bUr1rqIsUVrhBWcTj0QTZvUQ/deThDKoi10dSfhjmbUqFYr7RdyGwMwsUuFg1YzZCohvy8dVpBIwd+5wmtsIw=="],
+
+ "@jsx-email/section": ["@jsx-email/section@1.0.2", "https://registry.npmmirror.com/@jsx-email/section/-/section-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-gGGE9zkljfrgWOz7NlmFsDPVKCQv6omu+VXsce0yh0+yHBehuFYrv4WOqMZFtfQo6Y1IDdQWt+XCi5GlEvd0Lw=="],
+
+ "@jsx-email/tailwind": ["@jsx-email/tailwind@2.4.4", "https://registry.npmmirror.com/@jsx-email/tailwind/-/tailwind-2.4.4.tgz", { "dependencies": { "@jsx-email/render": "1.1.1", "react": "18.2.0", "react-dom": "18.2.0", "tw-to-css": "0.0.12" } }, "sha512-RqLD0y2le1ruFBt9MCa0PNnTVUgcS8vcOOWMJUkMezBZUAUkP5KSj3DO+6DdgVn67kH9cnnRvknXo8L6qd6BwA=="],
+
+ "@jsx-email/text": ["@jsx-email/text@1.0.2", "https://registry.npmmirror.com/@jsx-email/text/-/text-1.0.2.tgz", { "peerDependencies": { "react": "^18.2.0" } }, "sha512-0zzwEwrKtY6tfjPJF0r3krKCDpP/ySYDvkn4+MvIFrIH5RZKmn3XDa5o/3hkbxMwpLn4MsXGIXn9XzMTaqTfUA=="],
+
+ "@kobalte/core": ["@kobalte/core@0.13.11", "https://registry.npmmirror.com/@kobalte/core/-/core-0.13.11.tgz", { "dependencies": { "@floating-ui/dom": "^1.5.1", "@internationalized/date": "^3.4.0", "@internationalized/number": "^3.2.1", "@kobalte/utils": "^0.9.1", "@solid-primitives/props": "^3.1.8", "@solid-primitives/resize-observer": "^2.0.26", "solid-presence": "^0.1.8", "solid-prevent-scroll": "^0.1.4" }, "peerDependencies": { "solid-js": "^1.8.15" } }, "sha512-hK7TYpdib/XDb/r/4XDBFaO9O+3ZHz4ZWryV4/3BfES+tSQVgg2IJupDnztKXB0BqbSRy/aWlHKw1SPtNPYCFQ=="],
+
+ "@kobalte/utils": ["@kobalte/utils@0.9.1", "https://registry.npmmirror.com/@kobalte/utils/-/utils-0.9.1.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.2.14", "@solid-primitives/keyed": "^1.2.0", "@solid-primitives/map": "^0.4.7", "@solid-primitives/media": "^2.2.4", "@solid-primitives/props": "^3.1.8", "@solid-primitives/refs": "^1.0.5", "@solid-primitives/utils": "^6.2.1" }, "peerDependencies": { "solid-js": "^1.8.8" } }, "sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w=="],
+
+ "@kurkle/color": ["@kurkle/color@0.3.4", "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.4.tgz", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="],
+
+ "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="],
+
+ "@lukeed/ms": ["@lukeed/ms@2.0.2", "https://registry.npmmirror.com/@lukeed/ms/-/ms-2.0.2.tgz", {}, "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA=="],
+
+ "@lydell/node-pty": ["@lydell/node-pty@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty/-/node-pty-1.2.0-beta.12.tgz", { "optionalDependencies": { "@lydell/node-pty-darwin-arm64": "1.2.0-beta.12", "@lydell/node-pty-darwin-x64": "1.2.0-beta.12", "@lydell/node-pty-linux-arm64": "1.2.0-beta.12", "@lydell/node-pty-linux-x64": "1.2.0-beta.12", "@lydell/node-pty-win32-arm64": "1.2.0-beta.12", "@lydell/node-pty-win32-x64": "1.2.0-beta.12" } }, "sha512-qIK890UwPupoj07osVvgOIa++1mxeHbcGry4PKRHhNVNs81V2SCG34eJr46GybiOmBtc8Sj5PB1/GGM5PL549g=="],
+
+ "@lydell/node-pty-darwin-arm64": ["@lydell/node-pty-darwin-arm64@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty-darwin-arm64/-/node-pty-darwin-arm64-1.2.0-beta.12.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-tqaifcY9Cr41SblO1+FLzh8oxxtkNhuW9Dhl22lKme9BreYvKvxEZcdPIXTuqkJc5tagOEC4QHShKmJjLyLXLQ=="],
+
+ "@lydell/node-pty-darwin-x64": ["@lydell/node-pty-darwin-x64@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty-darwin-x64/-/node-pty-darwin-x64-1.2.0-beta.12.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-4LrS5pCJwqHKDVf1zS2gyNV0m4hKAXch+XZNhbZ6LY8uwVL8BhchzQBO40Os5anuRxRCWzHpw4Sp64Ie8q7E4Q=="],
+
+ "@lydell/node-pty-linux-arm64": ["@lydell/node-pty-linux-arm64@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty-linux-arm64/-/node-pty-linux-arm64-1.2.0-beta.12.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-Sx+A71x5BDGHt9ansfrtGxwq2VFVDWvJUAdlUL0Hv0qeiJUfts+hgopx+CgT4PSwahKjdEgtu0+FAfY9rICKRw=="],
+
+ "@lydell/node-pty-linux-x64": ["@lydell/node-pty-linux-x64@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty-linux-x64/-/node-pty-linux-x64-1.2.0-beta.12.tgz", { "os": "linux", "cpu": "x64" }, "sha512-bJzs94njofYhGg/UDqW1nj0dtvvu+2OvxMY+RlLS1T17VgcktKoIR6PuenTwE5HJ/D6StCPADmXcT0nNsCKmIQ=="],
+
+ "@lydell/node-pty-win32-arm64": ["@lydell/node-pty-win32-arm64@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty-win32-arm64/-/node-pty-win32-arm64-1.2.0-beta.12.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-p7POgjVEiFaBC3/y+AKuV1FzePCsJ6HmZDv2XK+jBZSfwP8+uBAw181ZiKYN1YuRa/XpmBGaWezcI8hZkbW++g=="],
+
+ "@lydell/node-pty-win32-x64": ["@lydell/node-pty-win32-x64@1.2.0-beta.12", "https://registry.npmmirror.com/@lydell/node-pty-win32-x64/-/node-pty-win32-x64-1.2.0-beta.12.tgz", { "os": "win32", "cpu": "x64" }, "sha512-IDFa00g7qUDGUYgByrUBJtC+mOjYVt/8KYyWivCg5JjGOHbBUACUQZLl0jTWmnr+tld/UyTpX90a2PY6oTVtRw=="],
+
+ "@malept/cross-spawn-promise": ["@malept/cross-spawn-promise@2.0.0", "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", { "dependencies": { "cross-spawn": "^7.0.1" } }, "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg=="],
+
+ "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="],
+
+ "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "https://registry.npmmirror.com/@mdx-js/mdx/-/mdx-3.1.1.tgz", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="],
+
+ "@mdx-js/react": ["@mdx-js/react@3.1.1", "https://registry.npmmirror.com/@mdx-js/react/-/react-3.1.1.tgz", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="],
+
+ "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "https://registry.npmmirror.com/@mixmark-io/domino/-/domino-2.2.0.tgz", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="],
+
+ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "https://registry.npmmirror.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="],
+
+ "@motionone/animation": ["@motionone/animation@10.18.0", "https://registry.npmmirror.com/@motionone/animation/-/animation-10.18.0.tgz", { "dependencies": { "@motionone/easing": "^10.18.0", "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw=="],
+
+ "@motionone/dom": ["@motionone/dom@10.18.0", "https://registry.npmmirror.com/@motionone/dom/-/dom-10.18.0.tgz", { "dependencies": { "@motionone/animation": "^10.18.0", "@motionone/generators": "^10.18.0", "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A=="],
+
+ "@motionone/easing": ["@motionone/easing@10.18.0", "https://registry.npmmirror.com/@motionone/easing/-/easing-10.18.0.tgz", { "dependencies": { "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg=="],
+
+ "@motionone/generators": ["@motionone/generators@10.18.0", "https://registry.npmmirror.com/@motionone/generators/-/generators-10.18.0.tgz", { "dependencies": { "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg=="],
+
+ "@motionone/types": ["@motionone/types@10.17.1", "https://registry.npmmirror.com/@motionone/types/-/types-10.17.1.tgz", {}, "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A=="],
+
+ "@motionone/utils": ["@motionone/utils@10.18.0", "https://registry.npmmirror.com/@motionone/utils/-/utils-10.18.0.tgz", { "dependencies": { "@motionone/types": "^10.17.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw=="],
+
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="],
+
+ "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="],
+
+ "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4", "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", { "os": "linux", "cpu": "arm" }, "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw=="],
+
+ "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4", "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw=="],
+
+ "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4", "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ=="],
+
+ "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="],
+
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
+
+ "@noble/hashes": ["@noble/hashes@2.2.0", "https://registry.npmmirror.com/@noble/hashes/-/hashes-2.2.0.tgz", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="],
+
+ "@nodable/entities": ["@nodable/entities@2.1.1", "https://registry.npmmirror.com/@nodable/entities/-/entities-2.1.1.tgz", {}, "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg=="],
+
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
+
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
+
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+
+ "@npm/types": ["@npm/types@1.0.2", "https://registry.npmmirror.com/@npm/types/-/types-1.0.2.tgz", {}, "sha512-KXZccTDEnWqNrrx6JjpJKU/wJvNeg9BDgjS0XhmlZab7br921HtyVbsYzJr4L+xIvjdJ20Wh9dgxgCI2a5CEQw=="],
+
+ "@npmcli/agent": ["@npmcli/agent@4.0.2", "https://registry.npmmirror.com/@npmcli/agent/-/agent-4.0.2.tgz", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg=="],
+
+ "@npmcli/arborist": ["@npmcli/arborist@9.4.0", "https://registry.npmmirror.com/@npmcli/arborist/-/arborist-9.4.0.tgz", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^5.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/map-workspaces": "^5.0.0", "@npmcli/metavuln-calculator": "^9.0.2", "@npmcli/name-from-folder": "^4.0.0", "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/query": "^5.0.0", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.0", "bin-links": "^6.0.0", "cacache": "^20.0.1", "common-ancestor-path": "^2.0.0", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", "minimatch": "^10.0.3", "nopt": "^9.0.0", "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.0", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "pacote": "^21.0.2", "parse-conflict-json": "^5.0.1", "proc-log": "^6.0.0", "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "semver": "^7.3.7", "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" } }, "sha512-4Bm8hNixJG/sii1PMnag0V9i/sGOX9VRzFrUiZMSBJpGlLR38f+Btl85d07G9GL56xO0l0OZjvrGNYsDYp0xKA=="],
+
+ "@npmcli/config": ["@npmcli/config@10.8.1", "https://registry.npmmirror.com/@npmcli/config/-/config-10.8.1.tgz", { "dependencies": { "@npmcli/map-workspaces": "^5.0.0", "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", "ini": "^6.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "walk-up-path": "^4.0.0" } }, "sha512-MAYk9IlIGiyC0c9fnjdBSQfIFPZT0g1MfeSiD1UXTq2zJOLX55jS9/sETJHqw/7LN18JjITrhYfgCfapbmZHiQ=="],
+
+ "@npmcli/fs": ["@npmcli/fs@5.0.0", "https://registry.npmmirror.com/@npmcli/fs/-/fs-5.0.0.tgz", { "dependencies": { "semver": "^7.3.5" } }, "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og=="],
+
+ "@npmcli/git": ["@npmcli/git@7.0.2", "https://registry.npmmirror.com/@npmcli/git/-/git-7.0.2.tgz", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", "semver": "^7.3.5", "which": "^6.0.0" } }, "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg=="],
+
+ "@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@4.0.0", "https://registry.npmmirror.com/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", { "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA=="],
+
+ "@npmcli/map-workspaces": ["@npmcli/map-workspaces@5.0.3", "https://registry.npmmirror.com/@npmcli/map-workspaces/-/map-workspaces-5.0.3.tgz", { "dependencies": { "@npmcli/name-from-folder": "^4.0.0", "@npmcli/package-json": "^7.0.0", "glob": "^13.0.0", "minimatch": "^10.0.3" } }, "sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw=="],
+
+ "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@9.0.3", "https://registry.npmmirror.com/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.3.tgz", { "dependencies": { "cacache": "^20.0.0", "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5" } }, "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg=="],
+
+ "@npmcli/name-from-folder": ["@npmcli/name-from-folder@4.0.0", "https://registry.npmmirror.com/@npmcli/name-from-folder/-/name-from-folder-4.0.0.tgz", {}, "sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg=="],
+
+ "@npmcli/node-gyp": ["@npmcli/node-gyp@5.0.0", "https://registry.npmmirror.com/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", {}, "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ=="],
+
+ "@npmcli/package-json": ["@npmcli/package-json@7.0.5", "https://registry.npmmirror.com/@npmcli/package-json/-/package-json-7.0.5.tgz", { "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", "hosted-git-info": "^9.0.0", "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", "spdx-expression-parse": "^4.0.0" } }, "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ=="],
+
+ "@npmcli/promise-spawn": ["@npmcli/promise-spawn@9.0.1", "https://registry.npmmirror.com/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", { "dependencies": { "which": "^6.0.0" } }, "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q=="],
+
+ "@npmcli/query": ["@npmcli/query@5.0.0", "https://registry.npmmirror.com/@npmcli/query/-/query-5.0.0.tgz", { "dependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ=="],
+
+ "@npmcli/redact": ["@npmcli/redact@4.0.0", "https://registry.npmmirror.com/@npmcli/redact/-/redact-4.0.0.tgz", {}, "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q=="],
+
+ "@npmcli/run-script": ["@npmcli/run-script@10.0.4", "https://registry.npmmirror.com/@npmcli/run-script/-/run-script-10.0.4.tgz", { "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", "proc-log": "^6.0.0" } }, "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg=="],
+
+ "@octokit/auth-app": ["@octokit/auth-app@8.0.1", "https://registry.npmmirror.com/@octokit/auth-app/-/auth-app-8.0.1.tgz", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.1", "@octokit/auth-oauth-user": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" } }, "sha512-P2J5pB3pjiGwtJX4WqJVYCtNkcZ+j5T2Wm14aJAEIC3WJOrv12jvBley3G1U/XI8q9o1A7QMG54LiFED2BiFlg=="],
+
+ "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@9.0.3", "https://registry.npmmirror.com/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.3", "@octokit/auth-oauth-user": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg=="],
+
+ "@octokit/auth-oauth-device": ["@octokit/auth-oauth-device@8.0.3", "https://registry.npmmirror.com/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", { "dependencies": { "@octokit/oauth-methods": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw=="],
+
+ "@octokit/auth-oauth-user": ["@octokit/auth-oauth-user@6.0.2", "https://registry.npmmirror.com/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.3", "@octokit/oauth-methods": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A=="],
+
+ "@octokit/auth-token": ["@octokit/auth-token@4.0.0", "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-4.0.0.tgz", {}, "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA=="],
+
+ "@octokit/core": ["@octokit/core@5.2.2", "https://registry.npmmirror.com/@octokit/core/-/core-5.2.2.tgz", { "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg=="],
+
+ "@octokit/endpoint": ["@octokit/endpoint@9.0.6", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-9.0.6.tgz", { "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw=="],
+
+ "@octokit/graphql": ["@octokit/graphql@9.0.2", "https://registry.npmmirror.com/@octokit/graphql/-/graphql-9.0.2.tgz", { "dependencies": { "@octokit/request": "^10.0.4", "@octokit/types": "^15.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw=="],
+
+ "@octokit/oauth-authorization-url": ["@octokit/oauth-authorization-url@8.0.0", "https://registry.npmmirror.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", {}, "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ=="],
+
+ "@octokit/oauth-methods": ["@octokit/oauth-methods@6.0.2", "https://registry.npmmirror.com/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", { "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0" } }, "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng=="],
+
+ "@octokit/openapi-types": ["@octokit/openapi-types@25.1.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", {}, "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA=="],
+
+ "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@13.2.1", "https://registry.npmmirror.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.2.1.tgz", { "dependencies": { "@octokit/types": "^15.0.1" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-Tj4PkZyIL6eBMYcG/76QGsedF0+dWVeLhYprTmuFVVxzDW7PQh23tM0TP0z+1MvSkxB29YFZwnUX+cXfTiSdyw=="],
+
+ "@octokit/plugin-request-log": ["@octokit/plugin-request-log@1.0.4", "https://registry.npmmirror.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", { "peerDependencies": { "@octokit/core": ">=3" } }, "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA=="],
+
+ "@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@16.1.1", "https://registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.1.tgz", { "dependencies": { "@octokit/types": "^15.0.1" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-VztDkhM0ketQYSh5Im3IcKWFZl7VIrrsCaHbDINkdYeiiAsJzjhS2xRFCSJgfN6VOcsoW4laMtsmf3HcNqIimg=="],
+
+ "@octokit/plugin-retry": ["@octokit/plugin-retry@3.0.9", "https://registry.npmmirror.com/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz", { "dependencies": { "@octokit/types": "^6.0.3", "bottleneck": "^2.15.3" } }, "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ=="],
+
+ "@octokit/request": ["@octokit/request@8.4.1", "https://registry.npmmirror.com/@octokit/request/-/request-8.4.1.tgz", { "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw=="],
+
+ "@octokit/request-error": ["@octokit/request-error@5.1.1", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-5.1.1.tgz", { "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g=="],
+
+ "@octokit/rest": ["@octokit/rest@22.0.0", "https://registry.npmmirror.com/@octokit/rest/-/rest-22.0.0.tgz", { "dependencies": { "@octokit/core": "^7.0.2", "@octokit/plugin-paginate-rest": "^13.0.1", "@octokit/plugin-request-log": "^6.0.0", "@octokit/plugin-rest-endpoint-methods": "^16.0.0" } }, "sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA=="],
+
+ "@octokit/types": ["@octokit/types@14.1.0", "https://registry.npmmirror.com/@octokit/types/-/types-14.1.0.tgz", { "dependencies": { "@octokit/openapi-types": "^25.1.0" } }, "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g=="],
+
+ "@octokit/webhooks-types": ["@octokit/webhooks-types@7.6.1", "https://registry.npmmirror.com/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz", {}, "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw=="],
+
+ "@one-ini/wasm": ["@one-ini/wasm@0.1.1", "https://registry.npmmirror.com/@one-ini/wasm/-/wasm-0.1.1.tgz", {}, "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw=="],
+
+ "@openauthjs/openauth": ["@openauthjs/openauth@0.0.0-20250322224806", "https://registry.npmmirror.com/@openauthjs/openauth/-/openauth-0.0.0-20250322224806.tgz", { "dependencies": { "@standard-schema/spec": "1.0.0-beta.3", "aws4fetch": "1.0.20", "jose": "5.9.6" }, "peerDependencies": { "arctic": "^2.2.2", "hono": "^4.0.0" } }, "sha512-p5IWSRXvABcwocH2dNI0w8c1QJelIOFulwhKk+aLLFfUbs8u1pr7kQbYe8yCSM2+bcLHiwbogpUQc2ovrGwCuw=="],
+
+ "@opencode-ai/app": ["@opencode-ai/app@workspace:packages/app"],
+
+ "@opencode-ai/cli": ["@opencode-ai/cli@workspace:packages/cli"],
+
+ "@opencode-ai/console-app": ["@opencode-ai/console-app@workspace:packages/console/app"],
+
+ "@opencode-ai/console-core": ["@opencode-ai/console-core@workspace:packages/console/core"],
+
+ "@opencode-ai/console-function": ["@opencode-ai/console-function@workspace:packages/console/function"],
+
+ "@opencode-ai/console-mail": ["@opencode-ai/console-mail@workspace:packages/console/mail"],
+
+ "@opencode-ai/console-resource": ["@opencode-ai/console-resource@workspace:packages/console/resource"],
+
+ "@opencode-ai/console-support": ["@opencode-ai/console-support@workspace:packages/console/support"],
+
+ "@opencode-ai/core": ["@opencode-ai/core@workspace:packages/core"],
+
+ "@opencode-ai/desktop": ["@opencode-ai/desktop@workspace:packages/desktop"],
+
+ "@opencode-ai/effect-drizzle-sqlite": ["@opencode-ai/effect-drizzle-sqlite@workspace:packages/effect-drizzle-sqlite"],
+
+ "@opencode-ai/effect-sqlite-node": ["@opencode-ai/effect-sqlite-node@workspace:packages/effect-sqlite-node"],
+
+ "@opencode-ai/enterprise": ["@opencode-ai/enterprise@workspace:packages/enterprise"],
+
+ "@opencode-ai/function": ["@opencode-ai/function@workspace:packages/function"],
+
+ "@opencode-ai/http-recorder": ["@opencode-ai/http-recorder@workspace:packages/http-recorder"],
+
+ "@opencode-ai/llm": ["@opencode-ai/llm@workspace:packages/llm"],
+
+ "@opencode-ai/plugin": ["@opencode-ai/plugin@workspace:packages/plugin"],
+
+ "@opencode-ai/script": ["@opencode-ai/script@workspace:packages/script"],
+
+ "@opencode-ai/sdk": ["@opencode-ai/sdk@workspace:packages/sdk/js"],
+
+ "@opencode-ai/server": ["@opencode-ai/server@workspace:packages/server"],
+
+ "@opencode-ai/slack": ["@opencode-ai/slack@workspace:packages/slack"],
+
+ "@opencode-ai/stats-app": ["@opencode-ai/stats-app@workspace:packages/stats/app"],
+
+ "@opencode-ai/stats-core": ["@opencode-ai/stats-core@workspace:packages/stats/core"],
+
+ "@opencode-ai/stats-server": ["@opencode-ai/stats-server@workspace:packages/stats/server"],
+
+ "@opencode-ai/storybook": ["@opencode-ai/storybook@workspace:packages/storybook"],
+
+ "@opencode-ai/tui": ["@opencode-ai/tui@workspace:packages/tui"],
+
+ "@opencode-ai/ui": ["@opencode-ai/ui@workspace:packages/ui"],
+
+ "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"],
+
+ "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.9.0", "https://registry.npmmirror.com/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.9.0.tgz", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ=="],
+
+ "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "https://registry.npmmirror.com/@opentelemetry/api/-/api-1.9.0.tgz", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
+
+ "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.214.0", "https://registry.npmmirror.com/@opentelemetry/api-logs/-/api-logs-0.214.0.tgz", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA=="],
+
+ "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.6.1", "https://registry.npmmirror.com/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.1.tgz", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-XHzhwRNkBpeP8Fs/qjGrAf9r9PRv67wkJQ/7ZPaBQQ68DYlTBBx5MF9LvPx7mhuXcDessKK2b+DcxqwpgkcivQ=="],
+
+ "@opentelemetry/core": ["@opentelemetry/core@2.6.1", "https://registry.npmmirror.com/@opentelemetry/core/-/core-2.6.1.tgz", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g=="],
+
+ "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.214.0", "https://registry.npmmirror.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.214.0.tgz", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/otlp-exporter-base": "0.214.0", "@opentelemetry/otlp-transformer": "0.214.0", "@opentelemetry/resources": "2.6.1", "@opentelemetry/sdk-trace-base": "2.6.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-kIN8nTBMgV2hXzV/a20BCFilPZdAIMYYJGSgfMMRm/Xa+07y5hRDS2Vm12A/z8Cdu3Sq++ZvJfElokX2rkgGgw=="],
+
+ "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.214.0", "https://registry.npmmirror.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.214.0.tgz", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/otlp-transformer": "0.214.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-u1Gdv0/E9wP+apqWf7Wv2npXmgJtxsW2XL0TEv9FZloTZRuMBKmu8cYVXwS4Hm3q/f/3FuCnPTgiwYvIqRSpRg=="],
+
+ "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.214.0", "https://registry.npmmirror.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.214.0.tgz", { "dependencies": { "@opentelemetry/api-logs": "0.214.0", "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/sdk-logs": "0.214.0", "@opentelemetry/sdk-metrics": "2.6.1", "@opentelemetry/sdk-trace-base": "2.6.1", "protobufjs": "^7.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-DSaYcuBRh6uozfsWN3R8HsN0yDhCuWP7tOFdkUOVaWD1KVJg8m4qiLUsg/tNhTLS9HUYUcwNpwL2eroLtsZZ/w=="],
+
+ "@opentelemetry/resources": ["@opentelemetry/resources@2.6.1", "https://registry.npmmirror.com/@opentelemetry/resources/-/resources-2.6.1.tgz", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA=="],
+
+ "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.214.0", "https://registry.npmmirror.com/@opentelemetry/sdk-logs/-/sdk-logs-0.214.0.tgz", { "dependencies": { "@opentelemetry/api-logs": "0.214.0", "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-zf6acnScjhsaBUU22zXZ/sLWim1dfhUAbGXdMmHmNG3LfBnQ3DKsOCITb2IZwoUsNNMTogqFKBnlIPPftUgGwA=="],
+
+ "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.6.1", "https://registry.npmmirror.com/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ=="],
+
+ "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.6.1", "https://registry.npmmirror.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw=="],
+
+ "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.6.1", "https://registry.npmmirror.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.1.tgz", { "dependencies": { "@opentelemetry/context-async-hooks": "2.6.1", "@opentelemetry/core": "2.6.1", "@opentelemetry/sdk-trace-base": "2.6.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Hh2i4FwHWRFhnO2Q/p6svMxy8MPsNCG0uuzUY3glqm0rwM0nQvbTO1dXSp9OqQoTKXcQzaz9q1f65fsurmOhNw=="],
+
+ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "https://registry.npmmirror.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="],
+
+ "@opentui/core": ["@opentui/core@0.3.4", "https://registry.npmmirror.com/@opentui/core/-/core-0.3.4.tgz", { "dependencies": { "bun-ffi-structs": "0.2.2", "diff": "9.0.0", "marked": "17.0.1", "string-width": "7.2.0", "strip-ansi": "7.1.2", "yoga-layout": "3.2.1" }, "optionalDependencies": { "@opentui/core-darwin-arm64": "0.3.4", "@opentui/core-darwin-x64": "0.3.4", "@opentui/core-linux-arm64": "0.3.4", "@opentui/core-linux-arm64-musl": "0.3.4", "@opentui/core-linux-x64": "0.3.4", "@opentui/core-linux-x64-musl": "0.3.4", "@opentui/core-win32-arm64": "0.3.4", "@opentui/core-win32-x64": "0.3.4" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-y0DlrChP9lcJ4jC5z/1wMS34+ygfSTW7gD5OJHwJaAScfmlFvuJOZbwmCGrJURZ+5wFBxuOi9LatZsmeAUIKAA=="],
+
+ "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.3.4", "https://registry.npmmirror.com/@opentui/core-darwin-arm64/-/core-darwin-arm64-0.3.4.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-4A7JYXUsZqhu9PPCe07E30ourSJYkitkwMujUyNKjM5e/dHNDVnz+5r5cO3M5snofLafc1DN7+9jEPn4UQzchQ=="],
+
+ "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.3.4", "https://registry.npmmirror.com/@opentui/core-darwin-x64/-/core-darwin-x64-0.3.4.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-Jvm9E8n2sPhKEyKSXn9GlmJcj8WoJXJTooXb3djwjVaiimjihIj0XxHzCWhdqbDtQp+VxDFyCKoQagOOz20qhA=="],
+
+ "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.3.4", "https://registry.npmmirror.com/@opentui/core-linux-arm64/-/core-linux-arm64-0.3.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-0uPuHCeZxm/O7+L+iNQl8zRAfehiwYstKkT9J0uTZO64/byBCLvy5lvn1DiE/72s/nTJ5nwpLN+pQs2/WYVKLQ=="],
+
+ "@opentui/core-linux-arm64-musl": ["@opentui/core-linux-arm64-musl@0.3.4", "https://registry.npmmirror.com/@opentui/core-linux-arm64-musl/-/core-linux-arm64-musl-0.3.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-sJYUzYcSOb5PCXRlhwsse/fdsMiVomNvIwq/2TDhAANef+YPO3Br+OH9kQRbuj0bjVDmUS36SGYWSTFu2lUO+A=="],
+
+ "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.3.4", "https://registry.npmmirror.com/@opentui/core-linux-x64/-/core-linux-x64-0.3.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-btYIQeNdPbN4JCrCjVB/RwMGrnRY7qWB2piNEfALSByuULKNjPKQ33PYIj38Yd01zCvCV7FotIeXEGSHx3tgCA=="],
+
+ "@opentui/core-linux-x64-musl": ["@opentui/core-linux-x64-musl@0.3.4", "https://registry.npmmirror.com/@opentui/core-linux-x64-musl/-/core-linux-x64-musl-0.3.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-fhmUey4oJJ2+N62xlIgAPxAl36Fa7wYffqDOT4QLpm0jfyD5xzo+wL/hr2zUqaEI439R8Iq6jHNxf/Nsx1WuuQ=="],
+
+ "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.3.4", "https://registry.npmmirror.com/@opentui/core-win32-arm64/-/core-win32-arm64-0.3.4.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-sh432vPU+eLp8eA4I0KWKKn7D0VHbk01YTg6mA9/ihCNYHntc6LZ8/sLvsPv8CvKscMotfIkh3M5YhdS36BuXw=="],
+
+ "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.3.4", "https://registry.npmmirror.com/@opentui/core-win32-x64/-/core-win32-x64-0.3.4.tgz", { "os": "win32", "cpu": "x64" }, "sha512-dw8FcjUZaLAjw25P3/7BarobCh/QOHn3srYaWYQdysoqyvSlPkQumpI8kV/KgpJtdITU1GW02MQC4EeLIFFalA=="],
+
+ "@opentui/keymap": ["@opentui/keymap@0.3.4", "https://registry.npmmirror.com/@opentui/keymap/-/keymap-0.3.4.tgz", { "dependencies": { "@opentui/core": "0.3.4" }, "peerDependencies": { "@opentui/react": "0.3.4", "@opentui/solid": "0.3.4", "react": ">=19.2.0", "solid-js": "1.9.12" }, "optionalPeers": ["@opentui/react", "@opentui/solid", "react", "solid-js"] }, "sha512-8fo6BZWQgCjANfbKkzPo0ghAzS1E7TlHjDDS+SUhrX01qEUO1clFTRssKluHbXd2UJY1Ehle01TV5bFmY78f8w=="],
+
+ "@opentui/solid": ["@opentui/solid@0.3.4", "https://registry.npmmirror.com/@opentui/solid/-/solid-0.3.4.tgz", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.3.4", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.12", "entities": "7.0.1", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.12" } }, "sha512-gin1VnsVBahX0nrU3mpgh5U1qvyJBIZu4NE5mc0YnObWOEf9HVNxKY4/BpUvQPh91kT6zeOzTBvAvYK4R7g9MQ=="],
+
+ "@oslojs/asn1": ["@oslojs/asn1@1.0.0", "https://registry.npmmirror.com/@oslojs/asn1/-/asn1-1.0.0.tgz", { "dependencies": { "@oslojs/binary": "1.0.0" } }, "sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA=="],
+
+ "@oslojs/binary": ["@oslojs/binary@1.0.0", "https://registry.npmmirror.com/@oslojs/binary/-/binary-1.0.0.tgz", {}, "sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ=="],
+
+ "@oslojs/crypto": ["@oslojs/crypto@1.0.1", "https://registry.npmmirror.com/@oslojs/crypto/-/crypto-1.0.1.tgz", { "dependencies": { "@oslojs/asn1": "1.0.0", "@oslojs/binary": "1.0.0" } }, "sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ=="],
+
+ "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "https://registry.npmmirror.com/@oslojs/encoding/-/encoding-1.1.0.tgz", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
+
+ "@oslojs/jwt": ["@oslojs/jwt@0.2.0", "https://registry.npmmirror.com/@oslojs/jwt/-/jwt-0.2.0.tgz", { "dependencies": { "@oslojs/encoding": "0.4.1" } }, "sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg=="],
+
+ "@oxc-minify/binding-android-arm64": ["@oxc-minify/binding-android-arm64@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.96.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-lzeIEMu/v6Y+La5JSesq4hvyKtKBq84cgQpKYTYM/yGuNk2tfd5Ha31hnC+mTh48lp/5vZH+WBfjVUjjINCfug=="],
+
+ "@oxc-minify/binding-darwin-arm64": ["@oxc-minify/binding-darwin-arm64@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.96.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-i0LkJAUXb4BeBFrJQbMKQPoxf8+cFEffDyLSb7NEzzKuPcH8qrVsnEItoOzeAdYam8Sr6qCHVwmBNEQzl7PWpw=="],
+
+ "@oxc-minify/binding-darwin-x64": ["@oxc-minify/binding-darwin-x64@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.96.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-C5vI0WPR+KPIFAD5LMOJk2J8iiT+Nv65vDXmemzXEXouzfEOLYNqnW+u6NSsccpuZHHWAiLyPFkYvKFduveAUQ=="],
+
+ "@oxc-minify/binding-freebsd-x64": ["@oxc-minify/binding-freebsd-x64@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.96.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-3//5DNx+xUjVBMLLk2sl6hfe4fwfENJtjVQUBXjxzwPuv8xgZUqASG4cRG3WqG5Qe8dV6SbCI4EgKQFjO4KCZA=="],
+
+ "@oxc-minify/binding-linux-arm-gnueabihf": ["@oxc-minify/binding-linux-arm-gnueabihf@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.96.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-WXChFKV7VdDk1NePDK1J31cpSvxACAVztJ7f7lJVYBTkH+iz5D0lCqPcE7a9eb7nC3xvz4yk7DM6dA9wlUQkQg=="],
+
+ "@oxc-minify/binding-linux-arm-musleabihf": ["@oxc-minify/binding-linux-arm-musleabihf@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.96.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-7B18glYMX4Z/YoqgE3VRLs/2YhVLxlxNKSgrtsRpuR8xv58xca+hEhiFwZN1Rn+NSMZ29Z33LWD7iYWnqYFvRA=="],
+
+ "@oxc-minify/binding-linux-arm64-gnu": ["@oxc-minify/binding-linux-arm64-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.96.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-Yl+KcTldsEJNcaYxxonwAXZ2q3gxIzn3kXYQWgKWdaGIpNhOCWqF+KE5WLsldoh5Ro5SHtomvb8GM6cXrIBMog=="],
+
+ "@oxc-minify/binding-linux-arm64-musl": ["@oxc-minify/binding-linux-arm64-musl@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.96.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-rNqoFWOWaxwMmUY5fspd/h5HfvgUlA3sv9CUdA2MpnHFiyoJNovR7WU8tGh+Yn0qOAs0SNH0a05gIthHig14IA=="],
+
+ "@oxc-minify/binding-linux-riscv64-gnu": ["@oxc-minify/binding-linux-riscv64-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.96.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-3paajIuzGnukHwSI3YBjYVqbd72pZd8NJxaayaNFR0AByIm8rmIT5RqFXbq8j2uhtpmNdZRXiu0em1zOmIScWA=="],
+
+ "@oxc-minify/binding-linux-s390x-gnu": ["@oxc-minify/binding-linux-s390x-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.96.0.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-9ESrpkB2XG0lQ89JlsxlZa86iQCOs+jkDZLl6O+u5wb7ynUy21bpJJ1joauCOSYIOUlSy3+LbtJLiqi7oSQt5Q=="],
+
+ "@oxc-minify/binding-linux-x64-gnu": ["@oxc-minify/binding-linux-x64-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.96.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-UMM1jkns+p+WwwmdjC5giI3SfR2BCTga18x3C0cAu6vDVf4W37uTZeTtSIGmwatTBbgiq++Te24/DE0oCdm1iQ=="],
+
+ "@oxc-minify/binding-linux-x64-musl": ["@oxc-minify/binding-linux-x64-musl@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.96.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-8b1naiC7MdP7xeMi7cQ5tb9W1rZAP9Qz/jBRqp1Y5EOZ1yhSGnf1QWuZ/0pCc+XiB9vEHXEY3Aki/H+86m2eOg=="],
+
+ "@oxc-minify/binding-wasm32-wasi": ["@oxc-minify/binding-wasm32-wasi@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-wasm32-wasi/-/binding-wasm32-wasi-0.96.0.tgz", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-bjGDjkGzo3GWU9Vg2qiFUrfoo5QxojPNV/2RHTlbIB5FWkkV4ExVjsfyqihFiAuj0NXIZqd2SAiEq9htVd3RFw=="],
+
+ "@oxc-minify/binding-win32-arm64-msvc": ["@oxc-minify/binding-win32-arm64-msvc@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.96.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-4L4DlHUT47qMWQuTyUghpncR3NZHWtxvd0G1KgSjVgXf+cXzFdWQCWZZtCU0yrmOoVCNUf4S04IFCJyAe+Ie7A=="],
+
+ "@oxc-minify/binding-win32-x64-msvc": ["@oxc-minify/binding-win32-x64-msvc@0.96.0", "https://registry.npmmirror.com/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.96.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-T2ijfqZLpV2bgGGocXV4SXTuMoouqN0asYTIm+7jVOLvT5XgDogf3ZvCmiEnSWmxl21+r5wHcs8voU2iUROXAg=="],
+
+ "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.127.0.tgz", { "os": "android", "cpu": "arm" }, "sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ=="],
+
+ "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.127.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg=="],
+
+ "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.127.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg=="],
+
+ "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.127.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw=="],
+
+ "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.127.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA=="],
+
+ "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.127.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ=="],
+
+ "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.127.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g=="],
+
+ "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.127.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ=="],
+
+ "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.127.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA=="],
+
+ "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.127.0.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ=="],
+
+ "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.127.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ=="],
+
+ "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.127.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g=="],
+
+ "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.127.0.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q=="],
+
+ "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.127.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ=="],
+
+ "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.127.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg=="],
+
+ "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.127.0.tgz", { "os": "none", "cpu": "arm64" }, "sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ=="],
+
+ "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.127.0.tgz", { "dependencies": { "@emnapi/core": "1.9.2", "@emnapi/runtime": "1.9.2", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ=="],
+
+ "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw=="],
+
+ "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.127.0.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw=="],
+
+ "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.127.0", "https://registry.npmmirror.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.127.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w=="],
+
+ "@oxc-project/types": ["@oxc-project/types@0.127.0", "https://registry.npmmirror.com/@oxc-project/types/-/types-0.127.0.tgz", {}, "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ=="],
+
+ "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.20.0.tgz", { "os": "android", "cpu": "arm" }, "sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg=="],
+
+ "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.20.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q=="],
+
+ "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.20.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ=="],
+
+ "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.20.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg=="],
+
+ "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.20.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ=="],
+
+ "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.20.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg=="],
+
+ "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.20.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg=="],
+
+ "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.20.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg=="],
+
+ "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.20.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw=="],
+
+ "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.20.0.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ=="],
+
+ "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.20.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw=="],
+
+ "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.20.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg=="],
+
+ "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.20.0.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g=="],
+
+ "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.20.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g=="],
+
+ "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.20.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ=="],
+
+ "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.20.0.tgz", { "os": "none", "cpu": "arm64" }, "sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ=="],
+
+ "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.20.0.tgz", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg=="],
+
+ "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.20.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA=="],
+
+ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.20.0", "https://registry.npmmirror.com/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.20.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw=="],
+
+ "@oxc-transform/binding-android-arm64": ["@oxc-transform/binding-android-arm64@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.96.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-wOm+ZsqFvyZ7B9RefUMsj0zcXw77Z2pXA51nbSQyPXqr+g0/pDGxriZWP8Sdpz/e4AEaKPA9DvrwyOZxu7GRDQ=="],
+
+ "@oxc-transform/binding-darwin-arm64": ["@oxc-transform/binding-darwin-arm64@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.96.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-td1sbcvzsyuoNRiNdIRodPXRtFFwxzPpC/6/yIUtRRhKn30XQcizxupIvQQVpJWWchxkphbBDh6UN+u+2CJ8Zw=="],
+
+ "@oxc-transform/binding-darwin-x64": ["@oxc-transform/binding-darwin-x64@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.96.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-xgqxnqhPYH2NYkgbqtnCJfhbXvxIf/pnhF/ig5UBK8PYpCEWIP/cfLpQRQ9DcQnRfuxi7RMIF6LdmB1AiS6Fkg=="],
+
+ "@oxc-transform/binding-freebsd-x64": ["@oxc-transform/binding-freebsd-x64@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.96.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-1i67OXdl/rvSkcTXqDlh6qGRXYseEmf0rl/R+/i88scZ/o3A+FzlX56sThuaPzSSv9eVgesnoYUjIBJELFc1oA=="],
+
+ "@oxc-transform/binding-linux-arm-gnueabihf": ["@oxc-transform/binding-linux-arm-gnueabihf@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.96.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-9MJBs0SWODsqyzO3eAnacXgJ/sZu1xqinjEwBzkcZ3tQI8nKhMADOzu2NzbVWDWujeoC8DESXaO08tujvUru+Q=="],
+
+ "@oxc-transform/binding-linux-arm-musleabihf": ["@oxc-transform/binding-linux-arm-musleabihf@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.96.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-BQom57I2ScccixljNYh2Wy+5oVZtF1LXiiUPxSLtDHbsanpEvV/+kzCagQpTjk1BVzSQzOxfEUWjvL7mY53pRQ=="],
+
+ "@oxc-transform/binding-linux-arm64-gnu": ["@oxc-transform/binding-linux-arm64-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.96.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-kaqvUzNu8LL4aBSXqcqGVLFG13GmJEplRI2+yqzkgAItxoP/LfFMdEIErlTWLGyBwd0OLiNMHrOvkcCQRWadVg=="],
+
+ "@oxc-transform/binding-linux-arm64-musl": ["@oxc-transform/binding-linux-arm64-musl@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.96.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-EiG/L3wEkPgTm4p906ufptyblBgtiQWTubGg/JEw82f8uLRroayr5zhbUqx40EgH037a3SfJthIyLZi7XPRFJw=="],
+
+ "@oxc-transform/binding-linux-riscv64-gnu": ["@oxc-transform/binding-linux-riscv64-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.96.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-r01CY6OxKGtVeYnvH4mGmtkQMlLkXdPWWNXwo5o7fE2s/fgZPMpqh8bAuXEhuMXipZRJrjxTk1+ZQ4KCHpMn3Q=="],
+
+ "@oxc-transform/binding-linux-s390x-gnu": ["@oxc-transform/binding-linux-s390x-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.96.0.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-4djg2vYLGbVeS8YiA2K4RPPpZE4fxTGCX5g/bOMbCYyirDbmBAIop4eOAj8vOA9i1CcWbDtmp+PVJ1dSw7f3IQ=="],
+
+ "@oxc-transform/binding-linux-x64-gnu": ["@oxc-transform/binding-linux-x64-gnu@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.96.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-f6pcWVz57Y8jXa2OS7cz3aRNuks34Q3j61+3nQ4xTE8H1KbalcEvHNmM92OEddaJ8QLs9YcE0kUC6eDTbY34+A=="],
+
+ "@oxc-transform/binding-linux-x64-musl": ["@oxc-transform/binding-linux-x64-musl@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.96.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-NSiRtFvR7Pbhv3mWyPMkTK38czIjcnK0+K5STo3CuzZRVbX1TM17zGdHzKBUHZu7v6IQ6/XsQ3ELa1BlEHPGWQ=="],
+
+ "@oxc-transform/binding-wasm32-wasi": ["@oxc-transform/binding-wasm32-wasi@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.96.0.tgz", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-A91ARLiuZHGN4hBds9s7bW3czUuLuHLsV+cz44iF9j8e1zX9m2hNGXf/acQRbg/zcFUXmjz5nmk8EkZyob876w=="],
+
+ "@oxc-transform/binding-win32-arm64-msvc": ["@oxc-transform/binding-win32-arm64-msvc@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.96.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-IedJf40djKgDObomhYjdRAlmSYUEdfqX3A3M9KfUltl9AghTBBLkTzUMA7O09oo71vYf5TEhbFM7+Vn5vqw7AQ=="],
+
+ "@oxc-transform/binding-win32-x64-msvc": ["@oxc-transform/binding-win32-x64-msvc@0.96.0", "https://registry.npmmirror.com/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.96.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-0fI0P0W7bSO/GCP/N5dkmtB9vBqCA4ggo1WmXTnxNJVmFFOtcA1vYm1I9jl8fxo+sucW2WnlpnI4fjKdo3JKxA=="],
+
+ "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.21.0", "https://registry.npmmirror.com/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.21.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-P20j3MLqfwIT+94qGU3htC7dWp4pXGZW1p1p7FRUzu1aopq7c9nPCgf0W/WjktqQ57+iuTq9mbSlwWinl6+H1A=="],
+
+ "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.21.0", "https://registry.npmmirror.com/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.21.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-81TmmuBcPedEA0MwRmObuQuXnCprS1UiHQWGe7pseqNAJzUWXeAPrayqKTACX92VpruJI+yvY0XJrFp11PpcTA=="],
+
+ "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.21.0", "https://registry.npmmirror.com/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.21.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-sbjBr6zDduX8rNO0PTjhf7VYLCPWqdijWiMPp8e10qu6Tam1GdaVLaLlX8QrNupTgglO1GvqqgY/jcacWL8a6g=="],
+
+ "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.21.0", "https://registry.npmmirror.com/@oxlint-tsgolint/linux-x64/-/linux-x64-0.21.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-jNrOcy53R5TJQfrK444Cm60bW9437xDoxPbm3AdvFSo/fhdFMllawc7uZC2Wzr+EAjTkW13K8R4QHzsUdBG9fQ=="],
+
+ "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.21.0", "https://registry.npmmirror.com/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.21.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-xWeRxJJILDE4b9UqHEWGBxcBc1TUS6zWHhxcyxTZMwf4q3wdKeu0OHYAcwLGJzoSjEIf6FTjyfPiRNil2oqsdg=="],
+
+ "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.21.0", "https://registry.npmmirror.com/@oxlint-tsgolint/win32-x64/-/win32-x64-0.21.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Ob9AA9teI8ckPo1whV1smLr5NrqwgBv/8boDbK0YZG+fKgNGRwr1hBj1ORgFWOQaUBv+5njp5A0RAfJJjQ95QQ=="],
+
+ "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.60.0.tgz", { "os": "android", "cpu": "arm" }, "sha512-YdeJKaZckDQL1qa62a1aKq/goyq48aX3yOxaaWqWb4sau4Ee4IiLbamftNLU3zbePky6QsDj6thnSSzHRBjDfA=="],
+
+ "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-android-arm64/-/binding-android-arm64-1.60.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-7ANS7PpXCfq84xZQ8E5WPs14gwcuPcl+/8TFNXfpSu0CQBXz3cUo2fDpHT8v8HJN+Ut02eacvMAzTnc9s6X4tw=="],
+
+ "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.60.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-pJsgd9AfplLGBm1fIr25V6V14vMrayhx4uIQvlfH7jWs2SZwSrvi3TfgfJySB8T+hvyEH8K2zXljQiUnkgUnfQ=="],
+
+ "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.60.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-Ue1aXHX49ivwflKqGJc7zcd/LeLgbhaTcDCQStgx5x06AXgjEAZmvrlMuIkWd4AL4FHQe6QJ9f33z04Cg448VQ=="],
+
+ "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.60.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-YCyQzsQtusQw+gNRW9rRTifSO+Dt/+dtCl2NHoDMZqJlRTEZ/Oht9YnuporI9yiTx7+cB+eqzX3MtHHVHGIWhg=="],
+
+ "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.60.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-c7dxM2Zksa45Qw16i2iGY3Fti2NirJ38FrsBsKw+qcJ0OtqTsBgKJLF0xV+yLG56UH01Z8WRPgsw31e0MoRoGQ=="],
+
+ "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.60.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-ZWALoA42UYqBEP1Tbw9OWURgFGS1nWj2AAvLdY6ZcGx/Gj93qVCBKjcvwXMupZibYwFbi9s/rzqkZseb/6gVtQ=="],
+
+ "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.60.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-tpy+1w4p9hN5CicMCxqNy6ymfRtV5ayE573vFNjp1k1TN/qhLFgflveZoE/0++RlkHikBz2vY545NWm/hp7big=="],
+
+ "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.60.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-eDYDXZGhQAXyn6GwtwiX/qcLS0HlOLPJ/+iiIY8RYr+3P8oKBmgKxADLlniL6FtWfE7pPk7IGN9/xvDEvDvFeg=="],
+
+ "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.60.0.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-nxehly5XYBHUWI9VJX1bqCf9j/B43DaK/aS/T1fcxCpX3PA4Rm9BB54nPD1CKayT8xg6REN1ao+01hSRNgy8OA=="],
+
+ "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.60.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-j1qf/NaUfOWQutjeoooNG1Q0zsK0XGmSu1uDLq3cctquRF3j7t9Hxqf/76ehCc5GEUAanth2W4Fa+XT1RFg/nw=="],
+
+ "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.60.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-YELKPRefQ/q/h3RUmeRfPCUhh2wBvgV1RyZ/F9M9u8cDyXsQW2ojv1DeWQTt466yczDITjZnIOg/s05pk7Ve2A=="],
+
+ "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.60.0.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-JkO3C6Gki7Y6h/MiIkFKvHFOz98/YWvQ4WYbK9DLXACMP2rjULzkeGyAzorJE5S1dzLQGFgeqvN779kSFwoV1g=="],
+
+ "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.60.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-XjKHdFVCpZZZSWBCKyyqCq65s2AKXykMXkjLoKYODrD+f5toLhlwsMESscu8FbgnJQ4Y/dpR/zdazsahmgBJIA=="],
+
+ "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.60.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-js29ZWIuPhNWzY8NC7KoffEMEeWG105vbmm+8EOJsC+T/jHBiKIJEUF78+F/IrgEWMMP9N0kRND4Pp75+xAhKg=="],
+
+ "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.60.0.tgz", { "os": "none", "cpu": "arm64" }, "sha512-H+PUITKHk04stFpWj3x3Kg08Afp/bcXSBi0EhasR5a0Vw7StXHTzdl655PUI0fB4qdh2Wsu6Dsi+3ACxPoyQnA=="],
+
+ "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.60.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-WA/yc7f7ZfCefBXVzNHn1Ztulb1EFwNBb4jMZ6pjML0zz6pHujlF3Q3jySluz3XHl/GNeMTntG1seUBWVMlMag=="],
+
+ "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.60.0.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-33YxL1sqwYNZXtn3MD/4dno6s0xeedXOJlT1WohkVD565WvohClZUr7vwKdAk954n4xiEWJkewiCr+zLeq7AeA=="],
+
+ "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.60.0", "https://registry.npmmirror.com/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.60.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-JOro4ZcfBLamJCyfURQmOQByoorgOdx3ZjAkSqnb/CyG/i+lN3KoV5LAgk5ZAW6DPq7/Cx7n23f8DuTWXTWgyQ=="],
+
+ "@pagefind/darwin-arm64": ["@pagefind/darwin-arm64@1.5.2", "https://registry.npmmirror.com/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ=="],
+
+ "@pagefind/darwin-x64": ["@pagefind/darwin-x64@1.5.2", "https://registry.npmmirror.com/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw=="],
+
+ "@pagefind/default-ui": ["@pagefind/default-ui@1.5.2", "https://registry.npmmirror.com/@pagefind/default-ui/-/default-ui-1.5.2.tgz", {}, "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg=="],
+
+ "@pagefind/freebsd-x64": ["@pagefind/freebsd-x64@1.5.2", "https://registry.npmmirror.com/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA=="],
+
+ "@pagefind/linux-arm64": ["@pagefind/linux-arm64@1.5.2", "https://registry.npmmirror.com/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw=="],
+
+ "@pagefind/linux-x64": ["@pagefind/linux-x64@1.5.2", "https://registry.npmmirror.com/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", { "os": "linux", "cpu": "x64" }, "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA=="],
+
+ "@pagefind/windows-arm64": ["@pagefind/windows-arm64@1.5.2", "https://registry.npmmirror.com/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g=="],
+
+ "@pagefind/windows-x64": ["@pagefind/windows-x64@1.5.2", "https://registry.npmmirror.com/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg=="],
+
+ "@parcel/watcher": ["@parcel/watcher@2.5.1", "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="],
+
+ "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="],
+
+ "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="],
+
+ "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="],
+
+ "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="],
+
+ "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="],
+
+ "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="],
+
+ "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="],
+
+ "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="],
+
+ "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="],
+
+ "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="],
+
+ "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="],
+
+ "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="],
+
+ "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="],
+
+ "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.7.0", "https://registry.npmmirror.com/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz", { "dependencies": { "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg=="],
+
+ "@peculiar/json-schema": ["@peculiar/json-schema@1.1.12", "https://registry.npmmirror.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w=="],
+
+ "@peculiar/utils": ["@peculiar/utils@2.0.3", "https://registry.npmmirror.com/@peculiar/utils/-/utils-2.0.3.tgz", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ=="],
+
+ "@peculiar/webcrypto": ["@peculiar/webcrypto@1.7.1", "https://registry.npmmirror.com/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.7.0", "@peculiar/json-schema": "^1.1.12", "@peculiar/utils": "^2.0.2", "tslib": "^2.8.1", "webcrypto-core": "^1.9.2" } }, "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ=="],
+
+ "@pierre/diffs": ["@pierre/diffs@1.1.0-beta.18", "https://registry.npmmirror.com/@pierre/diffs/-/diffs-1.1.0-beta.18.tgz", { "dependencies": { "@pierre/theme": "0.0.22", "@shikijs/transformers": "^3.0.0", "diff": "8.0.3", "hast-util-to-html": "9.0.5", "lru_map": "0.4.1", "shiki": "^3.0.0" }, "peerDependencies": { "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" } }, "sha512-7ZF3YD9fxdbYsPnltz5cUqHacN7ztp8RX/fJLxwv8wIEORpP4+7dHz1h/qx3o4EW2xUrIhmbM8ImywLasB787Q=="],
+
+ "@pierre/theme": ["@pierre/theme@0.0.22", "https://registry.npmmirror.com/@pierre/theme/-/theme-0.0.22.tgz", {}, "sha512-ePUIdQRNGjrveELTU7fY89Xa7YGHHEy5Po5jQy/18lm32eRn96+tnYJEtFooGdffrx55KBUtOXfvVy/7LDFFhA=="],
+
+ "@pinojs/redact": ["@pinojs/redact@0.4.0", "https://registry.npmmirror.com/@pinojs/redact/-/redact-0.4.0.tgz", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="],
+
+ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
+
+ "@planetscale/database": ["@planetscale/database@1.19.0", "https://registry.npmmirror.com/@planetscale/database/-/database-1.19.0.tgz", {}, "sha512-Tv4jcFUFAFjOWrGSio49H6R2ijALv0ZzVBfJKIdm+kl9X046Fh4LLawrF9OMsglVbK6ukqMJsUCeucGAFTBcMA=="],
+
+ "@playwright/test": ["@playwright/test@1.59.1", "https://registry.npmmirror.com/@playwright/test/-/test-1.59.1.tgz", { "dependencies": { "playwright": "1.59.1" }, "bin": { "playwright": "cli.js" } }, "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg=="],
+
+ "@poppinss/colors": ["@poppinss/colors@4.1.6", "https://registry.npmmirror.com/@poppinss/colors/-/colors-4.1.6.tgz", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="],
+
+ "@poppinss/dumper": ["@poppinss/dumper@0.6.5", "https://registry.npmmirror.com/@poppinss/dumper/-/dumper-0.6.5.tgz", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="],
+
+ "@poppinss/exception": ["@poppinss/exception@1.2.3", "https://registry.npmmirror.com/@poppinss/exception/-/exception-1.2.3.tgz", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="],
+
+ "@protobuf-ts/plugin": ["@protobuf-ts/plugin@2.11.1", "https://registry.npmmirror.com/@protobuf-ts/plugin/-/plugin-2.11.1.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.4.0", "@bufbuild/protoplugin": "^2.4.0", "@protobuf-ts/protoc": "^2.11.1", "@protobuf-ts/runtime": "^2.11.1", "@protobuf-ts/runtime-rpc": "^2.11.1", "typescript": "^3.9" }, "bin": { "protoc-gen-ts": "bin/protoc-gen-ts", "protoc-gen-dump": "bin/protoc-gen-dump" } }, "sha512-HyuprDcw0bEEJqkOWe1rnXUP0gwYLij8YhPuZyZk6cJbIgc/Q0IFgoHQxOXNIXAcXM4Sbehh6kjVnCzasElw1A=="],
+
+ "@protobuf-ts/protoc": ["@protobuf-ts/protoc@2.11.1", "https://registry.npmmirror.com/@protobuf-ts/protoc/-/protoc-2.11.1.tgz", { "bin": { "protoc": "protoc.js" } }, "sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg=="],
+
+ "@protobuf-ts/runtime": ["@protobuf-ts/runtime@2.11.1", "https://registry.npmmirror.com/@protobuf-ts/runtime/-/runtime-2.11.1.tgz", {}, "sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ=="],
+
+ "@protobuf-ts/runtime-rpc": ["@protobuf-ts/runtime-rpc@2.11.1", "https://registry.npmmirror.com/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.11.1.tgz", { "dependencies": { "@protobuf-ts/runtime": "^2.11.1" } }, "sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ=="],
+
+ "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
+
+ "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
+
+ "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.5.tgz", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="],
+
+ "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="],
+
+ "@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.1.tgz", { "dependencies": { "@protobufjs/aspromise": "^1.1.1" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="],
+
+ "@protobufjs/float": ["@protobufjs/float@1.0.2", "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
+
+ "@protobufjs/inquire": ["@protobufjs/inquire@1.1.2", "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.2.tgz", {}, "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw=="],
+
+ "@protobufjs/path": ["@protobufjs/path@1.1.2", "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
+
+ "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
+
+ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.1.tgz", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="],
+
+ "@radix-ui/colors": ["@radix-ui/colors@1.0.1", "https://registry.npmmirror.com/@radix-ui/colors/-/colors-1.0.1.tgz", {}, "sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg=="],
+
+ "@radix-ui/primitive": ["@radix-ui/primitive@1.0.1", "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" } }, "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw=="],
+
+ "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA=="],
+
+ "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-id": "1.0.1", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-controllable-state": "1.0.1", "@radix-ui/react-use-layout-effect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg=="],
+
+ "@radix-ui/react-collection": ["@radix-ui/react-collection@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA=="],
+
+ "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw=="],
+
+ "@radix-ui/react-context": ["@radix-ui/react-context@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg=="],
+
+ "@radix-ui/react-direction": ["@radix-ui/react-direction@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA=="],
+
+ "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.0.4", "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1", "@radix-ui/react-use-escape-keydown": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg=="],
+
+ "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA=="],
+
+ "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ=="],
+
+ "@radix-ui/react-id": ["@radix-ui/react-id@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-layout-effect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ=="],
+
+ "@radix-ui/react-popover": ["@radix-ui/react-popover@1.0.6", "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.0.6.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-dismissable-layer": "1.0.4", "@radix-ui/react-focus-guards": "1.0.1", "@radix-ui/react-focus-scope": "1.0.3", "@radix-ui/react-id": "1.0.1", "@radix-ui/react-popper": "1.1.2", "@radix-ui/react-portal": "1.0.3", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", "@radix-ui/react-use-controllable-state": "1.0.1", "aria-hidden": "^1.1.1", "react-remove-scroll": "2.5.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA=="],
+
+ "@radix-ui/react-popper": ["@radix-ui/react-popper@1.1.2", "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.0.3", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1", "@radix-ui/react-use-layout-effect": "1.0.1", "@radix-ui/react-use-rect": "1.0.1", "@radix-ui/react-use-size": "1.0.1", "@radix-ui/rect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg=="],
+
+ "@radix-ui/react-portal": ["@radix-ui/react-portal@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA=="],
+
+ "@radix-ui/react-presence": ["@radix-ui/react-presence@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-use-layout-effect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg=="],
+
+ "@radix-ui/react-primitive": ["@radix-ui/react-primitive@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-slot": "1.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g=="],
+
+ "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.0.4", "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-collection": "1.0.3", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-direction": "1.0.1", "@radix-ui/react-id": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1", "@radix-ui/react-use-controllable-state": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ=="],
+
+ "@radix-ui/react-slot": ["@radix-ui/react-slot@1.0.2", "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg=="],
+
+ "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-controllable-state": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg=="],
+
+ "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.0.4", "https://registry.npmmirror.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-direction": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-roving-focus": "1.0.4", "@radix-ui/react-toggle": "1.0.3", "@radix-ui/react-use-controllable-state": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A=="],
+
+ "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.0.6", "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-dismissable-layer": "1.0.4", "@radix-ui/react-id": "1.0.1", "@radix-ui/react-popper": "1.1.2", "@radix-ui/react-portal": "1.0.3", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", "@radix-ui/react-use-controllable-state": "1.0.1", "@radix-ui/react-visually-hidden": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg=="],
+
+ "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ=="],
+
+ "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA=="],
+
+ "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg=="],
+
+ "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ=="],
+
+ "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/rect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw=="],
+
+ "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.0.1", "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-layout-effect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g=="],
+
+ "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.0.3", "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA=="],
+
+ "@radix-ui/rect": ["@radix-ui/rect@1.0.1", "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.0.1.tgz", { "dependencies": { "@babel/runtime": "^7.13.10" } }, "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ=="],
+
+ "@remix-run/node-fetch-server": ["@remix-run/node-fetch-server@0.8.1", "https://registry.npmmirror.com/@remix-run/node-fetch-server/-/node-fetch-server-0.8.1.tgz", {}, "sha512-J1dev372wtJqmqn9U/qbpbZxbJSQrogNN2+Qv1lKlpATpe/WQ9aCZfl/xSb9d2Rgh1IyLSvNxZAXPZxruO6Xig=="],
+
+ "@remix-run/router": ["@remix-run/router@1.9.0", "https://registry.npmmirror.com/@remix-run/router/-/router-1.9.0.tgz", {}, "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA=="],
+
+ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="],
+
+ "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", { "os": "android", "cpu": "arm" }, "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", { "os": "android", "cpu": "arm64" }, "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", { "os": "linux", "cpu": "arm" }, "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", { "os": "linux", "cpu": "arm" }, "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", { "os": "none", "cpu": "arm64" }, "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", { "os": "win32", "cpu": "x64" }, "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.4", "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", { "os": "win32", "cpu": "x64" }, "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw=="],
+
+ "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "https://registry.npmmirror.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="],
+
+ "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@10.36.0", "https://registry.npmmirror.com/@sentry-internal/browser-utils/-/browser-utils-10.36.0.tgz", { "dependencies": { "@sentry/core": "10.36.0" } }, "sha512-WILVR8HQBWOxbqLRuTxjzRCMIACGsDTo6jXvzA8rz6ezElElLmIrn3CFAswrESLqEEUa4CQHl5bLgSVJCRNweA=="],
+
+ "@sentry-internal/feedback": ["@sentry-internal/feedback@10.36.0", "https://registry.npmmirror.com/@sentry-internal/feedback/-/feedback-10.36.0.tgz", { "dependencies": { "@sentry/core": "10.36.0" } }, "sha512-zPjz7AbcxEyx8AHj8xvp28fYtPTPWU1XcNtymhAHJLS9CXOblqSC7W02Jxz6eo3eR1/pLyOo6kJBUjvLe9EoFA=="],
+
+ "@sentry-internal/replay": ["@sentry-internal/replay@10.36.0", "https://registry.npmmirror.com/@sentry-internal/replay/-/replay-10.36.0.tgz", { "dependencies": { "@sentry-internal/browser-utils": "10.36.0", "@sentry/core": "10.36.0" } }, "sha512-nLMkJgvHq+uCCrQKV2KgSdVHxTsmDk0r2hsAoTcKCbzUpXyW5UhCziMRS6ULjBlzt5sbxoIIplE25ZpmIEeNgg=="],
+
+ "@sentry-internal/replay-canvas": ["@sentry-internal/replay-canvas@10.36.0", "https://registry.npmmirror.com/@sentry-internal/replay-canvas/-/replay-canvas-10.36.0.tgz", { "dependencies": { "@sentry-internal/replay": "10.36.0", "@sentry/core": "10.36.0" } }, "sha512-DLGIwmT2LX+O6TyYPtOQL5GiTm2rN0taJPDJ/Lzg2KEJZrdd5sKkzTckhh2x+vr4JQyeaLmnb8M40Ch1hvG/vQ=="],
+
+ "@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@4.6.0", "https://registry.npmmirror.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.6.0.tgz", {}, "sha512-3soTX50JPQQ51FSbb4qvNBf4z/yP7jTdn43vMTp9E4IxvJ9HKJR7OEuKkCMszrZmWsVABXl02msqO7QisePdiQ=="],
+
+ "@sentry/browser": ["@sentry/browser@10.36.0", "https://registry.npmmirror.com/@sentry/browser/-/browser-10.36.0.tgz", { "dependencies": { "@sentry-internal/browser-utils": "10.36.0", "@sentry-internal/feedback": "10.36.0", "@sentry-internal/replay": "10.36.0", "@sentry-internal/replay-canvas": "10.36.0", "@sentry/core": "10.36.0" } }, "sha512-yHhXbgdGY1s+m8CdILC9U/II7gb6+s99S2Eh8VneEn/JG9wHc+UOzrQCeFN0phFP51QbLkjkiQbbanjT1HP8UQ=="],
+
+ "@sentry/bundler-plugin-core": ["@sentry/bundler-plugin-core@4.6.0", "https://registry.npmmirror.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.6.0.tgz", { "dependencies": { "@babel/core": "^7.18.5", "@sentry/babel-plugin-component-annotate": "4.6.0", "@sentry/cli": "^2.57.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^9.3.2", "magic-string": "0.30.8", "unplugin": "1.0.1" } }, "sha512-Fub2XQqrS258jjS8qAxLLU1k1h5UCNJ76i8m4qZJJdogWWaF8t00KnnTyp9TEDJzrVD64tRXS8+HHENxmeUo3g=="],
+
+ "@sentry/cli": ["@sentry/cli@2.58.6", "https://registry.npmmirror.com/@sentry/cli/-/cli-2.58.6.tgz", { "dependencies": { "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", "which": "^2.0.2" }, "optionalDependencies": { "@sentry/cli-darwin": "2.58.6", "@sentry/cli-linux-arm": "2.58.6", "@sentry/cli-linux-arm64": "2.58.6", "@sentry/cli-linux-i686": "2.58.6", "@sentry/cli-linux-x64": "2.58.6", "@sentry/cli-win32-arm64": "2.58.6", "@sentry/cli-win32-i686": "2.58.6", "@sentry/cli-win32-x64": "2.58.6" }, "bin": { "sentry-cli": "bin/sentry-cli" } }, "sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg=="],
+
+ "@sentry/cli-darwin": ["@sentry/cli-darwin@2.58.6", "https://registry.npmmirror.com/@sentry/cli-darwin/-/cli-darwin-2.58.6.tgz", { "os": "darwin" }, "sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA=="],
+
+ "@sentry/cli-linux-arm": ["@sentry/cli-linux-arm@2.58.6", "https://registry.npmmirror.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.6.tgz", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm" }, "sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw=="],
+
+ "@sentry/cli-linux-arm64": ["@sentry/cli-linux-arm64@2.58.6", "https://registry.npmmirror.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.6.tgz", { "os": [ "linux", "android", "freebsd", ], "cpu": "arm64" }, "sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g=="],
+
+ "@sentry/cli-linux-i686": ["@sentry/cli-linux-i686@2.58.6", "https://registry.npmmirror.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.6.tgz", { "os": [ "linux", "android", "freebsd", ], "cpu": "ia32" }, "sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg=="],
+
+ "@sentry/cli-linux-x64": ["@sentry/cli-linux-x64@2.58.6", "https://registry.npmmirror.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.6.tgz", { "os": [ "linux", "android", "freebsd", ], "cpu": "x64" }, "sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q=="],
+
+ "@sentry/cli-win32-arm64": ["@sentry/cli-win32-arm64@2.58.6", "https://registry.npmmirror.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.6.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A=="],
+
+ "@sentry/cli-win32-i686": ["@sentry/cli-win32-i686@2.58.6", "https://registry.npmmirror.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.6.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg=="],
+
+ "@sentry/cli-win32-x64": ["@sentry/cli-win32-x64@2.58.6", "https://registry.npmmirror.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.6.tgz", { "os": "win32", "cpu": "x64" }, "sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA=="],
+
+ "@sentry/core": ["@sentry/core@10.36.0", "https://registry.npmmirror.com/@sentry/core/-/core-10.36.0.tgz", {}, "sha512-EYJjZvofI+D93eUsPLDIUV0zQocYqiBRyXS6CCV6dHz64P/Hob5NJQOwPa8/v6nD+UvJXvwsFfvXOHhYZhZJOQ=="],
+
+ "@sentry/solid": ["@sentry/solid@10.36.0", "https://registry.npmmirror.com/@sentry/solid/-/solid-10.36.0.tgz", { "dependencies": { "@sentry/browser": "10.36.0", "@sentry/core": "10.36.0" }, "peerDependencies": { "@solidjs/router": "^0.13.4 || ^0.14.0 || ^0.15.0", "@tanstack/solid-router": "^1.132.27", "solid-js": "^1.8.4" }, "optionalPeers": ["@solidjs/router", "@tanstack/solid-router"] }, "sha512-AaDqz3JGBrQCm2YVqODVyJHwg7LRTNSJig9mjfProFyvkC7eUXQ/HBJrrhAD1Dct9ufmDH3G+f3/Ut9LgpItSg=="],
+
+ "@sentry/vite-plugin": ["@sentry/vite-plugin@4.6.0", "https://registry.npmmirror.com/@sentry/vite-plugin/-/vite-plugin-4.6.0.tgz", { "dependencies": { "@sentry/bundler-plugin-core": "4.6.0", "unplugin": "1.0.1" } }, "sha512-fMR2d+EHwbzBa0S1fp45SNUTProxmyFBp+DeBWWQOSP9IU6AH6ea2rqrpMAnp/skkcdW4z4LSRrOEpMZ5rWXLw=="],
+
+ "@shikijs/core": ["@shikijs/core@3.9.2", "https://registry.npmmirror.com/@shikijs/core/-/core-3.9.2.tgz", { "dependencies": { "@shikijs/types": "3.9.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA=="],
+
+ "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.20.0", "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg=="],
+
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.20.0", "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ=="],
+
+ "@shikijs/langs": ["@shikijs/langs@3.20.0", "https://registry.npmmirror.com/@shikijs/langs/-/langs-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA=="],
+
+ "@shikijs/themes": ["@shikijs/themes@3.20.0", "https://registry.npmmirror.com/@shikijs/themes/-/themes-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ=="],
+
+ "@shikijs/transformers": ["@shikijs/transformers@3.9.2", "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-3.9.2.tgz", { "dependencies": { "@shikijs/core": "3.9.2", "@shikijs/types": "3.9.2" } }, "sha512-MW5hT4TyUp6bNAgTExRYLk1NNasVQMTCw1kgbxHcEC0O5cbepPWaB+1k+JzW9r3SP2/R8kiens8/3E6hGKfgsA=="],
+
+ "@shikijs/types": ["@shikijs/types@3.9.2", "https://registry.npmmirror.com/@shikijs/types/-/types-3.9.2.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw=="],
+
+ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+ "@sigstore/bundle": ["@sigstore/bundle@4.0.0", "https://registry.npmmirror.com/@sigstore/bundle/-/bundle-4.0.0.tgz", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A=="],
+
+ "@sigstore/core": ["@sigstore/core@3.2.1", "https://registry.npmmirror.com/@sigstore/core/-/core-3.2.1.tgz", {}, "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g=="],
+
+ "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.5.1", "https://registry.npmmirror.com/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", {}, "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g=="],
+
+ "@sigstore/sign": ["@sigstore/sign@4.1.1", "https://registry.npmmirror.com/@sigstore/sign/-/sign-4.1.1.tgz", { "dependencies": { "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", "make-fetch-happen": "^15.0.4", "proc-log": "^6.1.0" } }, "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ=="],
+
+ "@sigstore/tuf": ["@sigstore/tuf@4.0.2", "https://registry.npmmirror.com/@sigstore/tuf/-/tuf-4.0.2.tgz", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" } }, "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ=="],
+
+ "@sigstore/verify": ["@sigstore/verify@3.1.1", "https://registry.npmmirror.com/@sigstore/verify/-/verify-3.1.1.tgz", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA=="],
+
+ "@silvia-odwyer/photon-node": ["@silvia-odwyer/photon-node@0.3.4", "https://registry.npmmirror.com/@silvia-odwyer/photon-node/-/photon-node-0.3.4.tgz", {}, "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA=="],
+
+ "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "https://registry.npmmirror.com/@sindresorhus/is/-/is-7.2.0.tgz", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="],
+
+ "@slack/bolt": ["@slack/bolt@3.22.0", "https://registry.npmmirror.com/@slack/bolt/-/bolt-3.22.0.tgz", { "dependencies": { "@slack/logger": "^4.0.0", "@slack/oauth": "^2.6.3", "@slack/socket-mode": "^1.3.6", "@slack/types": "^2.13.0", "@slack/web-api": "^6.13.0", "@types/express": "^4.16.1", "@types/promise.allsettled": "^1.0.3", "@types/tsscmp": "^1.0.0", "axios": "^1.7.4", "express": "^4.21.0", "path-to-regexp": "^8.1.0", "promise.allsettled": "^1.0.2", "raw-body": "^2.3.3", "tsscmp": "^1.0.6" } }, "sha512-iKDqGPEJDnrVwxSVlFW6OKTkijd7s4qLBeSufoBsTM0reTyfdp/5izIQVkxNfzjHi3o6qjdYbRXkYad5HBsBog=="],
+
+ "@slack/logger": ["@slack/logger@4.0.1", "https://registry.npmmirror.com/@slack/logger/-/logger-4.0.1.tgz", { "dependencies": { "@types/node": ">=18" } }, "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ=="],
+
+ "@slack/oauth": ["@slack/oauth@2.6.3", "https://registry.npmmirror.com/@slack/oauth/-/oauth-2.6.3.tgz", { "dependencies": { "@slack/logger": "^3.0.0", "@slack/web-api": "^6.12.1", "@types/jsonwebtoken": "^8.3.7", "@types/node": ">=12", "jsonwebtoken": "^9.0.0", "lodash.isstring": "^4.0.1" } }, "sha512-1amXs6xRkJpoH6zSgjVPgGEJXCibKNff9WNDijcejIuVy1HFAl1adh7lehaGNiHhTWfQkfKxBiF+BGn56kvoFw=="],
+
+ "@slack/socket-mode": ["@slack/socket-mode@1.3.6", "https://registry.npmmirror.com/@slack/socket-mode/-/socket-mode-1.3.6.tgz", { "dependencies": { "@slack/logger": "^3.0.0", "@slack/web-api": "^6.12.1", "@types/node": ">=12.0.0", "@types/ws": "^7.4.7", "eventemitter3": "^5", "finity": "^0.5.4", "ws": "^7.5.3" } }, "sha512-G+im7OP7jVqHhiNSdHgv2VVrnN5U7KY845/5EZimZkrD4ZmtV0P3BiWkgeJhPtdLuM7C7i6+M6h6Bh+S4OOalA=="],
+
+ "@slack/types": ["@slack/types@2.21.1", "https://registry.npmmirror.com/@slack/types/-/types-2.21.1.tgz", {}, "sha512-I8vmSjNYWsaxuWPx6dz4yeh0h7vRBWbgAMK14LEmblbZ404BtrPbXs6jDPx4cYgGf8msDGF4A9opLZBu21FViQ=="],
+
+ "@slack/web-api": ["@slack/web-api@6.13.0", "https://registry.npmmirror.com/@slack/web-api/-/web-api-6.13.0.tgz", { "dependencies": { "@slack/logger": "^3.0.0", "@slack/types": "^2.11.0", "@types/is-stream": "^1.1.0", "@types/node": ">=12.0.0", "axios": "^1.7.4", "eventemitter3": "^3.1.0", "form-data": "^2.5.0", "is-electron": "2.2.2", "is-stream": "^1.1.0", "p-queue": "^6.6.1", "p-retry": "^4.0.0" } }, "sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g=="],
+
+ "@smithy/config-resolver": ["@smithy/config-resolver@4.5.5", "https://registry.npmmirror.com/@smithy/config-resolver/-/config-resolver-4.5.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-HehAZr4sq2m+4zHgEqDvtWENy/B5yywMKA8Pl4gBcU3F4ekelpZqDLDxQHdJlguaKNyTq31cZYjLWomzdujQrA=="],
+
+ "@smithy/core": ["@smithy/core@3.24.5", "https://registry.npmmirror.com/@smithy/core/-/core-3.24.5.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-Kt8phUg45M15EjhYAbZ+fFikYneijLu9Liugz8ZsYz2i8j0hzGv27LWKpEHYRfvj+LyCOSijpcR/2i8RouV+cA=="],
+
+ "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.3.6", "https://registry.npmmirror.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.6.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-tHhdiWZfG1ZIh2YcRfPJmY2gHcBmqbAzqm3ER4TIDFYsSEqTD5tICT7cgQ/kI8LRakxp12myOYyK68XPn7MnHw=="],
+
+ "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.7", "https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.7.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ=="],
+
+ "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.3.5", "https://registry.npmmirror.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-M9rMkTar7JcRrvUHsK1271AuWDmrISIPQpQ4TSHmYZ4KMisGnMH0gfjCWnBwdndR7skvvp/UheHhZGvO3Cr8/g=="],
+
+ "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.4.5", "https://registry.npmmirror.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-lUwPPu7DNNVJjeS+gV7g2rDHbW9X1wSRQIsIyzOgBtP7KDMefLhz0kz42AWAxZIFPcOO3pUbtq76LSkVcxLKRw=="],
+
+ "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.3.5", "https://registry.npmmirror.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-QydEYKqvdiS6dJb0tOfDiogt12FzzImt2FnL7gMD72hNrkiUAUKqtStRmkTrdzDKFJ46abe3yH94luCuhtnCkQ=="],
+
+ "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.4.5", "https://registry.npmmirror.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-SK3VMeH0fibgdTg2QeB+O4p7Yy/2E5HBOHJeC58FshkDdeuX8lOgO7PfjYfLyPLP1ch55j91cQqKBzDS0mRjSQ=="],
+
+ "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.3.5", "https://registry.npmmirror.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-DNInwxNX32WtmhiKVrplzFtkKk5ePNHitJYPCnsPrD2EHm06iWJKQo8F8eq5ss94yp/xSfmojYD7nFBsgzrHHQ=="],
+
+ "@smithy/hash-node": ["@smithy/hash-node@4.3.5", "https://registry.npmmirror.com/@smithy/hash-node/-/hash-node-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-/tUIDaB36qjLq/CIhMRIiFXCT7rVGBGAhFmMA9PbC/iW2u3QPNATZuFSdK0JBO3qeSPoHBeudFMmsbFq2Mf5EQ=="],
+
+ "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.3.5", "https://registry.npmmirror.com/@smithy/hash-stream-node/-/hash-stream-node-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-dLboKYf5ezU+b8SDDzVNjSHWHYPiU9aTI7IfIh9GhUpvCkwfdw1zUtK6dAGFHOrI5l1nVmsEWZrcAHophlNKug=="],
+
+ "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.3.5", "https://registry.npmmirror.com/@smithy/invalid-dependency/-/invalid-dependency-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-c8C1GzrU4PcY1QT/HP0ILCTLutyVONT93kPSisOyHoZaXlKQZtV6+RKqolhBtPolGULf59vq2yseagU6+WY82w=="],
+
+ "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.3.5", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-AzWk7NstKv+z3h0GmZlQkDdgcnh3tvBWnBr0zoBY/agV/zaMqEBnpqgF1S+sJAy5yfE1b2KZqiz+uHHV70vOYg=="],
+
+ "@smithy/md5-js": ["@smithy/md5-js@4.3.5", "https://registry.npmmirror.com/@smithy/md5-js/-/md5-js-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-U/zFWFDuNFspkLAtUbatmpevrRjXwQkoGPJTg1hapUsjLKK+aN3u4seX4+aSBzLom+RnZSdWncfSIgG100vsGg=="],
+
+ "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.3.5", "https://registry.npmmirror.com/@smithy/middleware-content-length/-/middleware-content-length-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-lzOzJ4c0t3vkBut02CjdWNgduN3mUWjc1WK9TPr75KVV6OgVWico9wMDn9ZnQN97VJPYfweBW6Dm5CElvQl8BQ=="],
+
+ "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.5.5", "https://registry.npmmirror.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.5.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-8DnkSoUMQAcuT/DHdigsFPti8M/Dm6TPCAsrIQ/bUDGxRkrgGuI++3dXRr8CoUyc9r0kGSCcZHjJje407ydgBQ=="],
+
+ "@smithy/middleware-retry": ["@smithy/middleware-retry@4.6.5", "https://registry.npmmirror.com/@smithy/middleware-retry/-/middleware-retry-4.6.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-fumMIfh5xOFjirylbSzmBX9bgQtrWFtQrosPfkjsJSBzqXVbQMNDGIC8oJBz4V3bokIm2F0CL3bziLtbXR7cbA=="],
+
+ "@smithy/middleware-serde": ["@smithy/middleware-serde@4.3.5", "https://registry.npmmirror.com/@smithy/middleware-serde/-/middleware-serde-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-+7glfRrb7byruZCPAM53TvmK8cx/ghzAThB4EvPzHynAYobtISl0g+DzzSVEC0NQob5BunP9gC9GP+Fcz6H9yw=="],
+
+ "@smithy/middleware-stack": ["@smithy/middleware-stack@4.3.5", "https://registry.npmmirror.com/@smithy/middleware-stack/-/middleware-stack-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-Yj4wjBQZXHePRIy9cBIKfCOn/kPjRlgDPGlr7DjIhwrnz8kWu7Ux7UwPr51P/wcug5oq4nWdBXSY4TV5afBdew=="],
+
+ "@smithy/node-config-provider": ["@smithy/node-config-provider@4.4.5", "https://registry.npmmirror.com/@smithy/node-config-provider/-/node-config-provider-4.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-c2G9QJ4xVZLwAkAf+WQESSSCkKbtt33ytje1klGvTcBn6cKuqV28E+62wbRPHwuTikkB3LQ7CBnNrayCoJur5A=="],
+
+ "@smithy/node-http-handler": ["@smithy/node-http-handler@4.7.5", "https://registry.npmmirror.com/@smithy/node-http-handler/-/node-http-handler-4.7.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-3dA9TQ+ybRSZ/m0wnbZhiBy4Dezjgq1Ib/ZZrYTpJDBgpoLLU/SDzZc/g0x0MNAdOJe1wPcM+x2PBRmoOur+Sw=="],
+
+ "@smithy/property-provider": ["@smithy/property-provider@4.3.5", "https://registry.npmmirror.com/@smithy/property-provider/-/property-provider-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-QNc22/FgfEm/9/rkefShfQUVckH3HWiQ2RPs+40hwAdY65hbg88gombeHwkfMzmVDZjolcyQeyOjnxZRmpavIA=="],
+
+ "@smithy/protocol-http": ["@smithy/protocol-http@5.4.5", "https://registry.npmmirror.com/@smithy/protocol-http/-/protocol-http-5.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-jOD+4WNWQLntiLJn3r82C7BLheEbRCKTbU5U5bskZmT7nwRiGkh0IghuHwHRZ1ZEFXpHltQxxp9/koOPsdluJg=="],
+
+ "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.5.5", "https://registry.npmmirror.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.5.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-W7IPDXj8AZdyH5EWEXmOvN7ao8iN0JKJ0FNLpGcqj08HZc0MmqGcJnGgh3DfUdGYtzrPIEudxs+ovq/EWZgLjg=="],
+
+ "@smithy/signature-v4": ["@smithy/signature-v4@5.4.5", "https://registry.npmmirror.com/@smithy/signature-v4/-/signature-v4-5.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-QBJKWGqIknH0dc9LWpfH1mkdokAx6iXYN3UcQ3eY6uIEyScuoQAhfl94ge7ozUy9WgFUdE8xsvwBjaYBbWmPNA=="],
+
+ "@smithy/smithy-client": ["@smithy/smithy-client@4.13.5", "https://registry.npmmirror.com/@smithy/smithy-client/-/smithy-client-4.13.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-pg9QRQESz3m/5HgAW/z9lA3ln8MSsCWNWc82MX40Djlxpcj/+7DZQ0yIk7tGWYJCVZog/9LBdNl1uEVRAhqm5Q=="],
+
+ "@smithy/types": ["@smithy/types@4.14.2", "https://registry.npmmirror.com/@smithy/types/-/types-4.14.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw=="],
+
+ "@smithy/url-parser": ["@smithy/url-parser@4.3.5", "https://registry.npmmirror.com/@smithy/url-parser/-/url-parser-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-f7kUYrRdLiAHz10WXQXiUkuBFaL2c2ZBD2kSwZyQBh73lWFTvXwdpS9l5irQ/uldk8YMJpm66BozmqCg/3uZvA=="],
+
+ "@smithy/util-base64": ["@smithy/util-base64@4.4.5", "https://registry.npmmirror.com/@smithy/util-base64/-/util-base64-4.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-2J8l+DoX3IIiP75X5SYkJ3mIgOkxW29MxOs7oPjbXLuInQ7UL6zLw2IJHbQ44+eKDBBhTjvt+GgwsTTNBGt8zA=="],
+
+ "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.3.5", "https://registry.npmmirror.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-nQtYwXg4spM6uc0Luq3yck+WXZ1VPfrYkC2SqkQ+YOGks0qR2bKKlSCjidSqfpq+VAY/RJe1O5V+CtBmnT63KQ=="],
+
+ "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.3.5", "https://registry.npmmirror.com/@smithy/util-body-length-node/-/util-body-length-node-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-BAsAed9yWExECwNIi61Le6D8ZTY71MFEFrf3d4L2+uzcbTjFAWxOtymkA1vCV8bNZQN9TGgZo4c68JDsnjNShA=="],
+
+ "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.3.5", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-CthqHx5VTlNIsS5rJni+pIfkGgYPnVFsy9qYiv8e+hMQDPemZod5wTa+2DkrI+vubX51sD6qqcgH3UHqdTf2bw=="],
+
+ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.3.5", "https://registry.npmmirror.com/@smithy/util-config-provider/-/util-config-provider-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-7yflDiFlO+bVXjI7BJe3B8jx5HyGCI146xrkZRwK9pO2ParfgWzgGfPGK3KsXkxcU+EBzIz1kFnX7fJRxAMbQA=="],
+
+ "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.4.5", "https://registry.npmmirror.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-LbE6AGHhQOunqIN5UyWDMgpPwmUHUzrV2NtUOQ+lt6Stpipzo6S7uDyeGtO0GGgUD1balEPCNu8Xfl1AQNiruQ=="],
+
+ "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.3.5", "https://registry.npmmirror.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-72gNpNDQ2iIGbaNmeaF9I58shWsEuD5tNI7my5uXlm1CSPH5i8IKI/nzU50qqB8y+kgw/qTLGgsf0We5qeM/aA=="],
+
+ "@smithy/util-endpoints": ["@smithy/util-endpoints@3.5.5", "https://registry.npmmirror.com/@smithy/util-endpoints/-/util-endpoints-3.5.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-NJhe8KmNjeZ7V+gJsQR5xw0IN47N8pBKosed40xfhelDuYkg8VQ5CVGDcHTEuJq3e3zQb21vnoOOReQothejhA=="],
+
+ "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.3.5", "https://registry.npmmirror.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-+ip3QrXGjDOzV/ciNWPTm6bhJuXjmzugMR19ouXgA26QqhEo0zuXM7pvYE9S4VfX13YmPgSYDPkF4+2bPqIwAg=="],
+
+ "@smithy/util-middleware": ["@smithy/util-middleware@4.3.5", "https://registry.npmmirror.com/@smithy/util-middleware/-/util-middleware-4.3.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-N1IR4bMHIDbqO3GxkJHgqNGsnrd7MNrj+EVqhFqKeRqSBV5I3KCjNllKfnbF9KV0YteGhfLqcMR5CYsPLJqpqw=="],
+
+ "@smithy/util-retry": ["@smithy/util-retry@4.4.5", "https://registry.npmmirror.com/@smithy/util-retry/-/util-retry-4.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-W9Ovy9i02yGqtLlpqZNQuXNxXc5OPfXujnembxN/FxyBtGjJd8vKY0PQYEJ8FNybTOcXG+ZxsSsX23HOb3zQzg=="],
+
+ "@smithy/util-stream": ["@smithy/util-stream@4.6.5", "https://registry.npmmirror.com/@smithy/util-stream/-/util-stream-4.6.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-PFzBVEBP5k8R+mK/c+VAKmtpUTL+KzBIXWJ6oM0GWOb31K+QgymXV9IW03XLPM1wtkC7oAb9ZBN2aswSSVbNFg=="],
+
+ "@smithy/util-utf8": ["@smithy/util-utf8@4.2.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw=="],
+
+ "@smithy/util-waiter": ["@smithy/util-waiter@4.4.5", "https://registry.npmmirror.com/@smithy/util-waiter/-/util-waiter-4.4.5.tgz", { "dependencies": { "@smithy/core": "^3.24.5", "tslib": "^2.6.2" } }, "sha512-EYviebytZE6vplW0AGwZ2Rc3sNuVR83lfUCNZu11VchUiKhMwJqrRWy7iVDTNEwG/vEwItno591Iad6/prj6Bw=="],
+
+ "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "https://registry.npmmirror.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="],
+
+ "@solid-primitives/active-element": ["@solid-primitives/active-element@2.1.3", "https://registry.npmmirror.com/@solid-primitives/active-element/-/active-element-2.1.3.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-9t5K4aR2naVDj950XU8OjnLgOg94a8k5wr6JNOPK+N5ESLsJDq42c1ZP8UKpewi1R+wplMMxiM6OPKRzbxJY7A=="],
+
+ "@solid-primitives/audio": ["@solid-primitives/audio@1.4.2", "https://registry.npmmirror.com/@solid-primitives/audio/-/audio-1.4.2.tgz", { "dependencies": { "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-UMD3ORQfI5Ky8yuKPxidDiEazsjv/dsoiKK5yZxLnsgaeNR1Aym3/77h/qT1jBYeXUgj4DX6t7NMpFUSVr14OQ=="],
+
+ "@solid-primitives/bounds": ["@solid-primitives/bounds@0.1.3", "https://registry.npmmirror.com/@solid-primitives/bounds/-/bounds-0.1.3.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/resize-observer": "^2.1.3", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-UbiyKMdSPmtijcEDnYLQL3zzaejpwWDAJJ4Gt5P0hgVs6A72piov0GyNw7V2SroH7NZFwxlYS22YmOr8A5xc1Q=="],
+
+ "@solid-primitives/event-bus": ["@solid-primitives/event-bus@1.1.2", "https://registry.npmmirror.com/@solid-primitives/event-bus/-/event-bus-1.1.2.tgz", { "dependencies": { "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-l+n10/51neGcMaP3ypYt21bXfoeWh8IaC8k7fYuY3ww2a8S1Zv2N2a7FF5Qn+waTu86l0V8/nRHjkyqVIZBYwA=="],
+
+ "@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.5", "https://registry.npmmirror.com/@solid-primitives/event-listener/-/event-listener-2.4.5.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA=="],
+
+ "@solid-primitives/i18n": ["@solid-primitives/i18n@2.2.1", "https://registry.npmmirror.com/@solid-primitives/i18n/-/i18n-2.2.1.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-TnTnE2Ku11MGYZ1JzhJ8pYscwg1fr9MteoYxPwsfxWfh9Jp5K7RRJncJn9BhOHvNLwROjqOHZ46PT7sPHqbcXw=="],
+
+ "@solid-primitives/keyed": ["@solid-primitives/keyed@1.5.3", "https://registry.npmmirror.com/@solid-primitives/keyed/-/keyed-1.5.3.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-zNadtyYBhJSOjXtogkGHmRxjGdz9KHc8sGGVAGlUABkE8BED2tbIZoxkwSqzOwde8OcUEH0bb5DLZUWIMvyBSA=="],
+
+ "@solid-primitives/map": ["@solid-primitives/map@0.4.13", "https://registry.npmmirror.com/@solid-primitives/map/-/map-0.4.13.tgz", { "dependencies": { "@solid-primitives/trigger": "^1.1.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew=="],
+
+ "@solid-primitives/media": ["@solid-primitives/media@2.3.3", "https://registry.npmmirror.com/@solid-primitives/media/-/media-2.3.3.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA=="],
+
+ "@solid-primitives/props": ["@solid-primitives/props@3.2.3", "https://registry.npmmirror.com/@solid-primitives/props/-/props-3.2.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-XzG6en9gSFwmvbKcATm2BxL63HegZ+BAG5fmHi8jyBppQHcaths7ffz+6vYvwYy3nlgLa20ufJLj7tst+PcHFA=="],
+
+ "@solid-primitives/refs": ["@solid-primitives/refs@1.1.3", "https://registry.npmmirror.com/@solid-primitives/refs/-/refs-1.1.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-aam02fjNKpBteewF/UliPSQCVJsIIGOLEWQOh+ll6R/QePzBOOBMcC4G+5jTaO75JuUS1d/14Q1YXT3X0Ow6iA=="],
+
+ "@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.5", "https://registry.npmmirror.com/@solid-primitives/resize-observer/-/resize-observer-2.1.5.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/static-store": "^0.1.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw=="],
+
+ "@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.3", "https://registry.npmmirror.com/@solid-primitives/rootless/-/rootless-1.5.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA=="],
+
+ "@solid-primitives/scheduled": ["@solid-primitives/scheduled@1.5.3", "https://registry.npmmirror.com/@solid-primitives/scheduled/-/scheduled-1.5.3.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-oNwLE6E6lxJAWrc8QXuwM0k2oU1BnANnkChwMw82aK1j3+mWGJkG1IFe5gCwbV+afYmjI76t9JJV3md/8tLw+g=="],
+
+ "@solid-primitives/scroll": ["@solid-primitives/scroll@2.1.3", "https://registry.npmmirror.com/@solid-primitives/scroll/-/scroll-2.1.3.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-Ejq/Z7zKo/6eIEFr1bFLzXFxiGBCMLuqCM8QB8urr3YdPzjSETFLzYRWUyRiDWaBQN0F7k0SY6S7ig5nWOP7vg=="],
+
+ "@solid-primitives/static-store": ["@solid-primitives/static-store@0.1.3", "https://registry.npmmirror.com/@solid-primitives/static-store/-/static-store-0.1.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ=="],
+
+ "@solid-primitives/storage": ["@solid-primitives/storage@4.3.3", "https://registry.npmmirror.com/@solid-primitives/storage/-/storage-4.3.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "@tauri-apps/plugin-store": "*", "solid-js": "^1.6.12", "solid-start": "*" }, "optionalPeers": ["@tauri-apps/plugin-store", "solid-start"] }, "sha512-ACbNwMZ1s8VAvld6EUXkDkX/US3IhtlPLxg6+B2s9MwNUugwdd51I98LPEaHrdLpqPmyzqgoJe0TxEFlf3Dqrw=="],
+
+ "@solid-primitives/timer": ["@solid-primitives/timer@1.4.4", "https://registry.npmmirror.com/@solid-primitives/timer/-/timer-1.4.4.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-Ayjyb3+v1hyU92vuLUN0tVHq2mmTCPGxSDLGJMsDydRqx9ZfJIc9xj6cxK4XvdY3pif3ps2mIv52pjgToybEpQ=="],
+
+ "@solid-primitives/trigger": ["@solid-primitives/trigger@1.2.3", "https://registry.npmmirror.com/@solid-primitives/trigger/-/trigger-1.2.3.tgz", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-Za2JebEiDyfamjmDwRaESYqBBYOlgYGzB8kHYH0QrkXyLf2qNADlKdGN+z3vWSLCTDcKxChS43Kssjuc0OZhng=="],
+
+ "@solid-primitives/utils": ["@solid-primitives/utils@6.4.0", "https://registry.npmmirror.com/@solid-primitives/utils/-/utils-6.4.0.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A=="],
+
+ "@solid-primitives/websocket": ["@solid-primitives/websocket@1.3.1", "https://registry.npmmirror.com/@solid-primitives/websocket/-/websocket-1.3.1.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-F06tA2FKa5VsnS4E4WEc3jHpsJfXRlMTGOtolugTzCqV3JmJTyvk9UVg1oz6PgGHKGi1CQ91OP8iW34myyJgaQ=="],
+
+ "@solidjs/meta": ["@solidjs/meta@0.29.4", "https://registry.npmmirror.com/@solidjs/meta/-/meta-0.29.4.tgz", { "peerDependencies": { "solid-js": ">=1.8.4" } }, "sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g=="],
+
+ "@solidjs/router": ["@solidjs/router@0.15.4", "https://registry.npmmirror.com/@solidjs/router/-/router-0.15.4.tgz", { "peerDependencies": { "solid-js": "^1.8.6" } }, "sha512-WOpgg9a9T638cR+5FGbFi/IV4l2FpmBs1GpIMSPa0Ce9vyJN7Wts+X2PqMf9IYn0zUj2MlSJtm1gp7/HI/n5TQ=="],
+
+ "@solidjs/start": ["@solidjs/start@https://pkg.pr.new/@solidjs/start@dfb2020", { "dependencies": { "@babel/core": "^7.28.3", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.5", "@solidjs/meta": "^0.29.4", "@tanstack/server-functions-plugin": "1.134.5", "@types/babel__traverse": "^7.28.0", "@types/micromatch": "^4.0.9", "cookie-es": "^2.0.0", "defu": "^6.1.4", "error-stack-parser": "^2.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.3", "fast-glob": "^3.3.3", "h3": "npm:h3@2.0.1-rc.4", "html-to-image": "^1.11.13", "micromatch": "^4.0.8", "path-to-regexp": "^8.2.0", "pathe": "^2.0.3", "radix3": "^1.1.2", "seroval": "^1.3.2", "seroval-plugins": "^1.2.1", "shiki": "^1.26.1", "solid-js": "^1.9.9", "source-map-js": "^1.2.1", "srvx": "^0.9.1", "terracotta": "^1.0.6", "vite": "7.1.10", "vite-plugin-solid": "^2.11.9", "vitest": "^4.0.10" } }, "sha512-7JjjA49VGNOsMRI8QRUhVudZmv0CnJ18SliSgK1ojszs/c3ijftgVkzvXdkSLN4miDTzbkXewf65D6ZBo6W+GQ=="],
+
+ "@speed-highlight/core": ["@speed-highlight/core@1.2.15", "https://registry.npmmirror.com/@speed-highlight/core/-/core-1.2.15.tgz", {}, "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw=="],
+
+ "@standard-community/standard-json": ["@standard-community/standard-json@0.3.5", "https://registry.npmmirror.com/@standard-community/standard-json/-/standard-json-0.3.5.tgz", { "peerDependencies": { "@standard-schema/spec": "^1.0.0", "@types/json-schema": "^7.0.15", "@valibot/to-json-schema": "^1.3.0", "arktype": "^2.1.20", "effect": "^3.16.8", "quansync": "^0.2.11", "sury": "^10.0.0", "typebox": "^1.0.17", "valibot": "^1.1.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.24.5" }, "optionalPeers": ["@valibot/to-json-schema", "arktype", "effect", "sury", "typebox", "valibot", "zod", "zod-to-json-schema"] }, "sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA=="],
+
+ "@standard-community/standard-openapi": ["@standard-community/standard-openapi@0.2.9", "https://registry.npmmirror.com/@standard-community/standard-openapi/-/standard-openapi-0.2.9.tgz", { "peerDependencies": { "@standard-community/standard-json": "^0.3.5", "@standard-schema/spec": "^1.0.0", "arktype": "^2.1.20", "effect": "^3.17.14", "openapi-types": "^12.1.3", "sury": "^10.0.0", "typebox": "^1.0.0", "valibot": "^1.1.0", "zod": "^3.25.0 || ^4.0.0", "zod-openapi": "^4" }, "optionalPeers": ["arktype", "effect", "sury", "typebox", "valibot", "zod", "zod-openapi"] }, "sha512-htj+yldvN1XncyZi4rehbf9kLbu8os2Ke/rfqoZHCMHuw34kiF3LP/yQPdA0tQ940y8nDq3Iou8R3wG+AGGyvg=="],
+
+ "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.0.0.tgz", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="],
+
+ "@storybook/addon-a11y": ["@storybook/addon-a11y@10.4.1", "https://registry.npmmirror.com/@storybook/addon-a11y/-/addon-a11y-10.4.1.tgz", { "dependencies": { "@storybook/global": "^5.0.0", "axe-core": "^4.2.0" }, "peerDependencies": { "storybook": "^10.4.1" } }, "sha512-MGft/IXjJ20a9KbaSVG9bHTAAoanbucKrgEiJJRNqpim8DsXA01+XTdSk17LmiOCB203Rrq9mWgdQ6+79cc8iA=="],
+
+ "@storybook/addon-docs": ["@storybook/addon-docs@10.4.1", "https://registry.npmmirror.com/@storybook/addon-docs/-/addon-docs-10.4.1.tgz", { "dependencies": { "@mdx-js/react": "^3.0.0", "@storybook/csf-plugin": "10.4.1", "@storybook/icons": "^2.0.2", "@storybook/react-dom-shim": "10.4.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.4.1" }, "optionalPeers": ["@types/react"] }, "sha512-IYqUdjoZe4VO2LFZlKL/gwy7DsQSWCq6hX+zc1MBmZo04yycDASk1tte57n9pdlW3ajw9yYMF/+lVBi+xQjyvw=="],
+
+ "@storybook/addon-links": ["@storybook/addon-links@10.4.1", "https://registry.npmmirror.com/@storybook/addon-links/-/addon-links-10.4.1.tgz", { "dependencies": { "@storybook/global": "^5.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.4.1" }, "optionalPeers": ["@types/react", "react"] }, "sha512-h/5D23GwMuHA55sB7XDyhByF9psF7UFmaQOn72pjNAarew5eOpue5A+jXk3AKEYokHbvgQaoz+FrvWo9GEfSKQ=="],
+
+ "@storybook/addon-onboarding": ["@storybook/addon-onboarding@10.4.1", "https://registry.npmmirror.com/@storybook/addon-onboarding/-/addon-onboarding-10.4.1.tgz", { "peerDependencies": { "storybook": "^10.4.1" } }, "sha512-XJ3vaPeXLc8GRrnYKoi0zmAMyT34XTnD6SZNcSV0ceEQrmfZKpLbn6wei1e4oqQRctkRH2QFl/ha7SqqB3yYmQ=="],
+
+ "@storybook/addon-vitest": ["@storybook/addon-vitest@10.4.1", "https://registry.npmmirror.com/@storybook/addon-vitest/-/addon-vitest-10.4.1.tgz", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2" }, "peerDependencies": { "@vitest/browser": "^3.0.0 || ^4.0.0", "@vitest/browser-playwright": "^4.0.0", "@vitest/runner": "^3.0.0 || ^4.0.0", "storybook": "^10.4.1", "vitest": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@vitest/browser", "@vitest/browser-playwright", "@vitest/runner", "vitest"] }, "sha512-ymrX9EOou1x3d21iDhjP3j3XfhOAiflhlPZWKcipULBoJCq/aZPbV68EghzovkJNuGRl9ezMYxbbKxwrMmCmGg=="],
+
+ "@storybook/builder-vite": ["@storybook/builder-vite@10.4.1", "https://registry.npmmirror.com/@storybook/builder-vite/-/builder-vite-10.4.1.tgz", { "dependencies": { "@storybook/csf-plugin": "10.4.1", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^10.4.1", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-/oyQrXoNOqN8SW5hNnYP+I1uvgFxKxWXj/EP6NXYzc5SQwImofgru+D2+6gDhL0+Q//+Hx05DJoQO2omvUJ8bQ=="],
+
+ "@storybook/csf-plugin": ["@storybook/csf-plugin@10.4.1", "https://registry.npmmirror.com/@storybook/csf-plugin/-/csf-plugin-10.4.1.tgz", { "dependencies": { "unplugin": "^2.3.5" }, "peerDependencies": { "esbuild": "*", "rollup": "*", "storybook": "^10.4.1", "vite": "*", "webpack": "*" }, "optionalPeers": ["esbuild", "rollup", "vite", "webpack"] }, "sha512-WdPepGBxDGOUDjYd8KxMtcf+us/2PAcnBczl77XtrnxxHNs0jWesxKkiJ9yiuGrge4BPhDeAj6rxjbBoaHxLBA=="],
+
+ "@storybook/global": ["@storybook/global@5.0.0", "https://registry.npmmirror.com/@storybook/global/-/global-5.0.0.tgz", {}, "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ=="],
+
+ "@storybook/icons": ["@storybook/icons@2.0.2", "https://registry.npmmirror.com/@storybook/icons/-/icons-2.0.2.tgz", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw=="],
+
+ "@storybook/react-dom-shim": ["@storybook/react-dom-shim@10.4.1", "https://registry.npmmirror.com/@storybook/react-dom-shim/-/react-dom-shim-10.4.1.tgz", { "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.4.1" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-6QFqfDNH4DMrt7yHKRfpqRopsVUc/Az+sXIdJ39IetYnHUxL3nW4NVaPc6uy/8Qi8urzUyEXL/nn7cpSIP2aPQ=="],
+
+ "@stripe/stripe-js": ["@stripe/stripe-js@8.6.1", "https://registry.npmmirror.com/@stripe/stripe-js/-/stripe-js-8.6.1.tgz", {}, "sha512-UJ05U2062XDgydbUcETH1AoRQLNhigQ2KmDn1BG8sC3xfzu6JKg95Qt6YozdzFpxl1Npii/02m2LEWFt1RYjVA=="],
+
+ "@swc/helpers": ["@swc/helpers@0.5.23", "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.23.tgz", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw=="],
+
+ "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="],
+
+ "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.1.11.tgz", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="],
+
+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.1.11.tgz", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="],
+
+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="],
+
+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="],
+
+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="],
+
+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="],
+
+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="],
+
+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="],
+
+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="],
+
+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="],
+
+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="],
+
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="],
+
+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="],
+
+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="],
+
+ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.1.11.tgz", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="],
+
+ "@tanstack/directive-functions-plugin": ["@tanstack/directive-functions-plugin@1.134.5", "https://registry.npmmirror.com/@tanstack/directive-functions-plugin/-/directive-functions-plugin-1.134.5.tgz", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.27.7", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@tanstack/router-utils": "1.133.19", "babel-dead-code-elimination": "^1.0.10", "pathe": "^2.0.3", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "vite": ">=6.0.0 || >=7.0.0" } }, "sha512-J3oawV8uBRBbPoLgMdyHt+LxzTNuWRKNJJuCLWsm/yq6v0IQSvIVCgfD2+liIiSnDPxGZ8ExduPXy8IzS70eXw=="],
+
+ "@tanstack/query-core": ["@tanstack/query-core@5.91.2", "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.91.2.tgz", {}, "sha512-Uz2pTgPC1mhqrrSGg18RKCWT/pkduAYtxbcyIyKBhw7dTWjXZIzqmpzO2lBkyWr4hlImQgpu1m1pei3UnkFRWw=="],
+
+ "@tanstack/router-utils": ["@tanstack/router-utils@1.133.19", "https://registry.npmmirror.com/@tanstack/router-utils/-/router-utils-1.133.19.tgz", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.5", "@babel/preset-typescript": "^7.27.1", "ansis": "^4.1.0", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-WEp5D2gPxvlLDRXwD/fV7RXjYtqaqJNXKB/L6OyZEbT+9BG/Ib2d7oG9GSUZNNMGPGYAlhBUOi3xutySsk6rxA=="],
+
+ "@tanstack/server-functions-plugin": ["@tanstack/server-functions-plugin@1.134.5", "https://registry.npmmirror.com/@tanstack/server-functions-plugin/-/server-functions-plugin-1.134.5.tgz", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.27.7", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@tanstack/directive-functions-plugin": "1.134.5", "babel-dead-code-elimination": "^1.0.9", "tiny-invariant": "^1.3.3" } }, "sha512-2sWxq70T+dOEUlE3sHlXjEPhaFZfdPYlWTSkHchWXrFGw2YOAa+hzD6L9wHMjGDQezYd03ue8tQlHG+9Jzbzgw=="],
+
+ "@tanstack/solid-query": ["@tanstack/solid-query@5.91.4", "https://registry.npmmirror.com/@tanstack/solid-query/-/solid-query-5.91.4.tgz", { "dependencies": { "@tanstack/query-core": "5.91.2" }, "peerDependencies": { "solid-js": "^1.6.0" } }, "sha512-oCEgn8iT7WnF/7ISd7usBpUK1C9EdvQfg8ZUpKNKZ4edVClICZrCX6f3/Bp8ZlwQnL21KLc2rp+CejEuehlRxg=="],
+
+ "@testing-library/dom": ["@testing-library/dom@10.4.1", "https://registry.npmmirror.com/@testing-library/dom/-/dom-10.4.1.tgz", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="],
+
+ "@testing-library/jest-dom": ["@testing-library/jest-dom@6.9.1", "https://registry.npmmirror.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "picocolors": "^1.1.1", "redent": "^3.0.0" } }, "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA=="],
+
+ "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "https://registry.npmmirror.com/@testing-library/user-event/-/user-event-14.6.1.tgz", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="],
+
+ "@thisbeyond/solid-dnd": ["@thisbeyond/solid-dnd@0.7.5", "https://registry.npmmirror.com/@thisbeyond/solid-dnd/-/solid-dnd-0.7.5.tgz", { "peerDependencies": { "solid-js": "^1.5" } }, "sha512-DfI5ff+yYGpK9M21LhYwIPlbP2msKxN2ARwuu6GF8tT1GgNVDTI8VCQvH4TJFoVApP9d44izmAcTh/iTCH2UUw=="],
+
+ "@tsconfig/bun": ["@tsconfig/bun@1.0.9", "https://registry.npmmirror.com/@tsconfig/bun/-/bun-1.0.9.tgz", {}, "sha512-4M0/Ivfwcpz325z6CwSifOBZYji3DFOEpY6zEUt0+Xi2qRhzwvmqQN9XAHJh3OVvRJuAqVTLU2abdCplvp6mwQ=="],
+
+ "@tsconfig/node22": ["@tsconfig/node22@22.0.2", "https://registry.npmmirror.com/@tsconfig/node22/-/node22-22.0.2.tgz", {}, "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA=="],
+
+ "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "https://registry.npmmirror.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="],
+
+ "@tufjs/models": ["@tufjs/models@4.1.0", "https://registry.npmmirror.com/@tufjs/models/-/models-4.1.0.tgz", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" } }, "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww=="],
+
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
+
+ "@types/aria-query": ["@types/aria-query@5.0.4", "https://registry.npmmirror.com/@types/aria-query/-/aria-query-5.0.4.tgz", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="],
+
+ "@types/babel__core": ["@types/babel__core@7.20.5", "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
+
+ "@types/babel__generator": ["@types/babel__generator@7.27.0", "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
+
+ "@types/babel__template": ["@types/babel__template@7.4.4", "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
+
+ "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
+
+ "@types/body-parser": ["@types/body-parser@1.19.6", "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.6.tgz", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="],
+
+ "@types/braces": ["@types/braces@3.0.5", "https://registry.npmmirror.com/@types/braces/-/braces-3.0.5.tgz", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="],
+
+ "@types/bun": ["@types/bun@1.3.13", "https://registry.npmmirror.com/@types/bun/-/bun-1.3.13.tgz", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
+
+ "@types/cacache": ["@types/cacache@20.0.1", "https://registry.npmmirror.com/@types/cacache/-/cacache-20.0.1.tgz", { "dependencies": { "@types/node": "*", "minipass": "*" } }, "sha512-QlKW3AFoFr/hvPHwFHMIVUH/ZCYeetBNou3PCmxu5LaNDvrtBlPJtIA6uhmU9JRt9oxj7IYoqoLcpxtzpPiTcw=="],
+
+ "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="],
+
+ "@types/chai": ["@types/chai@5.2.3", "https://registry.npmmirror.com/@types/chai/-/chai-5.2.3.tgz", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
+
+ "@types/connect": ["@types/connect@3.4.38", "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
+
+ "@types/cross-spawn": ["@types/cross-spawn@6.0.6", "https://registry.npmmirror.com/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA=="],
+
+ "@types/d3-geo": ["@types/d3-geo@3.1.0", "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
+
+ "@types/d3-scale": ["@types/d3-scale@4.0.9", "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
+
+ "@types/d3-time": ["@types/d3-time@3.0.4", "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
+
+ "@types/debug": ["@types/debug@4.1.13", "https://registry.npmmirror.com/@types/debug/-/debug-4.1.13.tgz", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="],
+
+ "@types/deep-eql": ["@types/deep-eql@4.0.2", "https://registry.npmmirror.com/@types/deep-eql/-/deep-eql-4.0.2.tgz", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
+
+ "@types/express": ["@types/express@4.17.25", "https://registry.npmmirror.com/@types/express/-/express-4.17.25.tgz", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "^1" } }, "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw=="],
+
+ "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.8", "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA=="],
+
+ "@types/fontkit": ["@types/fontkit@2.0.9", "https://registry.npmmirror.com/@types/fontkit/-/fontkit-2.0.9.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-qNYerFky3muCmZPq+R+B3cUDRA5OONw/oh6aGGFxx2LOBz6yu8eamKusrhkHnC6rc2fm76+G9z9QoWSB2SaQaw=="],
+
+ "@types/fs-extra": ["@types/fs-extra@9.0.13", "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="],
+
+ "@types/geojson": ["@types/geojson@7946.0.16", "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="],
+
+ "@types/http-errors": ["@types/http-errors@2.0.5", "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.5.tgz", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],
+
+ "@types/is-stream": ["@types/is-stream@1.1.0", "https://registry.npmmirror.com/@types/is-stream/-/is-stream-1.1.0.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg=="],
+
+ "@types/js-yaml": ["@types/js-yaml@4.0.9", "https://registry.npmmirror.com/@types/js-yaml/-/js-yaml-4.0.9.tgz", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/jsonwebtoken": ["@types/jsonwebtoken@8.5.9", "https://registry.npmmirror.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg=="],
+
+ "@types/katex": ["@types/katex@0.16.7", "https://registry.npmmirror.com/@types/katex/-/katex-0.16.7.tgz", {}, "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="],
+
+ "@types/keyv": ["@types/keyv@3.1.4", "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="],
+
+ "@types/luxon": ["@types/luxon@3.7.1", "https://registry.npmmirror.com/@types/luxon/-/luxon-3.7.1.tgz", {}, "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg=="],
+
+ "@types/mdast": ["@types/mdast@4.0.4", "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "@types/mdx": ["@types/mdx@2.0.13", "https://registry.npmmirror.com/@types/mdx/-/mdx-2.0.13.tgz", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="],
+
+ "@types/micromatch": ["@types/micromatch@4.0.10", "https://registry.npmmirror.com/@types/micromatch/-/micromatch-4.0.10.tgz", { "dependencies": { "@types/braces": "*" } }, "sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ=="],
+
+ "@types/mime": ["@types/mime@1.3.5", "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
+
+ "@types/mime-types": ["@types/mime-types@3.0.1", "https://registry.npmmirror.com/@types/mime-types/-/mime-types-3.0.1.tgz", {}, "sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ=="],
+
+ "@types/ms": ["@types/ms@2.1.0", "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
+
+ "@types/nlcst": ["@types/nlcst@2.0.3", "https://registry.npmmirror.com/@types/nlcst/-/nlcst-2.0.3.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
+
+ "@types/node": ["@types/node@24.12.2", "https://registry.npmmirror.com/@types/node/-/node-24.12.2.tgz", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/node-fetch": ["@types/node-fetch@2.6.13", "https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.13.tgz", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="],
+
+ "@types/npm-package-arg": ["@types/npm-package-arg@6.1.4", "https://registry.npmmirror.com/@types/npm-package-arg/-/npm-package-arg-6.1.4.tgz", {}, "sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q=="],
+
+ "@types/npm-registry-fetch": ["@types/npm-registry-fetch@8.0.9", "https://registry.npmmirror.com/@types/npm-registry-fetch/-/npm-registry-fetch-8.0.9.tgz", { "dependencies": { "@types/node": "*", "@types/node-fetch": "*", "@types/npm-package-arg": "*", "@types/npmlog": "*", "@types/ssri": "*" } }, "sha512-7NxvodR5Yrop3pb6+n8jhJNyzwOX0+6F+iagNEoi9u1CGxruYAwZD8pvGc9prIkL0+FdX5Xp0p80J9QPrGUp/g=="],
+
+ "@types/npmcli__arborist": ["@types/npmcli__arborist@6.3.3", "https://registry.npmmirror.com/@types/npmcli__arborist/-/npmcli__arborist-6.3.3.tgz", { "dependencies": { "@npm/types": "^1", "@types/cacache": "*", "@types/node": "*", "@types/npmcli__package-json": "*", "@types/pacote": "*" } }, "sha512-kyrX932Qr+/Y4OB47Jamgc2YWa/HlXTCN0KVJsq04XDHUGkfbprJA8rd66zZXHmHmvnz1LR4X17zsE/H8Mklew=="],
+
+ "@types/npmcli__package-json": ["@types/npmcli__package-json@4.0.4", "https://registry.npmmirror.com/@types/npmcli__package-json/-/npmcli__package-json-4.0.4.tgz", {}, "sha512-6QjlFUSHBmZJWuC08bz1ZCx6tm4t+7+OJXAdvM6tL2pI7n6Bh5SIp/YxQvnOLFf8MzCXs2ijyFgrzaiu1UFBGA=="],
+
+ "@types/npmlog": ["@types/npmlog@7.0.0", "https://registry.npmmirror.com/@types/npmlog/-/npmlog-7.0.0.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ=="],
+
+ "@types/pacote": ["@types/pacote@11.1.8", "https://registry.npmmirror.com/@types/pacote/-/pacote-11.1.8.tgz", { "dependencies": { "@types/node": "*", "@types/npm-registry-fetch": "*", "@types/npmlog": "*", "@types/ssri": "*" } }, "sha512-/XLR0VoTh2JEO0jJg1q/e6Rh9bxjBq9vorJuQmtT7rRrXSiWz7e7NsvXVYJQ0i8JxMlBMPPYDTnrRe7MZRFA8Q=="],
+
+ "@types/plist": ["@types/plist@3.0.5", "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz", { "dependencies": { "@types/node": "*", "xmlbuilder": ">=11.0.1" } }, "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA=="],
+
+ "@types/promise.allsettled": ["@types/promise.allsettled@1.0.6", "https://registry.npmmirror.com/@types/promise.allsettled/-/promise.allsettled-1.0.6.tgz", {}, "sha512-wA0UT0HeT2fGHzIFV9kWpYz5mdoyLxKrTgMdZQM++5h6pYAFH73HXcQhefg24nD1yivUFEn5KU+EF4b+CXJ4Wg=="],
+
+ "@types/prop-types": ["@types/prop-types@15.7.15", "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="],
+
+ "@types/qs": ["@types/qs@6.15.1", "https://registry.npmmirror.com/@types/qs/-/qs-6.15.1.tgz", {}, "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw=="],
+
+ "@types/range-parser": ["@types/range-parser@1.2.7", "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="],
+
+ "@types/react": ["@types/react@18.0.25", "https://registry.npmmirror.com/@types/react/-/react-18.0.25.tgz", { "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g=="],
+
+ "@types/responselike": ["@types/responselike@1.0.3", "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="],
+
+ "@types/retry": ["@types/retry@0.12.0", "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
+
+ "@types/sax": ["@types/sax@1.2.7", "https://registry.npmmirror.com/@types/sax/-/sax-1.2.7.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="],
+
+ "@types/scheduler": ["@types/scheduler@0.26.0", "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.26.0.tgz", {}, "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA=="],
+
+ "@types/semver": ["@types/semver@7.7.1", "https://registry.npmmirror.com/@types/semver/-/semver-7.7.1.tgz", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="],
+
+ "@types/send": ["@types/send@0.17.6", "https://registry.npmmirror.com/@types/send/-/send-0.17.6.tgz", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="],
+
+ "@types/serve-static": ["@types/serve-static@1.15.10", "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.10.tgz", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="],
+
+ "@types/ssri": ["@types/ssri@7.1.5", "https://registry.npmmirror.com/@types/ssri/-/ssri-7.1.5.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-odD/56S3B51liILSk5aXJlnYt99S6Rt9EFDDqGtJM26rKHApHcwyU/UoYHrzKkdkHMAIquGWCuHtQTbes+FRQw=="],
+
+ "@types/topojson-client": ["@types/topojson-client@3.1.5", "https://registry.npmmirror.com/@types/topojson-client/-/topojson-client-3.1.5.tgz", { "dependencies": { "@types/geojson": "*", "@types/topojson-specification": "*" } }, "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw=="],
+
+ "@types/topojson-specification": ["@types/topojson-specification@1.0.5", "https://registry.npmmirror.com/@types/topojson-specification/-/topojson-specification-1.0.5.tgz", { "dependencies": { "@types/geojson": "*" } }, "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ=="],
+
+ "@types/trusted-types": ["@types/trusted-types@2.0.7", "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
+
+ "@types/tsscmp": ["@types/tsscmp@1.0.2", "https://registry.npmmirror.com/@types/tsscmp/-/tsscmp-1.0.2.tgz", {}, "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g=="],
+
+ "@types/tunnel": ["@types/tunnel@0.0.3", "https://registry.npmmirror.com/@types/tunnel/-/tunnel-0.0.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA=="],
+
+ "@types/turndown": ["@types/turndown@5.0.5", "https://registry.npmmirror.com/@types/turndown/-/turndown-5.0.5.tgz", {}, "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@types/verror": ["@types/verror@1.10.11", "https://registry.npmmirror.com/@types/verror/-/verror-1.10.11.tgz", {}, "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg=="],
+
+ "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "https://registry.npmmirror.com/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="],
+
+ "@types/which": ["@types/which@3.0.4", "https://registry.npmmirror.com/@types/which/-/which-3.0.4.tgz", {}, "sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w=="],
+
+ "@types/ws": ["@types/ws@8.18.1", "https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
+
+ "@types/yargs": ["@types/yargs@17.0.33", "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="],
+
+ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
+
+ "@types/yauzl": ["@types/yauzl@2.10.3", "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="],
+
+ "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview/-/native-preview-7.0.0-dev.20251207.1.tgz", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251207.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251207.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20251207.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251207.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20251207.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251207.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20251207.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-4QcRnzB0pi9rS0AOvg8kWbmuwHv5X7B2EXHbgcms9+56hsZ8SZrZjNgBJb2rUIodJ4kU5mrkj/xlTTT4r9VcpQ=="],
+
+ "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251207.1.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-waWJnuuvkXh4WdpbTjYf7pyahJzx0ycesV2BylyHrE9OxU9FSKcD/cRLQYvbq3YcBSdF7sZwRLDBer7qTeLsYA=="],
+
+ "@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251207.1.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-3bkD9QuIjxETtp6J1l5X2oKgudJ8z+8fwUq0izCjK1JrIs2vW1aQnbzxhynErSyHWH7URGhHHzcsXHbikckAsg=="],
+
+ "@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251207.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-OjrZBq8XJkB7uCQvT1AZ1FPsp+lT0cHxY5SisE+ZTAU6V0IHAZMwJ7J/mnwlGsBcCKRLBT+lX3hgEuOTSwHr9w=="],
+
+ "@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251207.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-Qhp06OObkwy5B+PlAhAmq+Ls3GVt4LHAovrTRcpLB3Mk3yJ0h9DnIQwPQiayp16TdvTsGHI3jdIX4MGm5L/ghA=="],
+
+ "@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251207.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-fPRw0zfTBeVmrkgi5Le+sSwoeAz6pIdvcsa1OYZcrspueS9hn3qSC5bLEc5yX4NJP1vItadBqyGLUQ7u8FJjow=="],
+
+ "@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251207.1.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-KxY1i+HxeSFfzZ+HVsKwMGBM79laTRZv1ibFqHu22CEsfSPDt4yiV1QFis8Nw7OBXswNqJG/UGqY47VP8FeTvw=="],
+
+ "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20251207.1", "https://registry.npmmirror.com/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251207.1.tgz", { "os": "win32", "cpu": "x64" }, "sha512-5l51HlXjX7lXwo65DEl1IaCFLjmkMtL6K3NrSEamPNeNTtTQwZRa3pQ9V65dCglnnCQ0M3+VF1RqzC7FU0iDKg=="],
+
+ "@typescript/vfs": ["@typescript/vfs@1.6.4", "https://registry.npmmirror.com/@typescript/vfs/-/vfs-1.6.4.tgz", { "dependencies": { "debug": "^4.4.3" }, "peerDependencies": { "typescript": "*" } }, "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ=="],
+
+ "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.5", "https://registry.npmmirror.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="],
+
+ "@upstash/redis": ["@upstash/redis@1.38.0", "https://registry.npmmirror.com/@upstash/redis/-/redis-1.38.0.tgz", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-wu+dZBptlLy0+MCUEoHmzrY/TnmgDey3+c7EbIGwrLqAvkP8yi5MWZHYGIFtAygmL4Bkz2TdFu+eU0vFPncIcg=="],
+
+ "@valibot/to-json-schema": ["@valibot/to-json-schema@1.6.0", "https://registry.npmmirror.com/@valibot/to-json-schema/-/to-json-schema-1.6.0.tgz", { "peerDependencies": { "valibot": "^1.3.0" } }, "sha512-d6rYyK5KVa2XdqamWgZ4/Nr+cXhxjy7lmpe6Iajw15J/jmU+gyxl2IEd1Otg1d7Rl3gOQL5reulnSypzBtYy1A=="],
+
+ "@vercel/oidc": ["@vercel/oidc@3.2.0", "https://registry.npmmirror.com/@vercel/oidc/-/oidc-3.2.0.tgz", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="],
+
+ "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
+
+ "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.8", "https://registry.npmmirror.com/@vitest/coverage-v8/-/coverage-v8-4.1.8.tgz", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.8", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "@vitest/browser": "4.1.8", "vitest": "4.1.8" }, "optionalPeers": ["@vitest/browser"] }, "sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw=="],
+
+ "@vitest/expect": ["@vitest/expect@3.2.4", "https://registry.npmmirror.com/@vitest/expect/-/expect-3.2.4.tgz", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="],
+
+ "@vitest/mocker": ["@vitest/mocker@4.1.7", "https://registry.npmmirror.com/@vitest/mocker/-/mocker-4.1.7.tgz", { "dependencies": { "@vitest/spy": "4.1.7", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA=="],
+
+ "@vitest/pretty-format": ["@vitest/pretty-format@4.1.7", "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-4.1.7.tgz", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw=="],
+
+ "@vitest/runner": ["@vitest/runner@4.1.7", "https://registry.npmmirror.com/@vitest/runner/-/runner-4.1.7.tgz", { "dependencies": { "@vitest/utils": "4.1.7", "pathe": "^2.0.3" } }, "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw=="],
+
+ "@vitest/snapshot": ["@vitest/snapshot@4.1.7", "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-4.1.7.tgz", { "dependencies": { "@vitest/pretty-format": "4.1.7", "@vitest/utils": "4.1.7", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw=="],
+
+ "@vitest/spy": ["@vitest/spy@3.2.4", "https://registry.npmmirror.com/@vitest/spy/-/spy-3.2.4.tgz", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="],
+
+ "@vitest/utils": ["@vitest/utils@4.1.7", "https://registry.npmmirror.com/@vitest/utils/-/utils-4.1.7.tgz", { "dependencies": { "@vitest/pretty-format": "4.1.7", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw=="],
+
+ "@volar/kit": ["@volar/kit@2.4.28", "https://registry.npmmirror.com/@volar/kit/-/kit-2.4.28.tgz", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="],
+
+ "@volar/language-core": ["@volar/language-core@2.4.28", "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.28.tgz", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="],
+
+ "@volar/language-server": ["@volar/language-server@2.4.28", "https://registry.npmmirror.com/@volar/language-server/-/language-server-2.4.28.tgz", { "dependencies": { "@volar/language-core": "2.4.28", "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw=="],
+
+ "@volar/language-service": ["@volar/language-service@2.4.28", "https://registry.npmmirror.com/@volar/language-service/-/language-service-2.4.28.tgz", { "dependencies": { "@volar/language-core": "2.4.28", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw=="],
+
+ "@volar/source-map": ["@volar/source-map@2.4.28", "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.28.tgz", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="],
+
+ "@volar/typescript": ["@volar/typescript@2.4.28", "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.28.tgz", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="],
+
+ "@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "https://registry.npmmirror.com/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="],
+
+ "@vscode/l10n": ["@vscode/l10n@0.0.18", "https://registry.npmmirror.com/@vscode/l10n/-/l10n-0.0.18.tgz", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
+
+ "@webcontainer/env": ["@webcontainer/env@1.1.1", "https://registry.npmmirror.com/@webcontainer/env/-/env-1.1.1.tgz", {}, "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng=="],
+
+ "@webgpu/types": ["@webgpu/types@0.1.54", "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.54.tgz", {}, "sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg=="],
+
+ "@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.13.tgz", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="],
+
+ "@zip.js/zip.js": ["@zip.js/zip.js@2.7.62", "https://registry.npmmirror.com/@zip.js/zip.js/-/zip.js-2.7.62.tgz", {}, "sha512-OaLvZ8j4gCkLn048ypkZu29KX30r8/OfFF2w4Jo5WXFr+J04J+lzJ5TKZBVgFXhlvSkqNFQdfnY1Q8TMTCyBVA=="],
+
+ "abbrev": ["abbrev@4.0.0", "https://registry.npmmirror.com/abbrev/-/abbrev-4.0.0.tgz", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="],
+
+ "abort-controller": ["abort-controller@3.0.0", "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
+
+ "abstract-logging": ["abstract-logging@2.0.1", "https://registry.npmmirror.com/abstract-logging/-/abstract-logging-2.0.1.tgz", {}, "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="],
+
+ "accepts": ["accepts@1.3.8", "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
+
+ "acorn": ["acorn@8.16.0", "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "acorn-jsx": ["acorn-jsx@5.3.2", "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+ "acorn-walk": ["acorn-walk@8.3.2", "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="],
+
+ "agent-base": ["agent-base@7.1.4", "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
+
+ "agentkeepalive": ["agentkeepalive@4.6.0", "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
+
+ "ai": ["ai@6.0.168", "https://registry.npmmirror.com/ai/-/ai-6.0.168.tgz", { "dependencies": { "@ai-sdk/gateway": "3.0.104", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-2HqCJuO+1V2aV7vfYs5LFEUfxbkGX+5oa54q/gCCTL7KLTdbxcCu5D7TdLA5kwsrs3Szgjah9q6D9tpjHM3hUQ=="],
+
+ "ai-gateway-provider": ["ai-gateway-provider@3.1.2", "https://registry.npmmirror.com/ai-gateway-provider/-/ai-gateway-provider-3.1.2.tgz", { "optionalDependencies": { "@ai-sdk/amazon-bedrock": "^4.0.62", "@ai-sdk/anthropic": "^3.0.46", "@ai-sdk/azure": "^3.0.31", "@ai-sdk/cerebras": "^2.0.34", "@ai-sdk/cohere": "^3.0.21", "@ai-sdk/deepgram": "^2.0.20", "@ai-sdk/deepseek": "^2.0.20", "@ai-sdk/elevenlabs": "^2.0.20", "@ai-sdk/fireworks": "^2.0.34", "@ai-sdk/google": "^3.0.30", "@ai-sdk/google-vertex": "^4.0.61", "@ai-sdk/groq": "^3.0.24", "@ai-sdk/mistral": "^3.0.20", "@ai-sdk/openai": "^3.0.30", "@ai-sdk/perplexity": "^3.0.19", "@ai-sdk/xai": "^3.0.57", "@openrouter/ai-sdk-provider": "^2.2.3" }, "peerDependencies": { "@ai-sdk/openai-compatible": "^2.0.0", "@ai-sdk/provider": "^3.0.0", "@ai-sdk/provider-utils": "^4.0.0", "ai": "^6.0.0" } }, "sha512-krGNnJSoO/gJ7Hbe5nQDlsBpDUGIBGtMQTRUaW7s1MylsfvLduba0TLWzQaGtOmNRkP0pGhtGlwsnS6FNQMlyw=="],
+
+ "ajv": ["ajv@8.20.0", "https://registry.npmmirror.com/ajv/-/ajv-8.20.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
+
+ "ajv-draft-04": ["ajv-draft-04@1.0.0", "https://registry.npmmirror.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
+
+ "ajv-formats": ["ajv-formats@3.0.1", "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-3.0.1.tgz", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
+
+ "ajv-keywords": ["ajv-keywords@3.5.2", "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="],
+
+ "ansi-align": ["ansi-align@3.0.1", "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
+
+ "ansi-colors": ["ansi-colors@4.1.3", "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
+
+ "ansi-regex": ["ansi-regex@6.2.2", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "ansis": ["ansis@4.3.1", "https://registry.npmmirror.com/ansis/-/ansis-4.3.1.tgz", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="],
+
+ "any-promise": ["any-promise@1.3.0", "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "anymatch": ["anymatch@3.1.3", "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
+
+ "app-builder-bin": ["app-builder-bin@5.0.0-alpha.12", "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", {}, "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w=="],
+
+ "app-builder-lib": ["app-builder-lib@26.15.2", "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-26.15.2.tgz", { "dependencies": { "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", "@electron/rebuild": "^4.0.4", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@noble/hashes": "^2.2.0", "@peculiar/webcrypto": "^1.7.1", "@types/fs-extra": "9.0.13", "ajv": "^8.18.0", "asn1js": "^3.0.10", "async-exit-hook": "^2.0.1", "builder-util": "26.15.0", "builder-util-runtime": "9.7.0", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "26.15.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.2.5", "pkijs": "^3.4.0", "plist": "3.1.0", "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", "semver": "~7.7.3", "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", "unzipper": "^0.12.3", "which": "^5.0.0" }, "peerDependencies": { "dmg-builder": "26.15.2", "electron-builder-squirrel-windows": "26.15.2" } }, "sha512-3mYfKOjr/ZY7gFESOcq8kylBMgGPpmlQYnpBVit4p6zIg0t/8bkWBILdMMtnjFyN2jllyBf225T8dLlz3D6oBQ=="],
+
+ "archiver": ["archiver@7.0.1", "https://registry.npmmirror.com/archiver/-/archiver-7.0.1.tgz", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="],
+
+ "archiver-utils": ["archiver-utils@5.0.2", "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-5.0.2.tgz", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="],
+
+ "arctic": ["arctic@2.3.4", "https://registry.npmmirror.com/arctic/-/arctic-2.3.4.tgz", { "dependencies": { "@oslojs/crypto": "1.0.1", "@oslojs/encoding": "1.1.0", "@oslojs/jwt": "0.2.0" } }, "sha512-+p30BOWsctZp+CVYCt7oAean/hWGW42sH5LAcRQX56ttEkFJWbzXBhmSpibbzwSJkRrotmsA+oAoJoVsU0f5xA=="],
+
+ "arg": ["arg@5.0.2", "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
+
+ "argparse": ["argparse@1.0.10", "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "aria-hidden": ["aria-hidden@1.2.6", "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.6.tgz", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
+
+ "aria-query": ["aria-query@5.3.2", "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+ "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
+
+ "array-flatten": ["array-flatten@1.1.1", "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="],
+
+ "array-iterate": ["array-iterate@2.0.1", "https://registry.npmmirror.com/array-iterate/-/array-iterate-2.0.1.tgz", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
+
+ "array-union": ["array-union@2.1.0", "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
+
+ "array.prototype.map": ["array.prototype.map@1.0.8", "https://registry.npmmirror.com/array.prototype.map/-/array.prototype.map-1.0.8.tgz", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-array-method-boxes-properly": "^1.0.0", "es-object-atoms": "^1.0.0", "is-string": "^1.1.1" } }, "sha512-YocPM7bYYu2hXGxWpb5vwZ8cMeudNHYtYBcUDY4Z1GWa53qcnQMWSl25jeBHNzitjl9HW2AWW4ro/S/nftUaOQ=="],
+
+ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
+
+ "asn1js": ["asn1js@3.0.10", "https://registry.npmmirror.com/asn1js/-/asn1js-3.0.10.tgz", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.5", "tslib": "^2.8.1" } }, "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg=="],
+
+ "assert-plus": ["assert-plus@1.0.0", "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="],
+
+ "assertion-error": ["assertion-error@2.0.1", "https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
+
+ "ast-types": ["ast-types@0.16.1", "https://registry.npmmirror.com/ast-types/-/ast-types-0.16.1.tgz", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="],
+
+ "ast-v8-to-istanbul": ["ast-v8-to-istanbul@1.0.3", "https://registry.npmmirror.com/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.3.tgz", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^10.0.0" } }, "sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg=="],
+
+ "astral-regex": ["astral-regex@2.0.0", "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="],
+
+ "astring": ["astring@1.9.0", "https://registry.npmmirror.com/astring/-/astring-1.9.0.tgz", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
+
+ "astro": ["astro@5.7.13", "https://registry.npmmirror.com/astro/-/astro-5.7.13.tgz", { "dependencies": { "@astrojs/compiler": "^2.11.0", "@astrojs/internal-helpers": "0.6.1", "@astrojs/markdown-remark": "6.3.1", "@astrojs/telemetry": "3.2.1", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.1", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.6.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.3.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.1.0", "picomatch": "^4.0.2", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.1", "shiki": "^3.2.1", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.5", "ultrahtml": "^1.6.0", "unifont": "~0.5.0", "unist-util-visit": "^5.0.0", "unstorage": "^1.15.0", "vfile": "^6.0.3", "vite": "^6.3.4", "vitefu": "^1.0.6", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-cRGq2llKOhV3XMcYwQpfBIUcssN6HEK5CRbcMxAfd9OcFhvWE7KUy50zLioAZVVl3AqgUTJoNTlmZfD2eG0G1w=="],
+
+ "astro-expressive-code": ["astro-expressive-code@0.41.7", "https://registry.npmmirror.com/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", { "dependencies": { "rehype-expressive-code": "^0.41.7" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" } }, "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ=="],
+
+ "async": ["async@3.2.6", "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
+
+ "async-exit-hook": ["async-exit-hook@2.0.1", "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="],
+
+ "async-function": ["async-function@1.0.0", "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
+
+ "asynckit": ["asynckit@0.4.0", "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
+
+ "at-least-node": ["at-least-node@1.0.0", "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="],
+
+ "atomic-sleep": ["atomic-sleep@1.0.0", "https://registry.npmmirror.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="],
+
+ "atomically": ["atomically@2.1.1", "https://registry.npmmirror.com/atomically/-/atomically-2.1.1.tgz", { "dependencies": { "stubborn-fs": "^2.0.0", "when-exit": "^2.1.4" } }, "sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ=="],
+
+ "autoprefixer": ["autoprefixer@10.5.0", "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.5.0.tgz", { "dependencies": { "browserslist": "^4.28.2", "caniuse-lite": "^1.0.30001787", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong=="],
+
+ "available-typed-arrays": ["available-typed-arrays@1.0.7", "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
+
+ "avvio": ["avvio@9.2.0", "https://registry.npmmirror.com/avvio/-/avvio-9.2.0.tgz", { "dependencies": { "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ=="],
+
+ "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="],
+
+ "aws4": ["aws4@1.13.2", "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="],
+
+ "aws4fetch": ["aws4fetch@1.0.20", "https://registry.npmmirror.com/aws4fetch/-/aws4fetch-1.0.20.tgz", {}, "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g=="],
+
+ "axe-core": ["axe-core@4.11.4", "https://registry.npmmirror.com/axe-core/-/axe-core-4.11.4.tgz", {}, "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA=="],
+
+ "axios": ["axios@1.16.1", "https://registry.npmmirror.com/axios/-/axios-1.16.1.tgz", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A=="],
+
+ "axobject-query": ["axobject-query@4.1.0", "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.1.0.tgz", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+ "b4a": ["b4a@1.8.1", "https://registry.npmmirror.com/b4a/-/b4a-1.8.1.tgz", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="],
+
+ "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "https://registry.npmmirror.com/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="],
+
+ "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.7", "https://registry.npmmirror.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.7.tgz", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ=="],
+
+ "babel-plugin-module-resolver": ["babel-plugin-module-resolver@5.0.2", "https://registry.npmmirror.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz", { "dependencies": { "find-babel-config": "^2.1.1", "glob": "^9.3.3", "pkg-up": "^3.1.0", "reselect": "^4.1.7", "resolve": "^1.22.8" } }, "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg=="],
+
+ "babel-preset-solid": ["babel-preset-solid@1.9.12", "https://registry.npmmirror.com/babel-preset-solid/-/babel-preset-solid-1.9.12.tgz", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.6" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.12" }, "optionalPeers": ["solid-js"] }, "sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg=="],
+
+ "bail": ["bail@2.0.2", "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+
+ "balanced-match": ["balanced-match@4.0.4", "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
+
+ "bare-events": ["bare-events@2.8.3", "https://registry.npmmirror.com/bare-events/-/bare-events-2.8.3.tgz", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw=="],
+
+ "bare-fs": ["bare-fs@4.7.1", "https://registry.npmmirror.com/bare-fs/-/bare-fs-4.7.1.tgz", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw=="],
+
+ "bare-os": ["bare-os@3.9.1", "https://registry.npmmirror.com/bare-os/-/bare-os-3.9.1.tgz", {}, "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ=="],
+
+ "bare-path": ["bare-path@3.0.0", "https://registry.npmmirror.com/bare-path/-/bare-path-3.0.0.tgz", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="],
+
+ "bare-stream": ["bare-stream@2.13.1", "https://registry.npmmirror.com/bare-stream/-/bare-stream-2.13.1.tgz", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow=="],
+
+ "bare-url": ["bare-url@2.4.3", "https://registry.npmmirror.com/bare-url/-/bare-url-2.4.3.tgz", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ=="],
+
+ "base-64": ["base-64@1.0.0", "https://registry.npmmirror.com/base-64/-/base-64-1.0.0.tgz", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
+
+ "base64-js": ["base64-js@1.5.1", "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.33", "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw=="],
+
+ "bcp-47": ["bcp-47@2.1.0", "https://registry.npmmirror.com/bcp-47/-/bcp-47-2.1.0.tgz", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w=="],
+
+ "bcp-47-match": ["bcp-47-match@2.0.3", "https://registry.npmmirror.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="],
+
+ "before-after-hook": ["before-after-hook@2.2.3", "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-2.2.3.tgz", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="],
+
+ "bignumber.js": ["bignumber.js@9.3.1", "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
+
+ "bin-links": ["bin-links@6.0.2", "https://registry.npmmirror.com/bin-links/-/bin-links-6.0.2.tgz", { "dependencies": { "cmd-shim": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "proc-log": "^6.0.0", "read-cmd-shim": "^6.0.0", "write-file-atomic": "^7.0.0" } }, "sha512-frE1t78WOwJ45PKV2cF2tNPjTcs9L1J9s6VkrV59wanRP4GlaomuxYPVma7BwthMg8WnfSory4w5PTE6FZZ81w=="],
+
+ "binary": ["binary@0.3.0", "https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz", { "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" } }, "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg=="],
+
+ "binary-extensions": ["binary-extensions@2.3.0", "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
+
+ "blake3-wasm": ["blake3-wasm@2.1.5", "https://registry.npmmirror.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],
+
+ "blob-to-buffer": ["blob-to-buffer@1.2.9", "https://registry.npmmirror.com/blob-to-buffer/-/blob-to-buffer-1.2.9.tgz", {}, "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA=="],
+
+ "bluebird": ["bluebird@3.7.2", "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="],
+
+ "body-parser": ["body-parser@1.20.5", "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.5.tgz", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA=="],
+
+ "bonjour-service": ["bonjour-service@1.3.0", "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.3.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA=="],
+
+ "boolbase": ["boolbase@1.0.0", "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "boolean": ["boolean@3.2.0", "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="],
+
+ "bottleneck": ["bottleneck@2.19.5", "https://registry.npmmirror.com/bottleneck/-/bottleneck-2.19.5.tgz", {}, "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="],
+
+ "bowser": ["bowser@2.14.1", "https://registry.npmmirror.com/bowser/-/bowser-2.14.1.tgz", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="],
+
+ "boxen": ["boxen@8.0.1", "https://registry.npmmirror.com/boxen/-/boxen-8.0.1.tgz", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="],
+
+ "brace-expansion": ["brace-expansion@5.0.6", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
+
+ "braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "brotli": ["brotli@1.3.3", "https://registry.npmmirror.com/brotli/-/brotli-1.3.3.tgz", { "dependencies": { "base64-js": "^1.1.2" } }, "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="],
+
+ "browserslist": ["browserslist@4.28.2", "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.2.tgz", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="],
+
+ "buffer": ["buffer@6.0.3", "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "buffer-crc32": ["buffer-crc32@1.0.0", "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="],
+
+ "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
+
+ "buffer-from": ["buffer-from@1.1.2", "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
+
+ "buffers": ["buffers@0.1.1", "https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz", {}, "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ=="],
+
+ "builder-util": ["builder-util@26.15.0", "https://registry.npmmirror.com/builder-util/-/builder-util-26.15.0.tgz", { "dependencies": { "@types/debug": "^4.1.6", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" } }, "sha512-dUx+HxVbiNsNQ4mGe1PyoC/tBmsHwBNDLdBuqWCj+rhHFE9lHgrXiGYKAM1uNlznhAaUSyMlms84VeSSr3gOBA=="],
+
+ "builder-util-runtime": ["builder-util-runtime@9.7.0", "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw=="],
+
+ "bun-ffi-structs": ["bun-ffi-structs@0.2.2", "https://registry.npmmirror.com/bun-ffi-structs/-/bun-ffi-structs-0.2.2.tgz", { "peerDependencies": { "typescript": "^5" } }, "sha512-N/ZWtyN0piZlrXQT7TO0V+q952orYqkfhXRXM1Hcbb+R3QSiBH4vLnib187Mrs1H7pWIYECAmPeapGYDOMCl+w=="],
+
+ "bun-pty": ["bun-pty@0.4.8", "https://registry.npmmirror.com/bun-pty/-/bun-pty-0.4.8.tgz", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="],
+
+ "bun-types": ["bun-types@1.3.13", "https://registry.npmmirror.com/bun-types/-/bun-types-1.3.13.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
+
+ "bundle-name": ["bundle-name@4.1.0", "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
+
+ "bytes": ["bytes@3.1.2", "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
+
+ "bytestreamjs": ["bytestreamjs@2.0.1", "https://registry.npmmirror.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz", {}, "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ=="],
+
+ "c12": ["c12@3.3.3", "https://registry.npmmirror.com/c12/-/c12-3.3.3.tgz", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.8", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q=="],
+
+ "cac": ["cac@6.7.14", "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+
+ "cacache": ["cacache@20.0.4", "https://registry.npmmirror.com/cacache/-/cacache-20.0.4.tgz", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" } }, "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA=="],
+
+ "cacheable-lookup": ["cacheable-lookup@5.0.4", "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="],
+
+ "cacheable-request": ["cacheable-request@7.0.4", "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="],
+
+ "call-bind": ["call-bind@1.0.9", "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.9.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="],
+
+ "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
+
+ "call-bound": ["call-bound@1.0.4", "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
+
+ "camel-case": ["camel-case@4.1.2", "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="],
+
+ "camelcase": ["camelcase@8.0.0", "https://registry.npmmirror.com/camelcase/-/camelcase-8.0.0.tgz", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
+
+ "camelcase-css": ["camelcase-css@2.0.1", "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
+
+ "caniuse-lite": ["caniuse-lite@1.0.30001793", "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="],
+
+ "ccount": ["ccount@2.0.1", "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "chai": ["chai@5.3.3", "https://registry.npmmirror.com/chai/-/chai-5.3.3.tgz", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="],
+
+ "chainsaw": ["chainsaw@0.1.0", "https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz", { "dependencies": { "traverse": ">=0.3.0 <0.4" } }, "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ=="],
+
+ "chalk": ["chalk@5.6.2", "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
+ "character-entities": ["character-entities@2.0.2", "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "character-reference-invalid": ["character-reference-invalid@2.0.1", "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
+
+ "chart.js": ["chart.js@4.5.1", "https://registry.npmmirror.com/chart.js/-/chart.js-4.5.1.tgz", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="],
+
+ "check-error": ["check-error@2.1.3", "https://registry.npmmirror.com/check-error/-/check-error-2.1.3.tgz", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="],
+
+ "cheerio": ["cheerio@1.0.0-rc.12", "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "htmlparser2": "^8.0.1", "parse5": "^7.0.0", "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q=="],
+
+ "cheerio-select": ["cheerio-select@2.1.0", "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="],
+
+ "chokidar": ["chokidar@4.0.3", "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "chownr": ["chownr@3.0.0", "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
+
+ "chromium-pickle-js": ["chromium-pickle-js@0.2.0", "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", {}, "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw=="],
+
+ "ci-info": ["ci-info@4.4.0", "https://registry.npmmirror.com/ci-info/-/ci-info-4.4.0.tgz", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
+
+ "citty": ["citty@0.1.6", "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="],
+
+ "classnames": ["classnames@2.3.2", "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz", {}, "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="],
+
+ "clean-css": ["clean-css@5.3.3", "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="],
+
+ "cli-boxes": ["cli-boxes@3.0.0", "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-3.0.0.tgz", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
+
+ "cli-spinners": ["cli-spinners@3.4.0", "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-3.4.0.tgz", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="],
+
+ "cli-truncate": ["cli-truncate@4.0.0", "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-4.0.0.tgz", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="],
+
+ "clipboardy": ["clipboardy@4.0.0", "https://registry.npmmirror.com/clipboardy/-/clipboardy-4.0.0.tgz", { "dependencies": { "execa": "^8.0.1", "is-wsl": "^3.1.0", "is64bit": "^2.0.0" } }, "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w=="],
+
+ "cliui": ["cliui@9.0.1", "https://registry.npmmirror.com/cliui/-/cliui-9.0.1.tgz", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="],
+
+ "clone": ["clone@2.1.2", "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
+
+ "clone-response": ["clone-response@1.0.3", "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="],
+
+ "cloudflare": ["cloudflare@5.2.0", "https://registry.npmmirror.com/cloudflare/-/cloudflare-5.2.0.tgz", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-dVzqDpPFYR9ApEC9e+JJshFJZXcw4HzM8W+3DHzO5oy9+8rLC53G7x6fEf9A7/gSuSCxuvndzui5qJKftfIM9A=="],
+
+ "clsx": ["clsx@2.1.1", "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "cluster-key-slot": ["cluster-key-slot@1.1.1", "https://registry.npmmirror.com/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", {}, "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw=="],
+
+ "cmd-shim": ["cmd-shim@8.0.0", "https://registry.npmmirror.com/cmd-shim/-/cmd-shim-8.0.0.tgz", {}, "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="],
+
+ "collapse-white-space": ["collapse-white-space@2.1.0", "https://registry.npmmirror.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="],
+
+ "color": ["color@4.2.3", "https://registry.npmmirror.com/color/-/color-4.2.3.tgz", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
+
+ "color-convert": ["color-convert@2.0.1", "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "color-string": ["color-string@1.9.1", "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
+
+ "color-support": ["color-support@1.1.3", "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="],
+
+ "combined-stream": ["combined-stream@1.0.8", "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "commander": ["commander@14.0.2", "https://registry.npmmirror.com/commander/-/commander-14.0.2.tgz", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="],
+
+ "common-ancestor-path": ["common-ancestor-path@2.0.0", "https://registry.npmmirror.com/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="],
+
+ "compare-version": ["compare-version@0.1.2", "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz", {}, "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A=="],
+
+ "compress-commons": ["compress-commons@6.0.2", "https://registry.npmmirror.com/compress-commons/-/compress-commons-6.0.2.tgz", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="],
+
+ "concat-map": ["concat-map@0.0.1", "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "condense-newlines": ["condense-newlines@0.2.1", "https://registry.npmmirror.com/condense-newlines/-/condense-newlines-0.2.1.tgz", { "dependencies": { "extend-shallow": "^2.0.1", "is-whitespace": "^0.3.0", "kind-of": "^3.0.2" } }, "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg=="],
+
+ "conf": ["conf@15.1.0", "https://registry.npmmirror.com/conf/-/conf-15.1.0.tgz", { "dependencies": { "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "atomically": "^2.0.3", "debounce-fn": "^6.0.0", "dot-prop": "^10.0.0", "env-paths": "^3.0.0", "json-schema-typed": "^8.0.1", "semver": "^7.7.2", "uint8array-extras": "^1.5.0" } }, "sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og=="],
+
+ "confbox": ["confbox@0.2.4", "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="],
+
+ "config-chain": ["config-chain@1.1.13", "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="],
+
+ "consola": ["consola@3.4.2", "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+
+ "content-disposition": ["content-disposition@0.5.4", "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="],
+
+ "content-type": ["content-type@1.0.5", "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
+
+ "convert-source-map": ["convert-source-map@2.0.0", "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
+
+ "cookie": ["cookie@1.1.1", "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
+
+ "cookie-es": ["cookie-es@2.0.1", "https://registry.npmmirror.com/cookie-es/-/cookie-es-2.0.1.tgz", {}, "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA=="],
+
+ "cookie-signature": ["cookie-signature@1.0.7", "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.7.tgz", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="],
+
+ "core-util-is": ["core-util-is@1.0.3", "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
+
+ "cors": ["cors@2.8.6", "https://registry.npmmirror.com/cors/-/cors-2.8.6.tgz", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
+
+ "crc": ["crc@3.8.0", "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz", { "dependencies": { "buffer": "^5.1.0" } }, "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ=="],
+
+ "crc-32": ["crc-32@1.2.2", "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="],
+
+ "crc32-stream": ["crc32-stream@6.0.0", "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-6.0.0.tgz", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="],
+
+ "cross-dirname": ["cross-dirname@0.1.0", "https://registry.npmmirror.com/cross-dirname/-/cross-dirname-0.1.0.tgz", {}, "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q=="],
+
+ "cross-fetch": ["cross-fetch@3.2.0", "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.2.0.tgz", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "crossws": ["crossws@0.4.5", "https://registry.npmmirror.com/crossws/-/crossws-0.4.5.tgz", { "peerDependencies": { "srvx": ">=0.11.5" }, "optionalPeers": ["srvx"] }, "sha512-wUR89x/Rw7/8t+vn0CmGDYM9TD6VtARGb0LD5jq2wjtMy1vCP4M+sm6N6TigWeTYvnA8MoW29NqqXD0ep0rfBA=="],
+
+ "css-select": ["css-select@5.2.2", "https://registry.npmmirror.com/css-select/-/css-select-5.2.2.tgz", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+
+ "css-selector-parser": ["css-selector-parser@3.3.0", "https://registry.npmmirror.com/css-selector-parser/-/css-selector-parser-3.3.0.tgz", {}, "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g=="],
+
+ "css-tree": ["css-tree@3.2.1", "https://registry.npmmirror.com/css-tree/-/css-tree-3.2.1.tgz", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="],
+
+ "css-what": ["css-what@6.2.2", "https://registry.npmmirror.com/css-what/-/css-what-6.2.2.tgz", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "css.escape": ["css.escape@1.5.1", "https://registry.npmmirror.com/css.escape/-/css.escape-1.5.1.tgz", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="],
+
+ "cssesc": ["cssesc@3.0.0", "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "csstype": ["csstype@3.2.3", "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "d3-array": ["d3-array@3.2.4", "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
+
+ "d3-color": ["d3-color@3.1.0", "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
+
+ "d3-format": ["d3-format@3.1.2", "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.2.tgz", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="],
+
+ "d3-geo": ["d3-geo@3.1.1", "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
+
+ "d3-interpolate": ["d3-interpolate@3.0.1", "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
+
+ "d3-scale": ["d3-scale@4.0.2", "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
+
+ "d3-time": ["d3-time@3.1.0", "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
+
+ "d3-time-format": ["d3-time-format@4.1.0", "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
+
+ "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
+
+ "data-view-buffer": ["data-view-buffer@1.0.2", "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
+
+ "data-view-byte-length": ["data-view-byte-length@1.0.2", "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
+
+ "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
+
+ "db0": ["db0@0.3.4", "https://registry.npmmirror.com/db0/-/db0-0.3.4.tgz", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="],
+
+ "debounce-fn": ["debounce-fn@6.0.0", "https://registry.npmmirror.com/debounce-fn/-/debounce-fn-6.0.0.tgz", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ=="],
+
+ "debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "decimal.js": ["decimal.js@10.5.0", "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.5.0.tgz", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="],
+
+ "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],
+
+ "decompress-response": ["decompress-response@6.0.0", "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="],
+
+ "deep-eql": ["deep-eql@5.0.2", "https://registry.npmmirror.com/deep-eql/-/deep-eql-5.0.2.tgz", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
+
+ "deepmerge": ["deepmerge@4.3.1", "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
+
+ "default-browser": ["default-browser@5.5.0", "https://registry.npmmirror.com/default-browser/-/default-browser-5.5.0.tgz", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="],
+
+ "default-browser-id": ["default-browser-id@5.0.1", "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.1.tgz", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
+
+ "defer-to-connect": ["defer-to-connect@2.0.1", "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="],
+
+ "define-data-property": ["define-data-property@1.1.4", "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
+
+ "define-lazy-prop": ["define-lazy-prop@3.0.0", "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
+
+ "define-properties": ["define-properties@1.2.1", "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
+
+ "defu": ["defu@6.1.7", "https://registry.npmmirror.com/defu/-/defu-6.1.7.tgz", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="],
+
+ "delayed-stream": ["delayed-stream@1.0.0", "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
+
+ "denque": ["denque@2.1.0", "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="],
+
+ "depd": ["depd@2.0.0", "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
+
+ "deprecation": ["deprecation@2.3.1", "https://registry.npmmirror.com/deprecation/-/deprecation-2.3.1.tgz", {}, "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="],
+
+ "dequal": ["dequal@2.0.3", "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "destr": ["destr@2.0.5", "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
+
+ "destroy": ["destroy@1.2.0", "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
+
+ "detect-libc": ["detect-libc@1.0.3", "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
+
+ "detect-node": ["detect-node@2.1.0", "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="],
+
+ "detect-node-es": ["detect-node-es@1.1.0", "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
+
+ "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "https://registry.npmmirror.com/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
+
+ "devalue": ["devalue@5.8.1", "https://registry.npmmirror.com/devalue/-/devalue-5.8.1.tgz", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="],
+
+ "devlop": ["devlop@1.1.0", "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "dfa": ["dfa@1.2.0", "https://registry.npmmirror.com/dfa/-/dfa-1.2.0.tgz", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="],
+
+ "diacritics": ["diacritics@1.3.0", "https://registry.npmmirror.com/diacritics/-/diacritics-1.3.0.tgz", {}, "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA=="],
+
+ "didyoumean": ["didyoumean@1.2.2", "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
+
+ "diff": ["diff@8.0.2", "https://registry.npmmirror.com/diff/-/diff-8.0.2.tgz", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="],
+
+ "dir-compare": ["dir-compare@4.2.0", "https://registry.npmmirror.com/dir-compare/-/dir-compare-4.2.0.tgz", { "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ=="],
+
+ "dir-glob": ["dir-glob@3.0.1", "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
+
+ "direction": ["direction@2.0.1", "https://registry.npmmirror.com/direction/-/direction-2.0.1.tgz", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="],
+
+ "dlv": ["dlv@1.1.3", "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
+
+ "dmg-builder": ["dmg-builder@26.15.2", "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-26.15.2.tgz", { "dependencies": { "app-builder-lib": "26.15.2", "builder-util": "26.15.0", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0" } }, "sha512-fMkjRqKyPtsz4Kzu/qGP0BGjqzMCIgp+/7kw/u6YH6lvn/8hvL3c0TXhoFayBoYdpPCnEinnCHztd4bW7/jetA=="],
+
+ "dmg-license": ["dmg-license@1.0.11", "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz", { "dependencies": { "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", "crc": "^3.8.0", "iconv-corefoundation": "^1.1.7", "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" }, "os": "darwin", "bin": { "dmg-license": "bin/dmg-license.js" } }, "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q=="],
+
+ "dns-packet": ["dns-packet@5.6.1", "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz", { "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" } }, "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw=="],
+
+ "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="],
+
+ "dom-serializer": ["dom-serializer@2.0.0", "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "dompurify": ["dompurify@3.3.1", "https://registry.npmmirror.com/dompurify/-/dompurify-3.3.1.tgz", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="],
+
+ "domutils": ["domutils@3.2.2", "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
+
+ "dot-case": ["dot-case@3.0.4", "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="],
+
+ "dot-prop": ["dot-prop@8.0.2", "https://registry.npmmirror.com/dot-prop/-/dot-prop-8.0.2.tgz", { "dependencies": { "type-fest": "^3.8.0" } }, "sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ=="],
+
+ "dotenv": ["dotenv@16.6.1", "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="],
+
+ "dotenv-expand": ["dotenv-expand@11.0.7", "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="],
+
+ "drizzle-kit": ["drizzle-kit@1.0.0-rc.2", "https://registry.npmmirror.com/drizzle-kit/-/drizzle-kit-1.0.0-rc.2.tgz", { "dependencies": { "@drizzle-team/brocli": "^0.11.0", "@js-temporal/polyfill": "^0.5.1", "esbuild": "^0.25.10", "get-tsconfig": "^4.13.6", "jiti": "^2.6.1" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-TRxUmj1wDA2QCt3GvuhfamvIa66wJ7+MzSxBMKkpRtYScjHTumT9BE+x6daSzuEacSrPEuUH5/cW1uo5RkoPIg=="],
+
+ "drizzle-orm": ["drizzle-orm@1.0.0-rc.2", "https://registry.npmmirror.com/drizzle-orm/-/drizzle-orm-1.0.0-rc.2.tgz", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@effect/sql-pg": ">=4.0.0-beta.58 || >=4.0.0", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@sinclair/typebox": ">=0.34.8", "@sqlitecloud/drivers": ">=1.0.653", "@tidbcloud/serverless": "*", "@tursodatabase/database": ">=0.2.1", "@tursodatabase/database-common": ">=0.2.1", "@tursodatabase/database-wasm": ">=0.2.1", "@types/better-sqlite3": "*", "@types/mssql": "^9.1.4", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "arktype": ">=2.0.0", "better-sqlite3": ">=9.3.0", "bun-types": "*", "effect": ">=4.0.0-beta.58 || >=4.0.0", "expo-sqlite": ">=14.0.0", "mssql": "^11.0.1", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5", "typebox": ">=1.0.0", "valibot": ">=1.0.0-beta.7", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@effect/sql-pg", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@sinclair/typebox", "@sqlitecloud/drivers", "@tidbcloud/serverless", "@tursodatabase/database", "@tursodatabase/database-common", "@tursodatabase/database-wasm", "@types/better-sqlite3", "@types/mssql", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "arktype", "better-sqlite3", "bun-types", "effect", "expo-sqlite", "mssql", "mysql2", "pg", "postgres", "sql.js", "sqlite3", "typebox", "valibot", "zod"] }, "sha512-UXYDkbplF5wX0hwxll+80QhEwUvAJLBu+tAK/d4fna18kLE6VuliAzufF/ieDEIJeSnLRYgtmsXD6x1Xuy1kIg=="],
+
+ "dset": ["dset@3.1.4", "https://registry.npmmirror.com/dset/-/dset-3.1.4.tgz", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
+
+ "dunder-proto": ["dunder-proto@1.0.1", "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
+
+ "duplexer2": ["duplexer2@0.1.4", "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz", { "dependencies": { "readable-stream": "^2.0.2" } }, "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="],
+
+ "eastasianwidth": ["eastasianwidth@0.2.0", "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
+
+ "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
+
+ "editorconfig": ["editorconfig@1.0.7", "https://registry.npmmirror.com/editorconfig/-/editorconfig-1.0.7.tgz", { "dependencies": { "@one-ini/wasm": "0.1.1", "commander": "^10.0.0", "minimatch": "^9.0.1", "semver": "^7.5.3" }, "bin": { "editorconfig": "bin/editorconfig" } }, "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw=="],
+
+ "ee-first": ["ee-first@1.1.1", "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
+
+ "effect": ["effect@4.0.0-beta.74", "https://registry.npmmirror.com/effect/-/effect-4.0.0-beta.74.tgz", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.8.0", "find-my-way-ts": "^0.1.6", "ini": "^7.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^2.0.1", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^14.0.0", "yaml": "^2.9.0" } }, "sha512-Yx+Kh12U+i2FmjwEfKs+ePFmpMd43RPD1oGqc/VraSS9bYzvF0Ff3PojwEFEVEewp8xc92Uxu28gTspU4qyvHA=="],
+
+ "ejs": ["ejs@3.1.10", "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="],
+
+ "electron": ["electron@42.3.3", "https://registry.npmmirror.com/electron/-/electron-42.3.3.tgz", { "dependencies": { "@electron/get": "^5.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js", "install-electron": "install.js" } }, "sha512-0MwYp9wTb7TrtTalOYqeW+suqd9T/Znstr/nDLKqFGIjHdBZX339guo3mQqTPURRZ/UQmYM4uMpzKpI5wLptfQ=="],
+
+ "electron-builder": ["electron-builder@26.15.2", "https://registry.npmmirror.com/electron-builder/-/electron-builder-26.15.2.tgz", { "dependencies": { "app-builder-lib": "26.15.2", "builder-util": "26.15.0", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "26.15.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "./cli.js", "install-app-deps": "./install-app-deps.js" } }, "sha512-veKM9+dCljaC5A74Pwc0ZWQ9arOHREXWh9hUIf8NGg49ch7x+IB4QhbMzIrV5ONZIXM2OEkaxW11cAPjPtoi4A=="],
+
+ "electron-builder-squirrel-windows": ["electron-builder-squirrel-windows@26.8.1", "https://registry.npmmirror.com/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "electron-winstaller": "5.4.0" } }, "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA=="],
+
+ "electron-context-menu": ["electron-context-menu@4.1.2", "https://registry.npmmirror.com/electron-context-menu/-/electron-context-menu-4.1.2.tgz", { "dependencies": { "cli-truncate": "^4.0.0", "electron-dl": "^4.0.0", "electron-is-dev": "^3.0.1" } }, "sha512-9xYTUV0oRqKL50N9W71IrXNdVRB0LuBp3R1zkUdUc2wfIa2/QZwYYj5RLuO7Tn7ZSLVIaO3X6u+EIBK+cBvzrQ=="],
+
+ "electron-dl": ["electron-dl@4.0.0", "https://registry.npmmirror.com/electron-dl/-/electron-dl-4.0.0.tgz", { "dependencies": { "ext-name": "^5.0.0", "pupa": "^3.1.0", "unused-filename": "^4.0.1" } }, "sha512-USiB9816d2JzKv0LiSbreRfTg5lDk3lWh0vlx/gugCO92ZIJkHVH0UM18EHvKeadErP6Xn4yiTphWzYfbA2Ong=="],
+
+ "electron-is-dev": ["electron-is-dev@3.0.1", "https://registry.npmmirror.com/electron-is-dev/-/electron-is-dev-3.0.1.tgz", {}, "sha512-8TjjAh8Ec51hUi3o4TaU0mD3GMTOESi866oRNavj9A3IQJ7pmv+MJVmdZBFGw4GFT36X7bkqnuDNYvkQgvyI8Q=="],
+
+ "electron-log": ["electron-log@5.4.4", "https://registry.npmmirror.com/electron-log/-/electron-log-5.4.4.tgz", {}, "sha512-istWgaXjBfURBSS8LWVW9C3jsc6+ac+tY1lXrQEOTp0lVj+a4OlO1Tmqb36GgnEUDv92DGC9VI1HNXwJinWpgA=="],
+
+ "electron-publish": ["electron-publish@26.15.1", "https://registry.npmmirror.com/electron-publish/-/electron-publish-26.15.1.tgz", { "dependencies": { "@types/fs-extra": "^9.0.11", "aws4": "^1.13.2", "builder-util": "26.15.0", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } }, "sha512-BMgMHOyexWn0UnOC+Afffw0DMrr0yfLp4U8YsLXwoJ3Da7LS7WUnz21teYZqO0gaApE1KgsjREWmbPqvF5JcPg=="],
+
+ "electron-store": ["electron-store@11.0.2", "https://registry.npmmirror.com/electron-store/-/electron-store-11.0.2.tgz", { "dependencies": { "conf": "^15.0.2", "type-fest": "^5.0.1" } }, "sha512-4VkNRdN+BImL2KcCi41WvAYbh6zLX5AUTi4so68yPqiItjbgTjqpEnGAqasgnG+lB6GuAyUltKwVopp6Uv+gwQ=="],
+
+ "electron-to-chromium": ["electron-to-chromium@1.5.364", "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.364.tgz", {}, "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw=="],
+
+ "electron-updater": ["electron-updater@6.8.9", "https://registry.npmmirror.com/electron-updater/-/electron-updater-6.8.9.tgz", { "dependencies": { "builder-util-runtime": "9.7.0", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", "semver": "~7.7.3", "tiny-typed-emitter": "^2.1.0" } }, "sha512-ZhVxM9iGONUpZGI1FxdMRgJjUFXi7AYGVa5PwKlO1tV1/4zDxQmfKpXOHVztKrd6L9rLcFjERvi1Mf2vxyTkig=="],
+
+ "electron-vite": ["electron-vite@5.0.0", "https://registry.npmmirror.com/electron-vite/-/electron-vite-5.0.0.tgz", { "dependencies": { "@babel/core": "^7.28.4", "@babel/plugin-transform-arrow-functions": "^7.27.1", "cac": "^6.7.14", "esbuild": "^0.25.11", "magic-string": "^0.30.19", "picocolors": "^1.1.1" }, "peerDependencies": { "@swc/core": "^1.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@swc/core"], "bin": { "electron-vite": "bin/electron-vite.js" } }, "sha512-OHp/vjdlubNlhNkPkL/+3JD34ii5ov7M0GpuXEVdQeqdQ3ulvVR7Dg/rNBLfS5XPIFwgoBLDf9sjjrL+CuDyRQ=="],
+
+ "electron-window-state": ["electron-window-state@5.0.3", "https://registry.npmmirror.com/electron-window-state/-/electron-window-state-5.0.3.tgz", { "dependencies": { "jsonfile": "^4.0.0", "mkdirp": "^0.5.1" } }, "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg=="],
+
+ "electron-winstaller": ["electron-winstaller@5.4.0", "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.4.0.tgz", { "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", "lodash": "^4.17.21", "temp": "^0.9.0" }, "optionalDependencies": { "@electron/windows-sign": "^1.1.2" } }, "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg=="],
+
+ "emmet": ["emmet@2.4.11", "https://registry.npmmirror.com/emmet/-/emmet-2.4.11.tgz", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="],
+
+ "emoji-regex": ["emoji-regex@10.6.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "https://registry.npmmirror.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
+
+ "encodeurl": ["encodeurl@2.0.0", "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
+
+ "encoding": ["encoding@0.1.13", "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="],
+
+ "end-of-stream": ["end-of-stream@1.4.5", "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
+
+ "engine.io-client": ["engine.io-client@6.6.5", "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-6.6.5.tgz", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.20.1", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-QCwxUDULPlXv8F6tqMMKx5dNkTe6OaBYRMPYeXKBlyOoKvAmE0ac6pW7fFhSscJ/5SI7666/U/B+MElbsrJlIg=="],
+
+ "engine.io-parser": ["engine.io-parser@5.2.3", "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="],
+
+ "enhanced-resolve": ["enhanced-resolve@5.22.1", "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww=="],
+
+ "entities": ["entities@7.0.1", "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
+
+ "env-paths": ["env-paths@3.0.0", "https://registry.npmmirror.com/env-paths/-/env-paths-3.0.0.tgz", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="],
+
+ "err-code": ["err-code@2.0.3", "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="],
+
+ "error-stack-parser": ["error-stack-parser@2.1.4", "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="],
+
+ "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="],
+
+ "es-abstract": ["es-abstract@1.24.2", "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.2.tgz", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg=="],
+
+ "es-array-method-boxes-properly": ["es-array-method-boxes-properly@1.0.0", "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", {}, "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="],
+
+ "es-define-property": ["es-define-property@1.0.1", "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
+
+ "es-errors": ["es-errors@1.3.0", "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
+
+ "es-get-iterator": ["es-get-iterator@1.1.3", "https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", "is-string": "^1.0.7", "isarray": "^2.0.5", "stop-iteration-iterator": "^1.0.0" } }, "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw=="],
+
+ "es-module-lexer": ["es-module-lexer@1.7.0", "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
+
+ "es-object-atoms": ["es-object-atoms@1.1.2", "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="],
+
+ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
+
+ "es-to-primitive": ["es-to-primitive@1.3.0", "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
+
+ "es6-error": ["es6-error@4.1.1", "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="],
+
+ "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "https://registry.npmmirror.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="],
+
+ "esast-util-from-js": ["esast-util-from-js@2.0.1", "https://registry.npmmirror.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="],
+
+ "esbuild": ["esbuild@0.25.12", "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
+
+ "esbuild-plugin-copy": ["esbuild-plugin-copy@2.1.1", "https://registry.npmmirror.com/esbuild-plugin-copy/-/esbuild-plugin-copy-2.1.1.tgz", { "dependencies": { "chalk": "^4.1.2", "chokidar": "^3.5.3", "fs-extra": "^10.0.1", "globby": "^11.0.3" }, "peerDependencies": { "esbuild": ">= 0.14.0" } }, "sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw=="],
+
+ "escalade": ["escalade@3.2.0", "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "escape-goat": ["escape-goat@4.0.0", "https://registry.npmmirror.com/escape-goat/-/escape-goat-4.0.0.tgz", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="],
+
+ "escape-html": ["escape-html@1.0.3", "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
+
+ "escape-string-regexp": ["escape-string-regexp@5.0.0", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "esprima": ["esprima@4.0.1", "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+
+ "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "https://registry.npmmirror.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="],
+
+ "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "https://registry.npmmirror.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="],
+
+ "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "https://registry.npmmirror.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="],
+
+ "estree-util-scope": ["estree-util-scope@1.0.0", "https://registry.npmmirror.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="],
+
+ "estree-util-to-js": ["estree-util-to-js@2.0.0", "https://registry.npmmirror.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="],
+
+ "estree-util-visit": ["estree-util-visit@2.0.0", "https://registry.npmmirror.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="],
+
+ "estree-walker": ["estree-walker@3.0.3", "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
+
+ "etag": ["etag@1.8.1", "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
+
+ "event-target-shim": ["event-target-shim@5.0.1", "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
+
+ "eventemitter3": ["eventemitter3@5.0.4", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
+
+ "events": ["events@3.3.0", "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "events-universal": ["events-universal@1.0.1", "https://registry.npmmirror.com/events-universal/-/events-universal-1.0.1.tgz", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="],
+
+ "eventsource": ["eventsource@3.0.7", "https://registry.npmmirror.com/eventsource/-/eventsource-3.0.7.tgz", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
+
+ "eventsource-parser": ["eventsource-parser@3.1.0", "https://registry.npmmirror.com/eventsource-parser/-/eventsource-parser-3.1.0.tgz", {}, "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg=="],
+
+ "execa": ["execa@8.0.1", "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="],
+
+ "exit-hook": ["exit-hook@2.2.1", "https://registry.npmmirror.com/exit-hook/-/exit-hook-2.2.1.tgz", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="],
+
+ "expect-type": ["expect-type@1.3.0", "https://registry.npmmirror.com/expect-type/-/expect-type-1.3.0.tgz", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],
+
+ "exponential-backoff": ["exponential-backoff@3.1.3", "https://registry.npmmirror.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="],
+
+ "express": ["express@4.22.2", "https://registry.npmmirror.com/express/-/express-4.22.2.tgz", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="],
+
+ "express-rate-limit": ["express-rate-limit@8.5.2", "https://registry.npmmirror.com/express-rate-limit/-/express-rate-limit-8.5.2.tgz", { "dependencies": { "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A=="],
+
+ "expressive-code": ["expressive-code@0.41.7", "https://registry.npmmirror.com/expressive-code/-/expressive-code-0.41.7.tgz", { "dependencies": { "@expressive-code/core": "^0.41.7", "@expressive-code/plugin-frames": "^0.41.7", "@expressive-code/plugin-shiki": "^0.41.7", "@expressive-code/plugin-text-markers": "^0.41.7" } }, "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA=="],
+
+ "exsolve": ["exsolve@1.0.8", "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="],
+
+ "ext-list": ["ext-list@2.2.2", "https://registry.npmmirror.com/ext-list/-/ext-list-2.2.2.tgz", { "dependencies": { "mime-db": "^1.28.0" } }, "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA=="],
+
+ "ext-name": ["ext-name@5.0.0", "https://registry.npmmirror.com/ext-name/-/ext-name-5.0.0.tgz", { "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" } }, "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ=="],
+
+ "extend": ["extend@3.0.2", "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
+
+ "extend-shallow": ["extend-shallow@2.0.1", "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
+
+ "extract-zip": ["extract-zip@2.0.1", "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="],
+
+ "extsprintf": ["extsprintf@1.4.1", "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="],
+
+ "fast-check": ["fast-check@4.8.0", "https://registry.npmmirror.com/fast-check/-/fast-check-4.8.0.tgz", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg=="],
+
+ "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "https://registry.npmmirror.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-fifo": ["fast-fifo@1.3.2", "https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
+
+ "fast-glob": ["fast-glob@3.3.3", "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-json-stringify": ["fast-json-stringify@6.4.0", "https://registry.npmmirror.com/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz", { "dependencies": { "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0", "json-schema-ref-resolver": "^3.0.0", "rfdc": "^1.2.0" } }, "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ=="],
+
+ "fast-querystring": ["fast-querystring@1.1.2", "https://registry.npmmirror.com/fast-querystring/-/fast-querystring-1.1.2.tgz", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="],
+
+ "fast-uri": ["fast-uri@3.1.2", "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.2.tgz", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
+
+ "fast-xml-builder": ["fast-xml-builder@1.2.0", "https://registry.npmmirror.com/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", { "dependencies": { "path-expression-matcher": "^1.5.0", "xml-naming": "^0.1.0" } }, "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q=="],
+
+ "fast-xml-parser": ["fast-xml-parser@4.4.1", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw=="],
+
+ "fastify": ["fastify@5.8.5", "https://registry.npmmirror.com/fastify/-/fastify-5.8.5.tgz", { "dependencies": { "@fastify/ajv-compiler": "^4.0.5", "@fastify/error": "^4.0.0", "@fastify/fast-json-stringify-compiler": "^5.0.0", "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", "avvio": "^9.0.0", "fast-json-stringify": "^6.0.0", "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^9.14.0 || ^10.1.0", "process-warning": "^5.0.0", "rfdc": "^1.3.1", "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } }, "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q=="],
+
+ "fastify-plugin": ["fastify-plugin@5.1.0", "https://registry.npmmirror.com/fastify-plugin/-/fastify-plugin-5.1.0.tgz", {}, "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw=="],
+
+ "fastq": ["fastq@1.20.1", "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+
+ "fd-slicer": ["fd-slicer@1.1.0", "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="],
+
+ "fdir": ["fdir@6.5.0", "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fetch-blob": ["fetch-blob@3.2.0", "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
+
+ "filelist": ["filelist@1.0.6", "https://registry.npmmirror.com/filelist/-/filelist-1.0.6.tgz", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="],
+
+ "fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "finalhandler": ["finalhandler@1.3.2", "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="],
+
+ "find-babel-config": ["find-babel-config@2.1.2", "https://registry.npmmirror.com/find-babel-config/-/find-babel-config-2.1.2.tgz", { "dependencies": { "json5": "^2.2.3" } }, "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg=="],
+
+ "find-my-way": ["find-my-way@9.6.0", "https://registry.npmmirror.com/find-my-way/-/find-my-way-9.6.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ=="],
+
+ "find-my-way-ts": ["find-my-way-ts@0.1.6", "https://registry.npmmirror.com/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="],
+
+ "find-up": ["find-up@5.0.0", "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "finity": ["finity@0.5.4", "https://registry.npmmirror.com/finity/-/finity-0.5.4.tgz", {}, "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA=="],
+
+ "flattie": ["flattie@1.1.1", "https://registry.npmmirror.com/flattie/-/flattie-1.1.1.tgz", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
+
+ "follow-redirects": ["follow-redirects@1.16.0", "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz", { "peerDependencies": { "debug": "*" }, "optionalPeers": ["debug"] }, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="],
+
+ "fontace": ["fontace@0.3.1", "https://registry.npmmirror.com/fontace/-/fontace-0.3.1.tgz", { "dependencies": { "@types/fontkit": "^2.0.8", "fontkit": "^2.0.4" } }, "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg=="],
+
+ "fontkit": ["fontkit@2.0.4", "https://registry.npmmirror.com/fontkit/-/fontkit-2.0.4.tgz", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="],
+
+ "for-each": ["for-each@0.3.5", "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
+
+ "foreground-child": ["foreground-child@3.3.1", "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
+
+ "form-data": ["form-data@4.0.5", "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
+
+ "form-data-encoder": ["form-data-encoder@1.7.2", "https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="],
+
+ "formdata-node": ["formdata-node@4.4.1", "https://registry.npmmirror.com/formdata-node/-/formdata-node-4.4.1.tgz", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="],
+
+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
+
+ "forwarded": ["forwarded@0.2.0", "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
+
+ "fraction.js": ["fraction.js@5.3.4", "https://registry.npmmirror.com/fraction.js/-/fraction.js-5.3.4.tgz", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
+
+ "framer-motion": ["framer-motion@8.5.5", "https://registry.npmmirror.com/framer-motion/-/framer-motion-8.5.5.tgz", { "dependencies": { "@motionone/dom": "^10.15.3", "hey-listen": "^1.0.8", "tslib": "^2.4.0" }, "optionalDependencies": { "@emotion/is-prop-valid": "^0.8.2" }, "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0" } }, "sha512-5IDx5bxkjWHWUF3CVJoSyUVOtrbAxtzYBBowRE2uYI/6VYhkEBD+rbTHEGuUmbGHRj6YqqSfoG7Aa1cLyWCrBA=="],
+
+ "fresh": ["fresh@0.5.2", "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
+
+ "fs-extra": ["fs-extra@10.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
+
+ "fs-minipass": ["fs-minipass@3.0.3", "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-3.0.3.tgz", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="],
+
+ "fs.realpath": ["fs.realpath@1.0.0", "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="],
+
+ "fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "function-bind": ["function-bind@1.1.2", "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+
+ "function.prototype.name": ["function.prototype.name@1.1.8", "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
+
+ "functions-have-names": ["functions-have-names@1.2.3", "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
+
+ "fuzzysort": ["fuzzysort@3.1.0", "https://registry.npmmirror.com/fuzzysort/-/fuzzysort-3.1.0.tgz", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="],
+
+ "gaxios": ["gaxios@7.1.4", "https://registry.npmmirror.com/gaxios/-/gaxios-7.1.4.tgz", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA=="],
+
+ "gcp-metadata": ["gcp-metadata@8.1.2", "https://registry.npmmirror.com/gcp-metadata/-/gcp-metadata-8.1.2.tgz", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="],
+
+ "generate-function": ["generate-function@2.3.1", "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="],
+
+ "generator-function": ["generator-function@2.0.1", "https://registry.npmmirror.com/generator-function/-/generator-function-2.0.1.tgz", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="],
+
+ "gensync": ["gensync@1.0.0-beta.2", "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
+
+ "get-caller-file": ["get-caller-file@2.0.5", "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
+
+ "get-east-asian-width": ["get-east-asian-width@1.6.0", "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
+
+ "get-intrinsic": ["get-intrinsic@1.3.0", "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
+
+ "get-nonce": ["get-nonce@1.0.1", "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
+
+ "get-port": ["get-port@7.2.0", "https://registry.npmmirror.com/get-port/-/get-port-7.2.0.tgz", {}, "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg=="],
+
+ "get-proto": ["get-proto@1.0.1", "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
+
+ "get-stream": ["get-stream@5.2.0", "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
+
+ "get-symbol-description": ["get-symbol-description@1.1.0", "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
+
+ "get-tsconfig": ["get-tsconfig@4.14.0", "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="],
+
+ "ghostty-web": ["ghostty-web@github:anomalyco/ghostty-web#20bd361", {}, "anomalyco-ghostty-web-20bd361", "sha512-dW0nwaiBBcun9y5WJSvm3HxDLe5o9V0xLCndQvWonRVubU8CS1PHxZpLffyPt1YujPWC13ez03aWxcuKBPYYGQ=="],
+
+ "giget": ["giget@2.0.0", "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="],
+
+ "github-slugger": ["github-slugger@2.0.0", "https://registry.npmmirror.com/github-slugger/-/github-slugger-2.0.0.tgz", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
+
+ "gitlab-ai-provider": ["gitlab-ai-provider@6.9.3", "https://registry.npmmirror.com/gitlab-ai-provider/-/gitlab-ai-provider-6.9.3.tgz", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=3.0.0", "@ai-sdk/provider-utils": ">=4.0.0" } }, "sha512-lWo6b6es5+k9iXaDIvE9ECzyK4zfEza4+dQ5FN8SJpEuVRi3ZBCpHIOTa32QoYEDCBaiPh+tcyca86PfNodmlg=="],
+
+ "glob": ["glob@13.0.5", "https://registry.npmmirror.com/glob/-/glob-13.0.5.tgz", { "dependencies": { "minimatch": "^10.2.1", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-BzXxZg24Ibra1pbQ/zE7Kys4Ua1ks7Bn6pKLkVPZ9FZe4JQS6/Q7ef3LG1H+k7lUf5l4T3PLSyYyYJVYUvfgTw=="],
+
+ "glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "glob-to-regexp": ["glob-to-regexp@0.4.1", "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
+
+ "global-agent": ["global-agent@3.0.0", "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="],
+
+ "globalthis": ["globalthis@1.0.4", "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
+
+ "globby": ["globby@11.0.4", "https://registry.npmmirror.com/globby/-/globby-11.0.4.tgz", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" } }, "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg=="],
+
+ "google-auth-library": ["google-auth-library@10.5.0", "https://registry.npmmirror.com/google-auth-library/-/google-auth-library-10.5.0.tgz", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.0.0", "gcp-metadata": "^8.0.0", "google-logging-utils": "^1.0.0", "gtoken": "^8.0.0", "jws": "^4.0.0" } }, "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w=="],
+
+ "google-logging-utils": ["google-logging-utils@1.1.3", "https://registry.npmmirror.com/google-logging-utils/-/google-logging-utils-1.1.3.tgz", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
+
+ "gopd": ["gopd@1.2.0", "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
+
+ "got": ["got@11.8.6", "https://registry.npmmirror.com/got/-/got-11.8.6.tgz", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "graphql": ["graphql@16.14.0", "https://registry.npmmirror.com/graphql/-/graphql-16.14.0.tgz", {}, "sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q=="],
+
+ "graphql-request": ["graphql-request@6.1.0", "https://registry.npmmirror.com/graphql-request/-/graphql-request-6.1.0.tgz", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0", "cross-fetch": "^3.1.5" }, "peerDependencies": { "graphql": "14 - 16" } }, "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw=="],
+
+ "gray-matter": ["gray-matter@4.0.3", "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
+
+ "gtoken": ["gtoken@8.0.0", "https://registry.npmmirror.com/gtoken/-/gtoken-8.0.0.tgz", { "dependencies": { "gaxios": "^7.0.0", "jws": "^4.0.0" } }, "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw=="],
+
+ "h3": ["h3@2.0.1-rc.4", "https://registry.npmmirror.com/h3/-/h3-2.0.1-rc.4.tgz", { "dependencies": { "rou3": "^0.7.8", "srvx": "^0.9.1" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"] }, "sha512-vZq8pEUp6THsXKXrUXX44eOqfChic2wVQ1GlSzQCBr7DeFBkfIZAo2WyNND4GSv54TAa0E4LYIK73WSPdgKUgw=="],
+
+ "happy-dom": ["happy-dom@20.9.0", "https://registry.npmmirror.com/happy-dom/-/happy-dom-20.9.0.tgz", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" } }, "sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ=="],
+
+ "has-bigints": ["has-bigints@1.1.0", "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
+
+ "has-flag": ["has-flag@4.0.0", "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "has-property-descriptors": ["has-property-descriptors@1.0.2", "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
+
+ "has-proto": ["has-proto@1.2.0", "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
+
+ "has-symbols": ["has-symbols@1.1.0", "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
+
+ "has-tostringtag": ["has-tostringtag@1.0.2", "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
+
+ "hasown": ["hasown@2.0.4", "https://registry.npmmirror.com/hasown/-/hasown-2.0.4.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
+
+ "hast-util-embedded": ["hast-util-embedded@3.0.0", "https://registry.npmmirror.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="],
+
+ "hast-util-format": ["hast-util-format@1.1.0", "https://registry.npmmirror.com/hast-util-format/-/hast-util-format-1.1.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-whitespace": "^3.0.0", "html-whitespace-sensitive-tag-names": "^3.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA=="],
+
+ "hast-util-from-html": ["hast-util-from-html@2.0.3", "https://registry.npmmirror.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
+
+ "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
+
+ "hast-util-has-property": ["hast-util-has-property@3.0.0", "https://registry.npmmirror.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA=="],
+
+ "hast-util-heading-rank": ["hast-util-heading-rank@3.0.0", "https://registry.npmmirror.com/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA=="],
+
+ "hast-util-is-body-ok-link": ["hast-util-is-body-ok-link@3.0.1", "https://registry.npmmirror.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ=="],
+
+ "hast-util-is-element": ["hast-util-is-element@3.0.0", "https://registry.npmmirror.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
+
+ "hast-util-minify-whitespace": ["hast-util-minify-whitespace@1.0.1", "https://registry.npmmirror.com/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-is-element": "^3.0.0", "hast-util-whitespace": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw=="],
+
+ "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
+
+ "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "https://registry.npmmirror.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="],
+
+ "hast-util-raw": ["hast-util-raw@9.1.0", "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
+
+ "hast-util-select": ["hast-util-select@6.0.4", "https://registry.npmmirror.com/hast-util-select/-/hast-util-select-6.0.4.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "bcp-47-match": "^2.0.0", "comma-separated-tokens": "^2.0.0", "css-selector-parser": "^3.0.0", "devlop": "^1.0.0", "direction": "^2.0.0", "hast-util-has-property": "^3.0.0", "hast-util-to-string": "^3.0.0", "hast-util-whitespace": "^3.0.0", "nth-check": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw=="],
+
+ "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "https://registry.npmmirror.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="],
+
+ "hast-util-to-html": ["hast-util-to-html@9.0.5", "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
+
+ "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "https://registry.npmmirror.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="],
+
+ "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
+
+ "hast-util-to-string": ["hast-util-to-string@3.0.1", "https://registry.npmmirror.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="],
+
+ "hast-util-to-text": ["hast-util-to-text@4.0.2", "https://registry.npmmirror.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+ "hastscript": ["hastscript@9.0.1", "https://registry.npmmirror.com/hastscript/-/hastscript-9.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
+
+ "he": ["he@1.2.0", "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
+
+ "heap-snapshot-toolkit": ["heap-snapshot-toolkit@1.1.3", "https://registry.npmmirror.com/heap-snapshot-toolkit/-/heap-snapshot-toolkit-1.1.3.tgz", {}, "sha512-joThu2rEsDu8/l4arupRDI1qP4CZXNG+J6Wr348vnbLGSiBkwRdqZ6aOHl5BzEiC+Dc8OTbMlmWjD0lbXD5K2Q=="],
+
+ "hey-listen": ["hey-listen@1.0.8", "https://registry.npmmirror.com/hey-listen/-/hey-listen-1.0.8.tgz", {}, "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="],
+
+ "hono": ["hono@4.10.7", "https://registry.npmmirror.com/hono/-/hono-4.10.7.tgz", {}, "sha512-icXIITfw/07Q88nLSkB9aiUrd8rYzSweK681Kjo/TSggaGbOX4RRyxxm71v+3PC8C/j+4rlxGeoTRxQDkaJkUw=="],
+
+ "hono-openapi": ["hono-openapi@1.1.2", "https://registry.npmmirror.com/hono-openapi/-/hono-openapi-1.1.2.tgz", { "peerDependencies": { "@hono/standard-validator": "^0.2.0", "@standard-community/standard-json": "^0.3.5", "@standard-community/standard-openapi": "^0.2.9", "@types/json-schema": "^7.0.15", "hono": "^4.8.3", "openapi-types": "^12.1.3" }, "optionalPeers": ["@hono/standard-validator", "hono"] }, "sha512-toUcO60MftRBxqcVyxsHNYs2m4vf4xkQaiARAucQx3TiBPDtMNNkoh+C4I1vAretQZiGyaLOZNWn1YxfSyUA5g=="],
+
+ "hosted-git-info": ["hosted-git-info@9.0.3", "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-9.0.3.tgz", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="],
+
+ "html-entities": ["html-entities@2.3.3", "https://registry.npmmirror.com/html-entities/-/html-entities-2.3.3.tgz", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="],
+
+ "html-escaper": ["html-escaper@3.0.3", "https://registry.npmmirror.com/html-escaper/-/html-escaper-3.0.3.tgz", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="],
+
+ "html-minifier-terser": ["html-minifier-terser@7.2.0", "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", { "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", "commander": "^10.0.0", "entities": "^4.4.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.15.1" }, "bin": { "html-minifier-terser": "cli.js" } }, "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA=="],
+
+ "html-to-image": ["html-to-image@1.11.13", "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.13.tgz", {}, "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg=="],
+
+ "html-to-text": ["html-to-text@9.0.5", "https://registry.npmmirror.com/html-to-text/-/html-to-text-9.0.5.tgz", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "https://registry.npmmirror.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="],
+
+ "htmlparser2": ["htmlparser2@8.0.2", "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="],
+
+ "http-cache-semantics": ["http-cache-semantics@4.2.0", "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
+
+ "http-errors": ["http-errors@2.0.1", "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
+
+ "http-proxy-agent": ["http-proxy-agent@7.0.2", "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
+
+ "http2-wrapper": ["http2-wrapper@1.0.3", "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="],
+
+ "https-proxy-agent": ["https-proxy-agent@7.0.6", "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
+
+ "human-signals": ["human-signals@5.0.0", "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="],
+
+ "humanize-ms": ["humanize-ms@1.2.1", "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
+
+ "husky": ["husky@9.1.7", "https://registry.npmmirror.com/husky/-/husky-9.1.7.tgz", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="],
+
+ "i18n-iso-countries": ["i18n-iso-countries@7.14.0", "https://registry.npmmirror.com/i18n-iso-countries/-/i18n-iso-countries-7.14.0.tgz", { "dependencies": { "diacritics": "1.3.0" } }, "sha512-nXHJZYtNrfsi1UQbyRqm3Gou431elgLjKl//CYlnBGt5aTWdRPH1PiS2T/p/n8Q8LnqYqzQJik3Q7mkwvLokeg=="],
+
+ "i18next": ["i18next@23.16.8", "https://registry.npmmirror.com/i18next/-/i18next-23.16.8.tgz", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg=="],
+
+ "iconv-corefoundation": ["iconv-corefoundation@1.1.7", "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", { "dependencies": { "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "os": "darwin" }, "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ=="],
+
+ "iconv-lite": ["iconv-lite@0.7.2", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
+
+ "ieee754": ["ieee754@1.2.1", "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ignore": ["ignore@7.0.5", "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
+
+ "ignore-walk": ["ignore-walk@8.0.0", "https://registry.npmmirror.com/ignore-walk/-/ignore-walk-8.0.0.tgz", { "dependencies": { "minimatch": "^10.0.3" } }, "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A=="],
+
+ "immer": ["immer@11.1.4", "https://registry.npmmirror.com/immer/-/immer-11.1.4.tgz", {}, "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw=="],
+
+ "import-local": ["import-local@3.2.0", "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="],
+
+ "import-meta-resolve": ["import-meta-resolve@4.2.0", "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
+
+ "indent-string": ["indent-string@4.0.0", "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="],
+
+ "inflight": ["inflight@1.0.6", "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
+
+ "inherits": ["inherits@2.0.4", "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
+
+ "ini": ["ini@7.0.0", "https://registry.npmmirror.com/ini/-/ini-7.0.0.tgz", {}, "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w=="],
+
+ "inline-style-parser": ["inline-style-parser@0.2.7", "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
+
+ "internal-slot": ["internal-slot@1.1.0", "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
+
+ "internmap": ["internmap@2.0.3", "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
+
+ "ioredis": ["ioredis@5.11.0", "https://registry.npmmirror.com/ioredis/-/ioredis-5.11.0.tgz", { "dependencies": { "@ioredis/commands": "1.10.0", "cluster-key-slot": "1.1.1", "debug": "4.4.3", "denque": "2.1.0", "redis-errors": "1.2.0", "redis-parser": "3.0.0", "standard-as-callback": "2.1.0" } }, "sha512-EZBErytyVovD8f6pDfG3Kb37N6Y3lmDA9NNj+4+IP13CzzHGeX+OyeRM2Um13khRzoBSzzL+5lVnCX8V2RLeMg=="],
+
+ "ip-address": ["ip-address@10.2.0", "https://registry.npmmirror.com/ip-address/-/ip-address-10.2.0.tgz", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="],
+
+ "ipaddr.js": ["ipaddr.js@1.9.1", "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
+
+ "iron-webcrypto": ["iron-webcrypto@1.2.1", "https://registry.npmmirror.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
+
+ "is-alphabetical": ["is-alphabetical@2.0.1", "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
+
+ "is-alphanumerical": ["is-alphanumerical@2.0.1", "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
+
+ "is-arguments": ["is-arguments@1.2.0", "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="],
+
+ "is-array-buffer": ["is-array-buffer@3.0.5", "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
+
+ "is-arrayish": ["is-arrayish@0.3.4", "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.4.tgz", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="],
+
+ "is-async-function": ["is-async-function@2.1.1", "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
+
+ "is-bigint": ["is-bigint@1.1.0", "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
+
+ "is-binary-path": ["is-binary-path@2.1.0", "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
+
+ "is-boolean-object": ["is-boolean-object@1.2.2", "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
+
+ "is-buffer": ["is-buffer@1.1.6", "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="],
+
+ "is-callable": ["is-callable@1.2.7", "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
+
+ "is-core-module": ["is-core-module@2.16.2", "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.2.tgz", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
+
+ "is-data-view": ["is-data-view@1.0.2", "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
+
+ "is-date-object": ["is-date-object@1.1.0", "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
+
+ "is-decimal": ["is-decimal@2.0.1", "https://registry.npmmirror.com/is-decimal/-/is-decimal-2.0.1.tgz", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
+
+ "is-docker": ["is-docker@3.0.0", "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
+
+ "is-electron": ["is-electron@2.2.2", "https://registry.npmmirror.com/is-electron/-/is-electron-2.2.2.tgz", {}, "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="],
+
+ "is-extendable": ["is-extendable@0.1.1", "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
+ "is-generator-function": ["is-generator-function@1.1.2", "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.2.tgz", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="],
+
+ "is-glob": ["is-glob@4.0.3", "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-hexadecimal": ["is-hexadecimal@2.0.1", "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
+
+ "is-in-ssh": ["is-in-ssh@1.0.0", "https://registry.npmmirror.com/is-in-ssh/-/is-in-ssh-1.0.0.tgz", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="],
+
+ "is-inside-container": ["is-inside-container@1.0.0", "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
+
+ "is-map": ["is-map@2.0.3", "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
+
+ "is-negative-zero": ["is-negative-zero@2.0.3", "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="],
+
+ "is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-number-object": ["is-number-object@1.1.1", "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
+
+ "is-plain-obj": ["is-plain-obj@4.1.0", "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-promise": ["is-promise@4.0.0", "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
+
+ "is-property": ["is-property@1.0.2", "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="],
+
+ "is-regex": ["is-regex@1.2.1", "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
+
+ "is-set": ["is-set@2.0.3", "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
+
+ "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
+
+ "is-stream": ["is-stream@1.1.0", "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="],
+
+ "is-string": ["is-string@1.1.1", "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
+
+ "is-symbol": ["is-symbol@1.1.1", "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
+
+ "is-typed-array": ["is-typed-array@1.1.15", "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
+
+ "is-weakmap": ["is-weakmap@2.0.2", "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
+
+ "is-weakref": ["is-weakref@1.1.1", "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
+
+ "is-weakset": ["is-weakset@2.0.4", "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
+
+ "is-what": ["is-what@4.1.16", "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
+
+ "is-whitespace": ["is-whitespace@0.3.0", "https://registry.npmmirror.com/is-whitespace/-/is-whitespace-0.3.0.tgz", {}, "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg=="],
+
+ "is-wsl": ["is-wsl@3.1.1", "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.1.tgz", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
+
+ "is64bit": ["is64bit@2.0.0", "https://registry.npmmirror.com/is64bit/-/is64bit-2.0.0.tgz", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="],
+
+ "isarray": ["isarray@2.0.5", "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
+
+ "isbinaryfile": ["isbinaryfile@5.0.7", "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.7.tgz", {}, "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ=="],
+
+ "isexe": ["isexe@4.0.0", "https://registry.npmmirror.com/isexe/-/isexe-4.0.0.tgz", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
+
+ "isomorphic-ws": ["isomorphic-ws@5.0.0", "https://registry.npmmirror.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", { "peerDependencies": { "ws": "*" } }, "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw=="],
+
+ "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="],
+
+ "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="],
+
+ "istanbul-reports": ["istanbul-reports@3.2.0", "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="],
+
+ "iterate-iterator": ["iterate-iterator@1.0.2", "https://registry.npmmirror.com/iterate-iterator/-/iterate-iterator-1.0.2.tgz", {}, "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw=="],
+
+ "iterate-value": ["iterate-value@1.0.2", "https://registry.npmmirror.com/iterate-value/-/iterate-value-1.0.2.tgz", { "dependencies": { "es-get-iterator": "^1.0.2", "iterate-iterator": "^1.0.1" } }, "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ=="],
+
+ "jackspeak": ["jackspeak@4.2.3", "https://registry.npmmirror.com/jackspeak/-/jackspeak-4.2.3.tgz", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="],
+
+ "jake": ["jake@10.9.4", "https://registry.npmmirror.com/jake/-/jake-10.9.4.tgz", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="],
+
+ "jiti": ["jiti@2.7.0", "https://registry.npmmirror.com/jiti/-/jiti-2.7.0.tgz", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
+
+ "jose": ["jose@6.0.11", "https://registry.npmmirror.com/jose/-/jose-6.0.11.tgz", {}, "sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg=="],
+
+ "js-base64": ["js-base64@3.7.7", "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz", {}, "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="],
+
+ "js-beautify": ["js-beautify@1.15.4", "https://registry.npmmirror.com/js-beautify/-/js-beautify-1.15.4.tgz", { "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.4", "glob": "^10.4.2", "js-cookie": "^3.0.5", "nopt": "^7.2.1" }, "bin": { "css-beautify": "js/bin/css-beautify.js", "html-beautify": "js/bin/html-beautify.js", "js-beautify": "js/bin/js-beautify.js" } }, "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA=="],
+
+ "js-cookie": ["js-cookie@3.0.8", "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.8.tgz", {}, "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw=="],
+
+ "js-tokens": ["js-tokens@4.0.0", "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
+ "js-yaml": ["js-yaml@3.14.2", "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.2.tgz", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
+
+ "jsbi": ["jsbi@4.3.2", "https://registry.npmmirror.com/jsbi/-/jsbi-4.3.2.tgz", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="],
+
+ "jsesc": ["jsesc@3.1.0", "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+
+ "json-bigint": ["json-bigint@1.0.0", "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
+
+ "json-buffer": ["json-buffer@3.0.1", "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
+
+ "json-schema": ["json-schema@0.4.0", "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="],
+
+ "json-schema-ref-resolver": ["json-schema-ref-resolver@3.0.0", "https://registry.npmmirror.com/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A=="],
+
+ "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "https://registry.npmmirror.com/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", { "dependencies": { "@babel/runtime": "^7.18.3", "ts-algebra": "^2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="],
+
+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "json-schema-typed": ["json-schema-typed@8.0.2", "https://registry.npmmirror.com/json-schema-typed/-/json-schema-typed-8.0.2.tgz", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="],
+
+ "json-stringify-nice": ["json-stringify-nice@1.1.4", "https://registry.npmmirror.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="],
+
+ "json-stringify-safe": ["json-stringify-safe@5.0.1", "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
+
+ "json-with-bigint": ["json-with-bigint@3.5.8", "https://registry.npmmirror.com/json-with-bigint/-/json-with-bigint-3.5.8.tgz", {}, "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw=="],
+
+ "json5": ["json5@2.2.3", "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+
+ "jsonc-parser": ["jsonc-parser@3.3.1", "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
+
+ "jsonfile": ["jsonfile@4.0.0", "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],
+
+ "jsonparse": ["jsonparse@1.3.1", "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="],
+
+ "jsonwebtoken": ["jsonwebtoken@9.0.3", "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="],
+
+ "just-diff": ["just-diff@6.0.2", "https://registry.npmmirror.com/just-diff/-/just-diff-6.0.2.tgz", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="],
+
+ "just-diff-apply": ["just-diff-apply@5.5.0", "https://registry.npmmirror.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="],
+
+ "jwa": ["jwa@2.0.1", "https://registry.npmmirror.com/jwa/-/jwa-2.0.1.tgz", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
+
+ "jws": ["jws@4.0.1", "https://registry.npmmirror.com/jws/-/jws-4.0.1.tgz", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
+
+ "jwt-decode": ["jwt-decode@3.1.2", "https://registry.npmmirror.com/jwt-decode/-/jwt-decode-3.1.2.tgz", {}, "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="],
+
+ "katex": ["katex@0.16.27", "https://registry.npmmirror.com/katex/-/katex-0.16.27.tgz", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw=="],
+
+ "keyv": ["keyv@4.5.4", "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
+ "kind-of": ["kind-of@6.0.3", "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+
+ "kleur": ["kleur@4.1.5", "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
+
+ "klona": ["klona@2.0.6", "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="],
+
+ "kubernetes-types": ["kubernetes-types@1.30.0", "https://registry.npmmirror.com/kubernetes-types/-/kubernetes-types-1.30.0.tgz", {}, "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q=="],
+
+ "lang-map": ["lang-map@0.4.0", "https://registry.npmmirror.com/lang-map/-/lang-map-0.4.0.tgz", { "dependencies": { "language-map": "^1.1.0" } }, "sha512-oiSqZIEUnWdFeDNsp4HId4tAxdFbx5iMBOwA3666Fn2L8Khj8NiD9xRvMsGmKXopPVkaDFtSv3CJOmXFUB0Hcg=="],
+
+ "language-map": ["language-map@1.5.0", "https://registry.npmmirror.com/language-map/-/language-map-1.5.0.tgz", {}, "sha512-n7gFZpe+DwEAX9cXVTw43i3wiudWDDtSn28RmdnS/HCPr284dQI/SztsamWanRr75oSlKSaGbV2nmWCTzGCoVg=="],
+
+ "lazy-val": ["lazy-val@1.0.5", "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz", {}, "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="],
+
+ "lazystream": ["lazystream@1.0.1", "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="],
+
+ "leac": ["leac@0.6.0", "https://registry.npmmirror.com/leac/-/leac-0.6.0.tgz", {}, "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg=="],
+
+ "light-my-request": ["light-my-request@6.6.0", "https://registry.npmmirror.com/light-my-request/-/light-my-request-6.6.0.tgz", { "dependencies": { "cookie": "^1.0.1", "process-warning": "^4.0.0", "set-cookie-parser": "^2.6.0" } }, "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A=="],
+
+ "lightningcss": ["lightningcss@1.30.1", "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.1.tgz", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="],
+
+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="],
+
+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="],
+
+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="],
+
+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="],
+
+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="],
+
+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="],
+
+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="],
+
+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="],
+
+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="],
+
+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
+
+ "lilconfig": ["lilconfig@2.1.0", "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "locate-path": ["locate-path@6.0.0", "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash": ["lodash@4.18.1", "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="],
+
+ "lodash.escaperegexp": ["lodash.escaperegexp@4.1.2", "https://registry.npmmirror.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", {}, "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="],
+
+ "lodash.includes": ["lodash.includes@4.3.0", "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="],
+
+ "lodash.isboolean": ["lodash.isboolean@3.0.3", "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="],
+
+ "lodash.isequal": ["lodash.isequal@4.5.0", "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", {}, "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="],
+
+ "lodash.isinteger": ["lodash.isinteger@4.0.4", "https://registry.npmmirror.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="],
+
+ "lodash.isnumber": ["lodash.isnumber@3.0.3", "https://registry.npmmirror.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="],
+
+ "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="],
+
+ "lodash.isstring": ["lodash.isstring@4.0.1", "https://registry.npmmirror.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="],
+
+ "lodash.once": ["lodash.once@4.1.1", "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="],
+
+ "loglevelnext": ["loglevelnext@6.0.0", "https://registry.npmmirror.com/loglevelnext/-/loglevelnext-6.0.0.tgz", {}, "sha512-FDl1AI2sJGjHHG3XKJd6sG3/6ncgiGCQ0YkW46nxe7SfqQq6hujd9CvFXIXtkGBUN83KPZ2KSOJK8q5P0bSSRQ=="],
+
+ "long": ["long@5.3.2", "https://registry.npmmirror.com/long/-/long-5.3.2.tgz", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
+
+ "longest-streak": ["longest-streak@3.1.0", "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
+
+ "loose-envify": ["loose-envify@1.4.0", "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
+
+ "loupe": ["loupe@3.2.1", "https://registry.npmmirror.com/loupe/-/loupe-3.2.1.tgz", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="],
+
+ "lower-case": ["lower-case@2.0.2", "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="],
+
+ "lowercase-keys": ["lowercase-keys@2.0.0", "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="],
+
+ "lru-cache": ["lru-cache@11.5.1", "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.5.1.tgz", {}, "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A=="],
+
+ "lru.min": ["lru.min@1.1.4", "https://registry.npmmirror.com/lru.min/-/lru.min-1.1.4.tgz", {}, "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA=="],
+
+ "lru_map": ["lru_map@0.4.1", "https://registry.npmmirror.com/lru_map/-/lru_map-0.4.1.tgz", {}, "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg=="],
+
+ "luxon": ["luxon@3.6.1", "https://registry.npmmirror.com/luxon/-/luxon-3.6.1.tgz", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="],
+
+ "lz-string": ["lz-string@1.5.0", "https://registry.npmmirror.com/lz-string/-/lz-string-1.5.0.tgz", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="],
+
+ "magic-string": ["magic-string@0.30.21", "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "magicast": ["magicast@0.3.5", "https://registry.npmmirror.com/magicast/-/magicast-0.3.5.tgz", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="],
+
+ "make-dir": ["make-dir@4.0.0", "https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="],
+
+ "make-fetch-happen": ["make-fetch-happen@15.0.6", "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" } }, "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw=="],
+
+ "markdown-extensions": ["markdown-extensions@2.0.0", "https://registry.npmmirror.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="],
+
+ "markdown-table": ["markdown-table@3.0.4", "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
+
+ "marked": ["marked@17.0.1", "https://registry.npmmirror.com/marked/-/marked-17.0.1.tgz", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="],
+
+ "marked-katex-extension": ["marked-katex-extension@5.1.6", "https://registry.npmmirror.com/marked-katex-extension/-/marked-katex-extension-5.1.6.tgz", { "peerDependencies": { "katex": ">=0.16 <0.17", "marked": ">=4 <18" } }, "sha512-vYpLXwmlIDKILIhJtiRTgdyZRn5sEYdFBuTmbpjD7lbCIzg0/DWyK3HXIntN3Tp8zV6hvOUgpZNLWRCgWVc24A=="],
+
+ "marked-shiki": ["marked-shiki@1.2.1", "https://registry.npmmirror.com/marked-shiki/-/marked-shiki-1.2.1.tgz", { "peerDependencies": { "marked": ">=7.0.0", "shiki": ">=1.0.0" } }, "sha512-yHxYQhPY5oYaIRnROn98foKhuClark7M373/VpLxiy5TrDu9Jd/LsMwo8w+U91Up4oDb9IXFrP0N1MFRz8W/DQ=="],
+
+ "matcher": ["matcher@3.0.0", "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="],
+
+ "math-intrinsics": ["math-intrinsics@1.1.0", "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
+
+ "md-to-react-email": ["md-to-react-email@5.0.0", "https://registry.npmmirror.com/md-to-react-email/-/md-to-react-email-5.0.0.tgz", { "dependencies": { "marked": "7.0.4" }, "peerDependencies": { "react": "18.x" } }, "sha512-GdBrBUbAAJHypnuyofYGfVos8oUslxHx69hs3CW9P0L8mS1sT6GnJuMBTlz/Fw+2widiwdavcu9UwyLF/BzZ4w=="],
+
+ "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="],
+
+ "mdast-util-directive": ["mdast-util-directive@3.1.0", "https://registry.npmmirror.com/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q=="],
+
+ "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="],
+
+ "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="],
+
+ "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="],
+
+ "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="],
+
+ "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="],
+
+ "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="],
+
+ "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="],
+
+ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="],
+
+ "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "https://registry.npmmirror.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="],
+
+ "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "https://registry.npmmirror.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="],
+
+ "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "https://registry.npmmirror.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="],
+
+ "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "https://registry.npmmirror.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="],
+
+ "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
+
+ "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="],
+
+ "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
+
+ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
+
+ "mdn-data": ["mdn-data@2.27.1", "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.27.1.tgz", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="],
+
+ "media-typer": ["media-typer@0.3.0", "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="],
+
+ "merge-anything": ["merge-anything@5.1.7", "https://registry.npmmirror.com/merge-anything/-/merge-anything-5.1.7.tgz", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="],
+
+ "merge-descriptors": ["merge-descriptors@1.0.3", "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="],
+
+ "merge-stream": ["merge-stream@2.0.0", "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
+
+ "merge2": ["merge2@1.4.1", "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
+ "methods": ["methods@1.1.2", "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="],
+
+ "micromark": ["micromark@4.0.2", "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
+
+ "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
+
+ "micromark-extension-directive": ["micromark-extension-directive@3.0.2", "https://registry.npmmirror.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "parse-entities": "^4.0.0" } }, "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA=="],
+
+ "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="],
+
+ "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="],
+
+ "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="],
+
+ "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="],
+
+ "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="],
+
+ "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
+
+ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="],
+
+ "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "https://registry.npmmirror.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="],
+
+ "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "https://registry.npmmirror.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="],
+
+ "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "https://registry.npmmirror.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="],
+
+ "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "https://registry.npmmirror.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="],
+
+ "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "https://registry.npmmirror.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="],
+
+ "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="],
+
+ "micromark-factory-label": ["micromark-factory-label@2.0.1", "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="],
+
+ "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "https://registry.npmmirror.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="],
+
+ "micromark-factory-space": ["micromark-factory-space@2.0.1", "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="],
+
+ "micromark-factory-title": ["micromark-factory-title@2.0.1", "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="],
+
+ "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="],
+
+ "micromark-util-character": ["micromark-util-character@2.1.1", "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+ "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
+
+ "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="],
+
+ "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="],
+
+ "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="],
+
+ "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="],
+
+ "micromark-util-encode": ["micromark-util-encode@2.0.1", "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "https://registry.npmmirror.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="],
+
+ "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
+
+ "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
+
+ "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
+
+ "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+ "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "micromark-util-types": ["micromark-util-types@2.0.2", "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "micromatch": ["micromatch@4.0.8", "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime": ["mime@4.1.0", "https://registry.npmmirror.com/mime/-/mime-4.1.0.tgz", { "bin": { "mime": "bin/cli.js" } }, "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw=="],
+
+ "mime-db": ["mime-db@1.54.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
+
+ "mime-types": ["mime-types@3.0.2", "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
+
+ "mimic-fn": ["mimic-fn@4.0.0", "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="],
+
+ "mimic-function": ["mimic-function@5.0.1", "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
+
+ "mimic-response": ["mimic-response@3.1.0", "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="],
+
+ "min-indent": ["min-indent@1.0.1", "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="],
+
+ "miniflare": ["miniflare@4.20251118.1", "https://registry.npmmirror.com/miniflare/-/miniflare-4.20251118.1.tgz", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251118.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-uLSAE/DvOm392fiaig4LOaatxLjM7xzIniFRG5Y3yF9IduOYLLK/pkCPQNCgKQH3ou0YJRHnTN+09LPfqYNTQQ=="],
+
+ "minimatch": ["minimatch@10.2.5", "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
+
+ "minimist": ["minimist@1.2.8", "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
+
+ "minipass": ["minipass@7.1.3", "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
+
+ "minipass-collect": ["minipass-collect@2.0.1", "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-2.0.1.tgz", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="],
+
+ "minipass-fetch": ["minipass-fetch@5.0.2", "https://registry.npmmirror.com/minipass-fetch/-/minipass-fetch-5.0.2.tgz", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "optionalDependencies": { "iconv-lite": "^0.7.2" } }, "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ=="],
+
+ "minipass-flush": ["minipass-flush@1.0.7", "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.7.tgz", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="],
+
+ "minipass-pipeline": ["minipass-pipeline@1.2.4", "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
+
+ "minipass-sized": ["minipass-sized@2.0.0", "https://registry.npmmirror.com/minipass-sized/-/minipass-sized-2.0.0.tgz", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA=="],
+
+ "minizlib": ["minizlib@3.1.0", "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="],
+
+ "mkdirp": ["mkdirp@0.5.6", "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="],
+
+ "morphdom": ["morphdom@2.7.8", "https://registry.npmmirror.com/morphdom/-/morphdom-2.7.8.tgz", {}, "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg=="],
+
+ "motion": ["motion@12.34.5", "https://registry.npmmirror.com/motion/-/motion-12.34.5.tgz", { "dependencies": { "framer-motion": "^12.34.5", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-N06NLJ9IeBHeielRqIvYvjPfXuRdyTxa+9++BgpGa+hY2D7TcMkI6QzV3jaRuv0aZRXgMa7cPy9YcBUBisPzAQ=="],
+
+ "motion-dom": ["motion-dom@12.34.3", "https://registry.npmmirror.com/motion-dom/-/motion-dom-12.34.3.tgz", { "dependencies": { "motion-utils": "^12.29.2" } }, "sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ=="],
+
+ "motion-utils": ["motion-utils@12.29.2", "https://registry.npmmirror.com/motion-utils/-/motion-utils-12.29.2.tgz", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="],
+
+ "mrmime": ["mrmime@2.0.1", "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
+
+ "ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "msgpackr": ["msgpackr@2.0.2", "https://registry.npmmirror.com/msgpackr/-/msgpackr-2.0.2.tgz", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, "sha512-c5hYOXFbP79Slh6Dzd2wzk+jnV7mX1UxfMYtilnY1NmalXPqG8DGb5cYCMBrW4AsH3zekBBZd4QrKz9NhtvYLQ=="],
+
+ "msgpackr-extract": ["msgpackr-extract@3.0.4", "https://registry.npmmirror.com/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="],
+
+ "muggle-string": ["muggle-string@0.4.1", "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
+
+ "multicast-dns": ["multicast-dns@7.2.5", "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz", { "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg=="],
+
+ "multipasta": ["multipasta@0.2.7", "https://registry.npmmirror.com/multipasta/-/multipasta-0.2.7.tgz", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="],
+
+ "mustache": ["mustache@4.2.0", "https://registry.npmmirror.com/mustache/-/mustache-4.2.0.tgz", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="],
+
+ "mysql2": ["mysql2@3.14.4", "https://registry.npmmirror.com/mysql2/-/mysql2-3.14.4.tgz", { "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.0", "long": "^5.2.1", "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-Cs/jx3WZPNrYHVz+Iunp9ziahaG5uFMvD2R8Zlmc194AqXNxt9HBNu7ZsPYrUtmJsF0egETCWIdMIYAwOGjL1w=="],
+
+ "mz": ["mz@2.7.0", "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "named-placeholders": ["named-placeholders@1.1.6", "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.6.tgz", { "dependencies": { "lru.min": "^1.1.0" } }, "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w=="],
+
+ "nanoevents": ["nanoevents@7.0.1", "https://registry.npmmirror.com/nanoevents/-/nanoevents-7.0.1.tgz", {}, "sha512-o6lpKiCxLeijK4hgsqfR6CNToPyRU3keKyyI6uwuHRvpRTbZ0wXw51WRgyldVugZqoJfkGFrjrIenYH3bfEO3Q=="],
+
+ "nanoid": ["nanoid@3.3.12", "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.12.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
+
+ "negotiator": ["negotiator@1.0.0", "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
+
+ "neotraverse": ["neotraverse@0.6.18", "https://registry.npmmirror.com/neotraverse/-/neotraverse-0.6.18.tgz", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
+
+ "nf3": ["nf3@0.1.12", "https://registry.npmmirror.com/nf3/-/nf3-0.1.12.tgz", {}, "sha512-qbMXT7RTGh74MYWPeqTIED8nDW70NXOULVHpdWcdZ7IVHVnAsMV9fNugSNnvooipDc1FMOzpis7T9nXJEbJhvQ=="],
+
+ "nitro": ["nitro@3.0.1-alpha.1", "https://registry.npmmirror.com/nitro/-/nitro-3.0.1-alpha.1.tgz", { "dependencies": { "consola": "^3.4.2", "crossws": "^0.4.1", "db0": "^0.3.4", "h3": "2.0.1-rc.5", "jiti": "^2.6.1", "nf3": "^0.1.10", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", "oxc-minify": "^0.96.0", "oxc-transform": "^0.96.0", "srvx": "^0.9.5", "undici": "^7.16.0", "unenv": "^2.0.0-rc.24", "unstorage": "^2.0.0-alpha.4" }, "peerDependencies": { "rolldown": "*", "rollup": "^4", "vite": "^7", "xml2js": "^0.6.2" }, "optionalPeers": ["rolldown", "rollup", "vite", "xml2js"], "bin": { "nitro": "dist/cli/index.mjs" } }, "sha512-U4AxIsXxdkxzkFrK0XAw0e5Qbojk8jQ50MjjRBtBakC4HurTtQoiZvF+lSe382jhuQZCfAyywGWOFa9QzXLFaw=="],
+
+ "nlcst-to-string": ["nlcst-to-string@4.0.0", "https://registry.npmmirror.com/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
+
+ "no-case": ["no-case@3.0.4", "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="],
+
+ "node-abi": ["node-abi@4.31.0", "https://registry.npmmirror.com/node-abi/-/node-abi-4.31.0.tgz", { "dependencies": { "semver": "^7.6.3" } }, "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw=="],
+
+ "node-addon-api": ["node-addon-api@7.1.1", "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
+
+ "node-api-version": ["node-api-version@0.2.1", "https://registry.npmmirror.com/node-api-version/-/node-api-version-0.2.1.tgz", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="],
+
+ "node-domexception": ["node-domexception@1.0.0", "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
+
+ "node-fetch": ["node-fetch@2.7.0", "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
+
+ "node-fetch-native": ["node-fetch-native@1.6.7", "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
+
+ "node-gyp": ["node-gyp@12.3.0", "https://registry.npmmirror.com/node-gyp/-/node-gyp-12.3.0.tgz", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg=="],
+
+ "node-gyp-build": ["node-gyp-build@4.8.4", "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="],
+
+ "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "https://registry.npmmirror.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
+
+ "node-html-parser": ["node-html-parser@7.1.0", "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-7.1.0.tgz", { "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ=="],
+
+ "node-int64": ["node-int64@0.4.0", "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="],
+
+ "node-mock-http": ["node-mock-http@1.0.4", "https://registry.npmmirror.com/node-mock-http/-/node-mock-http-1.0.4.tgz", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
+
+ "node-releases": ["node-releases@2.0.46", "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.46.tgz", {}, "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ=="],
+
+ "nopt": ["nopt@9.0.0", "https://registry.npmmirror.com/nopt/-/nopt-9.0.0.tgz", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="],
+
+ "normalize-path": ["normalize-path@3.0.0", "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
+
+ "normalize-url": ["normalize-url@6.1.0", "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="],
+
+ "npm-bundled": ["npm-bundled@5.0.0", "https://registry.npmmirror.com/npm-bundled/-/npm-bundled-5.0.0.tgz", { "dependencies": { "npm-normalize-package-bin": "^5.0.0" } }, "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw=="],
+
+ "npm-install-checks": ["npm-install-checks@8.0.0", "https://registry.npmmirror.com/npm-install-checks/-/npm-install-checks-8.0.0.tgz", { "dependencies": { "semver": "^7.1.1" } }, "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA=="],
+
+ "npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="],
+
+ "npm-package-arg": ["npm-package-arg@13.0.2", "https://registry.npmmirror.com/npm-package-arg/-/npm-package-arg-13.0.2.tgz", { "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" } }, "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA=="],
+
+ "npm-packlist": ["npm-packlist@10.0.4", "https://registry.npmmirror.com/npm-packlist/-/npm-packlist-10.0.4.tgz", { "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" } }, "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng=="],
+
+ "npm-pick-manifest": ["npm-pick-manifest@11.0.3", "https://registry.npmmirror.com/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", { "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" } }, "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ=="],
+
+ "npm-registry-fetch": ["npm-registry-fetch@19.1.1", "https://registry.npmmirror.com/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", { "dependencies": { "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^13.0.0", "proc-log": "^6.0.0" } }, "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw=="],
+
+ "npm-run-path": ["npm-run-path@5.3.0", "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
+
+ "nth-check": ["nth-check@2.1.1", "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
+ "nypm": ["nypm@0.6.6", "https://registry.npmmirror.com/nypm/-/nypm-0.6.6.tgz", { "dependencies": { "citty": "^0.2.2", "pathe": "^2.0.3", "tinyexec": "^1.1.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q=="],
+
+ "object-assign": ["object-assign@4.1.1", "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "object-hash": ["object-hash@2.2.0", "https://registry.npmmirror.com/object-hash/-/object-hash-2.2.0.tgz", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="],
+
+ "object-inspect": ["object-inspect@1.13.4", "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
+
+ "object-keys": ["object-keys@1.1.1", "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
+
+ "object.assign": ["object.assign@4.1.7", "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
+
+ "obug": ["obug@2.1.1", "https://registry.npmmirror.com/obug/-/obug-2.1.1.tgz", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="],
+
+ "ofetch": ["ofetch@2.0.0-alpha.3", "https://registry.npmmirror.com/ofetch/-/ofetch-2.0.0-alpha.3.tgz", {}, "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA=="],
+
+ "ohash": ["ohash@2.0.11", "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
+
+ "oidc-token-hash": ["oidc-token-hash@5.2.0", "https://registry.npmmirror.com/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz", {}, "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw=="],
+
+ "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "https://registry.npmmirror.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="],
+
+ "on-finished": ["on-finished@2.4.1", "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
+
+ "once": ["once@1.4.0", "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
+
+ "onetime": ["onetime@6.0.0", "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="],
+
+ "oniguruma-parser": ["oniguruma-parser@0.12.2", "https://registry.npmmirror.com/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="],
+
+ "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="],
+
+ "open": ["open@10.1.2", "https://registry.npmmirror.com/open/-/open-10.1.2.tgz", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw=="],
+
+ "openai": ["openai@5.11.0", "https://registry.npmmirror.com/openai/-/openai-5.11.0.tgz", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-+AuTc5pVjlnTuA9zvn8rA/k+1RluPIx9AD4eDcnutv6JNwHHZxIhkFy+tmMKCvmMFDQzfA/r1ujvPWB19DQkYg=="],
+
+ "openapi-types": ["openapi-types@12.1.3", "https://registry.npmmirror.com/openapi-types/-/openapi-types-12.1.3.tgz", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
+
+ "opencode": ["opencode@workspace:packages/opencode"],
+
+ "opencode-gitlab-auth": ["opencode-gitlab-auth@2.1.0", "https://registry.npmmirror.com/opencode-gitlab-auth/-/opencode-gitlab-auth-2.1.0.tgz", { "dependencies": { "@fastify/rate-limit": "^10.2.0", "@opencode-ai/plugin": "*", "fastify": "^5.2.0", "open": "^10.0.0" } }, "sha512-ZCDYaY0V8Se6hOH2tqZqqcskrd0xLTgfiGhU0J1igkUP52oFtN9eSwxOPLT0ctvNXUq8b+zOmJ4sskAQoC/IUA=="],
+
+ "opencode-poe-auth": ["opencode-poe-auth@0.0.1", "https://registry.npmmirror.com/opencode-poe-auth/-/opencode-poe-auth-0.0.1.tgz", { "dependencies": { "open": "^10.0.0", "poe-oauth": "*" }, "peerDependencies": { "@opencode-ai/plugin": "*" } }, "sha512-cXqTlS6AXHzo1oBdosnxbT47ZJEZ9WXn050X8Re6wZ1vaNnTpB/l2fMQt90evT7RBK0fB8UjXQUDMKyd7bbiqg=="],
+
+ "openid-client": ["openid-client@5.6.4", "https://registry.npmmirror.com/openid-client/-/openid-client-5.6.4.tgz", { "dependencies": { "jose": "^4.15.4", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA=="],
+
+ "opentui-spinner": ["opentui-spinner@0.0.7", "https://registry.npmmirror.com/opentui-spinner/-/opentui-spinner-0.0.7.tgz", { "dependencies": { "cli-spinners": "^3.3.0" }, "peerDependencies": { "@opentui/core": "^0.3.4", "@opentui/react": "^0.3.4", "@opentui/solid": "^0.3.4", "typescript": "^5" }, "optionalPeers": ["@opentui/react", "@opentui/solid"] }, "sha512-nPzwAvJG+y9rVEwwHLHqbsMzLnIk2zw+F9LqwA7aYJvpM5gsrKC2rrGi36A+tZpA+1RnWxXeWEgVZMchnaH18Q=="],
+
+ "own-keys": ["own-keys@1.0.1", "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
+
+ "oxc-minify": ["oxc-minify@0.96.0", "https://registry.npmmirror.com/oxc-minify/-/oxc-minify-0.96.0.tgz", { "optionalDependencies": { "@oxc-minify/binding-android-arm64": "0.96.0", "@oxc-minify/binding-darwin-arm64": "0.96.0", "@oxc-minify/binding-darwin-x64": "0.96.0", "@oxc-minify/binding-freebsd-x64": "0.96.0", "@oxc-minify/binding-linux-arm-gnueabihf": "0.96.0", "@oxc-minify/binding-linux-arm-musleabihf": "0.96.0", "@oxc-minify/binding-linux-arm64-gnu": "0.96.0", "@oxc-minify/binding-linux-arm64-musl": "0.96.0", "@oxc-minify/binding-linux-riscv64-gnu": "0.96.0", "@oxc-minify/binding-linux-s390x-gnu": "0.96.0", "@oxc-minify/binding-linux-x64-gnu": "0.96.0", "@oxc-minify/binding-linux-x64-musl": "0.96.0", "@oxc-minify/binding-wasm32-wasi": "0.96.0", "@oxc-minify/binding-win32-arm64-msvc": "0.96.0", "@oxc-minify/binding-win32-x64-msvc": "0.96.0" } }, "sha512-dXeeGrfPJJ4rMdw+NrqiCRtbzVX2ogq//R0Xns08zql2HjV3Zi2SBJ65saqfDaJzd2bcHqvGWH+M44EQCHPAcA=="],
+
+ "oxc-parser": ["oxc-parser@0.127.0", "https://registry.npmmirror.com/oxc-parser/-/oxc-parser-0.127.0.tgz", { "dependencies": { "@oxc-project/types": "^0.127.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.127.0", "@oxc-parser/binding-android-arm64": "0.127.0", "@oxc-parser/binding-darwin-arm64": "0.127.0", "@oxc-parser/binding-darwin-x64": "0.127.0", "@oxc-parser/binding-freebsd-x64": "0.127.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.127.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.127.0", "@oxc-parser/binding-linux-arm64-gnu": "0.127.0", "@oxc-parser/binding-linux-arm64-musl": "0.127.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.127.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.127.0", "@oxc-parser/binding-linux-riscv64-musl": "0.127.0", "@oxc-parser/binding-linux-s390x-gnu": "0.127.0", "@oxc-parser/binding-linux-x64-gnu": "0.127.0", "@oxc-parser/binding-linux-x64-musl": "0.127.0", "@oxc-parser/binding-openharmony-arm64": "0.127.0", "@oxc-parser/binding-wasm32-wasi": "0.127.0", "@oxc-parser/binding-win32-arm64-msvc": "0.127.0", "@oxc-parser/binding-win32-ia32-msvc": "0.127.0", "@oxc-parser/binding-win32-x64-msvc": "0.127.0" } }, "sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA=="],
+
+ "oxc-resolver": ["oxc-resolver@11.20.0", "https://registry.npmmirror.com/oxc-resolver/-/oxc-resolver-11.20.0.tgz", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.20.0", "@oxc-resolver/binding-android-arm64": "11.20.0", "@oxc-resolver/binding-darwin-arm64": "11.20.0", "@oxc-resolver/binding-darwin-x64": "11.20.0", "@oxc-resolver/binding-freebsd-x64": "11.20.0", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.20.0", "@oxc-resolver/binding-linux-arm-musleabihf": "11.20.0", "@oxc-resolver/binding-linux-arm64-gnu": "11.20.0", "@oxc-resolver/binding-linux-arm64-musl": "11.20.0", "@oxc-resolver/binding-linux-ppc64-gnu": "11.20.0", "@oxc-resolver/binding-linux-riscv64-gnu": "11.20.0", "@oxc-resolver/binding-linux-riscv64-musl": "11.20.0", "@oxc-resolver/binding-linux-s390x-gnu": "11.20.0", "@oxc-resolver/binding-linux-x64-gnu": "11.20.0", "@oxc-resolver/binding-linux-x64-musl": "11.20.0", "@oxc-resolver/binding-openharmony-arm64": "11.20.0", "@oxc-resolver/binding-wasm32-wasi": "11.20.0", "@oxc-resolver/binding-win32-arm64-msvc": "11.20.0", "@oxc-resolver/binding-win32-x64-msvc": "11.20.0" } }, "sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g=="],
+
+ "oxc-transform": ["oxc-transform@0.96.0", "https://registry.npmmirror.com/oxc-transform/-/oxc-transform-0.96.0.tgz", { "optionalDependencies": { "@oxc-transform/binding-android-arm64": "0.96.0", "@oxc-transform/binding-darwin-arm64": "0.96.0", "@oxc-transform/binding-darwin-x64": "0.96.0", "@oxc-transform/binding-freebsd-x64": "0.96.0", "@oxc-transform/binding-linux-arm-gnueabihf": "0.96.0", "@oxc-transform/binding-linux-arm-musleabihf": "0.96.0", "@oxc-transform/binding-linux-arm64-gnu": "0.96.0", "@oxc-transform/binding-linux-arm64-musl": "0.96.0", "@oxc-transform/binding-linux-riscv64-gnu": "0.96.0", "@oxc-transform/binding-linux-s390x-gnu": "0.96.0", "@oxc-transform/binding-linux-x64-gnu": "0.96.0", "@oxc-transform/binding-linux-x64-musl": "0.96.0", "@oxc-transform/binding-wasm32-wasi": "0.96.0", "@oxc-transform/binding-win32-arm64-msvc": "0.96.0", "@oxc-transform/binding-win32-x64-msvc": "0.96.0" } }, "sha512-dQPNIF+gHpSkmC0+Vg9IktNyhcn28Y8R3eTLyzn52UNymkasLicl3sFAtz7oEVuFmCpgGjaUTKkwk+jW2cHpDQ=="],
+
+ "oxlint": ["oxlint@1.60.0", "https://registry.npmmirror.com/oxlint/-/oxlint-1.60.0.tgz", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.60.0", "@oxlint/binding-android-arm64": "1.60.0", "@oxlint/binding-darwin-arm64": "1.60.0", "@oxlint/binding-darwin-x64": "1.60.0", "@oxlint/binding-freebsd-x64": "1.60.0", "@oxlint/binding-linux-arm-gnueabihf": "1.60.0", "@oxlint/binding-linux-arm-musleabihf": "1.60.0", "@oxlint/binding-linux-arm64-gnu": "1.60.0", "@oxlint/binding-linux-arm64-musl": "1.60.0", "@oxlint/binding-linux-ppc64-gnu": "1.60.0", "@oxlint/binding-linux-riscv64-gnu": "1.60.0", "@oxlint/binding-linux-riscv64-musl": "1.60.0", "@oxlint/binding-linux-s390x-gnu": "1.60.0", "@oxlint/binding-linux-x64-gnu": "1.60.0", "@oxlint/binding-linux-x64-musl": "1.60.0", "@oxlint/binding-openharmony-arm64": "1.60.0", "@oxlint/binding-win32-arm64-msvc": "1.60.0", "@oxlint/binding-win32-ia32-msvc": "1.60.0", "@oxlint/binding-win32-x64-msvc": "1.60.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-tnRzTWiWJ9pg3ftRWnD0+Oqh78L6ZSwcEudvCZaER0PIqiAnNyXj5N1dPwjmNpDalkKS9m/WMLN1CTPUBPmsgw=="],
+
+ "oxlint-tsgolint": ["oxlint-tsgolint@0.21.0", "https://registry.npmmirror.com/oxlint-tsgolint/-/oxlint-tsgolint-0.21.0.tgz", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.21.0", "@oxlint-tsgolint/darwin-x64": "0.21.0", "@oxlint-tsgolint/linux-arm64": "0.21.0", "@oxlint-tsgolint/linux-x64": "0.21.0", "@oxlint-tsgolint/win32-arm64": "0.21.0", "@oxlint-tsgolint/win32-x64": "0.21.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-HiWPhANwRnN1pZJQ2SgNB3WRR+1etLJHmRzQ/MJhyINsEIaOUCjxhlXJKbEaVUwdnyXwRWqo/P9Fx21lz0/mSg=="],
+
+ "p-cancelable": ["p-cancelable@2.1.1", "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="],
+
+ "p-defer": ["p-defer@3.0.0", "https://registry.npmmirror.com/p-defer/-/p-defer-3.0.0.tgz", {}, "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw=="],
+
+ "p-finally": ["p-finally@1.0.0", "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="],
+
+ "p-limit": ["p-limit@6.2.0", "https://registry.npmmirror.com/p-limit/-/p-limit-6.2.0.tgz", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
+
+ "p-locate": ["p-locate@5.0.0", "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "p-map": ["p-map@7.0.4", "https://registry.npmmirror.com/p-map/-/p-map-7.0.4.tgz", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="],
+
+ "p-queue": ["p-queue@8.1.1", "https://registry.npmmirror.com/p-queue/-/p-queue-8.1.1.tgz", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="],
+
+ "p-retry": ["p-retry@4.6.2", "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="],
+
+ "p-timeout": ["p-timeout@6.1.4", "https://registry.npmmirror.com/p-timeout/-/p-timeout-6.1.4.tgz", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
+
+ "p-try": ["p-try@2.2.0", "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="],
+
+ "package-json-from-dist": ["package-json-from-dist@1.0.1", "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
+
+ "package-manager-detector": ["package-manager-detector@1.6.0", "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.6.0.tgz", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
+
+ "pacote": ["pacote@21.5.0", "https://registry.npmmirror.com/pacote/-/pacote-21.5.0.tgz", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="],
+
+ "pagefind": ["pagefind@1.5.2", "https://registry.npmmirror.com/pagefind/-/pagefind-1.5.2.tgz", { "optionalDependencies": { "@pagefind/darwin-arm64": "1.5.2", "@pagefind/darwin-x64": "1.5.2", "@pagefind/freebsd-x64": "1.5.2", "@pagefind/linux-arm64": "1.5.2", "@pagefind/linux-x64": "1.5.2", "@pagefind/windows-arm64": "1.5.2", "@pagefind/windows-x64": "1.5.2" }, "bin": { "pagefind": "lib/runner/bin.cjs" } }, "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q=="],
+
+ "pako": ["pako@0.2.9", "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="],
+
+ "param-case": ["param-case@3.0.4", "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="],
+
+ "parse-conflict-json": ["parse-conflict-json@5.0.1", "https://registry.npmmirror.com/parse-conflict-json/-/parse-conflict-json-5.0.1.tgz", { "dependencies": { "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ=="],
+
+ "parse-entities": ["parse-entities@4.0.2", "https://registry.npmmirror.com/parse-entities/-/parse-entities-4.0.2.tgz", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
+
+ "parse-latin": ["parse-latin@7.0.0", "https://registry.npmmirror.com/parse-latin/-/parse-latin-7.0.0.tgz", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
+
+ "parse5": ["parse5@7.3.0", "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
+
+ "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="],
+
+ "parseley": ["parseley@0.12.1", "https://registry.npmmirror.com/parseley/-/parseley-0.12.1.tgz", { "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" } }, "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw=="],
+
+ "parseurl": ["parseurl@1.3.3", "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
+
+ "partial-json": ["partial-json@0.1.7", "https://registry.npmmirror.com/partial-json/-/partial-json-0.1.7.tgz", {}, "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA=="],
+
+ "pascal-case": ["pascal-case@3.1.2", "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="],
+
+ "path-browserify": ["path-browserify@1.0.1", "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
+
+ "path-exists": ["path-exists@4.0.0", "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-expression-matcher": ["path-expression-matcher@1.5.0", "https://registry.npmmirror.com/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", {}, "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ=="],
+
+ "path-is-absolute": ["path-is-absolute@1.0.1", "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
+
+ "path-key": ["path-key@3.1.1", "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "path-parse": ["path-parse@1.0.7", "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
+
+ "path-scurry": ["path-scurry@2.0.2", "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.2.tgz", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
+
+ "path-to-regexp": ["path-to-regexp@6.3.0", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
+
+ "path-type": ["path-type@4.0.0", "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "pathe": ["pathe@2.0.3", "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "pathval": ["pathval@2.0.1", "https://registry.npmmirror.com/pathval/-/pathval-2.0.1.tgz", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="],
+
+ "pe-library": ["pe-library@0.4.1", "https://registry.npmmirror.com/pe-library/-/pe-library-0.4.1.tgz", {}, "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw=="],
+
+ "peberminta": ["peberminta@0.9.0", "https://registry.npmmirror.com/peberminta/-/peberminta-0.9.0.tgz", {}, "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ=="],
+
+ "pend": ["pend@1.2.0", "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="],
+
+ "perfect-debounce": ["perfect-debounce@2.1.0", "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="],
+
+ "piccolore": ["piccolore@0.1.3", "https://registry.npmmirror.com/piccolore/-/piccolore-0.1.3.tgz", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
+
+ "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "pify": ["pify@2.3.0", "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
+
+ "pino": ["pino@10.3.1", "https://registry.npmmirror.com/pino/-/pino-10.3.1.tgz", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^4.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg=="],
+
+ "pino-abstract-transport": ["pino-abstract-transport@3.0.0", "https://registry.npmmirror.com/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="],
+
+ "pino-std-serializers": ["pino-std-serializers@7.1.0", "https://registry.npmmirror.com/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="],
+
+ "pirates": ["pirates@4.0.7", "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "pkce-challenge": ["pkce-challenge@5.0.1", "https://registry.npmmirror.com/pkce-challenge/-/pkce-challenge-5.0.1.tgz", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
+
+ "pkg-dir": ["pkg-dir@4.2.0", "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="],
+
+ "pkg-types": ["pkg-types@2.3.1", "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz", { "dependencies": { "confbox": "^0.2.4", "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg=="],
+
+ "pkg-up": ["pkg-up@3.1.0", "https://registry.npmmirror.com/pkg-up/-/pkg-up-3.1.0.tgz", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="],
+
+ "pkijs": ["pkijs@3.4.0", "https://registry.npmmirror.com/pkijs/-/pkijs-3.4.0.tgz", { "dependencies": { "@noble/hashes": "1.4.0", "asn1js": "^3.0.6", "bytestreamjs": "^2.0.1", "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw=="],
+
+ "playwright": ["playwright@1.59.1", "https://registry.npmmirror.com/playwright/-/playwright-1.59.1.tgz", { "dependencies": { "playwright-core": "1.59.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw=="],
+
+ "playwright-core": ["playwright-core@1.59.1", "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.59.1.tgz", { "bin": { "playwright-core": "cli.js" } }, "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg=="],
+
+ "plist": ["plist@3.1.0", "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="],
+
+ "poe-oauth": ["poe-oauth@0.0.8", "https://registry.npmmirror.com/poe-oauth/-/poe-oauth-0.0.8.tgz", {}, "sha512-zlaRVLR6vuxBIYUkZoTIVo3f8h3qd27gv9Ms+kmGiYEiiV4TdccddTdNcGyI0DnuJ9tVi+5LP3Bvzez59IFbjw=="],
+
+ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
+
+ "postcss": ["postcss@8.5.15", "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
+
+ "postcss-css-variables": ["postcss-css-variables@0.18.0", "https://registry.npmmirror.com/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz", { "dependencies": { "balanced-match": "^1.0.0", "escape-string-regexp": "^1.0.3", "extend": "^3.0.1" }, "peerDependencies": { "postcss": "^8.2.6" } }, "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q=="],
+
+ "postcss-import": ["postcss-import@15.1.0", "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
+
+ "postcss-js": ["postcss-js@4.1.0", "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.1.0.tgz", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="],
+
+ "postcss-load-config": ["postcss-load-config@4.0.2", "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="],
+
+ "postcss-nested": ["postcss-nested@6.2.0", "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
+
+ "postcss-value-parser": ["postcss-value-parser@4.2.0", "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
+
+ "postgres": ["postgres@3.4.7", "https://registry.npmmirror.com/postgres/-/postgres-3.4.7.tgz", {}, "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw=="],
+
+ "postject": ["postject@1.0.0-alpha.6", "https://registry.npmmirror.com/postject/-/postject-1.0.0-alpha.6.tgz", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="],
+
+ "powershell-utils": ["powershell-utils@0.1.0", "https://registry.npmmirror.com/powershell-utils/-/powershell-utils-0.1.0.tgz", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
+
+ "prettier": ["prettier@3.6.2", "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="],
+
+ "pretty": ["pretty@2.0.0", "https://registry.npmmirror.com/pretty/-/pretty-2.0.0.tgz", { "dependencies": { "condense-newlines": "^0.2.1", "extend-shallow": "^2.0.1", "js-beautify": "^1.6.12" } }, "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w=="],
+
+ "pretty-format": ["pretty-format@27.5.1", "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="],
+
+ "prismjs": ["prismjs@1.30.0", "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
+
+ "proc-log": ["proc-log@6.1.0", "https://registry.npmmirror.com/proc-log/-/proc-log-6.1.0.tgz", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="],
+
+ "process": ["process@0.11.10", "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
+
+ "process-nextick-args": ["process-nextick-args@2.0.1", "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
+
+ "process-warning": ["process-warning@5.0.0", "https://registry.npmmirror.com/process-warning/-/process-warning-5.0.0.tgz", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="],
+
+ "proggy": ["proggy@4.0.0", "https://registry.npmmirror.com/proggy/-/proggy-4.0.0.tgz", {}, "sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ=="],
+
+ "progress": ["progress@2.0.3", "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="],
+
+ "promise-all-reject-late": ["promise-all-reject-late@1.0.1", "https://registry.npmmirror.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="],
+
+ "promise-call-limit": ["promise-call-limit@3.0.2", "https://registry.npmmirror.com/promise-call-limit/-/promise-call-limit-3.0.2.tgz", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="],
+
+ "promise-retry": ["promise-retry@2.0.1", "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
+
+ "promise.allsettled": ["promise.allsettled@1.0.7", "https://registry.npmmirror.com/promise.allsettled/-/promise.allsettled-1.0.7.tgz", { "dependencies": { "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "iterate-value": "^1.0.2" } }, "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA=="],
+
+ "prompts": ["prompts@2.4.2", "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
+
+ "proper-lockfile": ["proper-lockfile@4.1.2", "https://registry.npmmirror.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="],
+
+ "property-information": ["property-information@7.1.0", "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "proto-list": ["proto-list@1.2.4", "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="],
+
+ "protobufjs": ["protobufjs@7.6.2", "https://registry.npmmirror.com/protobufjs/-/protobufjs-7.6.2.tgz", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-N9EiLovGEQOJSPF26Ij7qUGvahfEnq0eeYZ02aigIedkmz1qZSwjnP9SBITHJuF/6MYbIW4HDN8zdYjsjqJKXQ=="],
+
+ "proxy-addr": ["proxy-addr@2.0.7", "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
+
+ "proxy-from-env": ["proxy-from-env@2.1.0", "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="],
+
+ "pump": ["pump@3.0.4", "https://registry.npmmirror.com/pump/-/pump-3.0.4.tgz", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="],
+
+ "punycode": ["punycode@2.3.1", "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "pupa": ["pupa@3.3.0", "https://registry.npmmirror.com/pupa/-/pupa-3.3.0.tgz", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA=="],
+
+ "pure-rand": ["pure-rand@8.4.0", "https://registry.npmmirror.com/pure-rand/-/pure-rand-8.4.0.tgz", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="],
+
+ "pvtsutils": ["pvtsutils@1.3.6", "https://registry.npmmirror.com/pvtsutils/-/pvtsutils-1.3.6.tgz", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="],
+
+ "pvutils": ["pvutils@1.1.5", "https://registry.npmmirror.com/pvutils/-/pvutils-1.1.5.tgz", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="],
+
+ "qs": ["qs@6.15.2", "https://registry.npmmirror.com/qs/-/qs-6.15.2.tgz", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="],
+
+ "quansync": ["quansync@0.2.11", "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="],
+
+ "queue-microtask": ["queue-microtask@1.2.3", "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
+ "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "https://registry.npmmirror.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="],
+
+ "quick-lru": ["quick-lru@5.1.1", "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="],
+
+ "radix3": ["radix3@1.1.2", "https://registry.npmmirror.com/radix3/-/radix3-1.1.2.tgz", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
+
+ "range-parser": ["range-parser@1.2.1", "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
+
+ "raw-body": ["raw-body@2.5.3", "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="],
+
+ "rc9": ["rc9@2.1.2", "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="],
+
+ "react": ["react@18.2.0", "https://registry.npmmirror.com/react/-/react-18.2.0.tgz", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ=="],
+
+ "react-docgen-typescript": ["react-docgen-typescript@2.4.0", "https://registry.npmmirror.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", { "peerDependencies": { "typescript": ">= 4.3.x" } }, "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg=="],
+
+ "react-dom": ["react-dom@18.2.0", "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="],
+
+ "react-is": ["react-is@17.0.2", "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="],
+
+ "react-refresh": ["react-refresh@0.17.0", "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="],
+
+ "react-remove-scroll": ["react-remove-scroll@2.5.5", "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", { "dependencies": { "react-remove-scroll-bar": "^2.3.3", "react-style-singleton": "^2.2.1", "tslib": "^2.1.0", "use-callback-ref": "^1.3.0", "use-sidecar": "^1.1.2" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw=="],
+
+ "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
+
+ "react-router": ["react-router@6.16.0", "https://registry.npmmirror.com/react-router/-/react-router-6.16.0.tgz", { "dependencies": { "@remix-run/router": "1.9.0" }, "peerDependencies": { "react": ">=16.8" } }, "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA=="],
+
+ "react-router-dom": ["react-router-dom@6.16.0", "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.16.0.tgz", { "dependencies": { "@remix-run/router": "1.9.0", "react-router": "6.16.0" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg=="],
+
+ "react-style-singleton": ["react-style-singleton@2.2.3", "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
+
+ "read-binary-file-arch": ["read-binary-file-arch@1.0.6", "https://registry.npmmirror.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", { "dependencies": { "debug": "^4.3.4" }, "bin": { "read-binary-file-arch": "cli.js" } }, "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg=="],
+
+ "read-cache": ["read-cache@1.0.0", "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
+
+ "read-cmd-shim": ["read-cmd-shim@6.0.0", "https://registry.npmmirror.com/read-cmd-shim/-/read-cmd-shim-6.0.0.tgz", {}, "sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A=="],
+
+ "readable-stream": ["readable-stream@4.7.0", "https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
+
+ "readdir-glob": ["readdir-glob@1.1.3", "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="],
+
+ "readdirp": ["readdirp@4.1.2", "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "real-require": ["real-require@0.2.0", "https://registry.npmmirror.com/real-require/-/real-require-0.2.0.tgz", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="],
+
+ "recast": ["recast@0.23.11", "https://registry.npmmirror.com/recast/-/recast-0.23.11.tgz", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
+
+ "recma-build-jsx": ["recma-build-jsx@1.0.0", "https://registry.npmmirror.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="],
+
+ "recma-jsx": ["recma-jsx@1.0.1", "https://registry.npmmirror.com/recma-jsx/-/recma-jsx-1.0.1.tgz", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="],
+
+ "recma-parse": ["recma-parse@1.0.0", "https://registry.npmmirror.com/recma-parse/-/recma-parse-1.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="],
+
+ "recma-stringify": ["recma-stringify@1.0.0", "https://registry.npmmirror.com/recma-stringify/-/recma-stringify-1.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="],
+
+ "redent": ["redent@3.0.0", "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="],
+
+ "redis-errors": ["redis-errors@1.2.0", "https://registry.npmmirror.com/redis-errors/-/redis-errors-1.2.0.tgz", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="],
+
+ "redis-parser": ["redis-parser@3.0.0", "https://registry.npmmirror.com/redis-parser/-/redis-parser-3.0.0.tgz", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="],
+
+ "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
+
+ "regex": ["regex@6.1.0", "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
+
+ "regex-recursion": ["regex-recursion@6.0.2", "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+ "regex-utilities": ["regex-utilities@2.3.0", "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
+
+ "rehype": ["rehype@13.0.2", "https://registry.npmmirror.com/rehype/-/rehype-13.0.2.tgz", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="],
+
+ "rehype-autolink-headings": ["rehype-autolink-headings@7.1.0", "https://registry.npmmirror.com/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-heading-rank": "^3.0.0", "hast-util-is-element": "^3.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw=="],
+
+ "rehype-expressive-code": ["rehype-expressive-code@0.41.7", "https://registry.npmmirror.com/rehype-expressive-code/-/rehype-expressive-code-0.41.7.tgz", { "dependencies": { "expressive-code": "^0.41.7" } }, "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ=="],
+
+ "rehype-format": ["rehype-format@5.0.1", "https://registry.npmmirror.com/rehype-format/-/rehype-format-5.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-format": "^1.0.0" } }, "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ=="],
+
+ "rehype-parse": ["rehype-parse@9.0.1", "https://registry.npmmirror.com/rehype-parse/-/rehype-parse-9.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="],
+
+ "rehype-raw": ["rehype-raw@7.0.0", "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-7.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
+
+ "rehype-recma": ["rehype-recma@1.0.0", "https://registry.npmmirror.com/rehype-recma/-/rehype-recma-1.0.0.tgz", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="],
+
+ "rehype-stringify": ["rehype-stringify@10.0.1", "https://registry.npmmirror.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="],
+
+ "relateurl": ["relateurl@0.2.7", "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="],
+
+ "remark-directive": ["remark-directive@3.0.1", "https://registry.npmmirror.com/remark-directive/-/remark-directive-3.0.1.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^3.0.0", "unified": "^11.0.0" } }, "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A=="],
+
+ "remark-gfm": ["remark-gfm@4.0.1", "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.1.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="],
+
+ "remark-mdx": ["remark-mdx@3.1.1", "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-3.1.1.tgz", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="],
+
+ "remark-parse": ["remark-parse@11.0.0", "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="],
+
+ "remark-rehype": ["remark-rehype@11.1.2", "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.2.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="],
+
+ "remark-smartypants": ["remark-smartypants@3.0.2", "https://registry.npmmirror.com/remark-smartypants/-/remark-smartypants-3.0.2.tgz", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="],
+
+ "remark-stringify": ["remark-stringify@11.0.0", "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
+
+ "remeda": ["remeda@2.26.0", "https://registry.npmmirror.com/remeda/-/remeda-2.26.0.tgz", { "dependencies": { "type-fest": "^4.41.0" } }, "sha512-lmNNwtaC6Co4m0WTTNoZ/JlpjEqAjPZO0+czC9YVRQUpkbS4x8Hmh+Mn9HPfJfiXqUQ5IXXgSXSOB2pBKAytdA=="],
+
+ "remend": ["remend@1.3.0", "https://registry.npmmirror.com/remend/-/remend-1.3.0.tgz", {}, "sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw=="],
+
+ "request-light": ["request-light@0.7.0", "https://registry.npmmirror.com/request-light/-/request-light-0.7.0.tgz", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="],
+
+ "require-directory": ["require-directory@2.1.1", "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "resedit": ["resedit@1.7.2", "https://registry.npmmirror.com/resedit/-/resedit-1.7.2.tgz", { "dependencies": { "pe-library": "^0.4.1" } }, "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA=="],
+
+ "reselect": ["reselect@4.1.8", "https://registry.npmmirror.com/reselect/-/reselect-4.1.8.tgz", {}, "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="],
+
+ "resolve": ["resolve@1.22.12", "https://registry.npmmirror.com/resolve/-/resolve-1.22.12.tgz", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="],
+
+ "resolve-alpn": ["resolve-alpn@1.2.1", "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="],
+
+ "resolve-cwd": ["resolve-cwd@3.0.0", "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="],
+
+ "resolve-from": ["resolve-from@5.0.0", "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+
+ "responselike": ["responselike@2.0.1", "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="],
+
+ "restructure": ["restructure@3.0.2", "https://registry.npmmirror.com/restructure/-/restructure-3.0.2.tgz", {}, "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="],
+
+ "ret": ["ret@0.5.0", "https://registry.npmmirror.com/ret/-/ret-0.5.0.tgz", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="],
+
+ "retext": ["retext@9.0.0", "https://registry.npmmirror.com/retext/-/retext-9.0.0.tgz", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
+
+ "retext-latin": ["retext-latin@4.0.0", "https://registry.npmmirror.com/retext-latin/-/retext-latin-4.0.0.tgz", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="],
+
+ "retext-smartypants": ["retext-smartypants@6.2.0", "https://registry.npmmirror.com/retext-smartypants/-/retext-smartypants-6.2.0.tgz", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="],
+
+ "retext-stringify": ["retext-stringify@4.0.0", "https://registry.npmmirror.com/retext-stringify/-/retext-stringify-4.0.0.tgz", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="],
+
+ "retry": ["retry@0.12.0", "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
+
+ "reusify": ["reusify@1.1.0", "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
+
+ "rimraf": ["rimraf@2.6.3", "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="],
+
+ "roarr": ["roarr@2.15.4", "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="],
+
+ "rollup": ["rollup@4.60.4", "https://registry.npmmirror.com/rollup/-/rollup-4.60.4.tgz", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.4", "@rollup/rollup-android-arm64": "4.60.4", "@rollup/rollup-darwin-arm64": "4.60.4", "@rollup/rollup-darwin-x64": "4.60.4", "@rollup/rollup-freebsd-arm64": "4.60.4", "@rollup/rollup-freebsd-x64": "4.60.4", "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", "@rollup/rollup-linux-arm-musleabihf": "4.60.4", "@rollup/rollup-linux-arm64-gnu": "4.60.4", "@rollup/rollup-linux-arm64-musl": "4.60.4", "@rollup/rollup-linux-loong64-gnu": "4.60.4", "@rollup/rollup-linux-loong64-musl": "4.60.4", "@rollup/rollup-linux-ppc64-gnu": "4.60.4", "@rollup/rollup-linux-ppc64-musl": "4.60.4", "@rollup/rollup-linux-riscv64-gnu": "4.60.4", "@rollup/rollup-linux-riscv64-musl": "4.60.4", "@rollup/rollup-linux-s390x-gnu": "4.60.4", "@rollup/rollup-linux-x64-gnu": "4.60.4", "@rollup/rollup-linux-x64-musl": "4.60.4", "@rollup/rollup-openbsd-x64": "4.60.4", "@rollup/rollup-openharmony-arm64": "4.60.4", "@rollup/rollup-win32-arm64-msvc": "4.60.4", "@rollup/rollup-win32-ia32-msvc": "4.60.4", "@rollup/rollup-win32-x64-gnu": "4.60.4", "@rollup/rollup-win32-x64-msvc": "4.60.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g=="],
+
+ "rou3": ["rou3@0.7.12", "https://registry.npmmirror.com/rou3/-/rou3-0.7.12.tgz", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="],
+
+ "router": ["router@2.2.0", "https://registry.npmmirror.com/router/-/router-2.2.0.tgz", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
+
+ "run-applescript": ["run-applescript@7.1.0", "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.1.0.tgz", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
+ "s-js": ["s-js@0.4.9", "https://registry.npmmirror.com/s-js/-/s-js-0.4.9.tgz", {}, "sha512-RtpOm+cM6O0sHg6IA70wH+UC3FZcND+rccBZpBAHzlUgNO2Bm5BN+FnM8+OBxzXdwpKWFwX11JGF0MFRkhSoIQ=="],
+
+ "safe-array-concat": ["safe-array-concat@1.1.4", "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "safe-push-apply": ["safe-push-apply@1.0.0", "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
+
+ "safe-regex-test": ["safe-regex-test@1.1.0", "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
+
+ "safe-regex2": ["safe-regex2@5.1.1", "https://registry.npmmirror.com/safe-regex2/-/safe-regex2-5.1.1.tgz", { "dependencies": { "ret": "~0.5.0" }, "bin": { "safe-regex2": "bin/safe-regex2.js" } }, "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA=="],
+
+ "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="],
+
+ "safer-buffer": ["safer-buffer@2.1.2", "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "sanitize-filename": ["sanitize-filename@1.6.4", "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.4.tgz", { "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg=="],
+
+ "sax": ["sax@1.6.0", "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
+
+ "scheduler": ["scheduler@0.23.2", "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
+
+ "section-matter": ["section-matter@1.0.0", "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
+
+ "secure-json-parse": ["secure-json-parse@4.1.0", "https://registry.npmmirror.com/secure-json-parse/-/secure-json-parse-4.1.0.tgz", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="],
+
+ "selderee": ["selderee@0.11.0", "https://registry.npmmirror.com/selderee/-/selderee-0.11.0.tgz", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="],
+
+ "semver": ["semver@7.8.1", "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="],
+
+ "semver-compare": ["semver-compare@1.0.0", "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="],
+
+ "send": ["send@0.19.2", "https://registry.npmmirror.com/send/-/send-0.19.2.tgz", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="],
+
+ "seq-queue": ["seq-queue@0.0.5", "https://registry.npmmirror.com/seq-queue/-/seq-queue-0.0.5.tgz", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="],
+
+ "serialize-error": ["serialize-error@7.0.1", "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="],
+
+ "seroval": ["seroval@1.3.2", "https://registry.npmmirror.com/seroval/-/seroval-1.3.2.tgz", {}, "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ=="],
+
+ "seroval-plugins": ["seroval-plugins@1.3.3", "https://registry.npmmirror.com/seroval-plugins/-/seroval-plugins-1.3.3.tgz", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w=="],
+
+ "serve-static": ["serve-static@1.16.3", "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.3.tgz", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="],
+
+ "set-cookie-parser": ["set-cookie-parser@2.7.2", "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="],
+
+ "set-function-length": ["set-function-length@1.2.2", "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
+
+ "set-function-name": ["set-function-name@2.0.2", "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
+
+ "set-proto": ["set-proto@1.0.0", "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
+
+ "setprototypeof": ["setprototypeof@1.2.0", "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
+
+ "sharp": ["sharp@0.33.5", "https://registry.npmmirror.com/sharp/-/sharp-0.33.5.tgz", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "shiki": ["shiki@3.20.0", "https://registry.npmmirror.com/shiki/-/shiki-3.20.0.tgz", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/engine-javascript": "3.20.0", "@shikijs/engine-oniguruma": "3.20.0", "@shikijs/langs": "3.20.0", "@shikijs/themes": "3.20.0", "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg=="],
+
+ "shikiji": ["shikiji@0.6.13", "https://registry.npmmirror.com/shikiji/-/shikiji-0.6.13.tgz", { "dependencies": { "hast-util-to-html": "^9.0.0" } }, "sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA=="],
+
+ "side-channel": ["side-channel@1.1.0", "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
+
+ "side-channel-list": ["side-channel-list@1.0.1", "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="],
+
+ "side-channel-map": ["side-channel-map@1.0.1", "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
+
+ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
+
+ "siginfo": ["siginfo@2.0.0", "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "sigstore": ["sigstore@4.1.1", "https://registry.npmmirror.com/sigstore/-/sigstore-4.1.1.tgz", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", "@sigstore/sign": "^4.1.1", "@sigstore/tuf": "^4.0.2", "@sigstore/verify": "^3.1.1" } }, "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w=="],
+
+ "simple-swizzle": ["simple-swizzle@0.2.4", "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="],
+
+ "simple-update-notifier": ["simple-update-notifier@2.0.0", "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", { "dependencies": { "semver": "^7.5.3" } }, "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w=="],
+
+ "sisteransi": ["sisteransi@1.0.5", "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
+
+ "sitemap": ["sitemap@9.0.1", "https://registry.npmmirror.com/sitemap/-/sitemap-9.0.1.tgz", { "dependencies": { "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/esm/cli.js" } }, "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ=="],
+
+ "slash": ["slash@3.0.0", "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
+
+ "slice-ansi": ["slice-ansi@5.0.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="],
+
+ "smart-buffer": ["smart-buffer@4.2.0", "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
+
+ "smol-toml": ["smol-toml@1.6.1", "https://registry.npmmirror.com/smol-toml/-/smol-toml-1.6.1.tgz", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="],
+
+ "socket.io-client": ["socket.io-client@4.8.3", "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-4.8.3.tgz", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="],
+
+ "socket.io-parser": ["socket.io-parser@4.2.6", "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-4.2.6.tgz", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg=="],
+
+ "socks": ["socks@2.8.9", "https://registry.npmmirror.com/socks/-/socks-2.8.9.tgz", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="],
+
+ "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
+
+ "solid-js": ["solid-js@1.9.10", "https://registry.npmmirror.com/solid-js/-/solid-js-1.9.10.tgz", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", "seroval-plugins": "~1.3.0" } }, "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew=="],
+
+ "solid-list": ["solid-list@0.3.0", "https://registry.npmmirror.com/solid-list/-/solid-list-0.3.0.tgz", { "dependencies": { "@corvu/utils": "~0.4.0" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-t4hx/F/l8Vmq+ib9HtZYl7Z9F1eKxq3eKJTXlvcm7P7yI4Z8O7QSOOEVHb/K6DD7M0RxzVRobK/BS5aSfLRwKg=="],
+
+ "solid-presence": ["solid-presence@0.1.8", "https://registry.npmmirror.com/solid-presence/-/solid-presence-0.1.8.tgz", { "dependencies": { "@corvu/utils": "~0.4.0" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA=="],
+
+ "solid-prevent-scroll": ["solid-prevent-scroll@0.1.10", "https://registry.npmmirror.com/solid-prevent-scroll/-/solid-prevent-scroll-0.1.10.tgz", { "dependencies": { "@corvu/utils": "~0.4.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw=="],
+
+ "solid-refresh": ["solid-refresh@0.6.3", "https://registry.npmmirror.com/solid-refresh/-/solid-refresh-0.6.3.tgz", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="],
+
+ "solid-stripe": ["solid-stripe@0.8.1", "https://registry.npmmirror.com/solid-stripe/-/solid-stripe-0.8.1.tgz", { "peerDependencies": { "@stripe/stripe-js": ">=1.44.1 <8.0.0", "solid-js": "^1.6.0" } }, "sha512-l2SkWoe51rsvk9u1ILBRWyCHODZebChSGMR6zHYJTivTRC0XWrRnNNKs5x1PYXsaIU71KYI6ov5CZB5cOtGLWw=="],
+
+ "solid-use": ["solid-use@0.9.1", "https://registry.npmmirror.com/solid-use/-/solid-use-0.9.1.tgz", { "peerDependencies": { "solid-js": "^1.7" } }, "sha512-UwvXDVPlrrbj/9ewG9ys5uL2IO4jSiwys2KPzK4zsnAcmEl7iDafZWW1Mo4BSEWOmQCGK6IvpmGHo1aou8iOFw=="],
+
+ "sonic-boom": ["sonic-boom@4.2.1", "https://registry.npmmirror.com/sonic-boom/-/sonic-boom-4.2.1.tgz", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="],
+
+ "sort-keys": ["sort-keys@1.1.2", "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz", { "dependencies": { "is-plain-obj": "^1.0.0" } }, "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg=="],
+
+ "sort-keys-length": ["sort-keys-length@1.0.1", "https://registry.npmmirror.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz", { "dependencies": { "sort-keys": "^1.0.0" } }, "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw=="],
+
+ "source-map": ["source-map@0.6.1", "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "source-map-support": ["source-map-support@0.5.21", "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "spdx-exceptions": ["spdx-exceptions@2.5.0", "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
+
+ "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="],
+
+ "spdx-license-ids": ["spdx-license-ids@3.0.23", "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="],
+
+ "split2": ["split2@4.2.0", "https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
+
+ "sprintf-js": ["sprintf-js@1.0.3", "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
+
+ "sqlstring": ["sqlstring@2.3.3", "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.3.tgz", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="],
+
+ "srvx": ["srvx@0.9.8", "https://registry.npmmirror.com/srvx/-/srvx-0.9.8.tgz", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-RZaxTKJEE/14HYn8COLuUOJAt0U55N9l1Xf6jj+T0GoA01EUH1Xz5JtSUOI+EHn+AEgPCVn7gk6jHJffrr06fQ=="],
+
+ "ssri": ["ssri@13.0.1", "https://registry.npmmirror.com/ssri/-/ssri-13.0.1.tgz", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ=="],
+
+ "sst": ["sst@4.13.1", "https://registry.npmmirror.com/sst/-/sst-4.13.1.tgz", { "dependencies": { "@aws/durable-execution-sdk-js": "1.0.2", "aws4fetch": "1.0.18", "jose": "5.2.3", "openid-client": "5.6.4" }, "optionalDependencies": { "sst-darwin-arm64": "4.13.1", "sst-darwin-x64": "4.13.1", "sst-linux-arm64": "4.13.1", "sst-linux-x64": "4.13.1", "sst-linux-x86": "4.13.1", "sst-win32-arm64": "4.13.1", "sst-win32-x64": "4.13.1", "sst-win32-x86": "4.13.1" }, "bin": { "sst": "bin/sst.mjs" } }, "sha512-FKzhWuqV5NPhFWH7b+Ktf5+Mvox6DCMc8iOrjaS3mkjnnmyEcOZq7HNx2/ZlIcBwgOZE9sCPR3ot1zXtXkXzZg=="],
+
+ "sst-darwin-arm64": ["sst-darwin-arm64@4.13.1", "https://registry.npmmirror.com/sst-darwin-arm64/-/sst-darwin-arm64-4.13.1.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-gGwfgZGOsulU6iGeZJtxP5BpSZFsRUy1dG/yTqJa++n1P1APWXZC64u2qRHm6rdwLAjEeWaCQ9k7ouKgn0zh5Q=="],
+
+ "sst-darwin-x64": ["sst-darwin-x64@4.13.1", "https://registry.npmmirror.com/sst-darwin-x64/-/sst-darwin-x64-4.13.1.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-RcKLI2oAY+Wk5fWUF0gJFKvwMSpid3qw9L3OcfgFL2ymZH652ybLpQPBxtoJ95FdyknWIMnYf6ZK9C2jnH5eaw=="],
+
+ "sst-linux-arm64": ["sst-linux-arm64@4.13.1", "https://registry.npmmirror.com/sst-linux-arm64/-/sst-linux-arm64-4.13.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-Lp/8BWhH8KZnb50xPd8A6bkZ7QqCH3Dar9l16TPwuAmPxxRUlkmg42h+ACZ9n02vSJl8y/WLnV4JB6SgJpRFVg=="],
+
+ "sst-linux-x64": ["sst-linux-x64@4.13.1", "https://registry.npmmirror.com/sst-linux-x64/-/sst-linux-x64-4.13.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-f4eHOsApoP+CpUzLUGzfoTBYsqqr6nl/M0gjYsVNi1T+6v92lc84AhQ4DoDZx033QggyxkqRezj8jOkjkKxa7w=="],
+
+ "sst-linux-x86": ["sst-linux-x86@4.13.1", "https://registry.npmmirror.com/sst-linux-x86/-/sst-linux-x86-4.13.1.tgz", { "os": "linux", "cpu": "none" }, "sha512-5OHdtPa0GmozDpBPdsD9Tv+SGnpjJSoTXptgK59ivQg3UYNWBBotidvEyUJs1MU9B/3+I+Fmw32zsF2O+ZtPgg=="],
+
+ "sst-win32-arm64": ["sst-win32-arm64@4.13.1", "https://registry.npmmirror.com/sst-win32-arm64/-/sst-win32-arm64-4.13.1.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-qAUuCQj6wDdZ84a9W4FhnRTHYlEnYRHGYFqO3cmMImbnAQEoKSQR1XuWqt0Ev4RT3kU4Lz/fgvJjGkR7WUstLg=="],
+
+ "sst-win32-x64": ["sst-win32-x64@4.13.1", "https://registry.npmmirror.com/sst-win32-x64/-/sst-win32-x64-4.13.1.tgz", { "os": "win32", "cpu": "x64" }, "sha512-r+83NMwpe4MLAvkVoOxi1KNs6nIqilFucsTr+VN1PgknsiVBY1emITjSWS2jDJJMuH8xJXL5xJzF/l5rcKWErg=="],
+
+ "sst-win32-x86": ["sst-win32-x86@4.13.1", "https://registry.npmmirror.com/sst-win32-x86/-/sst-win32-x86-4.13.1.tgz", { "os": "win32", "cpu": "none" }, "sha512-YPxBVdac/MsrzwlC6pF0NrrvMcmfdBLYjv7MbzHc5jNh1FQ1WPh6bdWQqgv0KD9EQTNLLEkej0beydgUvcCWJg=="],
+
+ "stackback": ["stackback@0.0.2", "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],
+
+ "stackframe": ["stackframe@1.3.4", "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="],
+
+ "standard-as-callback": ["standard-as-callback@2.1.0", "https://registry.npmmirror.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="],
+
+ "stat-mode": ["stat-mode@1.0.0", "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz", {}, "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg=="],
+
+ "statuses": ["statuses@2.0.2", "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
+
+ "std-env": ["std-env@4.1.0", "https://registry.npmmirror.com/std-env/-/std-env-4.1.0.tgz", {}, "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="],
+
+ "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
+
+ "stoppable": ["stoppable@1.1.0", "https://registry.npmmirror.com/stoppable/-/stoppable-1.1.0.tgz", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="],
+
+ "storybook": ["storybook@10.4.1", "https://registry.npmmirror.com/storybook/-/storybook-10.4.1.tgz", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", "@testing-library/jest-dom": "^6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", "open": "^10.2.0", "oxc-parser": "^0.127.0", "oxc-resolver": "^11.19.1", "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", "ws": "^8.18.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "prettier": "^2 || ^3", "vite-plus": "^0.1.15" }, "optionalPeers": ["@types/react", "prettier", "vite-plus"], "bin": "./dist/bin/dispatcher.js" }, "sha512-V1Zd2e+gBFufqAQVZ1JR8KLqALsEZ3JYSBnWwQbKa6zCfWWanR6AFMyuOkLt2gZOgGp3h2Riuz88pGNVTQSG0A=="],
+
+ "storybook-solidjs-vite": ["storybook-solidjs-vite@10.1.1", "https://registry.npmmirror.com/storybook-solidjs-vite/-/storybook-solidjs-vite-10.1.1.tgz", { "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@storybook/builder-vite": "^10.4.0", "@storybook/global": "^5.0.0", "semver": "7.8.1" }, "peerDependencies": { "@solidjs/web": "^2.0.0-0", "solid-js": "^1.8.0-0 || ^2.0.0-0", "storybook": "^0.0.0-0 || ^10.0.0", "typescript": "^4.0.0 || ^5.0.0 || ^6.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vite-plugin-solid": "^2.0.0-0 || ^3.0.0-0" }, "optionalPeers": ["@solidjs/web", "typescript"] }, "sha512-4acj1yxVPM3PieEGFPJukPeIXmpboJprewiX0KMrdYvtAZy8zbkZ7QBf8iENyKNJOayeXWzMm+z7hWBQDUirYg=="],
+
+ "stream-replace-string": ["stream-replace-string@2.0.0", "https://registry.npmmirror.com/stream-replace-string/-/stream-replace-string-2.0.0.tgz", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="],
+
+ "streamx": ["streamx@2.26.0", "https://registry.npmmirror.com/streamx/-/streamx-2.26.0.tgz", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A=="],
+
+ "string-width": ["string-width@7.2.0", "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "string-width-cjs": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "string.prototype.trim": ["string.prototype.trim@1.2.10", "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
+
+ "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
+
+ "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
+
+ "string_decoder": ["string_decoder@1.3.0", "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
+
+ "stringify-entities": ["stringify-entities@4.0.4", "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
+
+ "strip-ansi": ["strip-ansi@7.1.2", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "strip-ansi-cjs": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-bom-string": ["strip-bom-string@1.0.0", "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
+
+ "strip-final-newline": ["strip-final-newline@3.0.0", "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
+
+ "strip-indent": ["strip-indent@3.0.0", "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="],
+
+ "stripe": ["stripe@18.0.0", "https://registry.npmmirror.com/stripe/-/stripe-18.0.0.tgz", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-3Fs33IzKUby//9kCkCa1uRpinAoTvj6rJgQ2jrBEysoxEvfsclvXdna1amyEYbA2EKkjynuB4+L/kleCCaWTpA=="],
+
+ "strnum": ["strnum@1.1.2", "https://registry.npmmirror.com/strnum/-/strnum-1.1.2.tgz", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="],
+
+ "stubborn-fs": ["stubborn-fs@2.0.0", "https://registry.npmmirror.com/stubborn-fs/-/stubborn-fs-2.0.0.tgz", { "dependencies": { "stubborn-utils": "^1.0.1" } }, "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA=="],
+
+ "stubborn-utils": ["stubborn-utils@1.0.2", "https://registry.npmmirror.com/stubborn-utils/-/stubborn-utils-1.0.2.tgz", {}, "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg=="],
+
+ "style-to-js": ["style-to-js@1.1.21", "https://registry.npmmirror.com/style-to-js/-/style-to-js-1.1.21.tgz", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
+
+ "style-to-object": ["style-to-object@1.0.14", "https://registry.npmmirror.com/style-to-object/-/style-to-object-1.0.14.tgz", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
+
+ "sucrase": ["sucrase@3.35.1", "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.1.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "sumchecker": ["sumchecker@3.0.1", "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="],
+
+ "superstruct": ["superstruct@1.0.4", "https://registry.npmmirror.com/superstruct/-/superstruct-1.0.4.tgz", {}, "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ=="],
+
+ "supports-color": ["supports-color@7.2.0", "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
+
+ "sury": ["sury@11.0.0-alpha.4", "https://registry.npmmirror.com/sury/-/sury-11.0.0-alpha.4.tgz", { "peerDependencies": { "rescript": "12.x" }, "optionalPeers": ["rescript"] }, "sha512-oeG/GJWZvQCKtGPpLbu0yCZudfr5LxycDo5kh7SJmKHDPCsEPJssIZL2Eb4Tl7g9aPEvIDuRrkS+L0pybsMEMA=="],
+
+ "system-architecture": ["system-architecture@0.1.0", "https://registry.npmmirror.com/system-architecture/-/system-architecture-0.1.0.tgz", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="],
+
+ "tagged-tag": ["tagged-tag@1.0.0", "https://registry.npmmirror.com/tagged-tag/-/tagged-tag-1.0.0.tgz", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
+
+ "tailwindcss": ["tailwindcss@4.1.11", "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.11.tgz", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="],
+
+ "tapable": ["tapable@2.3.3", "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
+
+ "tar": ["tar@7.5.15", "https://registry.npmmirror.com/tar/-/tar-7.5.15.tgz", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ=="],
+
+ "tar-stream": ["tar-stream@3.2.0", "https://registry.npmmirror.com/tar-stream/-/tar-stream-3.2.0.tgz", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="],
+
+ "teex": ["teex@1.0.1", "https://registry.npmmirror.com/teex/-/teex-1.0.1.tgz", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="],
+
+ "temp": ["temp@0.9.4", "https://registry.npmmirror.com/temp/-/temp-0.9.4.tgz", { "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" } }, "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA=="],
+
+ "temp-file": ["temp-file@3.4.0", "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz", { "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" } }, "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg=="],
+
+ "terracotta": ["terracotta@1.1.0", "https://registry.npmmirror.com/terracotta/-/terracotta-1.1.0.tgz", { "dependencies": { "solid-use": "^0.9.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww=="],
+
+ "terser": ["terser@5.48.0", "https://registry.npmmirror.com/terser/-/terser-5.48.0.tgz", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q=="],
+
+ "text-decoder": ["text-decoder@1.2.7", "https://registry.npmmirror.com/text-decoder/-/text-decoder-1.2.7.tgz", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="],
+
+ "thenify": ["thenify@3.3.1", "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "thread-stream": ["thread-stream@4.2.0", "https://registry.npmmirror.com/thread-stream/-/thread-stream-4.2.0.tgz", { "dependencies": { "real-require": "^1.0.0" } }, "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ=="],
+
+ "thunky": ["thunky@1.1.0", "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", {}, "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="],
+
+ "tiny-async-pool": ["tiny-async-pool@1.3.0", "https://registry.npmmirror.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="],
+
+ "tiny-inflate": ["tiny-inflate@1.0.3", "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
+
+ "tiny-invariant": ["tiny-invariant@1.3.3", "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
+
+ "tiny-typed-emitter": ["tiny-typed-emitter@2.1.0", "https://registry.npmmirror.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", {}, "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="],
+
+ "tinybench": ["tinybench@2.9.0", "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
+
+ "tinyexec": ["tinyexec@0.3.2", "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
+
+ "tinyglobby": ["tinyglobby@0.2.17", "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
+ "tinyrainbow": ["tinyrainbow@3.1.0", "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-3.1.0.tgz", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="],
+
+ "tinyspy": ["tinyspy@4.0.4", "https://registry.npmmirror.com/tinyspy/-/tinyspy-4.0.4.tgz", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="],
+
+ "titleize": ["titleize@4.0.0", "https://registry.npmmirror.com/titleize/-/titleize-4.0.0.tgz", {}, "sha512-ZgUJ1K83rhdu7uh7EHAC2BgY5DzoX8V5rTvoWI4vFysggi6YjLe5gUXABPWAU7VkvGP7P/0YiWq+dcPeYDsf1g=="],
+
+ "tmp": ["tmp@0.2.7", "https://registry.npmmirror.com/tmp/-/tmp-0.2.7.tgz", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="],
+
+ "tmp-promise": ["tmp-promise@3.0.3", "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "toad-cache": ["toad-cache@3.7.1", "https://registry.npmmirror.com/toad-cache/-/toad-cache-3.7.1.tgz", {}, "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ=="],
+
+ "toidentifier": ["toidentifier@1.0.1", "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
+
+ "toml": ["toml@4.1.1", "https://registry.npmmirror.com/toml/-/toml-4.1.1.tgz", {}, "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw=="],
+
+ "toolbeam-docs-theme": ["toolbeam-docs-theme@0.4.8", "https://registry.npmmirror.com/toolbeam-docs-theme/-/toolbeam-docs-theme-0.4.8.tgz", { "peerDependencies": { "@astrojs/starlight": "^0.34.3", "astro": "^5.7.13" } }, "sha512-b+5ynEFp4Woe5a22hzNQm42lD23t13ZMihVxHbzjA50zdcM9aOSJTIjdJ0PDSd4/50HbBXcpHiQsz6rM4N88ww=="],
+
+ "topojson-client": ["topojson-client@3.1.0", "https://registry.npmmirror.com/topojson-client/-/topojson-client-3.1.0.tgz", { "dependencies": { "commander": "2" }, "bin": { "topo2geo": "bin/topo2geo", "topomerge": "bin/topomerge", "topoquantize": "bin/topoquantize" } }, "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw=="],
+
+ "tr46": ["tr46@0.0.3", "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
+
+ "traverse": ["traverse@0.3.9", "https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz", {}, "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ=="],
+
+ "tree-sitter-bash": ["tree-sitter-bash@0.25.0", "https://registry.npmmirror.com/tree-sitter-bash/-/tree-sitter-bash-0.25.0.tgz", { "dependencies": { "node-addon-api": "^8.2.1", "node-gyp-build": "^4.8.2" }, "peerDependencies": { "tree-sitter": "^0.25.0" }, "optionalPeers": ["tree-sitter"] }, "sha512-gZtlj9+qFS81qKxpLfD6H0UssQ3QBc/F0nKkPsiFDyfQF2YBqYvglFJUzchrPpVhZe9kLZTrJ9n2J6lmka69Vg=="],
+
+ "tree-sitter-powershell": ["tree-sitter-powershell@0.25.10", "https://registry.npmmirror.com/tree-sitter-powershell/-/tree-sitter-powershell-0.25.10.tgz", { "dependencies": { "node-addon-api": "^7.1.0", "node-gyp-build": "^4.8.0" }, "peerDependencies": { "tree-sitter": "^0.25.0" }, "optionalPeers": ["tree-sitter"] }, "sha512-bEt8QoySpGFnU3aa8WedQyNMaN6aTwy/WUbvIVt0JSKF+BbJoSHNHu+wCbhj7xLMsfB0AuffmiJm+B8gzva8Lg=="],
+
+ "treeverse": ["treeverse@3.0.0", "https://registry.npmmirror.com/treeverse/-/treeverse-3.0.0.tgz", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "trough": ["trough@2.2.0", "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
+
+ "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="],
+
+ "ts-algebra": ["ts-algebra@2.0.0", "https://registry.npmmirror.com/ts-algebra/-/ts-algebra-2.0.0.tgz", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="],
+
+ "ts-dedent": ["ts-dedent@2.2.0", "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "tsconfck": ["tsconfck@3.1.6", "https://registry.npmmirror.com/tsconfck/-/tsconfck-3.1.6.tgz", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="],
+
+ "tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tsscmp": ["tsscmp@1.0.6", "https://registry.npmmirror.com/tsscmp/-/tsscmp-1.0.6.tgz", {}, "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="],
+
+ "tuf-js": ["tuf-js@4.1.0", "https://registry.npmmirror.com/tuf-js/-/tuf-js-4.1.0.tgz", { "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" } }, "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ=="],
+
+ "tunnel": ["tunnel@0.0.6", "https://registry.npmmirror.com/tunnel/-/tunnel-0.0.6.tgz", {}, "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="],
+
+ "turbo": ["turbo@2.8.13", "https://registry.npmmirror.com/turbo/-/turbo-2.8.13.tgz", { "optionalDependencies": { "turbo-darwin-64": "2.8.13", "turbo-darwin-arm64": "2.8.13", "turbo-linux-64": "2.8.13", "turbo-linux-arm64": "2.8.13", "turbo-windows-64": "2.8.13", "turbo-windows-arm64": "2.8.13" }, "bin": { "turbo": "bin/turbo" } }, "sha512-nyM99hwFB9/DHaFyKEqatdayGjsMNYsQ/XBNO6MITc7roncZetKb97MpHxWf3uiU+LB9c9HUlU3Jp2Ixei2k1A=="],
+
+ "turbo-darwin-64": ["turbo-darwin-64@2.8.13", "https://registry.npmmirror.com/turbo-darwin-64/-/turbo-darwin-64-2.8.13.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-PmOvodQNiOj77+Zwoqku70vwVjKzL34RTNxxoARjp5RU5FOj/CGiC6vcDQhNtFPUOWSAaogHF5qIka9TBhX4XA=="],
+
+ "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.13", "https://registry.npmmirror.com/turbo-darwin-arm64/-/turbo-darwin-arm64-2.8.13.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-kI+anKcLIM4L8h+NsM7mtAUpElkCOxv5LgiQVQR8BASyDFfc8Efj5kCk3cqxuxOvIqx0sLfCX7atrHQ2kwuNJQ=="],
+
+ "turbo-linux-64": ["turbo-linux-64@2.8.13", "https://registry.npmmirror.com/turbo-linux-64/-/turbo-linux-64-2.8.13.tgz", { "os": "linux", "cpu": "x64" }, "sha512-j29KnQhHyzdzgCykBFeBqUPS4Wj7lWMnZ8CHqytlYDap4Jy70l4RNG46pOL9+lGu6DepK2s1rE86zQfo0IOdPw=="],
+
+ "turbo-linux-arm64": ["turbo-linux-arm64@2.8.13", "https://registry.npmmirror.com/turbo-linux-arm64/-/turbo-linux-arm64-2.8.13.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-OEl1YocXGZDRDh28doOUn49QwNe82kXljO1HXApjU0LapkDiGpfl3jkAlPKxEkGDSYWc8MH5Ll8S16Rf5tEBYg=="],
+
+ "turbo-windows-64": ["turbo-windows-64@2.8.13", "https://registry.npmmirror.com/turbo-windows-64/-/turbo-windows-64-2.8.13.tgz", { "os": "win32", "cpu": "x64" }, "sha512-717bVk1+Pn2Jody7OmWludhEirEe0okoj1NpRbSm5kVZz/yNN/jfjbxWC6ilimXMz7xoMT3IDfQFJsFR3PMANA=="],
+
+ "turbo-windows-arm64": ["turbo-windows-arm64@2.8.13", "https://registry.npmmirror.com/turbo-windows-arm64/-/turbo-windows-arm64-2.8.13.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-R819HShLIT0Wj6zWVnIsYvSNtRNj1q9VIyaUz0P24SMcLCbQZIm1sV09F4SDbg+KCCumqD2lcaR2UViQ8SnUJA=="],
+
+ "turndown": ["turndown@7.2.0", "https://registry.npmmirror.com/turndown/-/turndown-7.2.0.tgz", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A=="],
+
+ "tw-to-css": ["tw-to-css@0.0.12", "https://registry.npmmirror.com/tw-to-css/-/tw-to-css-0.0.12.tgz", { "dependencies": { "postcss": "8.4.31", "postcss-css-variables": "0.18.0", "tailwindcss": "3.3.2" } }, "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw=="],
+
+ "type-fest": ["type-fest@4.41.0", "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
+
+ "type-is": ["type-is@1.6.18", "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
+
+ "typed-array-buffer": ["typed-array-buffer@1.0.3", "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
+
+ "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
+
+ "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
+
+ "typed-array-length": ["typed-array-length@1.0.8", "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.8.tgz", { "dependencies": { "call-bind": "^1.0.9", "for-each": "^0.3.5", "gopd": "^1.2.0", "is-typed-array": "^1.1.15", "possible-typed-array-names": "^1.1.0", "reflect.getprototypeof": "^1.0.10" } }, "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g=="],
+
+ "typesafe-path": ["typesafe-path@0.2.2", "https://registry.npmmirror.com/typesafe-path/-/typesafe-path-0.2.2.tgz", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="],
+
+ "typescript": ["typescript@5.8.2", "https://registry.npmmirror.com/typescript/-/typescript-5.8.2.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="],
+
+ "typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "https://registry.npmmirror.com/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="],
+
+ "ufo": ["ufo@1.6.4", "https://registry.npmmirror.com/ufo/-/ufo-1.6.4.tgz", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
+
+ "uint8array-extras": ["uint8array-extras@1.5.0", "https://registry.npmmirror.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
+
+ "ulid": ["ulid@3.0.1", "https://registry.npmmirror.com/ulid/-/ulid-3.0.1.tgz", { "bin": { "ulid": "dist/cli.js" } }, "sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q=="],
+
+ "ultrahtml": ["ultrahtml@1.6.0", "https://registry.npmmirror.com/ultrahtml/-/ultrahtml-1.6.0.tgz", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
+
+ "unbox-primitive": ["unbox-primitive@1.1.0", "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
+
+ "uncrypto": ["uncrypto@0.1.3", "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
+
+ "undici": ["undici@8.3.0", "https://registry.npmmirror.com/undici/-/undici-8.3.0.tgz", {}, "sha512-TkUDgb6tl7KOGZ+7e8E3d2FYgUQgF6z5YypqjWmixVQSQERFcVrVg0ySADm2LVLRh5ljAaHTCR5Fmz3Q34rB7Q=="],
+
+ "undici-types": ["undici-types@7.16.0", "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
+
+ "unenv": ["unenv@2.0.0-rc.24", "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.24.tgz", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="],
+
+ "unicode-properties": ["unicode-properties@1.4.1", "https://registry.npmmirror.com/unicode-properties/-/unicode-properties-1.4.1.tgz", { "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="],
+
+ "unicode-trie": ["unicode-trie@2.0.0", "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="],
+
+ "unified": ["unified@11.0.5", "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
+
+ "unifont": ["unifont@0.5.2", "https://registry.npmmirror.com/unifont/-/unifont-0.5.2.tgz", { "dependencies": { "css-tree": "^3.0.0", "ofetch": "^1.4.1", "ohash": "^2.0.0" } }, "sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg=="],
+
+ "unist-util-find-after": ["unist-util-find-after@5.0.0", "https://registry.npmmirror.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
+
+ "unist-util-is": ["unist-util-is@6.0.1", "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
+
+ "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "https://registry.npmmirror.com/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="],
+
+ "unist-util-position": ["unist-util-position@5.0.0", "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+ "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "https://registry.npmmirror.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="],
+
+ "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "unist-util-visit": ["unist-util-visit@5.1.0", "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="],
+
+ "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "https://registry.npmmirror.com/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
+
+ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
+
+ "universal-github-app-jwt": ["universal-github-app-jwt@2.2.2", "https://registry.npmmirror.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz", {}, "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw=="],
+
+ "universal-user-agent": ["universal-user-agent@7.0.3", "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="],
+
+ "universalify": ["universalify@2.0.1", "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
+
+ "unpipe": ["unpipe@1.0.0", "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
+
+ "unplugin": ["unplugin@1.0.1", "https://registry.npmmirror.com/unplugin/-/unplugin-1.0.1.tgz", { "dependencies": { "acorn": "^8.8.1", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.5.0" } }, "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA=="],
+
+ "unstorage": ["unstorage@2.0.0-alpha.7", "https://registry.npmmirror.com/unstorage/-/unstorage-2.0.0-alpha.7.tgz", { "peerDependencies": { "@azure/app-configuration": "^1.11.0", "@azure/cosmos": "^4.9.1", "@azure/data-tables": "^13.3.2", "@azure/identity": "^4.13.0", "@azure/keyvault-secrets": "^4.10.0", "@azure/storage-blob": "^12.31.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.13.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.36.2", "@vercel/blob": ">=0.27.3", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "chokidar": "^4 || ^5", "db0": ">=0.3.4", "idb-keyval": "^6.2.2", "ioredis": "^5.9.3", "lru-cache": "^11.2.6", "mongodb": "^6 || ^7", "ofetch": "*", "uploadthing": "^7.7.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "chokidar", "db0", "idb-keyval", "ioredis", "lru-cache", "mongodb", "ofetch", "uploadthing"] }, "sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog=="],
+
+ "unused-filename": ["unused-filename@4.0.1", "https://registry.npmmirror.com/unused-filename/-/unused-filename-4.0.1.tgz", { "dependencies": { "escape-string-regexp": "^5.0.0", "path-exists": "^5.0.0" } }, "sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A=="],
+
+ "unzip-stream": ["unzip-stream@0.3.4", "https://registry.npmmirror.com/unzip-stream/-/unzip-stream-0.3.4.tgz", { "dependencies": { "binary": "^0.3.0", "mkdirp": "^0.5.1" } }, "sha512-PyofABPVv+d7fL7GOpusx7eRT9YETY2X04PhwbSipdj6bMxVCFJrr+nm0Mxqbf9hUiTin/UsnuFWBXlDZFy0Cw=="],
+
+ "unzipper": ["unzipper@0.12.3", "https://registry.npmmirror.com/unzipper/-/unzipper-0.12.3.tgz", { "dependencies": { "bluebird": "~3.7.2", "duplexer2": "~0.1.4", "fs-extra": "^11.2.0", "graceful-fs": "^4.2.2", "node-int64": "^0.4.0" } }, "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA=="],
+
+ "update-browserslist-db": ["update-browserslist-db@1.2.3", "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
+
+ "uri-js": ["uri-js@4.4.1", "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "use-callback-ref": ["use-callback-ref@1.3.3", "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
+
+ "use-sidecar": ["use-sidecar@1.1.3", "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.3.tgz", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
+
+ "use-sync-external-store": ["use-sync-external-store@1.6.0", "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
+
+ "utf8-byte-length": ["utf8-byte-length@1.0.5", "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", {}, "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "utils-merge": ["utils-merge@1.0.1", "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="],
+
+ "uuid": ["uuid@14.0.0", "https://registry.npmmirror.com/uuid/-/uuid-14.0.0.tgz", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg=="],
+
+ "valibot": ["valibot@1.4.1", "https://registry.npmmirror.com/valibot/-/valibot-1.4.1.tgz", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g=="],
+
+ "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "https://registry.npmmirror.com/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
+
+ "vary": ["vary@1.1.2", "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
+
+ "venice-ai-sdk-provider": ["venice-ai-sdk-provider@2.0.2", "https://registry.npmmirror.com/venice-ai-sdk-provider/-/venice-ai-sdk-provider-2.0.2.tgz", { "dependencies": { "@ai-sdk/openai-compatible": "^2.0.47", "@ai-sdk/provider": "^3.0.10", "@ai-sdk/provider-utils": "^4.0.27" }, "peerDependencies": { "ai": "^6.0.90" } }, "sha512-aoa05nI3BTK5aGbjBflq+Gfln2AHAkwNbWuGGvCzUIsOfp5Y3iPD4O4PUGDAEiWVJWbjpPn0KfDa0H/HebwsaA=="],
+
+ "verror": ["verror@1.10.1", "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg=="],
+
+ "vfile": ["vfile@6.0.3", "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-location": ["vfile-location@5.0.3", "https://registry.npmmirror.com/vfile-location/-/vfile-location-5.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
+
+ "vfile-message": ["vfile-message@4.0.3", "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "virtua": ["virtua@0.49.1", "https://registry.npmmirror.com/virtua/-/virtua-0.49.1.tgz", { "peerDependencies": { "react": ">=16.14.0", "react-dom": ">=16.14.0", "solid-js": ">=1.0", "svelte": ">=5.0", "vue": ">=3.2" }, "optionalPeers": ["react", "react-dom", "solid-js", "svelte", "vue"] }, "sha512-6f79msqg3jzNFdqJiS0FSzhRN1EHlDhR7EvW7emp6z5qQ22VdsReiDHflkpMEMhoAyUuYr69nwT0aagiM7NrUg=="],
+
+ "vite": ["vite@7.1.4", "https://registry.npmmirror.com/vite/-/vite-7.1.4.tgz", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw=="],
+
+ "vite-plugin-dynamic-import": ["vite-plugin-dynamic-import@1.6.0", "https://registry.npmmirror.com/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.6.0.tgz", { "dependencies": { "acorn": "^8.12.1", "es-module-lexer": "^1.5.4", "fast-glob": "^3.3.2", "magic-string": "^0.30.11" } }, "sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg=="],
+
+ "vite-plugin-icons-spritesheet": ["vite-plugin-icons-spritesheet@3.0.1", "https://registry.npmmirror.com/vite-plugin-icons-spritesheet/-/vite-plugin-icons-spritesheet-3.0.1.tgz", { "dependencies": { "chalk": "^5.4.1", "glob": "^11.0.1", "node-html-parser": "^7.0.1", "tinyexec": "^0.3.2" }, "peerDependencies": { "vite": ">=5.2.0" } }, "sha512-Cr0+Z6wRMwSwKisWW9PHeTjqmQFv0jwRQQMc3YgAhAgZEe03j21el0P/CA31KN/L5eiL1LhR14VTXl96LetonA=="],
+
+ "vite-plugin-solid": ["vite-plugin-solid@2.11.10", "https://registry.npmmirror.com/vite-plugin-solid/-/vite-plugin-solid-2.11.10.tgz", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw=="],
+
+ "vitefu": ["vitefu@1.1.3", "https://registry.npmmirror.com/vitefu/-/vitefu-1.1.3.tgz", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
+
+ "vitest": ["vitest@4.1.7", "https://registry.npmmirror.com/vitest/-/vitest-4.1.7.tgz", { "dependencies": { "@vitest/expect": "4.1.7", "@vitest/mocker": "4.1.7", "@vitest/pretty-format": "4.1.7", "@vitest/runner": "4.1.7", "@vitest/snapshot": "4.1.7", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.7", "@vitest/browser-preview": "4.1.7", "@vitest/browser-webdriverio": "4.1.7", "@vitest/coverage-istanbul": "4.1.7", "@vitest/coverage-v8": "4.1.7", "@vitest/ui": "4.1.7", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA=="],
+
+ "volar-service-css": ["volar-service-css@0.0.70", "https://registry.npmmirror.com/volar-service-css/-/volar-service-css-0.0.70.tgz", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw=="],
+
+ "volar-service-emmet": ["volar-service-emmet@0.0.70", "https://registry.npmmirror.com/volar-service-emmet/-/volar-service-emmet-0.0.70.tgz", { "dependencies": { "@emmetio/css-parser": "^0.4.1", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg=="],
+
+ "volar-service-html": ["volar-service-html@0.0.70", "https://registry.npmmirror.com/volar-service-html/-/volar-service-html-0.0.70.tgz", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ=="],
+
+ "volar-service-prettier": ["volar-service-prettier@0.0.70", "https://registry.npmmirror.com/volar-service-prettier/-/volar-service-prettier-0.0.70.tgz", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "optionalPeers": ["@volar/language-service", "prettier"] }, "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg=="],
+
+ "volar-service-typescript": ["volar-service-typescript@0.0.70", "https://registry.npmmirror.com/volar-service-typescript/-/volar-service-typescript-0.0.70.tgz", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg=="],
+
+ "volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.70", "https://registry.npmmirror.com/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.70.tgz", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ=="],
+
+ "volar-service-yaml": ["volar-service-yaml@0.0.70", "https://registry.npmmirror.com/volar-service-yaml/-/volar-service-yaml-0.0.70.tgz", { "dependencies": { "vscode-uri": "^3.0.8", "yaml-language-server": "~1.20.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ=="],
+
+ "vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "https://registry.npmmirror.com/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="],
+
+ "vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "https://registry.npmmirror.com/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="],
+
+ "vscode-json-languageservice": ["vscode-json-languageservice@4.1.8", "https://registry.npmmirror.com/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", "vscode-uri": "^3.0.2" } }, "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg=="],
+
+ "vscode-jsonrpc": ["vscode-jsonrpc@8.2.1", "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", {}, "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ=="],
+
+ "vscode-languageserver": ["vscode-languageserver@9.0.1", "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
+
+ "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
+
+ "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
+
+ "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
+
+ "vscode-nls": ["vscode-nls@5.2.0", "https://registry.npmmirror.com/vscode-nls/-/vscode-nls-5.2.0.tgz", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="],
+
+ "vscode-uri": ["vscode-uri@3.1.0", "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
+
+ "walk-up-path": ["walk-up-path@4.0.0", "https://registry.npmmirror.com/walk-up-path/-/walk-up-path-4.0.0.tgz", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="],
+
+ "web-namespaces": ["web-namespaces@2.0.1", "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
+
+ "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="],
+
+ "web-tree-sitter": ["web-tree-sitter@0.25.10", "https://registry.npmmirror.com/web-tree-sitter/-/web-tree-sitter-0.25.10.tgz", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="],
+
+ "webcrypto-core": ["webcrypto-core@1.9.2", "https://registry.npmmirror.com/webcrypto-core/-/webcrypto-core-1.9.2.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.7.0", "@peculiar/json-schema": "^1.1.12", "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q=="],
+
+ "webidl-conversions": ["webidl-conversions@3.0.1", "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+
+ "webpack-sources": ["webpack-sources@3.5.0", "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.5.0.tgz", {}, "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ=="],
+
+ "webpack-virtual-modules": ["webpack-virtual-modules@0.5.0", "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", {}, "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw=="],
+
+ "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="],
+
+ "whatwg-url": ["whatwg-url@5.0.0", "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
+
+ "when-exit": ["when-exit@2.1.5", "https://registry.npmmirror.com/when-exit/-/when-exit-2.1.5.tgz", {}, "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg=="],
+
+ "which": ["which@6.0.1", "https://registry.npmmirror.com/which/-/which-6.0.1.tgz", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
+
+ "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
+
+ "which-builtin-type": ["which-builtin-type@1.2.1", "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
+
+ "which-collection": ["which-collection@1.0.2", "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
+
+ "which-pm-runs": ["which-pm-runs@1.1.0", "https://registry.npmmirror.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
+
+ "which-typed-array": ["which-typed-array@1.1.21", "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.21.tgz", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw=="],
+
+ "why-is-node-running": ["why-is-node-running@3.2.2", "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-3.2.2.tgz", { "bin": { "why-is-node-running": "cli.js" } }, "sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A=="],
+
+ "widest-line": ["widest-line@5.0.0", "https://registry.npmmirror.com/widest-line/-/widest-line-5.0.0.tgz", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
+
+ "workerd": ["workerd@1.20251118.0", "https://registry.npmmirror.com/workerd/-/workerd-1.20251118.0.tgz", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251118.0", "@cloudflare/workerd-darwin-arm64": "1.20251118.0", "@cloudflare/workerd-linux-64": "1.20251118.0", "@cloudflare/workerd-linux-arm64": "1.20251118.0", "@cloudflare/workerd-windows-64": "1.20251118.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ=="],
+
+ "world-atlas": ["world-atlas@2.0.2", "https://registry.npmmirror.com/world-atlas/-/world-atlas-2.0.2.tgz", {}, "sha512-IXfV0qwlKXpckz1FhwXVwKRjiIhOnWttOskm5CtxMsjgE/MXAYRHWJqgXOpM8IkcPBoXnyTU5lFHcYa5ChG0LQ=="],
+
+ "wrangler": ["wrangler@4.50.0", "https://registry.npmmirror.com/wrangler/-/wrangler-4.50.0.tgz", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.7.11", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20251118.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251118.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251118.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-+nuZuHZxDdKmAyXOSrHlciGshCoAPiy5dM+t6mEohWm7HpXvTHmWQGUf/na9jjWlWJHCJYOWzkA1P5HBJqrIEA=="],
+
+ "wrap-ansi": ["wrap-ansi@9.0.2", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
+
+ "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "wrappy": ["wrappy@1.0.2", "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
+
+ "write-file-atomic": ["write-file-atomic@7.0.1", "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-7.0.1.tgz", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="],
+
+ "ws": ["ws@8.21.0", "https://registry.npmmirror.com/ws/-/ws-8.21.0.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
+
+ "wsl-utils": ["wsl-utils@0.3.1", "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.3.1.tgz", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
+
+ "xdg-basedir": ["xdg-basedir@5.1.0", "https://registry.npmmirror.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="],
+
+ "xml-naming": ["xml-naming@0.1.0", "https://registry.npmmirror.com/xml-naming/-/xml-naming-0.1.0.tgz", {}, "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw=="],
+
+ "xml2js": ["xml2js@0.5.0", "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="],
+
+ "xmlbuilder": ["xmlbuilder@11.0.1", "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
+
+ "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="],
+
+ "xxhash-wasm": ["xxhash-wasm@1.1.0", "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
+
+ "y18n": ["y18n@5.0.8", "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
+
+ "yallist": ["yallist@4.0.0", "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
+
+ "yaml": ["yaml@2.9.0", "https://registry.npmmirror.com/yaml/-/yaml-2.9.0.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
+
+ "yaml-language-server": ["yaml-language-server@1.20.0", "https://registry.npmmirror.com/yaml-language-server/-/yaml-language-server-1.20.0.tgz", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "prettier": "^3.5.0", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.7.1" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA=="],
+
+ "yargs": ["yargs@18.0.0", "https://registry.npmmirror.com/yargs/-/yargs-18.0.0.tgz", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="],
+
+ "yargs-parser": ["yargs-parser@21.1.1", "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+ "yauzl": ["yauzl@2.10.0", "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="],
+
+ "yocto-queue": ["yocto-queue@1.2.2", "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.2.2.tgz", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
+
+ "yocto-spinner": ["yocto-spinner@0.2.3", "https://registry.npmmirror.com/yocto-spinner/-/yocto-spinner-0.2.3.tgz", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="],
+
+ "yoctocolors": ["yoctocolors@2.1.2", "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.2.tgz", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
+
+ "yoga-layout": ["yoga-layout@3.2.1", "https://registry.npmmirror.com/yoga-layout/-/yoga-layout-3.2.1.tgz", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="],
+
+ "youch": ["youch@4.1.0-beta.10", "https://registry.npmmirror.com/youch/-/youch-4.1.0-beta.10.tgz", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="],
+
+ "youch-core": ["youch-core@0.3.3", "https://registry.npmmirror.com/youch-core/-/youch-core-0.3.3.tgz", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="],
+
+ "zip-stream": ["zip-stream@6.0.1", "https://registry.npmmirror.com/zip-stream/-/zip-stream-6.0.1.tgz", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="],
+
+ "zod": ["zod@4.1.8", "https://registry.npmmirror.com/zod/-/zod-4.1.8.tgz", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="],
+
+ "zod-openapi": ["zod-openapi@5.4.6", "https://registry.npmmirror.com/zod-openapi/-/zod-openapi-5.4.6.tgz", { "peerDependencies": { "zod": "^3.25.74 || ^4.0.0" } }, "sha512-P2jsOOBAq/6hCwUsMCjUATZ8szkMsV5VAwZENfyxp2Hc/XPJQpVwAgevWZc65xZauCwWB9LAn7zYeiCJFAEL+A=="],
+
+ "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="],
+
+ "zod-to-ts": ["zod-to-ts@1.2.0", "https://registry.npmmirror.com/zod-to-ts/-/zod-to-ts-1.2.0.tgz", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="],
+
+ "zwitch": ["zwitch@2.0.4", "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+ "@actions/artifact/@actions/core": ["@actions/core@2.0.3", "https://registry.npmmirror.com/@actions/core/-/core-2.0.3.tgz", { "dependencies": { "@actions/exec": "^2.0.0", "@actions/http-client": "^3.0.2" } }, "sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA=="],
+
+ "@actions/core/@actions/http-client": ["@actions/http-client@2.2.3", "https://registry.npmmirror.com/@actions/http-client/-/http-client-2.2.3.tgz", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="],
+
+ "@actions/github/@actions/http-client": ["@actions/http-client@2.2.3", "https://registry.npmmirror.com/@actions/http-client/-/http-client-2.2.3.tgz", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="],
+
+ "@actions/github/@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@9.2.2", "https://registry.npmmirror.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", { "dependencies": { "@octokit/types": "^12.6.0" }, "peerDependencies": { "@octokit/core": "5" } }, "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ=="],
+
+ "@actions/github/@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@10.4.1", "https://registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", { "dependencies": { "@octokit/types": "^12.6.0" }, "peerDependencies": { "@octokit/core": "5" } }, "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg=="],
+
+ "@actions/github/undici": ["undici@5.29.0", "https://registry.npmmirror.com/undici/-/undici-5.29.0.tgz", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
+
+ "@actions/http-client/undici": ["undici@6.26.0", "https://registry.npmmirror.com/undici/-/undici-6.26.0.tgz", {}, "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A=="],
+
+ "@ai-sdk/alibaba/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.41.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="],
+
+ "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.81", "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.81.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-B1JDd9Ugq9R5AgIaW3674lhGCMMYJcPUxnrZh8fzbGojgg4QvHFRv6eZahGQAUsmGHbcf74G9bdSBDLWQGY2GA=="],
+
+ "@ai-sdk/amazon-bedrock/@ai-sdk/openai": ["@ai-sdk/openai@3.0.67", "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-3.0.67.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oAiGC9eWG7IgtdsdS74bOCnAAHarAfTJhWN9x5INwnWPekL802AvF+0I5DvLzIF1MIRmNw4N8mPSL/GUVbX9Mw=="],
+
+ "@ai-sdk/amazon-bedrock/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/amazon-bedrock/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="],
+
+ "@ai-sdk/amazon-bedrock/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/azure/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/cerebras/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/cohere/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/deepgram/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/deepgram/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/deepinfra/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/deepseek/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/deepseek/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/elevenlabs/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/elevenlabs/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/fireworks/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.48", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.48.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-z9MC6M4Oh/yUY/F/eszOtO8wc2nMz99XmZQKd2gWTtyIfe716xTfrKe3aYZKg20NZDtyjqPPKPSR+wqz7q1T7Q=="],
+
+ "@ai-sdk/fireworks/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/fireworks/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/google/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/google/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/google-vertex/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.77", "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.77.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ML8C2M1YvPA1ulEx4TiyF0k1xvC2ikEiPBIC1PPQ0a5xELUGrO2lAaEzsTEoJ+eCeDd8PSBuFJjs+r+9yIwQXA=="],
+
+ "@ai-sdk/google-vertex/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.47", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.47.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Enm5UlL0zUCrW3792opk5h7hRWxZOZzDe6eQYVFqX9LUOGGCe1h8MZWAGim765nwzgnjlpeYOsuzZmLtRsTPlg=="],
+
+ "@ai-sdk/google-vertex/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "@ai-sdk/google-vertex/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "@ai-sdk/groq/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/mistral/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/perplexity/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/togetherai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/vercel/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.21.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+
+ "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.41.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="],
+
+ "@astrojs/check/yargs": ["yargs@17.7.2", "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
+ "@astrojs/cloudflare/vite": ["vite@6.4.2", "https://registry.npmmirror.com/vite/-/vite-6.4.2.tgz", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="],
+
+ "@astrojs/markdown-remark/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.6.1.tgz", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="],
+
+ "@astrojs/markdown-remark/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "https://registry.npmmirror.com/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="],
+
+ "@astrojs/mdx/source-map": ["source-map@0.7.6", "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "@astrojs/sitemap/zod": ["zod@4.4.3", "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
+
+ "@astrojs/solid-js/vite": ["vite@6.4.2", "https://registry.npmmirror.com/vite/-/vite-6.4.2.tgz", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="],
+
+ "@astrojs/starlight/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "@aws-crypto/crc32/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-crypto/crc32c/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-crypto/sha1-browser/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
+
+ "@aws-crypto/sha256-browser/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
+
+ "@aws-crypto/sha256-js/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-crypto/util/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
+
+ "@aws-sdk/client-athena/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/client-cognito-identity/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.47", "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.47.tgz", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.41", "@aws-sdk/credential-provider-http": "^3.972.43", "@aws-sdk/credential-provider-ini": "^3.972.46", "@aws-sdk/credential-provider-process": "^3.972.41", "@aws-sdk/credential-provider-sso": "^3.972.45", "@aws-sdk/credential-provider-web-identity": "^3.972.45", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/credential-provider-imds": "^4.3.6", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-HrId+C0DWA5qDIyLG64/kjUB2RNtPypxmABnIctK+TA1P1kHlOYoE/Wf5T5tKOMKgb08P7k/zNyhvfJ3lh5Oag=="],
+
+ "@aws-sdk/client-cognito-identity/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/client-firehose/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/client-lambda/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/client-lambda/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.47", "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.47.tgz", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.41", "@aws-sdk/credential-provider-http": "^3.972.43", "@aws-sdk/credential-provider-ini": "^3.972.46", "@aws-sdk/credential-provider-process": "^3.972.41", "@aws-sdk/credential-provider-sso": "^3.972.45", "@aws-sdk/credential-provider-web-identity": "^3.972.45", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/credential-provider-imds": "^4.3.6", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-HrId+C0DWA5qDIyLG64/kjUB2RNtPypxmABnIctK+TA1P1kHlOYoE/Wf5T5tKOMKgb08P7k/zNyhvfJ3lh5Oag=="],
+
+ "@aws-sdk/client-lambda/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/client-s3/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/client-sso/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/core": ["@aws-sdk/core@3.775.0", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.775.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/core": "^3.2.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/signature-v4": "^5.0.2", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/util-middleware": "^4.0.2", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" } }, "sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.782.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.782.0.tgz", { "dependencies": { "@aws-sdk/credential-provider-env": "3.775.0", "@aws-sdk/credential-provider-http": "3.775.0", "@aws-sdk/credential-provider-ini": "3.782.0", "@aws-sdk/credential-provider-process": "3.775.0", "@aws-sdk/credential-provider-sso": "3.782.0", "@aws-sdk/credential-provider-web-identity": "3.782.0", "@aws-sdk/types": "3.775.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-HZiAF+TCEyKjju9dgysjiPIWgt/+VerGaeEp18mvKLNfgKz1d+/82A2USEpNKTze7v3cMFASx3CvL8yYyF7mJw=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.775.0", "https://registry.npmmirror.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.775.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.775.0", "https://registry.npmmirror.com/@aws-sdk/middleware-logger/-/middleware-logger-3.775.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.775.0", "https://registry.npmmirror.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.775.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.782.0", "https://registry.npmmirror.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.782.0.tgz", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@smithy/core": "^3.2.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-i32H2R6IItX+bQ2p4+v2gGO2jA80jQoJO2m1xjU9rYWQW3+ErWy4I5YIuQHTBfb6hSdAHbaRfqPDgbv9J2rjEg=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.775.0", "https://registry.npmmirror.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.775.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" } }, "sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/types": ["@aws-sdk/types@3.775.0", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.775.0.tgz", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.782.0", "https://registry.npmmirror.com/@aws-sdk/util-endpoints/-/util-endpoints-3.782.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "@smithy/util-endpoints": "^3.0.2", "tslib": "^2.6.2" } }, "sha512-/RJOAO7o7HI6lEa4ASbFFLHGU9iPK876BhsVfnl54MvApPVYWQ9sHO0anOUim2S5lQTwd/6ghuH3rFYSq/+rdw=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.775.0", "https://registry.npmmirror.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.775.0.tgz", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.782.0", "https://registry.npmmirror.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.782.0.tgz", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/types": "3.775.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-dMFkUBgh2Bxuw8fYZQoH/u3H4afQ12VSkzEi//qFiDTwbKYq+u+RYjc8GLDM6JSK1BShMu5AVR7HD4ap1TYUnA=="],
+
+ "@aws-sdk/client-sts/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/core/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/credential-provider-cognito-identity/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-env/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-env/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-http/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-http/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-ini/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-ini/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-login/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-login/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.932.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.932.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/property-provider": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-ozge/c7NdHUDyHqro6+P5oHt8wfKSUBN+olttiVfBe9Mw3wBMpPa3gQ0pZnG+gwBkKskBuip2bMR16tqYvUSEA=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.932.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.932.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/node-http-handler": "^4.4.5", "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" } }, "sha512-b6N9Nnlg8JInQwzBkUq5spNaXssM3h3zLxGzpPrnw0nHSIWPJPTbZzA5Ca285fcDUFuKP+qf3qkuqlAjGOdWhg=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.933.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.933.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/credential-provider-env": "3.932.0", "@aws-sdk/credential-provider-http": "3.932.0", "@aws-sdk/credential-provider-process": "3.932.0", "@aws-sdk/credential-provider-sso": "3.933.0", "@aws-sdk/credential-provider-web-identity": "3.933.0", "@aws-sdk/nested-clients": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/credential-provider-imds": "^4.2.5", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-HygGyKuMG5AaGXsmM0d81miWDon55xwalRHB3UmDg3QBhtunbNIoIaWUbNTKuBZXcIN6emeeEZw/YgSMqLc0YA=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.932.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.932.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/types": "3.930.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-BodZYKvT4p/Dkm28Ql/FhDdS1+p51bcZeMMu2TRtU8PoMDHnVDhHz27zASEKSZwmhvquxHrZHB0IGuVqjZUtSQ=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.933.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.933.0.tgz", { "dependencies": { "@aws-sdk/client-sso": "3.933.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/token-providers": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-/R1DBR7xNcuZIhS2RirU+P2o8E8/fOk+iLAhbqeSTq+g09fP/F6W7ouFpS5eVE2NIfWG7YBFoVddOhvuqpn51g=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.933.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.933.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/nested-clients": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-c7Eccw2lhFx2/+qJn3g+uIDWRuWi2A6Sz3PVvckFUEzPsP0dPUo19hlvtarwP5GzrsXn0yEPRVhpewsIaSCGaQ=="],
+
+ "@aws-sdk/credential-provider-process/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-process/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-sso/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-sso/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-provider-web-identity/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-provider-web-identity/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/credential-providers/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/credential-providers/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.47", "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.47.tgz", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.41", "@aws-sdk/credential-provider-http": "^3.972.43", "@aws-sdk/credential-provider-ini": "^3.972.46", "@aws-sdk/credential-provider-process": "^3.972.41", "@aws-sdk/credential-provider-sso": "^3.972.45", "@aws-sdk/credential-provider-web-identity": "^3.972.45", "@aws-sdk/types": "^3.973.9", "@smithy/core": "^3.24.5", "@smithy/credential-provider-imds": "^4.3.6", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-HrId+C0DWA5qDIyLG64/kjUB2RNtPypxmABnIctK+TA1P1kHlOYoE/Wf5T5tKOMKgb08P7k/zNyhvfJ3lh5Oag=="],
+
+ "@aws-sdk/credential-providers/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/middleware-flexible-checksums/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/middleware-sdk-s3/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/nested-clients/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.30", "https://registry.npmmirror.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.30.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-HULDLMVzkmTSEv6//7kx2kRevp/VYUpm8hJNNFbmhxDn0fUiGTxVcM9yg31TukvTq8nyOBDUN2gH0o5IRbKjdw=="],
+
+ "@aws-sdk/nested-clients/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/token-providers/@aws-sdk/core": ["@aws-sdk/core@3.974.15", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.974.15.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.9", "@aws-sdk/xml-builder": "^3.972.26", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.5", "@smithy/signature-v4": "^5.4.5", "@smithy/types": "^4.14.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw=="],
+
+ "@aws-sdk/token-providers/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.9.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="],
+
+ "@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.2.5", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="],
+
+ "@azure/core-http/@azure/abort-controller": ["@azure/abort-controller@1.1.0", "https://registry.npmmirror.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz", { "dependencies": { "tslib": "^2.2.0" } }, "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw=="],
+
+ "@azure/core-http/@azure/core-tracing": ["@azure/core-tracing@1.0.0-preview.13", "https://registry.npmmirror.com/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", { "dependencies": { "@opentelemetry/api": "^1.0.1", "tslib": "^2.2.0" } }, "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ=="],
+
+ "@azure/core-http/uuid": ["uuid@8.3.2", "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="],
+
+ "@azure/core-xml/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@babel/core/semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+
+ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@bufbuild/protoplugin/typescript": ["typescript@5.4.5", "https://registry.npmmirror.com/typescript/-/typescript-5.4.5.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="],
+
+ "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
+
+ "@cloudflare/vite-plugin/ws": ["ws@8.18.0", "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="],
+
+ "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
+
+ "@develar/schema-utils/ajv": ["ajv@6.15.0", "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
+
+ "@dot/log/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "@electron/asar/commander": ["commander@5.1.0", "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="],
+
+ "@electron/asar/glob": ["glob@7.2.3", "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "@electron/asar/minimatch": ["minimatch@3.1.5", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
+
+ "@electron/fuses/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "@electron/fuses/fs-extra": ["fs-extra@9.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="],
+
+ "@electron/get/undici": ["undici@7.26.0", "https://registry.npmmirror.com/undici/-/undici-7.26.0.tgz", {}, "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg=="],
+
+ "@electron/notarize/fs-extra": ["fs-extra@9.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="],
+
+ "@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="],
+
+ "@electron/universal/fs-extra": ["fs-extra@11.3.5", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.5.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
+
+ "@electron/universal/minimatch": ["minimatch@9.0.9", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
+
+ "@electron/windows-sign/fs-extra": ["fs-extra@11.3.5", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.5.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
+
+ "@expressive-code/plugin-shiki/shiki": ["shiki@3.23.0", "https://registry.npmmirror.com/shiki/-/shiki-3.23.0.tgz", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="],
+
+ "@fastify/proxy-addr/ipaddr.js": ["ipaddr.js@2.4.0", "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.4.0.tgz", {}, "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ=="],
+
+ "@hey-api/json-schema-ref-parser/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "@hey-api/openapi-ts/open": ["open@11.0.0", "https://registry.npmmirror.com/open/-/open-11.0.0.tgz", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="],
+
+ "@hey-api/openapi-ts/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
+
+ "@jsx-email/cli/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "@jsx-email/cli/esbuild": ["esbuild@0.19.12", "https://registry.npmmirror.com/esbuild/-/esbuild-0.19.12.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="],
+
+ "@jsx-email/cli/tailwindcss": ["tailwindcss@3.3.3", "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.3.3.tgz", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.18.2", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w=="],
+
+ "@jsx-email/cli/vite": ["vite@4.5.14", "https://registry.npmmirror.com/vite/-/vite-4.5.14.tgz", { "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", "rollup": "^3.27.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g=="],
+
+ "@jsx-email/doiuse-email/htmlparser2": ["htmlparser2@9.1.0", "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.1.0", "entities": "^4.5.0" } }, "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ=="],
+
+ "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="],
+
+ "@mdx-js/mdx/source-map": ["source-map@0.7.6", "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "@modelcontextprotocol/sdk/express": ["express@5.2.1", "https://registry.npmmirror.com/express/-/express-5.2.1.tgz", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
+
+ "@modelcontextprotocol/sdk/hono": ["hono@4.12.23", "https://registry.npmmirror.com/hono/-/hono-4.12.23.tgz", {}, "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA=="],
+
+ "@modelcontextprotocol/sdk/jose": ["jose@6.2.3", "https://registry.npmmirror.com/jose/-/jose-6.2.3.tgz", {}, "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="],
+
+ "@modelcontextprotocol/sdk/raw-body": ["raw-body@3.0.2", "https://registry.npmmirror.com/raw-body/-/raw-body-3.0.2.tgz", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
+
+ "@modelcontextprotocol/sdk/zod": ["zod@4.4.3", "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
+
+ "@npmcli/config/ini": ["ini@6.0.0", "https://registry.npmmirror.com/ini/-/ini-6.0.0.tgz", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="],
+
+ "@npmcli/git/ini": ["ini@6.0.0", "https://registry.npmmirror.com/ini/-/ini-6.0.0.tgz", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="],
+
+ "@npmcli/query/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
+
+ "@octokit/auth-app/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/auth-app/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/auth-oauth-app/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/auth-oauth-app/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/auth-oauth-device/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/auth-oauth-device/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/auth-oauth-user/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/auth-oauth-user/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/core/@octokit/graphql": ["@octokit/graphql@7.1.1", "https://registry.npmmirror.com/@octokit/graphql/-/graphql-7.1.1.tgz", { "dependencies": { "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g=="],
+
+ "@octokit/core/@octokit/types": ["@octokit/types@13.10.0", "https://registry.npmmirror.com/@octokit/types/-/types-13.10.0.tgz", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="],
+
+ "@octokit/core/universal-user-agent": ["universal-user-agent@6.0.1", "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="],
+
+ "@octokit/endpoint/@octokit/types": ["@octokit/types@13.10.0", "https://registry.npmmirror.com/@octokit/types/-/types-13.10.0.tgz", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="],
+
+ "@octokit/endpoint/universal-user-agent": ["universal-user-agent@6.0.1", "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="],
+
+ "@octokit/graphql/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/graphql/@octokit/types": ["@octokit/types@15.0.2", "https://registry.npmmirror.com/@octokit/types/-/types-15.0.2.tgz", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q=="],
+
+ "@octokit/oauth-methods/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/oauth-methods/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/oauth-methods/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core": ["@octokit/core@7.0.6", "https://registry.npmmirror.com/@octokit/core/-/core-7.0.6.tgz", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/types": ["@octokit/types@15.0.2", "https://registry.npmmirror.com/@octokit/types/-/types-15.0.2.tgz", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core": ["@octokit/core@7.0.6", "https://registry.npmmirror.com/@octokit/core/-/core-7.0.6.tgz", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@15.0.2", "https://registry.npmmirror.com/@octokit/types/-/types-15.0.2.tgz", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q=="],
+
+ "@octokit/plugin-retry/@octokit/types": ["@octokit/types@6.41.0", "https://registry.npmmirror.com/@octokit/types/-/types-6.41.0.tgz", { "dependencies": { "@octokit/openapi-types": "^12.11.0" } }, "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg=="],
+
+ "@octokit/request/@octokit/types": ["@octokit/types@13.10.0", "https://registry.npmmirror.com/@octokit/types/-/types-13.10.0.tgz", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="],
+
+ "@octokit/request/universal-user-agent": ["universal-user-agent@6.0.1", "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="],
+
+ "@octokit/request-error/@octokit/types": ["@octokit/types@13.10.0", "https://registry.npmmirror.com/@octokit/types/-/types-13.10.0.tgz", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="],
+
+ "@octokit/rest/@octokit/core": ["@octokit/core@7.0.6", "https://registry.npmmirror.com/@octokit/core/-/core-7.0.6.tgz", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="],
+
+ "@octokit/rest/@octokit/plugin-request-log": ["@octokit/plugin-request-log@6.0.0", "https://registry.npmmirror.com/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", { "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q=="],
+
+ "@openauthjs/openauth/@standard-schema/spec": ["@standard-schema/spec@1.0.0-beta.3", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.0.0-beta.3.tgz", {}, "sha512-0ifF3BjA1E8SY9C+nUew8RefNOIq0cDlYALPty4rhUm8Rrl6tCM8hBT4bhGhx7I7iXD0uAgt50lgo8dD73ACMw=="],
+
+ "@openauthjs/openauth/jose": ["jose@5.9.6", "https://registry.npmmirror.com/jose/-/jose-5.9.6.tgz", {}, "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ=="],
+
+ "@opencode-ai/core/@ai-sdk/openai": ["@ai-sdk/openai@3.0.53", "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-3.0.53.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Wld+Rbc05KaUn08uBt06eEuwcgalcIFtIl32Yp+GxuZXUQwOb6YeAuq+C6da4ch6BurFoqEaLemJVwjBb7x+PQ=="],
+
+ "@opencode-ai/core/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.41.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="],
+
+ "@opencode-ai/desktop/@actions/artifact": ["@actions/artifact@4.0.0", "https://registry.npmmirror.com/@actions/artifact/-/artifact-4.0.0.tgz", { "dependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.1", "@actions/http-client": "^2.1.0", "@azure/core-http": "^3.0.5", "@azure/storage-blob": "^12.15.0", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-HCc2jMJRAfviGFAh0FsOR/jNfWhirxl7W6z8zDtttt0GltwxBLdEIjLiweOPFl9WbyJRW1VWnPUSAixJqcWUMQ=="],
+
+ "@opencode-ai/desktop/marked": ["marked@15.0.12", "https://registry.npmmirror.com/marked/-/marked-15.0.12.tgz", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
+
+ "@opencode-ai/desktop/typescript": ["typescript@5.6.3", "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
+
+ "@opencode-ai/llm/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="],
+
+ "@opencode-ai/llm/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@opencode-ai/ui/@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.3", "https://registry.npmmirror.com/@solid-primitives/resize-observer/-/resize-observer-2.1.3.tgz", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ=="],
+
+ "@opencode-ai/web/@shikijs/transformers": ["@shikijs/transformers@3.20.0", "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-3.20.0.tgz", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/types": "3.20.0" } }, "sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g=="],
+
+ "@opentui/core/diff": ["diff@9.0.0", "https://registry.npmmirror.com/diff/-/diff-9.0.0.tgz", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="],
+
+ "@opentui/solid/@babel/core": ["@babel/core@7.28.0", "https://registry.npmmirror.com/@babel/core/-/core-7.28.0.tgz", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="],
+
+ "@oslojs/jwt/@oslojs/encoding": ["@oslojs/encoding@0.4.1", "https://registry.npmmirror.com/@oslojs/encoding/-/encoding-0.4.1.tgz", {}, "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q=="],
+
+ "@oxc-resolver/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
+
+ "@oxc-resolver/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
+
+ "@pierre/diffs/@shikijs/transformers": ["@shikijs/transformers@3.20.0", "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-3.20.0.tgz", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/types": "3.20.0" } }, "sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g=="],
+
+ "@pierre/diffs/diff": ["diff@8.0.3", "https://registry.npmmirror.com/diff/-/diff-8.0.3.tgz", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="],
+
+ "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "https://registry.npmmirror.com/supports-color/-/supports-color-10.2.2.tgz", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
+
+ "@protobuf-ts/plugin/typescript": ["typescript@3.9.10", "https://registry.npmmirror.com/typescript/-/typescript-3.9.10.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q=="],
+
+ "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+ "@sentry/bundler-plugin-core/glob": ["glob@9.3.5", "https://registry.npmmirror.com/glob/-/glob-9.3.5.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="],
+
+ "@sentry/bundler-plugin-core/magic-string": ["magic-string@0.30.8", "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.8.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="],
+
+ "@sentry/cli/https-proxy-agent": ["https-proxy-agent@5.0.1", "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
+
+ "@sentry/cli/proxy-from-env": ["proxy-from-env@1.1.0", "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
+
+ "@sentry/cli/which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "@shikijs/engine-javascript/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "@shikijs/engine-oniguruma/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "@shikijs/langs/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "@shikijs/themes/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "@slack/bolt/path-to-regexp": ["path-to-regexp@8.4.2", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
+
+ "@slack/oauth/@slack/logger": ["@slack/logger@3.0.0", "https://registry.npmmirror.com/@slack/logger/-/logger-3.0.0.tgz", { "dependencies": { "@types/node": ">=12.0.0" } }, "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA=="],
+
+ "@slack/socket-mode/@slack/logger": ["@slack/logger@3.0.0", "https://registry.npmmirror.com/@slack/logger/-/logger-3.0.0.tgz", { "dependencies": { "@types/node": ">=12.0.0" } }, "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA=="],
+
+ "@slack/socket-mode/@types/ws": ["@types/ws@7.4.7", "https://registry.npmmirror.com/@types/ws/-/ws-7.4.7.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="],
+
+ "@slack/socket-mode/ws": ["ws@7.5.11", "https://registry.npmmirror.com/ws/-/ws-7.5.11.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="],
+
+ "@slack/web-api/@slack/logger": ["@slack/logger@3.0.0", "https://registry.npmmirror.com/@slack/logger/-/logger-3.0.0.tgz", { "dependencies": { "@types/node": ">=12.0.0" } }, "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA=="],
+
+ "@slack/web-api/eventemitter3": ["eventemitter3@3.1.2", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-3.1.2.tgz", {}, "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="],
+
+ "@slack/web-api/form-data": ["form-data@2.5.5", "https://registry.npmmirror.com/form-data/-/form-data-2.5.5.tgz", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="],
+
+ "@slack/web-api/p-queue": ["p-queue@6.6.2", "https://registry.npmmirror.com/p-queue/-/p-queue-6.6.2.tgz", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="],
+
+ "@solidjs/start/path-to-regexp": ["path-to-regexp@8.4.2", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
+
+ "@solidjs/start/shiki": ["shiki@1.29.2", "https://registry.npmmirror.com/shiki/-/shiki-1.29.2.tgz", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="],
+
+ "@solidjs/start/vite": ["vite@7.1.10", "https://registry.npmmirror.com/vite/-/vite-7.1.10.tgz", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA=="],
+
+ "@storybook/csf-plugin/unplugin": ["unplugin@2.3.11", "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.11.tgz", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="],
+
+ "@tailwindcss/oxide/detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "@tanstack/directive-functions-plugin/@babel/code-frame": ["@babel/code-frame@7.27.1", "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
+
+ "@tanstack/router-utils/diff": ["diff@8.0.3", "https://registry.npmmirror.com/diff/-/diff-8.0.3.tgz", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="],
+
+ "@tanstack/server-functions-plugin/@babel/code-frame": ["@babel/code-frame@7.27.1", "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
+
+ "@testing-library/dom/aria-query": ["aria-query@5.3.0", "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.0.tgz", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
+
+ "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
+
+ "@types/plist/xmlbuilder": ["xmlbuilder@15.1.1", "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="],
+
+ "@vitest/coverage-v8/@vitest/utils": ["@vitest/utils@4.1.8", "https://registry.npmmirror.com/@vitest/utils/-/utils-4.1.8.tgz", { "dependencies": { "@vitest/pretty-format": "4.1.8", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg=="],
+
+ "@vitest/coverage-v8/magicast": ["magicast@0.5.3", "https://registry.npmmirror.com/magicast/-/magicast-0.5.3.tgz", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="],
+
+ "@vitest/expect/@vitest/utils": ["@vitest/utils@3.2.4", "https://registry.npmmirror.com/@vitest/utils/-/utils-3.2.4.tgz", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="],
+
+ "@vitest/expect/tinyrainbow": ["tinyrainbow@2.0.0", "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="],
+
+ "@vitest/mocker/@vitest/spy": ["@vitest/spy@4.1.7", "https://registry.npmmirror.com/@vitest/spy/-/spy-4.1.7.tgz", {}, "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q=="],
+
+ "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="],
+
+ "accepts/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "accepts/negotiator": ["negotiator@0.6.3", "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="],
+
+ "ai-gateway-provider/@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@4.0.107", "https://registry.npmmirror.com/@ai-sdk/amazon-bedrock/-/amazon-bedrock-4.0.107.tgz", { "dependencies": { "@ai-sdk/anthropic": "3.0.78", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8nT08pGPy25rleJNk56ep00UHK6kCtCmu+ZNqVVSSPDieADlIZqcaN1iRXAFBoCH0Fb9F6C2EjFDaySdsargfQ=="],
+
+ "ai-gateway-provider/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.78", "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.78.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-0OY12G20cUt6iU6htpEA1491Oz++NVxZxlmWGX4B7rSbeZ5pnDmOu6YtW9BKzdZlNx5Gn23i6WMxyZFoMKNcgA=="],
+
+ "ai-gateway-provider/@ai-sdk/openai": ["@ai-sdk/openai@3.0.53", "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-3.0.53.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Wld+Rbc05KaUn08uBt06eEuwcgalcIFtIl32Yp+GxuZXUQwOb6YeAuq+C6da4ch6BurFoqEaLemJVwjBb7x+PQ=="],
+
+ "ai-gateway-provider/@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.8.1", "https://registry.npmmirror.com/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.8.1.tgz", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Y6j3yivgoEUf/kutD/k5GX/mzZfioRFoSx0gbQ+mIOzMaH/vJv1rCkztiuvlLw5xRYQil7oxHUZvmSfXqOx1NQ=="],
+
+ "ajv-keywords/ajv": ["ajv@6.15.0", "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
+
+ "ansi-align/string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "anymatch/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "app-builder-lib/@electron/get": ["@electron/get@3.1.0", "https://registry.npmmirror.com/@electron/get/-/get-3.1.0.tgz", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ=="],
+
+ "app-builder-lib/ci-info": ["ci-info@4.3.1", "https://registry.npmmirror.com/ci-info/-/ci-info-4.3.1.tgz", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
+
+ "app-builder-lib/hosted-git-info": ["hosted-git-info@4.1.0", "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="],
+
+ "app-builder-lib/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "app-builder-lib/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "app-builder-lib/which": ["which@5.0.0", "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="],
+
+ "archiver-utils/glob": ["glob@10.5.0", "https://registry.npmmirror.com/glob/-/glob-10.5.0.tgz", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
+
+ "archiver-utils/is-stream": ["is-stream@2.0.1", "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+
+ "ast-v8-to-istanbul/js-tokens": ["js-tokens@10.0.0", "https://registry.npmmirror.com/js-tokens/-/js-tokens-10.0.0.tgz", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="],
+
+ "astro/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.6.1.tgz", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="],
+
+ "astro/common-ancestor-path": ["common-ancestor-path@1.0.1", "https://registry.npmmirror.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
+
+ "astro/diff": ["diff@5.2.2", "https://registry.npmmirror.com/diff/-/diff-5.2.2.tgz", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="],
+
+ "astro/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "astro/unstorage": ["unstorage@1.17.5", "https://registry.npmmirror.com/unstorage/-/unstorage-1.17.5.tgz", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="],
+
+ "astro/vite": ["vite@6.4.2", "https://registry.npmmirror.com/vite/-/vite-6.4.2.tgz", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="],
+
+ "astro/zod": ["zod@3.25.76", "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "axios/https-proxy-agent": ["https-proxy-agent@5.0.1", "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
+
+ "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="],
+
+ "babel-plugin-module-resolver/glob": ["glob@9.3.5", "https://registry.npmmirror.com/glob/-/glob-9.3.5.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="],
+
+ "body-parser/debug": ["debug@2.6.9", "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "body-parser/iconv-lite": ["iconv-lite@0.4.24", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
+
+ "builder-util/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "builder-util/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "c12/chokidar": ["chokidar@5.0.0", "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+
+ "c12/dotenv": ["dotenv@17.4.2", "https://registry.npmmirror.com/dotenv/-/dotenv-17.4.2.tgz", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="],
+
+ "clone-response/mimic-response": ["mimic-response@1.0.1", "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="],
+
+ "compress-commons/is-stream": ["is-stream@2.0.1", "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+
+ "condense-newlines/kind-of": ["kind-of@3.2.2", "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="],
+
+ "conf/dot-prop": ["dot-prop@10.1.0", "https://registry.npmmirror.com/dot-prop/-/dot-prop-10.1.0.tgz", { "dependencies": { "type-fest": "^5.0.0" } }, "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q=="],
+
+ "config-chain/ini": ["ini@1.3.8", "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
+
+ "crc/buffer": ["buffer@5.7.1", "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="],
+
+ "cross-spawn/which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "dir-compare/minimatch": ["minimatch@3.1.5", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
+
+ "dir-compare/p-limit": ["p-limit@3.1.0", "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "dmg-builder/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "dmg-license/ajv": ["ajv@6.15.0", "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
+
+ "dom-serializer/entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "dot-prop/type-fest": ["type-fest@3.13.1", "https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="],
+
+ "duplexer2/readable-stream": ["readable-stream@2.3.8", "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
+
+ "editorconfig/commander": ["commander@10.0.1", "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
+
+ "editorconfig/minimatch": ["minimatch@9.0.9", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
+
+ "effect/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "electron-builder/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "electron-builder/yargs": ["yargs@17.7.2", "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib": ["app-builder-lib@26.8.1", "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-26.8.1.tgz", { "dependencies": { "@develar/schema-utils": "~2.6.5", "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", "@electron/rebuild": "^4.0.3", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "26.8.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.0.3", "plist": "3.1.0", "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", "semver": "~7.7.3", "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", "which": "^5.0.0" }, "peerDependencies": { "dmg-builder": "26.8.1", "electron-builder-squirrel-windows": "26.8.1" } }, "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw=="],
+
+ "electron-builder-squirrel-windows/builder-util": ["builder-util@26.8.1", "https://registry.npmmirror.com/builder-util/-/builder-util-26.8.1.tgz", { "dependencies": { "7zip-bin": "~5.2.0", "@types/debug": "^4.1.6", "app-builder-bin": "5.0.0-alpha.12", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" } }, "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw=="],
+
+ "electron-publish/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "electron-publish/mime": ["mime@2.6.0", "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="],
+
+ "electron-store/type-fest": ["type-fest@5.7.0", "https://registry.npmmirror.com/type-fest/-/type-fest-5.7.0.tgz", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg=="],
+
+ "electron-updater/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "electron-updater/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "electron-winstaller/fs-extra": ["fs-extra@7.0.1", "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="],
+
+ "encoding/iconv-lite": ["iconv-lite@0.6.3", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "engine.io-client/ws": ["ws@8.20.1", "https://registry.npmmirror.com/ws/-/ws-8.20.1.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="],
+
+ "esbuild-plugin-copy/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "esbuild-plugin-copy/chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+
+ "estree-util-to-js/source-map": ["source-map@0.7.6", "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "execa/get-stream": ["get-stream@8.0.1", "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="],
+
+ "execa/is-stream": ["is-stream@3.0.0", "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
+
+ "express/cookie": ["cookie@0.7.2", "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
+
+ "express/debug": ["debug@2.6.9", "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "express/path-to-regexp": ["path-to-regexp@0.1.13", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="],
+
+ "fetch-blob/web-streams-polyfill": ["web-streams-polyfill@3.3.3", "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
+
+ "filelist/minimatch": ["minimatch@5.1.9", "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.9.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="],
+
+ "finalhandler/debug": ["debug@2.6.9", "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "form-data/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "gaxios/node-fetch": ["node-fetch@3.3.2", "https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
+
+ "gitlab-ai-provider/openai": ["openai@6.39.1", "https://registry.npmmirror.com/openai/-/openai-6.39.1.tgz", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-z3dO9fEWOXBzlXynVb/xZ/tujzUjFWQWn3C0n0mw6Vo0zJTbEkaN4b2cLWjhJ6haJQx8LlREoafHRl+Gu/Hl+A=="],
+
+ "gitlab-ai-provider/zod": ["zod@3.25.76", "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "globby/ignore": ["ignore@5.3.2", "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "got/@sindresorhus/is": ["@sindresorhus/is@4.6.0", "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="],
+
+ "html-minifier-terser/commander": ["commander@10.0.1", "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
+
+ "html-minifier-terser/entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "htmlparser2/entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "iconv-corefoundation/cli-truncate": ["cli-truncate@2.1.0", "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", { "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="],
+
+ "iconv-corefoundation/node-addon-api": ["node-addon-api@1.7.2", "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="],
+
+ "istanbul-reports/html-escaper": ["html-escaper@2.0.2", "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="],
+
+ "js-beautify/glob": ["glob@10.5.0", "https://registry.npmmirror.com/glob/-/glob-10.5.0.tgz", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
+
+ "js-beautify/nopt": ["nopt@7.2.1", "https://registry.npmmirror.com/nopt/-/nopt-7.2.1.tgz", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="],
+
+ "katex/commander": ["commander@8.3.0", "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
+
+ "lazystream/readable-stream": ["readable-stream@2.3.8", "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
+
+ "light-my-request/process-warning": ["process-warning@4.0.1", "https://registry.npmmirror.com/process-warning/-/process-warning-4.0.1.tgz", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="],
+
+ "lightningcss/detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "matcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "md-to-react-email/marked": ["marked@7.0.4", "https://registry.npmmirror.com/marked/-/marked-7.0.4.tgz", { "bin": { "marked": "bin/marked.js" } }, "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ=="],
+
+ "micromatch/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "miniflare/acorn": ["acorn@8.14.0", "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
+
+ "miniflare/undici": ["undici@7.14.0", "https://registry.npmmirror.com/undici/-/undici-7.14.0.tgz", {}, "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ=="],
+
+ "miniflare/ws": ["ws@8.18.0", "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="],
+
+ "miniflare/zod": ["zod@3.22.3", "https://registry.npmmirror.com/zod/-/zod-3.22.3.tgz", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="],
+
+ "minipass-flush/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "minipass-pipeline/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "motion/framer-motion": ["framer-motion@12.40.0", "https://registry.npmmirror.com/framer-motion/-/framer-motion-12.40.0.tgz", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
+
+ "nitro/h3": ["h3@2.0.1-rc.5", "https://registry.npmmirror.com/h3/-/h3-2.0.1-rc.5.tgz", { "dependencies": { "rou3": "^0.7.9", "srvx": "^0.9.1" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"] }, "sha512-qkohAzCab0nLzXNm78tBjZDvtKMTmtygS8BJLT3VPczAQofdqlFXDPkXdLMJN4r05+xqneG8snZJ0HgkERCZTg=="],
+
+ "nitro/undici": ["undici@7.26.0", "https://registry.npmmirror.com/undici/-/undici-7.26.0.tgz", {}, "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg=="],
+
+ "node-gyp/env-paths": ["env-paths@2.2.1", "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
+
+ "node-gyp/undici": ["undici@6.26.0", "https://registry.npmmirror.com/undici/-/undici-6.26.0.tgz", {}, "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A=="],
+
+ "node-gyp-build-optional-packages/detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "npm-run-path/path-key": ["path-key@4.0.0", "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
+
+ "nypm/citty": ["citty@0.2.2", "https://registry.npmmirror.com/citty/-/citty-0.2.2.tgz", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="],
+
+ "nypm/tinyexec": ["tinyexec@1.2.4", "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.2.4.tgz", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="],
+
+ "opencode/@ai-sdk/openai": ["@ai-sdk/openai@3.0.53", "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-3.0.53.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Wld+Rbc05KaUn08uBt06eEuwcgalcIFtIl32Yp+GxuZXUQwOb6YeAuq+C6da4ch6BurFoqEaLemJVwjBb7x+PQ=="],
+
+ "opencode/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.41", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.41.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g=="],
+
+ "opencode/@solid-primitives/scheduled": ["@solid-primitives/scheduled@1.5.2", "https://registry.npmmirror.com/@solid-primitives/scheduled/-/scheduled-1.5.2.tgz", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-/j2igE0xyNaHhj6kMfcUQn5rAVSTLbAX+CDEBm25hSNBmNiHLu2lM7Usj2kJJ5j36D67bE8wR1hBNA8hjtvsQA=="],
+
+ "opencode/minimatch": ["minimatch@10.0.3", "https://registry.npmmirror.com/minimatch/-/minimatch-10.0.3.tgz", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw=="],
+
+ "opencode-gitlab-auth/open": ["open@10.2.0", "https://registry.npmmirror.com/open/-/open-10.2.0.tgz", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="],
+
+ "openid-client/jose": ["jose@4.15.9", "https://registry.npmmirror.com/jose/-/jose-4.15.9.tgz", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="],
+
+ "openid-client/lru-cache": ["lru-cache@6.0.0", "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
+
+ "p-locate/p-limit": ["p-limit@3.1.0", "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "p-retry/retry": ["retry@0.13.1", "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
+
+ "parse-entities/@types/unist": ["@types/unist@2.0.11", "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "parse5/entities": ["entities@6.0.1", "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+ "pkg-dir/find-up": ["find-up@4.1.0", "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
+
+ "pkg-up/find-up": ["find-up@3.0.0", "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="],
+
+ "pkijs/@noble/hashes": ["@noble/hashes@1.4.0", "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.4.0.tgz", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="],
+
+ "playwright/fsevents": ["fsevents@2.3.2", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
+
+ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="],
+
+ "postcss-css-variables/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "postcss-css-variables/escape-string-regexp": ["escape-string-regexp@1.0.5", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
+
+ "postcss-load-config/lilconfig": ["lilconfig@3.1.3", "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "postject/commander": ["commander@9.5.0", "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
+
+ "pretty-format/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
+
+ "prompts/kleur": ["kleur@3.0.3", "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
+
+ "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "raw-body/iconv-lite": ["iconv-lite@0.4.24", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
+
+ "readdir-glob/minimatch": ["minimatch@5.1.9", "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.9.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="],
+
+ "rimraf/glob": ["glob@7.2.3", "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "roarr/sprintf-js": ["sprintf-js@1.1.3", "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="],
+
+ "router/path-to-regexp": ["path-to-regexp@8.4.2", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
+
+ "send/debug": ["debug@2.6.9", "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "send/mime": ["mime@1.6.0", "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
+
+ "serialize-error/type-fest": ["type-fest@0.13.1", "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="],
+
+ "sharp/detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "shiki/@shikijs/core": ["@shikijs/core@3.20.0", "https://registry.npmmirror.com/@shikijs/core/-/core-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="],
+
+ "shiki/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="],
+
+ "sort-keys/is-plain-obj": ["is-plain-obj@1.1.0", "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="],
+
+ "sst/aws4fetch": ["aws4fetch@1.0.18", "https://registry.npmmirror.com/aws4fetch/-/aws4fetch-1.0.18.tgz", {}, "sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ=="],
+
+ "sst/jose": ["jose@5.2.3", "https://registry.npmmirror.com/jose/-/jose-5.2.3.tgz", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="],
+
+ "storybook/open": ["open@10.2.0", "https://registry.npmmirror.com/open/-/open-10.2.0.tgz", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="],
+
+ "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "sucrase/commander": ["commander@4.1.1", "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "tar/yallist": ["yallist@5.0.0", "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
+
+ "terser/commander": ["commander@2.20.3", "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
+
+ "thread-stream/real-require": ["real-require@1.0.0", "https://registry.npmmirror.com/real-require/-/real-require-1.0.0.tgz", {}, "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g=="],
+
+ "tiny-async-pool/semver": ["semver@5.7.2", "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
+
+ "topojson-client/commander": ["commander@2.20.3", "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
+
+ "tree-sitter-bash/node-addon-api": ["node-addon-api@8.8.0", "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-8.8.0.tgz", {}, "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA=="],
+
+ "tw-to-css/postcss": ["postcss@8.4.31", "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
+
+ "tw-to-css/tailwindcss": ["tailwindcss@3.3.2", "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.3.2.tgz", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.18.2", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w=="],
+
+ "type-is/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "unifont/ofetch": ["ofetch@1.5.1", "https://registry.npmmirror.com/ofetch/-/ofetch-1.5.1.tgz", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
+
+ "unplugin/chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+
+ "unused-filename/path-exists": ["path-exists@5.0.0", "https://registry.npmmirror.com/path-exists/-/path-exists-5.0.0.tgz", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="],
+
+ "unzipper/fs-extra": ["fs-extra@11.3.5", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.5.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
+
+ "venice-ai-sdk-provider/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.47", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.47.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Enm5UlL0zUCrW3792opk5h7hRWxZOZzDe6eQYVFqX9LUOGGCe1h8MZWAGim765nwzgnjlpeYOsuzZmLtRsTPlg=="],
+
+ "venice-ai-sdk-provider/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "venice-ai-sdk-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "verror/core-util-is": ["core-util-is@1.0.2", "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="],
+
+ "vite-plugin-icons-spritesheet/glob": ["glob@11.1.0", "https://registry.npmmirror.com/glob/-/glob-11.1.0.tgz", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="],
+
+ "vitest/@vitest/expect": ["@vitest/expect@4.1.7", "https://registry.npmmirror.com/@vitest/expect/-/expect-4.1.7.tgz", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w=="],
+
+ "vitest/@vitest/spy": ["@vitest/spy@4.1.7", "https://registry.npmmirror.com/@vitest/spy/-/spy-4.1.7.tgz", {}, "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q=="],
+
+ "vitest/es-module-lexer": ["es-module-lexer@2.1.0", "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.1.0.tgz", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="],
+
+ "vitest/tinyexec": ["tinyexec@1.2.4", "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.2.4.tgz", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="],
+
+ "vitest/vite": ["vite@7.1.10", "https://registry.npmmirror.com/vite/-/vite-7.1.10.tgz", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA=="],
+
+ "vitest/why-is-node-running": ["why-is-node-running@2.3.0", "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
+
+ "vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
+
+ "wrangler/esbuild": ["esbuild@0.25.4", "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.4.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
+
+ "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "yaml-language-server/request-light": ["request-light@0.5.8", "https://registry.npmmirror.com/request-light/-/request-light-0.5.8.tgz", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="],
+
+ "yaml-language-server/yaml": ["yaml@2.7.1", "https://registry.npmmirror.com/yaml/-/yaml-2.7.1.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
+
+ "yargs/yargs-parser": ["yargs-parser@22.0.0", "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-22.0.0.tgz", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
+
+ "yauzl/buffer-crc32": ["buffer-crc32@0.2.13", "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="],
+
+ "zod-to-ts/zod": ["zod@3.25.76", "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "@actions/artifact/@actions/core/@actions/exec": ["@actions/exec@2.0.0", "https://registry.npmmirror.com/@actions/exec/-/exec-2.0.0.tgz", { "dependencies": { "@actions/io": "^2.0.0" } }, "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw=="],
+
+ "@actions/core/@actions/http-client/undici": ["undici@5.29.0", "https://registry.npmmirror.com/undici/-/undici-5.29.0.tgz", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
+
+ "@actions/github/@octokit/plugin-paginate-rest/@octokit/types": ["@octokit/types@12.6.0", "https://registry.npmmirror.com/@octokit/types/-/types-12.6.0.tgz", { "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw=="],
+
+ "@actions/github/@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@12.6.0", "https://registry.npmmirror.com/@octokit/types/-/types-12.6.0.tgz", { "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw=="],
+
+ "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/azure/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/cerebras/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/cohere/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/deepgram/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/deepinfra/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/deepseek/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/elevenlabs/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/fireworks/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/google-vertex/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/google/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/groq/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/mistral/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/openai-compatible/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/openai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/perplexity/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/togetherai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@ai-sdk/vercel/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "@astrojs/check/yargs/cliui": ["cliui@8.0.1", "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "@astrojs/check/yargs/string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "@astrojs/markdown-remark/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/@astrojs/prism": ["@astrojs/prism@3.3.0", "https://registry.npmmirror.com/@astrojs/prism/-/prism-3.3.0.tgz", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki": ["shiki@3.23.0", "https://registry.npmmirror.com/shiki/-/shiki-3.23.0.tgz", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="],
+
+ "@astrojs/starlight/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
+
+ "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
+
+ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
+
+ "@aws-sdk/client-cognito-identity/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/client-lambda/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.775.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.775.0.tgz", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.775.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.775.0.tgz", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/property-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.782.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.782.0.tgz", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/credential-provider-env": "3.775.0", "@aws-sdk/credential-provider-http": "3.775.0", "@aws-sdk/credential-provider-process": "3.775.0", "@aws-sdk/credential-provider-sso": "3.782.0", "@aws-sdk/credential-provider-web-identity": "3.782.0", "@aws-sdk/nested-clients": "3.782.0", "@aws-sdk/types": "3.775.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-wd4KdRy2YjLsE4Y7pz00470Iip06GlRHkG4dyLW7/hFMzEO2o7ixswCWp6J2VGZVAX64acknlv2Q0z02ebjmhw=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.775.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.775.0.tgz", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.782.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.782.0.tgz", { "dependencies": { "@aws-sdk/client-sso": "3.782.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/token-providers": "3.782.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-1y1ucxTtTIGDSNSNxriQY8msinilhe9gGvQpUDYW9gboyC7WQJPDw66imy258V6osdtdi+xoHzVCbCz3WhosMQ=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.782.0", "https://registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.782.0.tgz", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/nested-clients": "3.782.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-xCna0opVPaueEbJoclj5C6OpDNi0Gynj+4d7tnuXGgQhTHPyAz8ZyClkVqpi5qvHTgxROdUEDxWqEO5jqRHZHQ=="],
+
+ "@aws-sdk/credential-provider-env/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-provider-http/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-provider-ini/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-provider-login/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.933.0", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-o1GX0+IPlFi/D8ei9y/jj3yucJWNfPnbB5appVBWevAyUdZA5KzQ2nK/hDxiu9olTZlFEFpf1m1Rn3FaGxHqsw=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.933.0", "https://registry.npmmirror.com/@aws-sdk/token-providers/-/token-providers-3.933.0.tgz", { "dependencies": { "@aws-sdk/core": "3.932.0", "@aws-sdk/nested-clients": "3.933.0", "@aws-sdk/types": "3.930.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-Qzq7zj9yXUgAAJEbbmqRhm0jmUndl8nHG0AbxFEfCfQRVZWL96Qzx0mf8lYwT9hIMrXncLwy31HOthmbXwFRwQ=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.933.0", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-o1GX0+IPlFi/D8ei9y/jj3yucJWNfPnbB5appVBWevAyUdZA5KzQ2nK/hDxiu9olTZlFEFpf1m1Rn3FaGxHqsw=="],
+
+ "@aws-sdk/credential-provider-process/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-provider-sso/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-provider-web-identity/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/credential-providers/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/nested-clients/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/token-providers/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.26", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", { "dependencies": { "@smithy/types": "^4.14.2", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g=="],
+
+ "@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@azure/core-xml/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
+
+ "@develar/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.15", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="],
+
+ "@electron/fuses/fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "@electron/notarize/fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "@electron/universal/fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "@expressive-code/plugin-shiki/shiki/@shikijs/core": ["@shikijs/core@3.23.0", "https://registry.npmmirror.com/@shikijs/core/-/core-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="],
+
+ "@expressive-code/plugin-shiki/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="],
+
+ "@expressive-code/plugin-shiki/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="],
+
+ "@expressive-code/plugin-shiki/shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "https://registry.npmmirror.com/@shikijs/langs/-/langs-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="],
+
+ "@expressive-code/plugin-shiki/shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "https://registry.npmmirror.com/@shikijs/themes/-/themes-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="],
+
+ "@expressive-code/plugin-shiki/shiki/@shikijs/types": ["@shikijs/types@3.23.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.23.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="],
+
+ "@hey-api/json-schema-ref-parser/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="],
+
+ "@jsx-email/cli/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="],
+
+ "@jsx-email/cli/tailwindcss/chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+
+ "@jsx-email/cli/tailwindcss/glob-parent": ["glob-parent@6.0.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "@jsx-email/cli/tailwindcss/jiti": ["jiti@1.21.7", "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
+
+ "@jsx-email/cli/tailwindcss/object-hash": ["object-hash@3.0.0", "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
+
+ "@jsx-email/cli/vite/esbuild": ["esbuild@0.18.20", "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
+
+ "@jsx-email/cli/vite/rollup": ["rollup@3.30.0", "https://registry.npmmirror.com/rollup/-/rollup-3.30.0.tgz", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA=="],
+
+ "@jsx-email/doiuse-email/htmlparser2/entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "@malept/flatpak-bundler/fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "@modelcontextprotocol/sdk/express/accepts": ["accepts@2.0.0", "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
+
+ "@modelcontextprotocol/sdk/express/body-parser": ["body-parser@2.2.2", "https://registry.npmmirror.com/body-parser/-/body-parser-2.2.2.tgz", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
+
+ "@modelcontextprotocol/sdk/express/content-disposition": ["content-disposition@1.1.0", "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.1.0.tgz", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="],
+
+ "@modelcontextprotocol/sdk/express/cookie": ["cookie@0.7.2", "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
+
+ "@modelcontextprotocol/sdk/express/cookie-signature": ["cookie-signature@1.2.2", "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.2.2.tgz", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
+
+ "@modelcontextprotocol/sdk/express/finalhandler": ["finalhandler@2.1.1", "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
+
+ "@modelcontextprotocol/sdk/express/fresh": ["fresh@2.0.0", "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
+
+ "@modelcontextprotocol/sdk/express/merge-descriptors": ["merge-descriptors@2.0.0", "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
+
+ "@modelcontextprotocol/sdk/express/send": ["send@1.2.1", "https://registry.npmmirror.com/send/-/send-1.2.1.tgz", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
+
+ "@modelcontextprotocol/sdk/express/serve-static": ["serve-static@2.2.1", "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.1.tgz", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
+
+ "@modelcontextprotocol/sdk/express/type-is": ["type-is@2.1.0", "https://registry.npmmirror.com/type-is/-/type-is-2.1.0.tgz", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="],
+
+ "@octokit/auth-app/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/auth-app/@octokit/request/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/auth-app/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/auth-app/@octokit/request-error/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/auth-oauth-app/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/auth-oauth-app/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/auth-oauth-app/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/auth-oauth-app/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/auth-oauth-device/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/auth-oauth-device/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/auth-oauth-device/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/auth-oauth-device/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/auth-oauth-user/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/auth-oauth-user/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/auth-oauth-user/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/auth-oauth-user/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="],
+
+ "@octokit/endpoint/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="],
+
+ "@octokit/graphql/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/graphql/@octokit/request/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/graphql/@octokit/request/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/graphql/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/graphql/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="],
+
+ "@octokit/oauth-methods/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/oauth-methods/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/oauth-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@6.0.0", "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-6.0.0.tgz", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.3", "https://registry.npmmirror.com/@octokit/graphql/-/graphql-9.0.3.tgz", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-4.0.0.tgz", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@6.0.0", "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-6.0.0.tgz", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.3", "https://registry.npmmirror.com/@octokit/graphql/-/graphql-9.0.3.tgz", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-4.0.0.tgz", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="],
+
+ "@octokit/plugin-retry/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@12.11.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", {}, "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="],
+
+ "@octokit/request-error/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="],
+
+ "@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="],
+
+ "@octokit/rest/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@6.0.0", "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-6.0.0.tgz", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="],
+
+ "@octokit/rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@9.0.3", "https://registry.npmmirror.com/@octokit/graphql/-/graphql-9.0.3.tgz", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="],
+
+ "@octokit/rest/@octokit/core/@octokit/request": ["@octokit/request@10.0.10", "https://registry.npmmirror.com/@octokit/request/-/request-10.0.10.tgz", { "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" } }, "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w=="],
+
+ "@octokit/rest/@octokit/core/@octokit/request-error": ["@octokit/request-error@7.1.0", "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="],
+
+ "@octokit/rest/@octokit/core/@octokit/types": ["@octokit/types@16.0.0", "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="],
+
+ "@octokit/rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-4.0.0.tgz", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="],
+
+ "@opencode-ai/desktop/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "https://registry.npmmirror.com/@actions/http-client/-/http-client-2.2.3.tgz", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="],
+
+ "@opencode-ai/web/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "https://registry.npmmirror.com/@shikijs/core/-/core-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="],
+
+ "@opencode-ai/web/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "@opentui/solid/@babel/core/semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@pierre/diffs/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "https://registry.npmmirror.com/@shikijs/core/-/core-3.20.0.tgz", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="],
+
+ "@pierre/diffs/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.20.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.20.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
+
+ "@sentry/bundler-plugin-core/glob/minimatch": ["minimatch@8.0.7", "https://registry.npmmirror.com/minimatch/-/minimatch-8.0.7.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="],
+
+ "@sentry/bundler-plugin-core/glob/minipass": ["minipass@4.2.8", "https://registry.npmmirror.com/minipass/-/minipass-4.2.8.tgz", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="],
+
+ "@sentry/bundler-plugin-core/glob/path-scurry": ["path-scurry@1.11.1", "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
+
+ "@sentry/cli/https-proxy-agent/agent-base": ["agent-base@6.0.2", "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
+
+ "@sentry/cli/which/isexe": ["isexe@2.0.0", "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "@slack/web-api/form-data/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "@slack/web-api/p-queue/eventemitter3": ["eventemitter3@4.0.7", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
+
+ "@slack/web-api/p-queue/p-timeout": ["p-timeout@3.2.0", "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="],
+
+ "@solidjs/start/shiki/@shikijs/core": ["@shikijs/core@1.29.2", "https://registry.npmmirror.com/@shikijs/core/-/core-1.29.2.tgz", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="],
+
+ "@solidjs/start/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="],
+
+ "@solidjs/start/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@1.29.2", "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1" } }, "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA=="],
+
+ "@solidjs/start/shiki/@shikijs/langs": ["@shikijs/langs@1.29.2", "https://registry.npmmirror.com/@shikijs/langs/-/langs-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ=="],
+
+ "@solidjs/start/shiki/@shikijs/themes": ["@shikijs/themes@1.29.2", "https://registry.npmmirror.com/@shikijs/themes/-/themes-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g=="],
+
+ "@solidjs/start/shiki/@shikijs/types": ["@shikijs/types@1.29.2", "https://registry.npmmirror.com/@shikijs/types/-/types-1.29.2.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw=="],
+
+ "@storybook/csf-plugin/unplugin/webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
+
+ "@vitest/coverage-v8/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@4.1.8", "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA=="],
+
+ "@vitest/expect/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="],
+
+ "accepts/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "ai-gateway-provider/@ai-sdk/amazon-bedrock/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "ai-gateway-provider/@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "ai-gateway-provider/@ai-sdk/amazon-bedrock/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="],
+
+ "ai-gateway-provider/@ai-sdk/amazon-bedrock/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.10.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
+
+ "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
+
+ "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "app-builder-lib/@electron/get/env-paths": ["env-paths@2.2.1", "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
+
+ "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
+
+ "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "app-builder-lib/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
+
+ "app-builder-lib/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "app-builder-lib/which/isexe": ["isexe@3.1.5", "https://registry.npmmirror.com/isexe/-/isexe-3.1.5.tgz", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
+
+ "archiver-utils/glob/jackspeak": ["jackspeak@3.4.3", "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
+
+ "archiver-utils/glob/minimatch": ["minimatch@9.0.9", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
+
+ "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
+
+ "astro/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "astro/unstorage/chokidar": ["chokidar@5.0.0", "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+
+ "astro/unstorage/h3": ["h3@1.15.11", "https://registry.npmmirror.com/h3/-/h3-1.15.11.tgz", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
+
+ "astro/unstorage/ofetch": ["ofetch@1.5.1", "https://registry.npmmirror.com/ofetch/-/ofetch-1.5.1.tgz", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
+
+ "axios/https-proxy-agent/agent-base": ["agent-base@6.0.2", "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
+
+ "babel-plugin-module-resolver/glob/minimatch": ["minimatch@8.0.7", "https://registry.npmmirror.com/minimatch/-/minimatch-8.0.7.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="],
+
+ "babel-plugin-module-resolver/glob/minipass": ["minipass@4.2.8", "https://registry.npmmirror.com/minipass/-/minipass-4.2.8.tgz", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="],
+
+ "babel-plugin-module-resolver/glob/path-scurry": ["path-scurry@1.11.1", "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
+
+ "body-parser/debug/ms": ["ms@2.0.0", "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "builder-util/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "c12/chokidar/readdirp": ["readdirp@5.0.0", "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+
+ "conf/dot-prop/type-fest": ["type-fest@5.7.0", "https://registry.npmmirror.com/type-fest/-/type-fest-5.7.0.tgz", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg=="],
+
+ "cross-spawn/which/isexe": ["isexe@2.0.0", "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.15", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="],
+
+ "dir-compare/p-limit/yocto-queue": ["yocto-queue@0.1.0", "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "dmg-builder/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "dmg-license/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "duplexer2/readable-stream/isarray": ["isarray@1.0.0", "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
+
+ "duplexer2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
+
+ "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
+
+ "editorconfig/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/@electron/get": ["@electron/get@3.1.0", "https://registry.npmmirror.com/@electron/get/-/get-3.1.0.tgz", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/builder-util-runtime": ["builder-util-runtime@9.5.1", "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/ci-info": ["ci-info@4.3.1", "https://registry.npmmirror.com/ci-info/-/ci-info-4.3.1.tgz", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/dmg-builder": ["dmg-builder@26.8.1", "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-26.8.1.tgz", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, "optionalDependencies": { "dmg-license": "^1.0.11" } }, "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/electron-publish": ["electron-publish@26.8.1", "https://registry.npmmirror.com/electron-publish/-/electron-publish-26.8.1.tgz", { "dependencies": { "@types/fs-extra": "^9.0.11", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } }, "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/hosted-git-info": ["hosted-git-info@4.1.0", "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/which": ["which@5.0.0", "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="],
+
+ "electron-builder-squirrel-windows/builder-util/builder-util-runtime": ["builder-util-runtime@9.5.1", "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ=="],
+
+ "electron-builder-squirrel-windows/builder-util/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "electron-builder-squirrel-windows/builder-util/js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "electron-builder/yargs/cliui": ["cliui@8.0.1", "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "electron-builder/yargs/string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "electron-updater/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "electron-winstaller/fs-extra/universalify": ["universalify@0.1.2", "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="],
+
+ "esbuild-plugin-copy/chokidar/readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+
+ "express/debug/ms": ["ms@2.0.0", "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "filelist/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "finalhandler/debug/ms": ["ms@2.0.0", "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "form-data/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "iconv-corefoundation/cli-truncate/slice-ansi": ["slice-ansi@3.0.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="],
+
+ "iconv-corefoundation/cli-truncate/string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "js-beautify/glob/jackspeak": ["jackspeak@3.4.3", "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
+
+ "js-beautify/glob/minimatch": ["minimatch@9.0.9", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
+
+ "js-beautify/glob/path-scurry": ["path-scurry@1.11.1", "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
+
+ "js-beautify/nopt/abbrev": ["abbrev@2.0.0", "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="],
+
+ "lazystream/readable-stream/isarray": ["isarray@1.0.0", "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
+
+ "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
+
+ "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
+
+ "motion/framer-motion/motion-dom": ["motion-dom@12.40.0", "https://registry.npmmirror.com/motion-dom/-/motion-dom-12.40.0.tgz", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="],
+
+ "motion/framer-motion/motion-utils": ["motion-utils@12.39.0", "https://registry.npmmirror.com/motion-utils/-/motion-utils-12.39.0.tgz", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
+
+ "opencode-gitlab-auth/open/wsl-utils": ["wsl-utils@0.1.0", "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="],
+
+ "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
+
+ "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="],
+
+ "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "rimraf/glob/minimatch": ["minimatch@3.1.5", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
+
+ "send/debug/ms": ["ms@2.0.0", "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "storybook/open/wsl-utils": ["wsl-utils@0.1.0", "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="],
+
+ "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "tw-to-css/tailwindcss/chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+
+ "tw-to-css/tailwindcss/glob-parent": ["glob-parent@6.0.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "tw-to-css/tailwindcss/jiti": ["jiti@1.21.7", "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
+
+ "tw-to-css/tailwindcss/object-hash": ["object-hash@3.0.0", "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
+
+ "tw-to-css/tailwindcss/postcss": ["postcss@8.5.15", "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
+
+ "type-is/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "unplugin/chokidar/readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+
+ "unzipper/fs-extra/jsonfile": ["jsonfile@6.2.1", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "venice-ai-sdk-provider/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "vitest/@vitest/expect/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "vitest/@vitest/expect/chai": ["chai@6.2.2", "https://registry.npmmirror.com/chai/-/chai-6.2.2.tgz", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="],
+
+ "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
+
+ "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
+
+ "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
+
+ "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
+
+ "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
+
+ "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
+
+ "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
+
+ "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
+
+ "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
+
+ "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
+
+ "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
+
+ "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
+
+ "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
+
+ "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
+
+ "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
+
+ "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
+
+ "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
+
+ "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="],
+
+ "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
+
+ "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
+
+ "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
+
+ "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
+
+ "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
+
+ "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
+
+ "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
+
+ "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "@actions/artifact/@actions/core/@actions/exec/@actions/io": ["@actions/io@2.0.0", "https://registry.npmmirror.com/@actions/io/-/io-2.0.0.tgz", {}, "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg=="],
+
+ "@actions/github/@octokit/plugin-paginate-rest/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@20.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", {}, "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="],
+
+ "@actions/github/@octokit/plugin-rest-endpoint-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@20.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", {}, "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="],
+
+ "@astrojs/check/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "@astrojs/check/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "@astrojs/check/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "@astrojs/check/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/core": ["@shikijs/core@3.23.0", "https://registry.npmmirror.com/@shikijs/core/-/core-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "https://registry.npmmirror.com/@shikijs/langs/-/langs-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "https://registry.npmmirror.com/@shikijs/themes/-/themes-3.23.0.tgz", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="],
+
+ "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/types": ["@shikijs/types@3.23.0", "https://registry.npmmirror.com/@shikijs/types/-/types-3.23.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="],
+
+ "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
+
+ "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
+
+ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
+
+ "@aws-sdk/client-cognito-identity/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/client-lambda/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.782.0", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.782.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.782.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-QOYC8q7luzHFXrP0xYAqBctoPkynjfV0r9dqntFu4/IWMTyC1vlo1UTxFAjIPyclYw92XJyEkVCVg9v/nQnsUA=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.782.0", "https://registry.npmmirror.com/@aws-sdk/client-sso/-/client-sso-3.782.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.782.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-5GlJBejo8wqMpSSEKb45WE82YxI2k73YuebjLH/eWDNQeE6VI5Bh9lA1YQ7xNkLLH8hIsb0pSfKVuwh0VEzVrg=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.782.0", "https://registry.npmmirror.com/@aws-sdk/token-providers/-/token-providers-3.782.0.tgz", { "dependencies": { "@aws-sdk/nested-clients": "3.782.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-4tPuk/3+THPrzKaXW4jE2R67UyGwHLFizZ47pcjJWbhb78IIJAy94vbeqEQ+veS84KF5TXcU7g5jGTXC0D70Wg=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.782.0", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.782.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.782.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-QOYC8q7luzHFXrP0xYAqBctoPkynjfV0r9dqntFu4/IWMTyC1vlo1UTxFAjIPyclYw92XJyEkVCVg9v/nQnsUA=="],
+
+ "@aws-sdk/credential-provider-env/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-provider-http/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-provider-ini/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-provider-login/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.933.0", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.933.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.932.0", "@aws-sdk/middleware-host-header": "3.930.0", "@aws-sdk/middleware-logger": "3.930.0", "@aws-sdk/middleware-recursion-detection": "3.933.0", "@aws-sdk/middleware-user-agent": "3.932.0", "@aws-sdk/region-config-resolver": "3.930.0", "@aws-sdk/types": "3.930.0", "@aws-sdk/util-endpoints": "3.930.0", "@aws-sdk/util-user-agent-browser": "3.930.0", "@aws-sdk/util-user-agent-node": "3.932.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.2", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.9", "@smithy/middleware-retry": "^4.4.9", "@smithy/middleware-serde": "^4.2.5", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.8", "@smithy/util-defaults-mode-node": "^4.2.11", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-o1GX0+IPlFi/D8ei9y/jj3yucJWNfPnbB5appVBWevAyUdZA5KzQ2nK/hDxiu9olTZlFEFpf1m1Rn3FaGxHqsw=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/credential-provider-process/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-provider-sso/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-provider-web-identity/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/credential-providers/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/nested-clients/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@aws-sdk/token-providers/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="],
+
+ "@electron/asar/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "@electron/universal/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "@jsx-email/cli/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "@jsx-email/cli/tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="],
+
+ "@jsx-email/cli/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="],
+
+ "@modelcontextprotocol/sdk/express/type-is/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@modelcontextprotocol/sdk/express/type-is/media-typer": ["media-typer@1.1.0", "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.0.tgz", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
+
+ "@octokit/auth-app/@octokit/request-error/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/auth-app/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/graphql/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@octokit/rest/@octokit/core/@octokit/request/@octokit/endpoint": ["@octokit/endpoint@11.0.3", "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag=="],
+
+ "@octokit/rest/@octokit/core/@octokit/request/content-type": ["content-type@2.0.0", "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
+
+ "@octokit/rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
+
+ "@opencode-ai/desktop/@actions/artifact/@actions/http-client/undici": ["undici@5.29.0", "https://registry.npmmirror.com/undici/-/undici-5.29.0.tgz", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
+
+ "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "@sentry/bundler-plugin-core/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "@sentry/bundler-plugin-core/glob/path-scurry/minipass": ["minipass@7.1.3", "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
+
+ "@slack/web-api/form-data/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "@solidjs/start/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@2.3.0", "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="],
+
+ "ai-gateway-provider/@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "ai-gateway-provider/@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
+ "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "app-builder-lib/@electron/get/fs-extra/universalify": ["universalify@0.1.2", "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="],
+
+ "archiver-utils/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
+
+ "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+
+ "astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "https://registry.npmmirror.com/cookie-es/-/cookie-es-1.2.3.tgz", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="],
+
+ "astro/unstorage/h3/crossws": ["crossws@0.3.5", "https://registry.npmmirror.com/crossws/-/crossws-0.3.5.tgz", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
+
+ "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "babel-plugin-module-resolver/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "babel-plugin-module-resolver/glob/path-scurry/minipass": ["minipass@7.1.3", "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
+
+ "dir-compare/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "editorconfig/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/@electron/get/env-paths": ["env-paths@2.2.1", "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/@electron/get/semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/dmg-builder/iconv-lite": ["iconv-lite@0.6.3", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/electron-publish/chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/electron-publish/mime": ["mime@2.6.0", "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/which/isexe": ["isexe@3.1.5", "https://registry.npmmirror.com/isexe/-/isexe-3.1.5.tgz", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
+
+ "electron-builder-squirrel-windows/builder-util/js-yaml/argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "electron-builder/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "electron-builder/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "electron-builder/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "electron-builder/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "esbuild-plugin-copy/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "iconv-corefoundation/cli-truncate/string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "iconv-corefoundation/cli-truncate/string-width/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "js-beautify/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
+
+ "js-beautify/glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="],
+
+ "js-beautify/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
+
+ "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="],
+
+ "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="],
+
+ "readdir-glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.15", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="],
+
+ "tw-to-css/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "tw-to-css/tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+
+ "unplugin/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "@astrojs/check/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "@astrojs/check/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "@aws-sdk/client-cognito-identity/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/client-lambda/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/client-sts/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.782.0", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.782.0.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.782.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.782.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.782.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-QOYC8q7luzHFXrP0xYAqBctoPkynjfV0r9dqntFu4/IWMTyC1vlo1UTxFAjIPyclYw92XJyEkVCVg9v/nQnsUA=="],
+
+ "@aws-sdk/credential-provider-env/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-provider-http/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-provider-ini/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-provider-login/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
+
+ "@aws-sdk/credential-provider-process/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-provider-sso/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-provider-web-identity/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/credential-providers/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/nested-clients/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@aws-sdk/token-providers/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "https://registry.npmmirror.com/strnum/-/strnum-2.3.0.tgz", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="],
+
+ "@jsx-email/cli/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "@solidjs/start/shiki/@shikijs/engine-javascript/oniguruma-to-es/regex": ["regex@5.1.1", "https://registry.npmmirror.com/regex/-/regex-5.1.1.tgz", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw=="],
+
+ "@solidjs/start/shiki/@shikijs/engine-javascript/oniguruma-to-es/regex-recursion": ["regex-recursion@5.1.1", "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-5.1.1.tgz", { "dependencies": { "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w=="],
+
+ "archiver-utils/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "archiver-utils/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
+
+ "archiver-utils/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "babel-plugin-module-resolver/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "electron-builder-squirrel-windows/app-builder-lib/@electron/get/fs-extra/universalify": ["universalify@0.1.2", "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="],
+
+ "electron-builder/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "electron-builder/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "iconv-corefoundation/cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "js-beautify/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
+
+ "js-beautify/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+
+ "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+
+ "rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "tw-to-css/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "archiver-utils/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+
+ "archiver-utils/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "js-beautify/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+
+ "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+ }
+}
diff --git a/bunfig.toml b/bunfig.toml
new file mode 100644
index 0000000..c086c75
--- /dev/null
+++ b/bunfig.toml
@@ -0,0 +1,8 @@
+[install]
+exact = true
+# Only install newly resolved package versions published at least 3 days ago.
+minimumReleaseAge = 259200
+minimumReleaseAgeExcludes = ["@ai-sdk/amazon-bedrock", "@ai-sdk/anthropic", "@opentui/core", "@opentui/core-darwin-arm64", "@opentui/core-darwin-x64", "@opentui/core-linux-arm64", "@opentui/core-linux-arm64-musl", "@opentui/core-linux-x64", "@opentui/core-linux-x64-musl", "@opentui/core-win32-arm64", "@opentui/core-win32-x64", "@opentui/keymap", "@opentui/solid", "opentui-spinner", "gitlab-ai-provider", "opencode-gitlab-auth", "@ff-labs/fff-node", "@ff-labs/fff-bun", "@ff-labs/fff-bin-darwin-arm64", "@ff-labs/fff-bin-darwin-x64", "@ff-labs/fff-bin-linux-arm64-gnu", "@ff-labs/fff-bin-linux-arm64-musl", "@ff-labs/fff-bin-linux-x64-gnu", "@ff-labs/fff-bin-linux-x64-musl", "@ff-labs/fff-bin-win32-arm64", "@ff-labs/fff-bin-win32-x64", "app-builder-lib", "dmg-builder", "electron-builder", "electron-publish"]
+
+[test]
+root = "./do-not-run-tests-from-root"
diff --git a/docs/AGENTS.md b/docs/AGENTS.md
new file mode 100644
index 0000000..8e923f0
--- /dev/null
+++ b/docs/AGENTS.md
@@ -0,0 +1,137 @@
+# AGENTS.md
+
+This file provides guidance to the AI agent when working with code in this repository.
+
+## 项目概述
+
+AirCoding 是基于 OpenCode v1.17.4 fork 的多 Agent 协作 AI 编程系统,以 C++ 为首个深度支持语言。核心策略:**最小修改 OpenCode,通过 Plugin + Agent 配置植入多 Agent 调度层**。
+
+- 完整架构设计:@aircoding-architecture-mvp.md
+- 实现计划:@implementation-plan.md
+- V1 痛点教训:@airplanV2-Qwen3.7-Max设计.md
+- OpenCode 参考代码:@reference/opencode/
+
+## 构建与测试
+
+```bash
+bun install # 安装依赖
+bun lint # oxlint 检查
+bun typecheck # turbo typecheck 全包
+bun test # ⚠️ 禁止从根目录运行,必须进入 packages/ 执行
+bun typecheck # ⚠️ 同上,从包目录执行,禁止直接运行 tsc
+```
+
+## 代码风格
+
+沿用 OpenCode 规范(Prettier: `semi: false`, `printWidth: 120`,oxlint):
+
+- `const` 优先,禁止 `let` + 重赋值
+- 禁止 `else`,用 early return
+- 禁止不必要的解构,用 dot notation
+- 禁止 `import { x as y }` 和 `import * as Foo`
+- 禁止 `try/catch`(能用 `.catch()` 的场景)
+- 内联单次使用的值,不提前抽取 helper
+- 模块底部加 `export * as Foo from "./foo"` 自导出
+- Drizzle schema 字段用 snake_case
+- Effect v4 beta:`Effect.fork` 不存在,用 `Effect.forkIn(scope)`
+
+## 分支与提交
+
+- 默认分支:`dev`(不是 `main`)
+- 分支名:短名(最多三个词),短横线分隔,无前缀(如 `session-recovery`,不是 `feat/session-recovery`)
+- 提交:`type(scope): summary`,type: `feat|fix|docs|chore|refactor|test`
+
+## Agent 架构约束
+
+**核心原则:工具白名单是硬阻断,不是建议。**
+
+| Agent | 可用工具 | 禁止工具 |
+|-------|---------|---------|
+| Architecture Designer | read, glob, grep, task | Write, Edit, Bash(代码级只读) |
+| Scheduler | read, glob, grep, task, coordinator.* | Write, Edit(不可写代码) |
+| Worker (EXECUTE) | read, write, edit, shell, glob, grep | — |
+| Worker (DEBUG) | 同上,但必须先通过 shell 取证才能修改代码 | — |
+
+- Worker 是 EXECUTE + DEBUG 双模式合一,由 TaskSpec.type 切换
+- Worker 直接通过 `shell` 调用 cmake/ctest/cppcheck/ffmpeg/tcpdump,不封装 Plugin
+- EXECUTE 模式:**每次完成前必须运行 `cppcheck --enable=all`(不可跳过)**
+- DEBUG 模式:先取证(shell 调用截图/抓包/静态分析)→ 记录 → 才能改代码
+- Scheduler 通过 EventV2 事件驱动,不依赖 LLM 轮询
+- 10 分钟不活跃自动巡检 + scheduler-state.json 实时落盘
+
+## 关键设计约束
+
+- **单进程模型**:子代理 = OpenCode 子 session(TaskTool + BackgroundJob),不是独立进程
+- **LLM 混合策略**:正常调度走确定性代码(DAG 遍历),异常/边界才调 LLM
+- **证据门控**:按任务类型决定必需证据(GUI→截图,网络→抓包,C++→静态分析)
+- **两层审查**:Worker 自验(逐任务)+ Arc 里程碑审查 fork(全局 Code-to-Design)
+- **接口契约**:中等粒度(module + kind + spec + stability),作为概率信号而非确定性判断
+
+## C++ 工具链
+
+- Worker 直接通过 `shell` 调用命令行工具,不封装 Plugin
+- 构建:CMake 优先,Ninja 优先,失败回退 Make
+- 测试:CTest + GoogleTest
+- **cppcheck 强制:每次任务完成前必须运行 `cppcheck --enable=all`,无输出不允许标记完成**
+- Scheduler 校验 WorkerResult 中必须包含 cppcheck 输出
+- 编译错误解析:LLM 自行分析(不用正则)
+- compile_commands.json:按需生成,不持久化
+
+## 目录约定
+
+```
+.air/shared/ # 可提交 git(plan, rules, project.json)
+.air/local/ # gitignore(sessions, state, debug-records)
+.air/local/state/scheduler-state.json # 调度器实时状态
+```
+
+## 测试策略
+
+- 单元测试:`bun test`,无 LLM 调用,<30s
+- 集成测试:录制 LLM fixture 回放,<1min
+- E2E 测试:真实 LLM,release gate
+
+## 强制规则
+- 不得以兜底方案、先这样做、以后再删、先跳过、后面再补或类似原因进行与方案不同的降级实现
+- 执行必须先读取相关需求设计与架构,先读后写,不得违背架构独自实现
+- 代码审查不能只看代码是否存在,不能只跑代码是否通过门禁,必须先读取相关设计和约束然后code to review逐条审查+功能测试用例全过才能pass
+
+## 多 Agent 调度规则(Main Agent 必读)
+
+你是 Main Agent(用户交互入口)。你不直接写代码或执行复杂任务,而是**派发给专门的子代理**。
+
+### 何时派发 Architect(架构师)
+
+- 新项目或新功能开始时 → 派发 `architect` 子代理做需求分析和架构设计
+- 用户讨论架构、需求变更时 → 派发 `architect`
+- 提示词示例:`请用 architect 子代理分析这个需求并设计架构方案:{用户需求}`
+
+### 何时派发 Scheduler(调度器)
+
+- 用户提出需要多步骤实现的开发任务时 → 派发 `scheduler` 子代理
+- Architect 完成架构设计后,需要执行时 → 派发 `scheduler`
+- 提示词示例:`请用 scheduler 子代理执行以下任务:{任务描述}`
+
+### 派发规则
+
+1. **使用 `task` 工具**,设置 `subagent_type` 为 `scheduler`、`worker` 或 `architect`
+2. **始终设置 `background: true`**,让子代理在后台运行,你保持与用户的对话
+3. 子代理完成后会自动通知你,你负责向用户汇报结果
+4. 不要同时承担多个角色——你是协调者,不是执行者
+
+### 对话流程
+
+```
+用户提需求
+ → 如果是新领域/复杂需求 → 派发 architect 做架构设计
+ → architect 完成后 → 派发 scheduler 执行
+ → scheduler 完成 → 向用户汇报结果
+ → 如果用户追问细节 → 派发对应子代理处理
+```
+
+### 简单任务例外
+
+以下情况你可以直接处理,不需要派发子代理:
+- 回答用户关于项目/代码的问题(用 read/grep/glob)
+- 单文件的小修改(直接用 edit)
+- 解释已有代码的行为
\ No newline at end of file
diff --git a/docs/INTEGRATION.md b/docs/INTEGRATION.md
new file mode 100644
index 0000000..b1b08ad
--- /dev/null
+++ b/docs/INTEGRATION.md
@@ -0,0 +1,138 @@
+# AirCoding 集成指南
+
+本文档说明如何将 AirCoding 的自定义组件集成到 OpenCode v1.17.4 fork 中。
+
+## 需要集成的文件
+
+| 源文件 | 目标位置 | 说明 |
+|--------|---------|------|
+| `src/tool/coordinator.ts` | `packages/opencode/src/tool/coordinator.ts` | 调度工具(4 个子工具) |
+| `src/agents/prompts/scheduler.md` | `packages/opencode/src/agent/prompt/scheduler.txt` | Scheduler system prompt |
+| `src/agents/prompts/worker.md` | `packages/opencode/src/agent/prompt/worker.txt` | Worker system prompt |
+| `src/agents/prompts/architect.md` | `packages/opencode/src/agent/prompt/architect.txt` | Architect system prompt |
+| `opencode.json` | 项目根目录 `.opencode/opencode.json` 或用户配置 | Agent 定义 |
+
+## 步骤 1:复制 coordinator.ts
+
+```bash
+cp src/tool/coordinator.ts packages/opencode/src/tool/coordinator.ts
+```
+
+## 步骤 2:修改 registry.ts
+
+在 `packages/opencode/src/tool/registry.ts` 中做以下修改:
+
+### 2a. 添加 import(文件顶部)
+
+```typescript
+import * as coordinator from "./coordinator"
+```
+
+### 2b. 注册工具(约 198 行,tool init block 中)
+
+在 `const tool = yield* Effect.all({` 块中添加:
+
+```typescript
+coordinator_listen: Tool.init(coordinator.listen),
+coordinator_status: Tool.init(coordinator.status),
+coordinator_save_state: Tool.init(coordinator.saveState),
+coordinator_load_state: Tool.init(coordinator.loadState),
+```
+
+### 2c. 添加到 builtin 列表(约 219 行)
+
+在 `builtin: [` 数组中添加:
+
+```typescript
+tool.coordinator_listen,
+tool.coordinator_status,
+tool.coordinator_save_state,
+tool.coordinator_load_state,
+```
+
+## 步骤 3:复制 prompt 文件
+
+```bash
+cp src/agents/prompts/scheduler.md packages/opencode/src/agent/prompt/scheduler.txt
+cp src/agents/prompts/worker.md packages/opencode/src/agent/prompt/worker.txt
+cp src/agents/prompts/architect.md packages/opencode/src/agent/prompt/architect.txt
+```
+
+## 步骤 4:注册 Agent(可选)
+
+可以选择以下两种方式之一注册自定义 Agent:
+
+### 方式 A:通过 opencode.json 配置(推荐)
+
+将 `opencode.json` 放到项目的 `.opencode/` 目录或用户全局配置目录中。OpenCode 会自动加载其中的 agent 定义。
+
+### 方式 B:修改 agent.ts 源码
+
+在 `packages/opencode/src/agent/agent.ts` 的 `agents` 对象中添加自定义 agent 定义(约 138 行):
+
+```typescript
+scheduler: {
+ name: "scheduler",
+ description: "任务调度引擎",
+ mode: "subagent",
+ native: true,
+ steps: 200,
+ prompt: PROMPT_SCHEDULER,
+ permission: Permission.merge(defaults, Permission.fromConfig({
+ edit: "deny",
+ write: "deny",
+ todowrite: "deny",
+ }), user),
+ options: {},
+},
+worker: {
+ name: "worker",
+ description: "执行器/调试器双模式 Worker",
+ mode: "subagent",
+ native: true,
+ steps: 100,
+ prompt: PROMPT_WORKER,
+ permission: Permission.merge(defaults, user),
+ options: {},
+},
+architect: {
+ name: "architect",
+ description: "架构规划器",
+ mode: "subagent",
+ native: true,
+ steps: 100,
+ prompt: PROMPT_ARCHITECT,
+ permission: Permission.merge(defaults, Permission.fromConfig({
+ "*": "deny",
+ read: "allow",
+ glob: "allow",
+ grep: "allow",
+ task: "allow",
+ }), user),
+ options: {},
+},
+```
+
+并在文件顶部添加 prompt import:
+
+```typescript
+import PROMPT_SCHEDULER from "./prompt/scheduler.txt"
+import PROMPT_WORKER from "./prompt/worker.txt"
+import PROMPT_ARCHITECT from "./prompt/architect.txt"
+```
+
+## 步骤 5:启用后台子代理
+
+设置环境变量以启用 OpenCode 的后台子代理功能:
+
+```bash
+export OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true
+```
+
+## 步骤 6:验证
+
+1. 构建 OpenCode:`bun run build`(或 `bun dev` 开发模式)
+2. 在项目目录中创建 `.opencode/opencode.json`(包含 agent 配置)
+3. 创建 `.air/local/state/` 目录
+4. 启动 OpenCode,尝试使用 `task` 工具派发 scheduler/worker/architect 子代理
+5. 验证 coordinator_listen / coordinator_status 工具可用
diff --git a/docs/aircoding-architecture-mvp.md b/docs/aircoding-architecture-mvp.md
new file mode 100644
index 0000000..5e0d522
--- /dev/null
+++ b/docs/aircoding-architecture-mvp.md
@@ -0,0 +1,788 @@
+# AirCoding Agent 最小化架构设计
+
+> **版本**: MVP-0.3
+> **日期**: 2026-06-12
+> **基线**: OpenCode v1.17.4 (commit abda3515)
+> **策略**: 基于 OpenCode 最小修改,复用已有架构,植入多 Agent 协作
+
+---
+
+## 1. 核心定位
+
+AirCoding 是基于 OpenCode 改造的 AI Coding Agent,核心 runtime 语言无关,C++ 为首个深度支持的语言 profile。
+
+**与 OpenCode 的关系**:Fork OpenCode 作为内核,保留其 TUI、Provider、Session、Event 系统,在其上植入多 Agent 协作层。
+
+**与 AirPlan V1 的关系**:AirPlan V1 是 Claude Code 上的插件方案,已验证架构方向但暴露大量可靠性问题(详见 `airplanV2-Qwen3.7-Max设计.md`)。AirCoding 将 V1 的经验教训内化为代码级约束,不再依赖自然语言指令控制 LLM 行为。
+
+---
+
+## 2. 设计原则
+
+### 2.1 代码级硬阻断
+
+> 永远不要用自然语言指令去约束 LLM 的行为边界。凡是"不可违反"的规则,必须在代码层面硬阻断。
+
+三道防线:
+
+```
+第一道:工具白名单(Agent 注册时限定 tools 列表)
+ → Architecture Designer 没有 Write/Edit → 物理上不可能写代码
+ → Scheduler 没有 Write/Edit → 物理上不可能越界编码
+
+第二道:状态机(Scheduler 的流程规则是代码,不是 prompt 建议)
+ → Executor 完成 → 代码自动触发 Reviewer(Worker 无法跳过)
+ → 证据不足 → 代码阻止标记完成(Worker 无法绕过)
+
+第三道:结构化契约(TaskSpec/WorkerResult 是 TypeScript 类型)
+ → 缺失必填字段 → 类型校验失败,不接受结果
+ → denied_paths 被写入 → Permission 引擎拒绝
+```
+
+### 2.2 最小修改原则
+
+- 直接使用 OpenCode 已有的系统,不重写
+- 新增功能通过 Plugin 和 Agent 注册实现,不改 OpenCode 核心代码
+- 仅在 OpenCode 无法满足需求时才修改核心代码
+
+### 2.3 单进程模型
+
+- 沿用 OpenCode 的单进程模型
+- 子代理 = 子 session(通过 TaskTool + BackgroundJob 实现)
+- 不引入独立进程 IPC,降低复杂度
+
+---
+
+## 3. 架构总览
+
+```
+┌─────────────────────────────────────────────────────┐
+│ OpenCode 内核 │
+│ ┌─────────┐ ┌──────────┐ ┌────────┐ ┌───────────┐ │
+│ │ TUI │ │ Provider │ │Session │ │ EventV2 │ │
+│ │OpenTUI │ │ Anthropic│ │SQLite │ │ PubSub │ │
+│ │SolidJS │ │ OpenAI │ │Drizzle │ │ Durable │ │
+│ └────┬────┘ └────┬─────┘ └───┬────┘ └─────┬─────┘ │
+│ │ │ │ │ │
+│ ┌────┴───────────┴───────────┴─────────────┴────┐ │
+│ │ AirCoding 多 Agent 层 │ │
+│ │ │ │
+│ │ ┌──────────┐ ┌────────────┐ ┌─────────┐ │ │
+│ │ │Main Agent│──▶│ Scheduler │──▶│ Workers │ │ │
+│ │ │(对话入口) │ │ Agent │ │ │ │ │
+│ │ │ │ │ (事件路由) │ │Executor │ │ │
+│ │ │ │ │ │ │Reviewer │ │ │
+│ │ └──────────┘ │ ┌──────┐ │ │Debugger │ │ │
+│ │ │ │Arc │ │ └─────────┘ │ │
+│ │ ┌──────────┐ │ │Design│ │ │ │
+│ │ │Experience│ │ └──────┘ │ ┌─────────┐ │ │
+│ │ │ Miner │ └────────────┘ │C++ Tool │ │ │
+│ │ └──────────┘ │ Plugin │ │ │
+│ │ └─────────┘ │ │
+│ └───────────────────────────────────────────────┘ │
+└─────────────────────────────────────────────────────┘
+```
+
+---
+
+## 4. Agent 层级与职责
+
+### 4.1 Main Agent(用户唯一交互入口)
+
+- **职责**:对话、意图分类、进度汇报、需求变更处理
+- **工具**:全部对话类工具 + `task`(派发子代理)
+- **核心约束**:不直接操作文件和命令,保持空闲可响应用户介入
+- **模式**:
+ - 对话模式(默认):不直接执行
+ - 直通模式(`/direct` 触发):前台直接执行
+
+### 4.2 Architecture Designer(只读)
+
+- **职责**:架构规划、需求探讨、影响评估、全周期审查
+- **工具白名单**:`read`, `glob`, `grep`(**代码级只读**,无 Write/Edit/Bash)
+- **阶段门控**:
+ - `discussing` → 与用户探讨需求,禁止生成计划
+ - `proposing` → 呈现架构方案,等待用户确认
+ - `confirmed` → 生成 TaskGraph,允许写入 plan/ 目录
+- **V1 教训**:P0-5(被 plan mode 劫持)→ 工具白名单硬阻断
+
+### 4.3 Scheduler Agent(事件路由器)
+
+- **职责**:任务拆解、派发、监控、合并、流程规则执行
+- **工具白名单**:`task`, `coordinator.listen`, `coordinator.dispatch`, `coordinator.status`, `read`, `glob`, `grep`(**无 Write/Edit**)
+- **核心机制**:
+ - 通过 `BackgroundJob` 非阻塞派发子代理
+ - 通过 `coordinator.listen` 订阅 EventV2,被动等待子代理事件
+ - 按流程规则(代码级状态机)决定下一步派发
+- **V1 教训**:
+ - P0-6(停下来问)→ system prompt 强制自主决策
+ - P0-7(遗忘轮询)→ 不依赖 LLM 轮询,用事件驱动
+ - P0-10(偏离调度写代码)→ 工具白名单硬阻断
+
+#### 防卡死机制(简化版)
+
+**不活跃定时器**:Scheduler 维护 `last_activity` 时间戳。以下任一动作更新该时间戳:派发新任务、收到子代理进度/完成/失败事件、用户介入操作。如果 `now - last_activity > 10 分钟`,自动触发一轮巡检(调用 `coordinator.status` 查询所有活跃子代理状态),根据结果处理卡死/崩溃的子代理。
+
+**状态实时落盘**:Scheduler 的每次状态变更写入 `.air/local/state/scheduler-state.json`。内容包括:当前图状态快照(每个 task 的 status)、活跃子代理列表 + 最后心跳时间、当前调度阶段/波次、`last_activity` 时间戳。API 挂了 / 进程崩溃 / 用户关闭后,下次启动时读取该文件重建调度上下文继续调度。
+
+#### LLM 调用策略(混合模式)
+
+正常流程走确定性代码,异常/边界/用户输出时才调 LLM:
+
+| 决策点 | 确定性(不调 LLM) | LLM 介入 |
+|--------|-------------------|---------|
+| 下一波任务选择 | DAG 遍历,入度为 0 自动 ready | 资源不足时决定优先级 |
+| Executor 完成 → 派发 Reviewer | 自动 | — |
+| build/test 失败 → 派发 Debugger | 自动 | — |
+| Debugger 修复后重试 | retry_budget 未耗尽时自动 | 预算耗尽时评估是否继续 |
+| Reviewer 不通过 → 重新派发 | 自动(前 2 次) | 连续 2 次不通过 → LLM 分析 |
+| 任务失败(非 build 原因) | — | LLM 分析原因 |
+| 需求变更 | — | LLM 变更分类 + 影响评估 |
+| 所有任务完成 → 汇总 | — | LLM 生成汇总报告 |
+
+**防卡死兜底**:确定性代码遇到未匹配的状态转换时,不阻塞,直接调 LLM 分析。LLM 也失败则进入降级模式(只做基本调度),持续失败则暂停并上报用户。
+
+### 4.4 Worker Agents
+
+#### Executor
+
+- **职责**:写代码、编译、测试、验证
+- **工具**:`read`, `write`, `edit`, `shell`, `glob`, `grep` + C++ 工具链 Plugin 工具
+- **内部循环**:TORI(Task → Observation → Reasoning → Iteration)
+- **出口**:TaskCompleted / TaskBlocked / TaskFailed
+- **约束**:TaskSpec 中的 `acceptance_criteria` + `scope.denied_paths`
+
+#### Reviewer(只读)
+
+- **职责**:代码审查、需求一致性验证、高风险审计
+- **工具白名单**:`read`, `glob`, `grep`(**只读**)
+- **触发**:Scheduler 在 Executor 完成后自动派发(代码级规则,Worker 无法跳过)
+- **上下文**:ContextAssembler 按需抽取当前任务模块的 plan 段落 + 需求条目(局部视野,~4K-6K tokens)
+- **审查范围**:任务验收(acceptance_criteria)+ 模块内 Code-to-Design + 代码质量 + 高风险审计
+- **V1 教训**:P0-8(AirDo 跳过专家)→ Scheduler 强制派发,不由 Worker 决定
+
+**两层审查模型**:
+
+| | 逐任务审查 (Reviewer) | 里程碑审查 (Architecture Designer) |
+|---|---|---|
+| 触发时机 | 每个 Executor 完成后 | 每个阶段/波次完成后 |
+| 上下文范围 | 局部(当前任务 + 模块段落) | 全局(完整 plan + 所有审查报告) |
+| 检查重点 | 任务验收 + 模块内 Code-to-Design | 跨模块架构一致性 |
+| 上下文大小 | ~4K-6K tokens | ~8K-15K tokens |
+| 频率 | 高(每个任务一次) | 低(每个阶段一次) |
+
+里程碑审查由 Scheduler 在阶段内所有任务完成后自动派发 Architecture Designer,Arc 持有完整 plan.md + 本阶段所有 Reviewer 报告,重点检查跨模块依赖方向、公共接口一致性、模块职责边界。
+
+#### Debugger
+
+- **职责**:证据收集、问题定位、修复、验证
+- **工具**:分两阶段
+ - `GATHERING` 阶段:只读工具(`read`, `glob`, `grep`, `shell` 仅用于运行诊断命令)
+ - `FIXING` 阶段:开放写工具(`write`, `edit`)
+ - 阶段转换由代码检查证据列表,无证据不允许进入 FIXING
+- **V1 教训**:P1-17(未取证就改代码)→ 阶段门控硬阻断
+
+#### ExperienceMiner(后台)
+
+- **职责**:从会话中提取经验、生成 SKILL.md、去重归档
+- **触发**:会话结束时 / DebugRecord 产生时 / 定期触发
+- **不阻塞 Main Agent**
+
+#### Compactor(后台)
+
+- **职责**:上下文压缩(Copy-on-Write)
+- **触发**:Context window 占比达 70%
+- **直接复用 OpenCode 的 `compaction.ts`**
+
+---
+
+## 5. 子代理通信机制
+
+### 5.1 通信模型
+
+OpenCode 的 TaskTool 是父子树状通信。AirCoding 通过 **EventV2 + Scheduler 路由** 实现兄弟 agent 之间的松耦合通信。
+
+```
+子 Agent 完成 → EventV2 广播事件 → Scheduler 收到事件 → Scheduler 按规则派发下一个子 Agent
+```
+
+不是 agent 之间直接对话,而是通过事件 + Scheduler 路由。
+
+### 5.2 流程规则(Scheduler 的状态机)
+
+```
+Executor 完成 → 自动触发 Reviewer(逐任务审查)
+Reviewer 通过 → 标记任务完成
+build/test 失败 → 自动触发 Debugger
+Reviewer 发现问题 → 重新派发 Executor 修复
+阶段内所有任务完成 → 自动触发 Architecture Designer(里程碑审查)
+里程碑审查通过 → 进入下一阶段
+里程碑审查发现问题 → Arc 生成修复任务 → Scheduler 派发
+需求变更 → 触发动态 DAG 调度算法(§14)
+Scheduler 异常无法决策 → 派发 Architecture Designer(咨询)
+所有任务完成 → 汇总结果返回 Main Agent
+```
+
+这些规则在 Scheduler 的 system prompt 中定义,但执行由 `coordinator.listen` 工具驱动——Scheduler 被动接收事件,按规则响应。
+
+### 5.3 需要新增的工具
+
+#### `coordinator.listen`
+
+让 Scheduler 在 TORI 循环中等待子代理事件:
+
+```typescript
+// .opencode/tool/coordinator.ts
+Tool.define("coordinator.listen", {
+ description: "等待并返回下一个子代理事件",
+ parameters: Schema.Struct({
+ event_types: Schema.Array(Schema.String),
+ timeout_ms: Schema.optional(Schema.Number),
+ }),
+ execute: async ({ event_types, timeout_ms }) => {
+ // 订阅 EventV2,等待匹配的事件到达
+ // 返回事件内容
+ }
+})
+```
+
+#### `coordinator.dispatch`
+
+让 Scheduler 批量派发子代理:
+
+```typescript
+Tool.define("coordinator.dispatch", {
+ description: "批量派发子代理任务",
+ parameters: Schema.Struct({
+ tasks: Schema.Array(Schema.Struct({
+ agent_type: Schema.Literal("executor", "reviewer", "debugger"),
+ task_spec: TaskSpecSchema,
+ background: Schema.optional(Schema.Boolean),
+ })),
+ }),
+ execute: async ({ tasks }) => {
+ // 为每个任务创建 BackgroundJob 或前台子 session
+ // 返回 job IDs
+ }
+})
+```
+
+#### `coordinator.status`
+
+让 Scheduler 查询当前所有子代理的状态:
+
+```typescript
+Tool.define("coordinator.status", {
+ description: "查询所有活跃子代理的状态",
+ parameters: Schema.Struct({}),
+ execute: async () => {
+ // 查询所有活跃 BackgroundJob 的状态
+ // 返回 [{ jobId, agentType, taskId, status, progress }]
+ }
+})
+```
+
+---
+
+## 6. TaskSpec 与 WorkerResult 结构化契约
+
+### 6.1 TaskSpec
+
+```typescript
+interface TaskSpec {
+ id: string
+ type: "execute" | "review" | "debug" | "compact" | "mine_experience"
+ title: string
+ description: string
+
+ // 验收标准(结构化,非自由文本)
+ acceptance_criteria: string[]
+
+ // 作用域约束
+ scope: {
+ expected_files?: string[] // 预期修改的文件
+ denied_paths?: string[] // 禁止触碰的路径
+ preserved_paths?: string[] // 必须保留不动的路径
+ write_area?: string // 写区域标识(用于冲突检测)
+ }
+
+ // 接口契约(用于影响传播算法)
+ contracts: {
+ provides?: InterfaceContract[] // 本任务对外暴露的接口
+ requires?: InterfaceContract[] // 本任务依赖的接口
+ }
+
+ // 依赖关系
+ dependencies: Array<{
+ task_id: string
+ type: "hard" | "soft" | "conflict" | "serialization"
+ }>
+
+ // 验证要求
+ verification: {
+ commands?: string[] // 验证命令
+ required: boolean // 是否必须通过验证才能标记完成
+ evidence_types?: string[] // 需要的证据类型(screenshot, pcap, static_analysis 等)
+ }
+
+ // 约束
+ constraints: {
+ max_turns: number
+ soft_timeout_ms: number
+ hard_timeout_ms: number
+ retry_budget: number
+ }
+}
+
+interface InterfaceContract {
+ module: string // "auth", "database", "ui/login"
+ kind: "api" | "schema" | "file" | "config" | "protocol"
+ spec: string // 人类可读的描述,不要求形式化
+ stability: "stable" | "volatile" | "frozen" // stable: 大概率不变; volatile: 可能随需求调整; frozen: 已有下游依赖不应改
+}
+```
+
+### 6.2 WorkerResult
+
+```typescript
+interface WorkerResult {
+ task_id: string
+ agent_type: "executor" | "reviewer" | "debugger"
+ status: "completed" | "failed" | "blocked" | "cancelled"
+
+ // 结构化摘要(3-6 句话)
+ summary: string
+
+ // 变更清单
+ changed_files: string[]
+ diff_ref?: string
+
+ // 验证结果(结构化)
+ verification: Array<{
+ name: string
+ status: "passed" | "failed" | "skipped"
+ evidence_ref?: string
+ notes?: string
+ }>
+
+ // 收集的证据
+ evidence: Array<{
+ type: "screenshot" | "pcap" | "static_analysis" | "test_output" | "build_log" | "code_trace"
+ ref: string
+ summary: string
+ }>
+
+ // 风险评估
+ risks: Array<{
+ severity: "low" | "medium" | "high"
+ summary: string
+ }>
+
+ // 后续建议
+ follow_up_tasks?: Array<{
+ title: string
+ type: "execute" | "review" | "debug"
+ }>
+}
+```
+
+---
+
+## 7. AirPlan V1 痛点 → AirCoding 对策清单
+
+### 7.1 P0 级(已造成实际损失)
+
+| ID | V1 痛点 | AirCoding 对策 | 防线 |
+|----|---------|---------------|------|
+| P0-1 | 证据门控假阳性 | Scheduler 按 TaskSpec.verification.evidence_types 决定需要什么证据 | 状态机 |
+| P0-2 | 部署验证缺口 | verification.required=true 时,Scheduler 检查 VerificationResult 才允许完成 | 状态机 |
+| P0-3 | 非原子写入 | OpenCode SQLite 事务 | 内核 |
+| P0-4 | 零并发控制 | OpenCode EventV2 + session 隔离 | 内核 |
+| P0-5 | Arc 被 plan mode 劫持 | Architecture Designer 工具白名单只含只读工具 | 工具白名单 |
+| P0-6 | Eng 停下来问不自主推进 | Scheduler system prompt 强制自主决策,仅三种情况询问用户 | prompt + 工具 |
+| P0-7 | Eng 遗忘轮询 | 不依赖 LLM 轮询,用 `coordinator.listen` 事件驱动 | 工具 |
+| P0-8 | AirDo 跳过专家插件 | Scheduler 代码级规则自动派发 Reviewer/Debugger,Worker 无权跳过 | 状态机 |
+| P0-9 | 安装器路径错误 | OpenCode Plugin SDK 标准注册 | 内核 |
+| P0-10 | Eng 偏离调度写代码 | Scheduler 工具白名单无 Write/Edit | 工具白名单 |
+
+### 7.2 P1 级(限制可靠性)
+
+| ID | V1 痛点 | AirCoding 对策 | 防线 |
+|----|---------|---------------|------|
+| P1-14 | 需求变更后调度恢复慢 | TaskGraph + PlanDelta 增量更新 + 影响传播算法(待设计) | 调度算法 |
+| P1-15 | 同文件无冲突被迫串行 | 区域级冲突检测 + worktree 隔离 | 调度算法 |
+| P1-16 | Arc 跳过需求探讨 | Architecture Designer 阶段门控(discussing → proposing → confirmed) | 状态机 |
+| P1-17 | AirDbg 未取证就改代码 | Debugger 分阶段工具权限(GATHERING 只读 → FIXING 写) | 工具白名单 |
+| P1-21 | ADR 变更级联失效 | Scheduler 订阅 ADR 变更事件 → 影响传播 → 选择性失效 | 调度算法 |
+| P1-22 | Dispatch→Worker 断链 | OpenCode TaskTool 代码级派发,无 JSON 中间文件 | 内核 |
+| P1-24 | 任务描述歧义导致破坏 | TaskSpec 结构化:scope.expected_files + denied_paths + acceptance_criteria | 结构化契约 |
+| P1-25 | Merge 后状态不同步 | OpenCode domain tables 事务更新 | 内核 |
+
+---
+
+## 8. C++ 工具链(Plugin 方式)
+
+C++ 工具链作为 OpenCode Plugin 注册,放在 `.opencode/tool/` 目录或通过 Plugin SDK 注册。
+
+### 8.1 工具列表
+
+| 工具名 | 功能 | 对应 V1 |
+|--------|------|---------|
+| `cpp.build` | CMake/Ninja 构建 | AirSDB 扩展 |
+| `cpp.test` | CTest + GoogleTest 运行 | AirTst |
+| `cpp.analyze` | cppcheck + clang-tidy 静态分析 | AirSDB |
+| `cpp.diagnose` | 编译错误解析(LLM 驱动) | Debugger 内置 |
+| `cpp.intelligence` | clangd CLI 模式代码智能 | 新增 |
+| `cpp.screenshot` | GUI 截图采集 | AirXDB |
+| `cpp.packet_capture` | 网络抓包 | AirNDB |
+| `cpp.deploy` | SSH 远程部署 + 验证 | AirDep |
+
+### 8.2 证据门控策略
+
+#### 任务类型分类
+
+```typescript
+enum TaskCategory {
+ CPP_LOGIC = "cpp_logic", // C++ 业务逻辑、算法、状态机
+ CPP_BUILD = "cpp_build", // CMake/构建配置
+ CPP_GUI = "cpp_gui", // Qt/GTK UI 组件
+ CPP_NETWORK = "cpp_network", // 网络协议、通信模块
+ CPP_DEPLOY = "cpp_deploy", // 部署、打包、安装
+ CONFIG = "config", // 配置文件修改
+ DOCS = "docs", // 文档编写
+ TEST = "test", // 测试用例编写/运行
+ REFACTOR = "refactor", // 重构(不改功能)
+ BUGFIX = "bugfix", // Bug 修复
+}
+```
+
+#### 证据策略表
+
+| 任务类型 | 必需证据 | 可选证据 |
+|---------|---------|---------|
+| `cpp_logic` | build_pass, test_pass | static_analysis |
+| `cpp_build` | build_pass | — |
+| `cpp_gui` | build_pass, screenshot | test_pass |
+| `cpp_network` | build_pass, pcap | test_pass |
+| `cpp_deploy` | build_pass, deploy_verify | smoke_test |
+| `config` | build_pass | — |
+| `docs` | — | — |
+| `test` | build_pass, test_output | — |
+| `refactor` | build_pass, test_pass, diff_review | static_analysis |
+| `bugfix` | build_pass, test_pass, reproduction | screenshot, pcap |
+
+Architecture Designer 生成 TaskSpec 时根据任务描述和文件范围自动推断 `verification.evidence_types`。用户可在 plan 中用 `[no-screenshot]` 等标记显式跳过。
+
+#### 全局强制规则
+
+```typescript
+// 1. blocked/failed 状态必须附 debugger 分析
+if (result.status === "blocked" || result.status === "failed") {
+ required_evidence.push("debugger_analysis")
+}
+
+// 2. 无文件变更的 done 必须有解释
+if (result.status === "completed" && result.changed_files.length === 0) {
+ required_evidence.push("explanation")
+}
+
+// 3. C++ 文件变更强制静态分析
+if (result.changed_files.some(f => f.match(/\.(cpp|h|hpp|cc|cxx)$/))) {
+ required_evidence.push("static_analysis")
+}
+```
+
+Scheduler 按此策略检查 WorkerResult 中的 evidence 是否齐全,不齐全则阻止标记完成。
+
+---
+
+## 9. 上下文共享模型
+
+### 共享数据源
+
+所有 Agent 通过共享文件访问架构上下文,Scheduler 作为通信中枢派发时通过 ContextPack 传递引用:
+
+```
+.air/shared/ ← 所有 Agent 可读
+ ├── plan/
+ │ ├── plan.md ← 架构方案
+ │ ├── task-graph.json ← 任务图(source of truth)
+ │ ├── requirements.md ← 原始需求
+ │ └── docs/
+ │ └── ADR-*.md ← 架构决策记录
+ └── rules/
+ ├── project-rules.md
+ └── toolchain-rules.md
+```
+
+### 三条通信路径
+
+```
+路径 1: Scheduler → Architecture Designer(重规划/异常咨询)
+ Scheduler 发现问题 → 派发 Arc 子 session
+ → ContextPack 携带问题描述 + 当前图引用
+ → Arc 读图 → 输出 PlanDelta 或建议
+ → 结果通过 WorkerResult 返回 Scheduler
+
+路径 2: Reviewer 对照审查(Code-to-Design)
+ Scheduler 派发 Reviewer 时,ContextPack 包含 plan 段落 + 需求条目
+ → Reviewer 读文件做 Code-to-Design 对照
+ → 审查报告写入 WorkerResult
+ → 里程碑审查时 Arc 持有完整 plan + 所有审查报告(全局视野)
+
+路径 3: Scheduler 异常咨询 Architecture Designer
+ Scheduler 确定性代码 + LLM 都无法决策
+ → 派发 Arc 子 session,task type = "consult"
+ → 传入当前困境 + 图状态
+ → Arc 返回建议 → Scheduler 按建议执行
+```
+
+### ContextAssembler 按需组装
+
+Agent 不直接读完整文件。ContextAssembler 根据当前任务只抽取相关片段:
+
+| 完整文件 | 抽取策略 | 预估大小 |
+|---------|---------|---------|
+| plan.md (500 行) | 按 TaskSpec 涉及的 module 抽取相关段落 | ~30 行 |
+| task-graph.json (200 节点) | 仅当前任务 + 直接上下游邻居 | ~5-10 节点 |
+| requirements.md (100 行) | 按 module 过滤相关需求条目 | ~5-10 条 |
+| ADR 目录 (20 份) | 仅加载 TaskSpec.contracts 引用的 ADR | ~1-3 份 |
+| project-rules.md | 按 scope.expected_files 过滤相关规则 | ~10-20 条 |
+
+各 Agent 典型上下文大小:
+
+| Agent | 上下文组成 | 预估 token |
+|-------|----------|-----------|
+| Executor | TaskSpec + plan 段落 + 邻居节点 + 相关规则 + ADR | ~3K-5K |
+| Reviewer | TaskSpec + plan 段落 + 需求条目 + 相关规则 + diff | ~4K-6K |
+| Scheduler | 图状态摘要(ID + status 列表)+ 事件 | ~2K-4K |
+| Arc (里程碑审查) | 完整 plan + 本阶段所有 Reviewer 报告 | ~8K-15K |
+| Arc (重规划) | 变更描述 + 受影响任务上下文 + frozen 接口 | ~5K-8K |
+
+---
+
+## 10. 上下文与记忆
+
+### 10.1 直接复用 OpenCode
+
+- **上下文压缩**:`compaction.ts`(已有,70% 阈值触发)
+- **会话持久化**:SQLite per-session(已有)
+- **消息存储**:Anthropic 原生 content blocks(已有)
+
+### 10.2 新增
+
+- **Project Rules**:`.air/shared/rules/project-rules.md`(Claude Code 风格 Markdown + frontmatter)
+- **Learned Experience**:`~/.air/skills//SKILL.md`(YAML frontmatter + Markdown body)
+- **Debug Knowledge**:SQLite 本地知识库,DebugRecord 结构化存储
+- **ExperienceMiner**:独立后台 Agent,会话结束时提取经验
+
+---
+
+## 11. 目录结构
+
+### 11.1 全局
+
+```
+~/.air/
+ ├── config.yaml # AirCoding 配置(扩展 OpenCode config)
+ ├── models.yaml # 模型配置
+ ├── permissions.yaml # 权限规则
+ ├── compaction-rules.md # 压缩规则
+ ├── skills/ # 跨项目复用技能(SKILL.md)
+ └── logs/
+```
+
+### 11.2 项目内
+
+```
+/.air/
+ ├── shared/ # 可提交 git
+ │ ├── project.json # 项目元数据
+ │ ├── rules/
+ │ │ ├── project-rules.md
+ │ │ └── toolchain-rules.md
+ │ └── plan/
+ │ ├── AGENTS.md
+ │ ├── plan.md
+ │ ├── task-graph.json
+ │ └── docs/
+ └── local/ # gitignore
+ ├── sessions/ # OpenCode session DB
+ ├── state/
+ │ └── scheduler-state.json # 调度器实时状态(防卡死 + 崩溃恢复)
+ ├── debug-records.db
+ ├── learned-memory.db
+ └── workspaces/ # git worktree 隔离区
+```
+
+---
+
+## 12. MVP 范围
+
+### 12.1 包含
+
+1. **Main Agent 对话 + 意图分类**(复用 OpenCode)
+2. **Architecture Designer Agent**(只读,阶段门控)
+3. **Scheduler Agent**(事件驱动调度,coordinator 工具)
+4. **Executor Worker**(TORI 循环,C++ 工具链 Plugin)
+5. **Reviewer Worker**(只读,自动触发)
+6. **Debugger Worker**(分阶段权限,证据门控)
+7. **C++ 工具链 Plugin**(build, test, analyze, diagnose)
+8. **TaskSpec / WorkerResult 结构化契约**
+9. **Session 持久化**(复用 OpenCode)
+10. **上下文压缩**(复用 OpenCode)
+11. **Project Rules**(Markdown + frontmatter)
+
+### 12.2 不包含(后续迭代)
+
+- ExperienceMiner / Curator Daemon
+- Debug Knowledge Network
+- 多语言 toolchain(Python/Rust/JS)
+- HUD / Status Layer
+- 二进制分发
+- 动态 DAG 调度算法的完整实现(MVP 阶段先用简单的全量重规划,§14 的增量算法后续迭代)
+
+---
+
+## 13. OpenCode 改造点清单
+
+### 13.1 不改(直接复用)
+
+| 模块 | 路径 | 说明 |
+|------|------|------|
+| TUI | `packages/tui/` | OpenTUI/Solid,直接复用 |
+| Provider | `packages/opencode/src/provider/` | Anthropic + OpenAI 抽象 |
+| Session DB | `packages/core/src/session/sql.ts` | SQLite + Drizzle |
+| Event System | `packages/core/src/event.ts` | EventV2 PubSub |
+| Context Compaction | `packages/opencode/src/session/compaction.ts` | 自动压缩 |
+| Tool Registry | `packages/opencode/src/tool/registry.ts` | 工具注册框架 |
+| Permission | OpenCode 权限系统 | 权限检查 |
+| BackgroundJob | `packages/opencode/src/background/job.ts` | 异步子代理 |
+
+### 13.2 新增文件
+
+| 文件 | 说明 |
+|------|------|
+| `.opencode/tool/coordinator.ts` | coordinator.listen / dispatch / status 工具 |
+| `.opencode/tool/cpp-*.ts` | C++ 工具链 Plugin |
+| `agents/main.ts` | Main Agent 配置(system prompt + 工具列表) |
+| `agents/architecture-designer.ts` | Arc Agent 配置(只读工具 + 阶段门控) |
+| `agents/scheduler.ts` | Scheduler Agent 配置(事件路由 + 流程规则) |
+| `agents/executor.ts` | Executor Worker 配置 |
+| `agents/reviewer.ts` | Reviewer Worker 配置(只读) |
+| `agents/debugger.ts` | Debugger Worker 配置(分阶段权限) |
+| `contracts/task-spec.ts` | TaskSpec 类型定义 |
+| `contracts/worker-result.ts` | WorkerResult 类型定义 |
+| `contracts/interface-contract.ts` | InterfaceContract 类型定义 |
+
+### 13.3 需要修改的 OpenCode 代码(最小改动)
+
+| 改动 | 位置 | 说明 |
+|------|------|------|
+| Agent 注册扩展 | `packages/opencode/src/agent/agent.ts` | 注册自定义 Agent 类型 |
+| TaskTool 扩展 | `packages/opencode/src/tool/task.ts` | 支持 BackgroundJob 批量派发 |
+| EventV2 事件类型 | `packages/core/src/event.ts` | 新增 agent 协调事件类型 |
+
+---
+
+## 14. 动态 DAG 调度算法
+
+核心场景:需求中途变更,任务图部分失效,部分任务还在跑,需要智能判断哪些保留、哪些重做。
+
+### 算法总流程
+
+```
+需求变更发生
+ ↓
+Phase 1: 变更分类(LLM)→ ChangeScope + 涉及模块列表
+ ↓
+Phase 2: 影响传播(确定性代码 + LLM 辅助)→ 每个任务标记 SAFE / BOUNDARY / IMPACTED
+ ↓
+Phase 3: 飞行中任务调和(确定性代码)→ cancel / wait_and_assess / let_finish
+ ↓
+Phase 4: 图重建(LLM)→ 仅重规划 IMPACTED 区域,SAFE 区域不动
+ ↓
+恢复调度
+```
+
+### Phase 1: 变更分类
+
+Architecture Designer (LLM) 输出结构化结果:
+
+```typescript
+interface ChangeDescription {
+ scope: "implementation" | "internal_interface" | "external_interface"
+ | "module_replacement" | "global_constraint"
+ affected_modules: string[]
+ summary: string
+}
+```
+
+分类规则:`implementation`(仅实现细节变,接口不变)→ `internal_interface`(模块内部接口变)→ `external_interface`(公开接口变)→ `module_replacement`(整个模块替换)→ `global_constraint`(全局约束变更)。影响范围逐级扩大。
+
+### Phase 2: 影响传播
+
+BFS 遍历依赖图,基于 InterfaceContract 判断影响范围:
+
+```typescript
+function propagateImpact(graph, change): Map {
+ // 1. 种子节点:直接涉及变更模块的任务 → IMPACTED
+ // 2. BFS 向前传播:检查 provides/requires 契约匹配
+ // - 契约 broken (volatile 接口) → IMPACTED,继续传播
+ // - 契约 partial (stable 接口) → BOUNDARY,继续传播
+ // - 契约 intact (frozen 接口) → SAFE,停止传播
+ // 3. 未触及的节点 → SAFE
+}
+```
+
+**关键**:契约匹配是概率信号,不是确定性判断。BOUNDARY 任务需要后续二次确认。
+
+### Phase 3: 飞行中任务调和
+
+根据任务状态 + 影响区域决定处理方式:
+
+| 任务状态 | IMPACTED | BOUNDARY | SAFE |
+|---------|----------|----------|------|
+| completed | 回滚 (rollback) | 验证 (verify) | 保留 |
+| running/dispatched | 取消 (cancel) | 等完成后评估 (wait_and_assess) | 继续 |
+| pending | 冻结 (freeze) | 冻结 (freeze) | 正常调度 |
+
+### Phase 4: 图重建
+
+1. 移除取消和回滚的任务
+2. 冻结调度(`dispatchFrozen = true`)
+3. 提取 SAFE 已完成任务的接口作为 frozen 约束
+4. 调用 Architecture Designer 局部重规划(传入变更描述 + frozen 接口 + 受影响任务上下文)
+5. 插入新任务,重建依赖边
+6. 为 BOUNDARY 已完成任务生成验证任务
+7. 解冻调度
+
+### 环检测
+
+入库前和动态添加依赖边时做拓扑排序检查(Kahn 算法)。发现环时反馈给 Architecture Designer 修正,不阻塞调度。
+
+### 触发方式
+
+- 用户显式说"需求变了" → Main Agent 识别 → 通知 Scheduler
+- Architecture Designer 里程碑审查时发现偏离 → 主动触发
+- ADR 文件变更 → 文件监控检测
+
+---
+
+## 15. 已确定事项
+
+| # | 议题 | 结论 |
+|---|------|------|
+| 1 | 接口契约精度 | 中等粒度:module + kind + 人类可读描述 + stability 标记。LLM 生成可靠,影响传播算法作为概率信号使用 |
+| 2 | Scheduler LLM 调用策略 | 混合模式:正常流程走确定性代码(DAG 遍历 + 状态机),异常/边界/用户输出时调 LLM。防卡死兜底:未匹配转换不阻塞,直接走 LLM |
+| 3 | 证据门控策略 | 10 种任务类型 × 必需/可选证据表 + 3 条全局强制规则。Arc 自动推断,用户可显式覆盖 |
+| 4 | 防卡死机制 | 简化方案:10 分钟不活跃定时器自动巡检 + scheduler-state.json 实时落盘(崩溃恢复) |
+| 5 | 动态 DAG 调度算法 | 四阶段算法(变更分类 → 影响传播 → 飞行调和 → 图重建)+ 环检测 + 三种触发方式 |
+| 6 | 上下文共享模型 | 共享文件 + ContextPack + WorkerResult 三通道。ContextAssembler 按需抽取,不全量加载 |
+| 7 | 审查分层 | 两层审查:Reviewer 逐任务局部审查 + Architecture Designer 阶段性里程碑审查(全局视野) |
+
+---
+
+## 16. 待讨论
+
+(暂无)
diff --git a/docs/airplanV2-Qwen3.7-Max设计.md b/docs/airplanV2-Qwen3.7-Max设计.md
new file mode 100644
index 0000000..18acb9a
--- /dev/null
+++ b/docs/airplanV2-Qwen3.7-Max设计.md
@@ -0,0 +1,1985 @@
+# AirPlan V2 设计文档
+
+> **版本**: Draft 0.1
+> **日期**: 2026-06-09
+> **基线**: AirPlan V1 (air-suite-20260518, air_runtime ~4,500 行, 8 插件)
+> **状态**: 待评审
+
+---
+
+## 0. 文档目的
+
+本文档记录 AirPlan V1 在真实工程项目(DecodePlayer 系列, AirCoding V1.0.0 Alpha)中暴露的系统性缺陷,并定义 V2 的架构改进方向、新增组件设计和分阶段实施计划。
+
+V2 的核心命题:**V1 证明了制品驱动 + 上下文隔离 + 波次并行的架构方向成立;V2 要解决可靠性、可观测性和规模化问题。**
+
+---
+
+## 1. V1 问题诊断
+
+### 1.1 缺陷分级
+
+#### P0 — 已造成实际损失
+
+| ID | 缺陷 | 位置 | 影响 | 根因 |
+|----|------|------|------|------|
+| P0-1 | AirXDB 假阳性阻塞 | `airxdb_runtime.py` `ensure_xdb_sessions_for_result()` | 11+ 任务触发虚假修复循环,每次需人工覆盖 | 证据门控无任务类型感知 |
+| P0-2 | 部署验证缺口 | `contracts.py` `validate_for_finalize()` | T-028b 发现 4 个 "done" 任务未实际部署,延迟发布一整天 | 验证只检查结构完整性,不检查部署一致性 |
+| P0-3 | 非原子写入 | 全部 `_json_dump` (5 份) | 进程崩溃时 state.json 截断,下次加载 JSONDecodeError | `path.write_text()` 直接覆盖,无 tempfile + rename |
+| P0-4 | 零并发控制 | 整个 `air_runtime/` | 两个 Worker 同时完成时 todo.md 读-改-写竞态 | 无任何锁、互斥量或原子操作 |
+| P0-5 | AirArc 被 plan 模式劫持 | AirArc SKILL.md / 命令文件 | 架构器频繁被 Agent 内置 plan mode 接管,偏离架构规划职责 | 缺乏 plan mode 阻断机制,SKILL.md 指令不够强硬 |
+| P0-6 | AirEng 停下来问而不自主决策 | AirEng SKILL.md / 命令文件 | 调度器用英文反复询问用户确认,而非中文自主推进开发进度 | SKILL.md 未强制"以推进为目标自行决策",语言未锁定中文 |
+| P0-7 | AirEng 无子线程状态轮询 | `engine.py` `monitor_engine()` | 子线程卡死后调度器无限等待,必须用户手动发现并告知 | 轮询逻辑依赖 Agent 自觉执行,无硬编码的定时轮询循环 |
+| P0-8 | AirDo 不调用专家插件(Dbg/XDB/NDB/SDB/Rvr) | AirDo SKILL.md / `worker.py` `finish_worker()` | 执行器遇到问题或验收时几乎不触发任何专家插件:不调 AirDbg 调试、不调 AirXDB 截图、不调 AirNDB 抓包、不调 AirSDB 静态分析、不调 AirRvr 审查,直接报 blocked 或 false-done | 自动路由为建议性而非强制,Worker 倾向于跳过所有专家插件直接返回 |
+| P0-9 | 安装器脚本路径错误 | 安装脚本 / 插件注册逻辑 | 安装后插件无法识别,AI 修复后可识别但脚本执行失败,路径不正确 | 安装器未正确解析插件脚本的绝对路径,注册的命令路径与实际文件位置不匹配 |
+| P0-10 | AirEng 偏离调度亲自写代码 | AirEng SKILL.md / 命令文件 | 调度引擎频繁偏离调度职责自己编写代码,破坏隔离架构。极端情况(子代理循环阻塞需接手合并)允许少量修改,但日常调度中不应发生 | SKILL.md 未明确区分"仅调度"与"极端接管"的边界,无工具限制约束 |
+
+#### P1 — 限制可靠性与可维护性
+
+| ID | 缺陷 | 位置 | 影响 |
+|----|------|------|------|
+| P1-1 | 硬编码开发者路径 | `debug_runtime.py:130`, `airxdb_runtime.py:156` | `C:\Users\20392\...` 在其他机器静默失败 |
+| P1-2 | `_json_dump`/`_json_load` 5 份重复 | engine, worker, airxdb, debug, repair | 修一处漏四处 |
+| P1-3 | `_ordered_unique` 4 份重复 | airxdb, debug, repair, contracts | 同上 |
+| P1-4 | policy normalization 3 份重复 | airxdb, debug, repair | 同上 |
+| P1-5 | merge-into-state 3 份重复 | airxdb, debug, repair | 同上 |
+| P1-6 | marker block upsert 2 份(接口不同) | doc_sync, project_bootstrap | 同上 |
+| P1-7 | `_session_stamp` 格式不一致 | airxdb, debug vs engine | 时间戳格式在不同模块产生不同文件名 |
+| P1-8 | todo.md 列索引硬编码 | `doc_sync.py:154-156` | `cells[1]`=status, `cells[6]`=validation, `cells[7]`=adr — 表头变化时全部失效 |
+| P1-9 | 并发度上限硬编码为 3 | `engine.py:527` | 无法根据项目规模调整 |
+| P1-10 | 子进程无超时 | airxdb, debug runtime | 挂死时阻塞整个引擎 |
+| P1-11 | task_id 路径注入 | `worker.py:59` | 无 `../` 遍历校验 |
+| P1-12 | 标记注入风险 | `doc_sync.py` `_replace_marker_block()` | marker 字段含 `-->` 时可注入内容 |
+| P1-13 | 静默吞异常 | session 文件损坏时 `except` 后 `continue` | 损坏文件不可见,无日志 |
+| P1-14 | Arc 重规划后 Eng 无法衔接 | `engine.py` 计划解析 + `todo.md` 同步 | 中途变更需求后 Arc 重新生成规划,Eng 需多轮 AI 迭代才能恢复调度 | 调度引擎基于静态 todo.md 表格,无法增量吸收 Arc 的动态重规划结果 |
+| P1-15 | 同文件无冲突任务被迫串行 | `review.py` 写集冲突检测 | 同文件不同区域(如 Qt 样式 vs 状态机)被判为冲突,被迫串行执行 | 冲突检测粒度为文件级而非区域级,无 worktree 隔离并行能力 |
+| P1-16 | AirArc 跳过需求探讨直接生成规划 | AirArc SKILL.md / 命令文件 | 用户刚说一两句就自顾自生成计划并要求执行,未与用户充分探讨需求和分析架构 | SKILL.md 未强制"先探讨后规划"流程,缺少用户确认架构的门控 |
+| P1-17 | AirDbg 未取证就盲改代码 | AirDbg SKILL.md / `debug_runtime.py` | 调试器不进行任何取证(抓包/截图/代码分析)就猜测原因并修改代码,引入新问题且污染代码库 | 7 步工作流为建议性不强制,无"先读后写"硬性门控——未执行任何取证行为就不允许修改代码 |
+| P1-18 | 项目缺乏标准化日志体系 | 项目引导 / AirArc 规划 | 生成的代码无统一日志输出,debug/release 无法切换,问题排查困难 | 无项目级日志标准要求,AirArc 规划时未强制 spdlog 集成,AirRvr 审查时未检查日志完备性 |
+| P1-19 | 边界无测试 + 终审缺高风险检查 | AirDo / AirRvr | 代码边界无接口测试和单元测试,最终审查未着重检查生命周期、空指针、悬垂指针、异常风险,产品交付后短时间内崩溃 | AirArc 规划时未强制测试任务,AirRvr 终审无专项高风险审计环节 |
+| P1-20 | 界面设计缺乏专业 Skill 支撑 | AirDo / 安装器 | UI/前端任务由通用 Agent 直接编写,界面质量差,布局、配色、交互不符合设计规范 | 未集成 frontend-design Skill,AirDo 遇到 UI 任务时无专业工具可用,安装器未自动检测并配置 |
+| P1-21 | ADR 变更无级联失效机制 | AirArc / AirEng / TaskGraph | 架构方案变更(如 ffmpeg → gstreamer)后,基于旧 ADR 已完成的任务不会自动失效,旧代码残留与新方案冲突,下游任务基于过期产出继续执行 | TaskGraph 无 ADR→任务的溯源链,无已完成任务的失效判定,无回滚清理流程 |
+| P1-22 | Dispatch → Worker 启动无桥接 | `eng_mode.py:dispatch_worker_group()` | dispatch 只写 JSON 派发清单,不启动 Worker。Worker 启动依赖 Agent 自觉读 payload 并手动调用 Skill 工具——Agent 不读则 Worker 永不启动,Agent 最终「回退自己执行」 | `dispatch_worker_group()` 与 Worker 启动之间仅有 JSON 文件,无代码层桥接。L1 保障未覆盖 Agent 调度层 |
+| P1-23 | Dispatch 指令歧义 | `commands/eng.md` | Eng 的 dispatch 步骤(spawn Worker)是意图描述而非可执行伪代码,Agent 每步都在猜:用什么工具?参数格式?task-text 从哪取?——猜错多一轮,猜不出来 Worker 不启动 | 指令未降到操作级。Arc 和 Eng 的约束非对称性是刻意的(Arc 永不写→硬阻断,Eng 保留极端接管→不硬阻断),P1-23 是纯指令层问题 |
+| P1-24 | AirArc 任务描述歧义导致弱模型破坏性执行 | AirArc `review.py` / SKILL.md | 任务粒度太粗、用词有歧义(如"清理"被弱模型理解为"删除全部"),Worker 严格按字面执行导致误删现有代码。真实案例:screenPlayer CMake 重构中 Worker 删除了整个 src/ | Arc 未针对弱模型优化任务描述,无"保留约束"机制,任务粒度未按操作类型拆分 |
+| P1-25 | Merge 后 TaskGraph 状态不同步 | `eng_mode.py:merge_worker_result()` | merge 更新 todo.md 和 state.json 但不动 task-graph.json。已完成任务的节点状态仍是 TODO/DISPATCHED,再次 dispatch 重复派发 | `merge_worker_result()` Phase 5/6 未同步 `task-graph.json` 节点 status 字段 |
+
+#### P2 — 限制规模化
+
+| ID | 缺陷 | 位置 | 影响 |
+|----|------|------|------|
+| P2-1 | 冲突检测 O(n²) | `review.py` `combinations(active_tasks, 2)` | 100 任务时 ~495,000 次路径比较 |
+| P2-2 | state.json 无界增长 | `engine.py` | `mergedResults` 等列表永不截断 |
+| P2-3 | todo.md 每次操作全量重解析 | engine 多处调用 `parse_tasks()` | 大 todo 表时性能退化 |
+| P2-4 | 零测试覆盖 | 整个 `air_runtime/` | 任何重构都有回归风险 |
+
+#### P3 — 限制用户体验
+
+| ID | 缺陷 | 位置 | 影响 |
+|----|------|------|------|
+| P3-1 | AGENTS.md 膨胀 | AirEng sync 追加无去重 | 同一任务记录重复 2-3 次 |
+| P3-2 | 写集刚性导致级联任务链 | 写集边界设计 | T-028 衍生 fix-001~005 + T-028b + T-028c |
+| P3-3 | 并行 Worker 抢占共享硬件 | 无硬件资源感知 | kmsgrab 锁死、负载 7.59 自发重启 |
+| P3-4 | 环境特定修复不可持久化 | 部署自动化不完整 | MonitorServiceD、cgroup v1 每次重启需手动修复 |
+| P3-5 | 跨项目知识不迁移 | 无模板继承机制 | 每个项目从零积累运维经验 |
+
+### 1.2 插件级差距
+
+| 插件 | V1 差距 | 影响 |
+|------|---------|------|
+| **AirContext** | 压缩质量无监控;Token 估算 `char_div_3.5` 粗糙;续传 prompt 硬编码中文;锁文件无陈旧检测 | 坏摘要静默损坏上下文 |
+| **AirDbg** | 7 步工作流纯建议性不强制;无不可复现 bug 分支;无回滚能力 | 调试质量依赖模型自觉 |
+| **AirXDB** | 无 headless CI;无 DRM/KMS 原生截图;无截图 diff;远程探测不含 ffmpeg | 生产渲染路径无法自动验证 |
+| **AirNDB** | 无 TLS 解密;大 pcap `tail(8000)` 截断;无 pcapng 支持 | 大规模抓包分析能力不足 |
+| **AirSDB** | 仅 C/C++;无 diff 模式;无 compile_commands.json 生成 | 多语言项目零覆盖 |
+| **AirArc** | 无规划质量验证;无增量重规划;无执行→规划反馈 | scope 变更必须全量重新生成 |
+| **AirEng** | 无级联故障保护;无资源耗尽监控;5 分钟固定轮询;无 Worker 总时间上限 | 大规模调度时稳定性不足 |
+
+### 1.3 真实项目痛点汇总
+
+| 痛点 | 频次 | 根因缺陷 |
+|------|------|---------|
+| AirXDB 假阳性阻塞 | 11+ 任务 | P0-1 |
+| 完成但未部署 | 1 次关键事故 | P0-2 |
+| 写集级联任务链 | 5+ 条链 | P3-2 |
+| 并行 Worker 抢占硬件 | 3+ 次 | P3-3 |
+| 空壳修复循环 | 11+ 次 | P0-1 + P3-4 |
+| AGENTS.md 膨胀 | 持续累积 | P3-1 |
+| 环境修复不可持久 | 每次重启 | P3-4 |
+| AirArc 被 plan 模式劫持 | 频繁 | P0-5 |
+| AirEng 反复询问不自主推进 | 每次调度 | P0-6 |
+| AirEng 遗忘轮询导致无限等待 | 频繁 | P0-7 |
+| AirDo 跳过 AirDbg 直接返回 | 频繁 | P0-8 |
+| 安装后插件无法识别或脚本路径错误 | 用户普遍反馈 | P0-9 |
+| 需求变更后调度需多轮迭代恢复 | 每次变更 | P1-14 |
+| 同文件无冲突任务被迫串行 | 频繁 | P1-15 |
+| 实现偏离设计无对照机制 | 持续累积 | AirRvr 设计缺口 |
+| AirArc 跳过需求探讨直接生成规划 | 每次启动 | P1-16 |
+| AirDbg 不取证就猜测修复污染代码 | 频繁 | P1-17 |
+| AirEng 偏离调度亲自写代码 | 频繁 | P0-10 |
+| 项目代码缺乏标准化日志体系 | 所有项目 | P1-18 |
+| 边界无测试 + 终审缺高风险检查 | 所有项目 | P1-19 |
+| 界面设计缺乏专业 Skill 支撑 | UI 任务 | P1-20 |
+| ADR 变更后已完成任务不失效 | 架构变更时 | P1-21 |
+| AirArc 任务描述歧义导致弱模型破坏性执行 | 已造成实际损失 | P1-24 |
+
+---
+
+## 2. V2 设计目标
+
+### 2.1 核心目标
+
+1. **可靠性**:状态写入不丢失,并发操作不竞态,崩溃后可自愈
+2. **可观测性**:所有引擎操作可追溯,指标可导出,异常主动通知
+3. **智能化**:证据门控感知任务类型,轮询频率自适应,修复模式可学习
+4. **规模化**:支持 100+ 任务、5+ 并行 Worker、多项目知识迁移
+
+### 2.2 不变量
+
+V2 必须保持 V1 的核心不变量:
+
+| 不变量 | V1 定义 | V2 保持方式 |
+|--------|---------|------------|
+| INV-1 制品驱动通信 | 插件间通过 AirPlan/ 文件通信 | 保持,增加事件索引层 |
+| INV-2 上下文隔离 | Worker `fork_context=false` | 保持,增加选择性上下文继承 |
+| INV-3 架构同步强制 | 不更新架构文档不能 DONE | 保持,增加增量同步 |
+| INV-4 证据先于修复 | 截图/抓包/静态分析前置 | 保持,增加任务类型感知 |
+| INV-5 闭环自动修复 | 执行→失败→调试→修复→重执行 | 保持,增加修复模式学习 |
+
+---
+
+## 3. V2 架构改进
+
+### 3.1 基础设施层重构
+
+#### 3.1.1 `air_runtime.io` — 统一 I/O 模块
+
+消除 5 份 `_json_dump`/`_json_load` 重复,统一为原子写入:
+
+```python
+# air_runtime/io.py
+
+def atomic_json_write(path: Path, data: dict) -> None:
+ """POSIX 原子写入:tempfile + os.replace()"""
+ path.parent.mkdir(parents=True, exist_ok=True)
+ fd, tmp = tempfile.mkstemp(dir=path.parent, suffix=".tmp")
+ try:
+ os.write(fd, json.dumps(data, indent=2, ensure_ascii=False).encode("utf-8"))
+ os.close(fd)
+ os.replace(tmp, path)
+ except BaseException:
+ with contextlib.suppress(OSError):
+ os.unlink(tmp)
+ raise
+
+def safe_json_load(path: Path) -> dict | None:
+ """安全加载:处理损坏文件,自动从 .bak 恢复"""
+ try:
+ return json.loads(path.read_text("utf-8"))
+ except (json.JSONDecodeError, UnicodeDecodeError):
+ bak = path.with_suffix(path.suffix + ".bak")
+ if bak.exists():
+ logging.warning("corrupt %s, restoring from %s", path, bak)
+ return json.loads(bak.read_text("utf-8"))
+ logging.error("corrupt %s with no backup", path)
+ return None
+```
+
+每次写入前自动备份旧文件为 `.bak`(单级轮转),保证至少有一次完整的历史版本。
+
+#### 3.1.2 `air_runtime.lock` — 文件级并发控制
+
+```python
+# air_runtime/lock.py
+
+class FileLock:
+ """基于 fcntl.flock 的进程级文件锁"""
+
+ def __init__(self, path: Path, timeout: float = 10.0):
+ self._path = path.with_suffix(path.suffix + ".lock")
+ self._timeout = timeout
+ self._fd = None
+
+ def __enter__(self):
+ self._fd = os.open(self._path, os.O_CREAT | os.O_RDWR)
+ deadline = time.monotonic() + self._timeout
+ while True:
+ try:
+ fcntl.flock(self._fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ return self
+ except OSError:
+ if time.monotonic() >= deadline:
+ raise TimeoutError(f"lock timeout: {self._path}")
+ time.sleep(0.1)
+
+ def __exit__(self, *exc):
+ fcntl.flock(self._fd, fcntl.LOCK_UN)
+ os.close(self._fd)
+```
+
+所有 `state.json` 和 `todo.md` 的读-改-写操作必须持有对应锁。
+
+#### 3.1.3 `air_runtime.utils` — 消除代码重复
+
+```python
+# air_runtime/utils.py
+
+def ordered_unique(items: list) -> list:
+ """保序去重"""
+ seen = set()
+ result = []
+ for item in items:
+ key = item if isinstance(item, str) else item.get("id", str(item))
+ if key not in seen:
+ seen.add(key)
+ result.append(item)
+ return result
+
+def session_stamp() -> str:
+ """统一的文件系统安全时间戳"""
+ return datetime.now(timezone.utc).isoformat().replace(":", "-").replace(".", "-").replace("+", "-")
+
+def normalize_policy(defaults: dict, overrides: dict | None) -> dict:
+ """通用的策略合并"""
+ merged = {**defaults}
+ if overrides:
+ for k, v in overrides.items():
+ if k in merged:
+ expected_type = type(defaults[k])
+ merged[k] = expected_type(v) if not isinstance(v, expected_type) else v
+ return merged
+
+def sanitize_task_id(task_id: str) -> str:
+ """防止路径注入"""
+ if not re.fullmatch(r"[A-Za-z0-9_\-]+", task_id):
+ raise ValueError(f"invalid task_id: {task_id!r}")
+ return task_id
+
+def sanitize_marker(marker: str) -> str:
+ """防止 HTML 注释注入"""
+ if "-->" in marker or "
+
+
+
+```
+
+```css
+[data-page="home"] {
+ /* Reusable title component defined at page level since it's used in multiple components */
+ [data-component="title"] {
+ text-transform: uppercase;
+ font-weight: 400;
+ }
+
+ [data-component="install"] {
+ /* install-specific styles */
+ }
+
+ [data-component="screenshots"] {
+ /* screenshots-specific styles */
+ }
+}
+```
+
+This is correct because the `title` component has consistent styling and behavior across the page.
+
+## Key Clarifications
+
+1. **JSX Nesting is Flexible**: Components can be nested inside slots, slots can contain components - whatever makes semantic sense
+2. **CSS Hierarchy is Strict**: Follow pages → components → slots structure in CSS
+3. **Reusable Components**: Define at the appropriate level where they're shared (page level if used across the page, component level if only used within that component)
+4. **DOM vs CSS Structure**: These don't need to match - optimize each for its purpose
+
+See ./src/routes/index.css and ./src/routes/index.tsx for a complete example.
diff --git a/packages/console/app/README.md b/packages/console/app/README.md
new file mode 100644
index 0000000..9337430
--- /dev/null
+++ b/packages/console/app/README.md
@@ -0,0 +1,32 @@
+# SolidStart
+
+Everything you need to build a Solid project, powered by [`solid-start`](https://start.solidjs.com);
+
+## Creating a project
+
+```bash
+# create a new project in the current directory
+npm init solid@latest
+
+# create a new project in my-app
+npm init solid@latest my-app
+```
+
+## Developing
+
+Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
+
+```bash
+npm run dev
+
+# or start the server and open the app in a new browser tab
+npm run dev -- --open
+```
+
+## Building
+
+Solid apps are built with _presets_, which optimise your project for deployment to different environments.
+
+By default, `npm run build` will generate a Node app that you can run with `npm start`. To use a different preset, add it to the `devDependencies` in `package.json` and specify in your `app.config.js`.
+
+## This project was created with the [Solid CLI](https://github.com/solidjs-community/solid-cli)
diff --git a/packages/console/app/package.json b/packages/console/app/package.json
new file mode 100644
index 0000000..9fa9b0e
--- /dev/null
+++ b/packages/console/app/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "@opencode-ai/console-app",
+ "version": "1.17.4",
+ "type": "module",
+ "license": "MIT",
+ "scripts": {
+ "typecheck": "tsgo --noEmit",
+ "dev": "vite dev --host 0.0.0.0",
+ "dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51RtuLNE7fOCwHSD4mewwzFejyytjdGoSDK7CAvhbffwaZnPbNb2rwJICw6LTOXCmWO320fSNXvb5NzI08RZVkAxd00syfqrW7t bun sst shell --stage=dev bun dev",
+ "build": "bun ./script/generate-sitemap.ts && vite build && bun ../../opencode/script/schema.ts ./.output/public/config.json ./.output/public/tui.json",
+ "start": "vite start"
+ },
+ "dependencies": {
+ "@cloudflare/vite-plugin": "1.15.2",
+ "@ibm/plex": "6.4.1",
+ "@jsx-email/render": "1.1.1",
+ "@kobalte/core": "catalog:",
+ "@openauthjs/openauth": "catalog:",
+ "@opencode-ai/console-core": "workspace:*",
+ "@opencode-ai/console-mail": "workspace:*",
+ "@opencode-ai/console-resource": "workspace:*",
+ "@opencode-ai/ui": "workspace:*",
+ "@smithy/eventstream-codec": "4.2.7",
+ "@smithy/util-utf8": "4.2.0",
+ "@solidjs/meta": "catalog:",
+ "@solidjs/router": "catalog:",
+ "@solidjs/start": "catalog:",
+ "@stripe/stripe-js": "8.6.1",
+ "@upstash/redis": "1.38.0",
+ "chart.js": "4.5.1",
+ "nitro": "3.0.1-alpha.1",
+ "solid-js": "catalog:",
+ "solid-list": "0.3.0",
+ "solid-stripe": "0.8.1",
+ "vite": "catalog:",
+ "zod": "catalog:"
+ },
+ "devDependencies": {
+ "@types/bun": "catalog:",
+ "@typescript/native-preview": "catalog:",
+ "@webgpu/types": "0.1.54",
+ "typescript": "catalog:",
+ "wrangler": "4.50.0"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+}
diff --git a/packages/console/app/public/apple-touch-icon-v3.png b/packages/console/app/public/apple-touch-icon-v3.png
new file mode 120000
index 0000000..ddd1d1a
--- /dev/null
+++ b/packages/console/app/public/apple-touch-icon-v3.png
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/apple-touch-icon-v3.png
\ No newline at end of file
diff --git a/packages/console/app/public/apple-touch-icon.png b/packages/console/app/public/apple-touch-icon.png
new file mode 120000
index 0000000..52ebd1c
--- /dev/null
+++ b/packages/console/app/public/apple-touch-icon.png
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/apple-touch-icon.png
\ No newline at end of file
diff --git a/packages/console/app/public/email b/packages/console/app/public/email
new file mode 120000
index 0000000..0df016d
--- /dev/null
+++ b/packages/console/app/public/email
@@ -0,0 +1 @@
+../../mail/emails/templates/static
\ No newline at end of file
diff --git a/packages/console/app/public/favicon-96x96-v3.png b/packages/console/app/public/favicon-96x96-v3.png
new file mode 120000
index 0000000..5f4b8a7
--- /dev/null
+++ b/packages/console/app/public/favicon-96x96-v3.png
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/favicon-96x96-v3.png
\ No newline at end of file
diff --git a/packages/console/app/public/favicon-96x96.png b/packages/console/app/public/favicon-96x96.png
new file mode 120000
index 0000000..0a40e56
--- /dev/null
+++ b/packages/console/app/public/favicon-96x96.png
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/favicon-96x96.png
\ No newline at end of file
diff --git a/packages/console/app/public/favicon-v3.ico b/packages/console/app/public/favicon-v3.ico
new file mode 120000
index 0000000..6e1f48a
--- /dev/null
+++ b/packages/console/app/public/favicon-v3.ico
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/favicon-v3.ico
\ No newline at end of file
diff --git a/packages/console/app/public/favicon-v3.svg b/packages/console/app/public/favicon-v3.svg
new file mode 120000
index 0000000..77814ac
--- /dev/null
+++ b/packages/console/app/public/favicon-v3.svg
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/favicon-v3.svg
\ No newline at end of file
diff --git a/packages/console/app/public/favicon.ico b/packages/console/app/public/favicon.ico
new file mode 120000
index 0000000..d861e77
--- /dev/null
+++ b/packages/console/app/public/favicon.ico
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/favicon.ico
\ No newline at end of file
diff --git a/packages/console/app/public/favicon.svg b/packages/console/app/public/favicon.svg
new file mode 120000
index 0000000..9a9c41c
--- /dev/null
+++ b/packages/console/app/public/favicon.svg
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/favicon.svg
\ No newline at end of file
diff --git a/packages/console/app/public/opencode-brand-assets.zip b/packages/console/app/public/opencode-brand-assets.zip
new file mode 100644
index 0000000..1a145bb
Binary files /dev/null and b/packages/console/app/public/opencode-brand-assets.zip differ
diff --git a/packages/console/app/public/robots.txt b/packages/console/app/public/robots.txt
new file mode 100644
index 0000000..bddac69
--- /dev/null
+++ b/packages/console/app/public/robots.txt
@@ -0,0 +1,6 @@
+User-agent: *
+Allow: /
+
+# Disallow shared content pages
+Disallow: /s/
+Disallow: /share/
\ No newline at end of file
diff --git a/packages/console/app/public/site.webmanifest b/packages/console/app/public/site.webmanifest
new file mode 120000
index 0000000..ce3161b
--- /dev/null
+++ b/packages/console/app/public/site.webmanifest
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/site.webmanifest
\ No newline at end of file
diff --git a/packages/console/app/public/social-share-black.png b/packages/console/app/public/social-share-black.png
new file mode 120000
index 0000000..5baa004
--- /dev/null
+++ b/packages/console/app/public/social-share-black.png
@@ -0,0 +1 @@
+../../../ui/src/assets/images/social-share-black.png
\ No newline at end of file
diff --git a/packages/console/app/public/social-share-zen.png b/packages/console/app/public/social-share-zen.png
new file mode 120000
index 0000000..2cb95c7
--- /dev/null
+++ b/packages/console/app/public/social-share-zen.png
@@ -0,0 +1 @@
+../../../ui/src/assets/images/social-share-zen.png
\ No newline at end of file
diff --git a/packages/console/app/public/social-share.png b/packages/console/app/public/social-share.png
new file mode 120000
index 0000000..deb3346
--- /dev/null
+++ b/packages/console/app/public/social-share.png
@@ -0,0 +1 @@
+../../../ui/src/assets/images/social-share.png
\ No newline at end of file
diff --git a/packages/console/app/public/theme.json b/packages/console/app/public/theme.json
new file mode 100644
index 0000000..b3e97f7
--- /dev/null
+++ b/packages/console/app/public/theme.json
@@ -0,0 +1,182 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "$schema": {
+ "type": "string",
+ "description": "JSON schema reference for configuration validation"
+ },
+ "defs": {
+ "type": "object",
+ "description": "Color definitions that can be referenced in the theme",
+ "patternProperties": {
+ "^[a-zA-Z][a-zA-Z0-9_]*$": {
+ "oneOf": [
+ {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$",
+ "description": "Hex color value"
+ },
+ {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255,
+ "description": "ANSI color code (0-255)"
+ },
+ {
+ "type": "string",
+ "enum": ["none"],
+ "description": "No color (uses terminal default)"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "theme": {
+ "type": "object",
+ "description": "Theme color definitions",
+ "properties": {
+ "primary": { "$ref": "#/definitions/colorValue" },
+ "secondary": { "$ref": "#/definitions/colorValue" },
+ "accent": { "$ref": "#/definitions/colorValue" },
+ "error": { "$ref": "#/definitions/colorValue" },
+ "warning": { "$ref": "#/definitions/colorValue" },
+ "success": { "$ref": "#/definitions/colorValue" },
+ "info": { "$ref": "#/definitions/colorValue" },
+ "text": { "$ref": "#/definitions/colorValue" },
+ "textMuted": { "$ref": "#/definitions/colorValue" },
+ "background": { "$ref": "#/definitions/colorValue" },
+ "backgroundPanel": { "$ref": "#/definitions/colorValue" },
+ "backgroundElement": { "$ref": "#/definitions/colorValue" },
+ "border": { "$ref": "#/definitions/colorValue" },
+ "borderActive": { "$ref": "#/definitions/colorValue" },
+ "borderSubtle": { "$ref": "#/definitions/colorValue" },
+ "diffAdded": { "$ref": "#/definitions/colorValue" },
+ "diffRemoved": { "$ref": "#/definitions/colorValue" },
+ "diffContext": { "$ref": "#/definitions/colorValue" },
+ "diffHunkHeader": { "$ref": "#/definitions/colorValue" },
+ "diffHighlightAdded": { "$ref": "#/definitions/colorValue" },
+ "diffHighlightRemoved": { "$ref": "#/definitions/colorValue" },
+ "diffAddedBg": { "$ref": "#/definitions/colorValue" },
+ "diffRemovedBg": { "$ref": "#/definitions/colorValue" },
+ "diffContextBg": { "$ref": "#/definitions/colorValue" },
+ "diffLineNumber": { "$ref": "#/definitions/colorValue" },
+ "diffAddedLineNumberBg": { "$ref": "#/definitions/colorValue" },
+ "diffRemovedLineNumberBg": { "$ref": "#/definitions/colorValue" },
+ "markdownText": { "$ref": "#/definitions/colorValue" },
+ "markdownHeading": { "$ref": "#/definitions/colorValue" },
+ "markdownLink": { "$ref": "#/definitions/colorValue" },
+ "markdownLinkText": { "$ref": "#/definitions/colorValue" },
+ "markdownCode": { "$ref": "#/definitions/colorValue" },
+ "markdownBlockQuote": { "$ref": "#/definitions/colorValue" },
+ "markdownEmph": { "$ref": "#/definitions/colorValue" },
+ "markdownStrong": { "$ref": "#/definitions/colorValue" },
+ "markdownHorizontalRule": { "$ref": "#/definitions/colorValue" },
+ "markdownListItem": { "$ref": "#/definitions/colorValue" },
+ "markdownListEnumeration": { "$ref": "#/definitions/colorValue" },
+ "markdownImage": { "$ref": "#/definitions/colorValue" },
+ "markdownImageText": { "$ref": "#/definitions/colorValue" },
+ "markdownCodeBlock": { "$ref": "#/definitions/colorValue" },
+ "syntaxComment": { "$ref": "#/definitions/colorValue" },
+ "syntaxKeyword": { "$ref": "#/definitions/colorValue" },
+ "syntaxFunction": { "$ref": "#/definitions/colorValue" },
+ "syntaxVariable": { "$ref": "#/definitions/colorValue" },
+ "syntaxString": { "$ref": "#/definitions/colorValue" },
+ "syntaxNumber": { "$ref": "#/definitions/colorValue" },
+ "syntaxType": { "$ref": "#/definitions/colorValue" },
+ "syntaxOperator": { "$ref": "#/definitions/colorValue" },
+ "syntaxPunctuation": { "$ref": "#/definitions/colorValue" }
+ },
+ "required": ["primary", "secondary", "accent", "text", "textMuted", "background"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["theme"],
+ "additionalProperties": false,
+ "definitions": {
+ "colorValue": {
+ "oneOf": [
+ {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$",
+ "description": "Hex color value (same for dark and light)"
+ },
+ {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255,
+ "description": "ANSI color code (0-255, same for dark and light)"
+ },
+ {
+ "type": "string",
+ "enum": ["none"],
+ "description": "No color (uses terminal default)"
+ },
+ {
+ "type": "string",
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
+ "description": "Reference to another color in the theme or defs"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "dark": {
+ "oneOf": [
+ {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$",
+ "description": "Hex color value for dark mode"
+ },
+ {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255,
+ "description": "ANSI color code for dark mode"
+ },
+ {
+ "type": "string",
+ "enum": ["none"],
+ "description": "No color (uses terminal default)"
+ },
+ {
+ "type": "string",
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
+ "description": "Reference to another color for dark mode"
+ }
+ ]
+ },
+ "light": {
+ "oneOf": [
+ {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$",
+ "description": "Hex color value for light mode"
+ },
+ {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255,
+ "description": "ANSI color code for light mode"
+ },
+ {
+ "type": "string",
+ "enum": ["none"],
+ "description": "No color (uses terminal default)"
+ },
+ {
+ "type": "string",
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
+ "description": "Reference to another color for light mode"
+ }
+ ]
+ }
+ },
+ "required": ["dark", "light"],
+ "additionalProperties": false,
+ "description": "Separate colors for dark and light modes"
+ }
+ ]
+ }
+ }
+}
diff --git a/packages/console/app/public/web-app-manifest-192x192.png b/packages/console/app/public/web-app-manifest-192x192.png
new file mode 120000
index 0000000..9d3590f
--- /dev/null
+++ b/packages/console/app/public/web-app-manifest-192x192.png
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/web-app-manifest-192x192.png
\ No newline at end of file
diff --git a/packages/console/app/public/web-app-manifest-512x512.png b/packages/console/app/public/web-app-manifest-512x512.png
new file mode 120000
index 0000000..0ca44b8
--- /dev/null
+++ b/packages/console/app/public/web-app-manifest-512x512.png
@@ -0,0 +1 @@
+../../../ui/src/assets/favicon/web-app-manifest-512x512.png
\ No newline at end of file
diff --git a/packages/console/app/script/generate-sitemap.ts b/packages/console/app/script/generate-sitemap.ts
new file mode 100755
index 0000000..1cf64d6
--- /dev/null
+++ b/packages/console/app/script/generate-sitemap.ts
@@ -0,0 +1,108 @@
+#!/usr/bin/env bun
+import { readdir, writeFile } from "fs/promises"
+import { join, dirname } from "path"
+import { fileURLToPath } from "url"
+import { config } from "../src/config.js"
+import { LOCALES, route } from "../src/lib/language.js"
+
+const __dirname = dirname(fileURLToPath(import.meta.url))
+const BASE_URL = config.baseUrl
+const PUBLIC_DIR = join(__dirname, "../public")
+const DOCS_DIR = join(__dirname, "../../../web/src/content/docs")
+
+interface SitemapEntry {
+ url: string
+ priority: number
+ changefreq: string
+}
+
+async function getMainRoutes(): Promise {
+ const routes: SitemapEntry[] = []
+
+ // Add main static routes
+ const staticRoutes = [
+ { path: "/", priority: 1.0, changefreq: "daily" },
+ { path: "/enterprise", priority: 0.8, changefreq: "weekly" },
+ { path: "/brand", priority: 0.6, changefreq: "monthly" },
+ { path: "/zen", priority: 0.8, changefreq: "weekly" },
+ { path: "/go", priority: 0.8, changefreq: "weekly" },
+ ]
+
+ for (const item of staticRoutes) {
+ for (const locale of LOCALES) {
+ routes.push({
+ url: `${BASE_URL}${route(locale, item.path)}`,
+ priority: item.priority,
+ changefreq: item.changefreq,
+ })
+ }
+ }
+
+ return routes
+}
+
+async function getDocsRoutes(): Promise {
+ const routes: SitemapEntry[] = []
+
+ try {
+ const files = await readdir(DOCS_DIR)
+
+ for (const file of files) {
+ if (!file.endsWith(".mdx")) continue
+
+ const slug = file.replace(".mdx", "")
+ const path = slug === "index" ? "/docs/" : `/docs/${slug}`
+
+ for (const locale of LOCALES) {
+ routes.push({
+ url: `${BASE_URL}${route(locale, path)}`,
+ priority: slug === "index" ? 0.9 : 0.7,
+ changefreq: "weekly",
+ })
+ }
+ }
+ } catch (error) {
+ console.error("Error reading docs directory:", error)
+ }
+
+ return routes
+}
+
+function generateSitemapXML(entries: SitemapEntry[]): string {
+ const urls = entries
+ .map(
+ (entry) => `
+ ${entry.url}
+ ${entry.changefreq}
+ ${entry.priority}
+ `,
+ )
+ .join("\n")
+
+ return `
+
+${urls}
+ `
+}
+
+async function main() {
+ console.log("Generating sitemap...")
+
+ const mainRoutes = await getMainRoutes()
+ const docsRoutes = await getDocsRoutes()
+
+ const allRoutes = [...mainRoutes, ...docsRoutes]
+
+ console.log(`Found ${mainRoutes.length} main routes`)
+ console.log(`Found ${docsRoutes.length} docs routes`)
+ console.log(`Total: ${allRoutes.length} routes`)
+
+ const xml = generateSitemapXML(allRoutes)
+
+ const outputPath = join(PUBLIC_DIR, "sitemap.xml")
+ await writeFile(outputPath, xml, "utf-8")
+
+ console.log(`✓ Sitemap generated at ${outputPath}`)
+}
+
+void main()
diff --git a/packages/console/app/src/app.css b/packages/console/app/src/app.css
new file mode 100644
index 0000000..c0261c4
--- /dev/null
+++ b/packages/console/app/src/app.css
@@ -0,0 +1 @@
+@import "./style/index.css";
diff --git a/packages/console/app/src/app.tsx b/packages/console/app/src/app.tsx
new file mode 100644
index 0000000..1f1d006
--- /dev/null
+++ b/packages/console/app/src/app.tsx
@@ -0,0 +1,44 @@
+import { MetaProvider, Title, Meta } from "@solidjs/meta"
+import { Router } from "@solidjs/router"
+import { FileRoutes } from "@solidjs/start/router"
+import { Suspense } from "solid-js"
+import { Favicon } from "@opencode-ai/ui/favicon"
+import { Font } from "@opencode-ai/ui/font"
+import "@ibm/plex/css/ibm-plex.css"
+import "./app.css"
+import { LanguageProvider } from "~/context/language"
+import { I18nProvider, useI18n } from "~/context/i18n"
+import { strip } from "~/lib/language"
+
+function AppMeta() {
+ const i18n = useI18n()
+ return (
+ <>
+ opencode
+
+
+
+ >
+ )
+}
+
+export default function App() {
+ return (
+ (
+
+
+
+
+ {props.children}
+
+
+
+ )}
+ >
+
+
+ )
+}
diff --git a/packages/console/app/src/asset/black/hero.png b/packages/console/app/src/asset/black/hero.png
new file mode 100644
index 0000000..967f4ac
Binary files /dev/null and b/packages/console/app/src/asset/black/hero.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-brand-assets.zip b/packages/console/app/src/asset/brand/opencode-brand-assets.zip
new file mode 100644
index 0000000..85d3635
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-brand-assets.zip differ
diff --git a/packages/console/app/src/asset/brand/opencode-logo-dark-square.png b/packages/console/app/src/asset/brand/opencode-logo-dark-square.png
new file mode 100644
index 0000000..673c7e3
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-logo-dark-square.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-logo-dark-square.svg b/packages/console/app/src/asset/brand/opencode-logo-dark-square.svg
new file mode 100644
index 0000000..6a67f62
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-logo-dark-square.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-logo-dark.png b/packages/console/app/src/asset/brand/opencode-logo-dark.png
new file mode 100644
index 0000000..cf868c8
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-logo-dark.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-logo-dark.svg b/packages/console/app/src/asset/brand/opencode-logo-dark.svg
new file mode 100644
index 0000000..c28babf
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-logo-dark.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-logo-light-square.png b/packages/console/app/src/asset/brand/opencode-logo-light-square.png
new file mode 100644
index 0000000..5c71047
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-logo-light-square.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-logo-light-square.svg b/packages/console/app/src/asset/brand/opencode-logo-light-square.svg
new file mode 100644
index 0000000..a738ad8
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-logo-light-square.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-logo-light.png b/packages/console/app/src/asset/brand/opencode-logo-light.png
new file mode 100644
index 0000000..a2ffc9b
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-logo-light.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-logo-light.svg b/packages/console/app/src/asset/brand/opencode-logo-light.svg
new file mode 100644
index 0000000..7ed0af0
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-logo-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-dark.png b/packages/console/app/src/asset/brand/opencode-wordmark-dark.png
new file mode 100644
index 0000000..f8e2c3f
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-wordmark-dark.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-dark.svg b/packages/console/app/src/asset/brand/opencode-wordmark-dark.svg
new file mode 100644
index 0000000..a242eee
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-wordmark-dark.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-light.png b/packages/console/app/src/asset/brand/opencode-wordmark-light.png
new file mode 100644
index 0000000..f53607f
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-wordmark-light.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-light.svg b/packages/console/app/src/asset/brand/opencode-wordmark-light.svg
new file mode 100644
index 0000000..24a36c7
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-wordmark-light.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.png b/packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.png
new file mode 100644
index 0000000..945d4eb
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.svg b/packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.svg
new file mode 100644
index 0000000..afc323e
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-simple-light.png b/packages/console/app/src/asset/brand/opencode-wordmark-simple-light.png
new file mode 100644
index 0000000..6c1d057
Binary files /dev/null and b/packages/console/app/src/asset/brand/opencode-wordmark-simple-light.png differ
diff --git a/packages/console/app/src/asset/brand/opencode-wordmark-simple-light.svg b/packages/console/app/src/asset/brand/opencode-wordmark-simple-light.svg
new file mode 100644
index 0000000..29be245
--- /dev/null
+++ b/packages/console/app/src/asset/brand/opencode-wordmark-simple-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/brand/preview-opencode-dark.png b/packages/console/app/src/asset/brand/preview-opencode-dark.png
new file mode 100644
index 0000000..3c19242
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-dark.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-logo-dark-square.png b/packages/console/app/src/asset/brand/preview-opencode-logo-dark-square.png
new file mode 100644
index 0000000..604ad7a
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-logo-dark-square.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-logo-dark.png b/packages/console/app/src/asset/brand/preview-opencode-logo-dark.png
new file mode 100644
index 0000000..d1ef713
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-logo-dark.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-logo-light-square.png b/packages/console/app/src/asset/brand/preview-opencode-logo-light-square.png
new file mode 100644
index 0000000..3964d85
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-logo-light-square.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-logo-light.png b/packages/console/app/src/asset/brand/preview-opencode-logo-light.png
new file mode 100644
index 0000000..d77bbc3
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-logo-light.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-wordmark-dark.png b/packages/console/app/src/asset/brand/preview-opencode-wordmark-dark.png
new file mode 100644
index 0000000..58bcf93
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-wordmark-dark.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-wordmark-light.png b/packages/console/app/src/asset/brand/preview-opencode-wordmark-light.png
new file mode 100644
index 0000000..b39b799
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-wordmark-light.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-dark.png b/packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-dark.png
new file mode 100644
index 0000000..2910c7a
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-dark.png differ
diff --git a/packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-light.png b/packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-light.png
new file mode 100644
index 0000000..6ab84aa
Binary files /dev/null and b/packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-light.png differ
diff --git a/packages/console/app/src/asset/go-ornate-dark.svg b/packages/console/app/src/asset/go-ornate-dark.svg
new file mode 100644
index 0000000..9b617c6
--- /dev/null
+++ b/packages/console/app/src/asset/go-ornate-dark.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/go-ornate-light.svg b/packages/console/app/src/asset/go-ornate-light.svg
new file mode 100644
index 0000000..7999197
--- /dev/null
+++ b/packages/console/app/src/asset/go-ornate-light.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/avatar-adam.png b/packages/console/app/src/asset/lander/avatar-adam.png
new file mode 100644
index 0000000..d94a0a9
Binary files /dev/null and b/packages/console/app/src/asset/lander/avatar-adam.png differ
diff --git a/packages/console/app/src/asset/lander/avatar-david.png b/packages/console/app/src/asset/lander/avatar-david.png
new file mode 100644
index 0000000..2e65272
Binary files /dev/null and b/packages/console/app/src/asset/lander/avatar-david.png differ
diff --git a/packages/console/app/src/asset/lander/avatar-dax.png b/packages/console/app/src/asset/lander/avatar-dax.png
new file mode 100644
index 0000000..0ee8fea
Binary files /dev/null and b/packages/console/app/src/asset/lander/avatar-dax.png differ
diff --git a/packages/console/app/src/asset/lander/avatar-frank.png b/packages/console/app/src/asset/lander/avatar-frank.png
new file mode 100644
index 0000000..5e8f771
Binary files /dev/null and b/packages/console/app/src/asset/lander/avatar-frank.png differ
diff --git a/packages/console/app/src/asset/lander/avatar-jay.png b/packages/console/app/src/asset/lander/avatar-jay.png
new file mode 100644
index 0000000..2f74ca8
Binary files /dev/null and b/packages/console/app/src/asset/lander/avatar-jay.png differ
diff --git a/packages/console/app/src/asset/lander/brand-assets-dark.svg b/packages/console/app/src/asset/lander/brand-assets-dark.svg
new file mode 100644
index 0000000..93da246
--- /dev/null
+++ b/packages/console/app/src/asset/lander/brand-assets-dark.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/brand-assets-light.svg b/packages/console/app/src/asset/lander/brand-assets-light.svg
new file mode 100644
index 0000000..aa9d115
--- /dev/null
+++ b/packages/console/app/src/asset/lander/brand-assets-light.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/brand.png b/packages/console/app/src/asset/lander/brand.png
new file mode 100644
index 0000000..9c1653e
Binary files /dev/null and b/packages/console/app/src/asset/lander/brand.png differ
diff --git a/packages/console/app/src/asset/lander/check.svg b/packages/console/app/src/asset/lander/check.svg
new file mode 100644
index 0000000..0ac7759
--- /dev/null
+++ b/packages/console/app/src/asset/lander/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/console/app/src/asset/lander/copy.svg b/packages/console/app/src/asset/lander/copy.svg
new file mode 100644
index 0000000..e226327
--- /dev/null
+++ b/packages/console/app/src/asset/lander/copy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/console/app/src/asset/lander/desktop-app-icon.png b/packages/console/app/src/asset/lander/desktop-app-icon.png
new file mode 100644
index 0000000..a35c28f
Binary files /dev/null and b/packages/console/app/src/asset/lander/desktop-app-icon.png differ
diff --git a/packages/console/app/src/asset/lander/dock.png b/packages/console/app/src/asset/lander/dock.png
new file mode 100644
index 0000000..b53db01
Binary files /dev/null and b/packages/console/app/src/asset/lander/dock.png differ
diff --git a/packages/console/app/src/asset/lander/logo-dark.svg b/packages/console/app/src/asset/lander/logo-dark.svg
new file mode 100644
index 0000000..d73830f
--- /dev/null
+++ b/packages/console/app/src/asset/lander/logo-dark.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/logo-light.svg b/packages/console/app/src/asset/lander/logo-light.svg
new file mode 100644
index 0000000..7394bf4
--- /dev/null
+++ b/packages/console/app/src/asset/lander/logo-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/opencode-comparison-min.mp4 b/packages/console/app/src/asset/lander/opencode-comparison-min.mp4
new file mode 100644
index 0000000..3cfa15b
Binary files /dev/null and b/packages/console/app/src/asset/lander/opencode-comparison-min.mp4 differ
diff --git a/packages/console/app/src/asset/lander/opencode-comparison-poster.png b/packages/console/app/src/asset/lander/opencode-comparison-poster.png
new file mode 100644
index 0000000..e1cd4bd
Binary files /dev/null and b/packages/console/app/src/asset/lander/opencode-comparison-poster.png differ
diff --git a/packages/console/app/src/asset/lander/opencode-desktop-icon.png b/packages/console/app/src/asset/lander/opencode-desktop-icon.png
new file mode 100644
index 0000000..f2c8d4f
Binary files /dev/null and b/packages/console/app/src/asset/lander/opencode-desktop-icon.png differ
diff --git a/packages/console/app/src/asset/lander/opencode-logo-dark.svg b/packages/console/app/src/asset/lander/opencode-logo-dark.svg
new file mode 100644
index 0000000..154000a
--- /dev/null
+++ b/packages/console/app/src/asset/lander/opencode-logo-dark.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/opencode-logo-light.svg b/packages/console/app/src/asset/lander/opencode-logo-light.svg
new file mode 100644
index 0000000..c1259a7
--- /dev/null
+++ b/packages/console/app/src/asset/lander/opencode-logo-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/opencode-min.mp4 b/packages/console/app/src/asset/lander/opencode-min.mp4
new file mode 100644
index 0000000..ffd6c4f
Binary files /dev/null and b/packages/console/app/src/asset/lander/opencode-min.mp4 differ
diff --git a/packages/console/app/src/asset/lander/opencode-poster.png b/packages/console/app/src/asset/lander/opencode-poster.png
new file mode 100644
index 0000000..e1cd4bd
Binary files /dev/null and b/packages/console/app/src/asset/lander/opencode-poster.png differ
diff --git a/packages/console/app/src/asset/lander/opencode-wordmark-dark.svg b/packages/console/app/src/asset/lander/opencode-wordmark-dark.svg
new file mode 100644
index 0000000..822d971
--- /dev/null
+++ b/packages/console/app/src/asset/lander/opencode-wordmark-dark.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/opencode-wordmark-light.svg b/packages/console/app/src/asset/lander/opencode-wordmark-light.svg
new file mode 100644
index 0000000..6d98af7
--- /dev/null
+++ b/packages/console/app/src/asset/lander/opencode-wordmark-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/lander/screenshot-github.png b/packages/console/app/src/asset/lander/screenshot-github.png
new file mode 100644
index 0000000..a421598
Binary files /dev/null and b/packages/console/app/src/asset/lander/screenshot-github.png differ
diff --git a/packages/console/app/src/asset/lander/screenshot-splash.png b/packages/console/app/src/asset/lander/screenshot-splash.png
new file mode 100644
index 0000000..98e9b47
Binary files /dev/null and b/packages/console/app/src/asset/lander/screenshot-splash.png differ
diff --git a/packages/console/app/src/asset/lander/screenshot-vscode.png b/packages/console/app/src/asset/lander/screenshot-vscode.png
new file mode 100644
index 0000000..4297948
Binary files /dev/null and b/packages/console/app/src/asset/lander/screenshot-vscode.png differ
diff --git a/packages/console/app/src/asset/lander/screenshot.png b/packages/console/app/src/asset/lander/screenshot.png
new file mode 100644
index 0000000..26975bc
Binary files /dev/null and b/packages/console/app/src/asset/lander/screenshot.png differ
diff --git a/packages/console/app/src/asset/lander/wordmark-dark.svg b/packages/console/app/src/asset/lander/wordmark-dark.svg
new file mode 100644
index 0000000..42f8e22
--- /dev/null
+++ b/packages/console/app/src/asset/lander/wordmark-dark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/console/app/src/asset/lander/wordmark-light.svg b/packages/console/app/src/asset/lander/wordmark-light.svg
new file mode 100644
index 0000000..398278d
--- /dev/null
+++ b/packages/console/app/src/asset/lander/wordmark-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/console/app/src/asset/logo-ornate-dark.svg b/packages/console/app/src/asset/logo-ornate-dark.svg
new file mode 100644
index 0000000..a158273
--- /dev/null
+++ b/packages/console/app/src/asset/logo-ornate-dark.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/logo-ornate-light.svg b/packages/console/app/src/asset/logo-ornate-light.svg
new file mode 100644
index 0000000..2a856dc
--- /dev/null
+++ b/packages/console/app/src/asset/logo-ornate-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/logo.svg b/packages/console/app/src/asset/logo.svg
new file mode 100644
index 0000000..2a856dc
--- /dev/null
+++ b/packages/console/app/src/asset/logo.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/zen-ornate-dark.svg b/packages/console/app/src/asset/zen-ornate-dark.svg
new file mode 100644
index 0000000..cdc4485
--- /dev/null
+++ b/packages/console/app/src/asset/zen-ornate-dark.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/asset/zen-ornate-light.svg b/packages/console/app/src/asset/zen-ornate-light.svg
new file mode 100644
index 0000000..2a9ed13
--- /dev/null
+++ b/packages/console/app/src/asset/zen-ornate-light.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/packages/console/app/src/component/dropdown.css b/packages/console/app/src/component/dropdown.css
new file mode 100644
index 0000000..242940e
--- /dev/null
+++ b/packages/console/app/src/component/dropdown.css
@@ -0,0 +1,80 @@
+[data-component="dropdown"] {
+ position: relative;
+
+ [data-slot="trigger"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-2);
+ padding: var(--space-2) var(--space-3);
+ border: none;
+ border-radius: var(--border-radius-sm);
+ background-color: transparent;
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-sans);
+ cursor: pointer;
+ transition: all 0.15s ease;
+
+ &:hover {
+ background-color: var(--color-surface-hover);
+ }
+
+ span {
+ flex: 1;
+ text-align: left;
+ font-weight: 500;
+ }
+ }
+
+ [data-slot="chevron"] {
+ flex-shrink: 0;
+ color: var(--color-text-secondary);
+ }
+
+ [data-slot="dropdown"] {
+ position: absolute;
+ top: 100%;
+ z-index: 1000;
+ margin-top: var(--space-1);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+ min-width: 160px;
+
+ &[data-align="left"] {
+ left: 0;
+ }
+
+ &[data-align="right"] {
+ right: 0;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+ }
+ }
+
+ [data-slot="item"] {
+ display: block;
+ width: 100%;
+ padding: var(--space-2-5) var(--space-3);
+ border: none;
+ background: none;
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-sans);
+ text-align: left;
+ cursor: pointer;
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--color-bg-surface);
+ }
+
+ &[data-selected="true"] {
+ background-color: var(--color-accent-alpha);
+ }
+ }
+}
diff --git a/packages/console/app/src/component/dropdown.tsx b/packages/console/app/src/component/dropdown.tsx
new file mode 100644
index 0000000..de99d44
--- /dev/null
+++ b/packages/console/app/src/component/dropdown.tsx
@@ -0,0 +1,79 @@
+import { JSX, Show, createEffect, onCleanup } from "solid-js"
+import { createStore } from "solid-js/store"
+import { IconChevron } from "./icon"
+import "./dropdown.css"
+
+interface DropdownProps {
+ trigger: JSX.Element | string
+ children: JSX.Element
+ open?: boolean
+ onOpenChange?: (open: boolean) => void
+ align?: "left" | "right"
+ class?: string
+}
+
+export function Dropdown(props: DropdownProps) {
+ const [store, setStore] = createStore({
+ isOpen: props.open ?? false,
+ })
+ let dropdownRef: HTMLDivElement | undefined
+
+ createEffect(() => {
+ if (props.open !== undefined) {
+ setStore("isOpen", props.open)
+ }
+ })
+
+ createEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (dropdownRef && !dropdownRef.contains(event.target as Node)) {
+ setStore("isOpen", false)
+ props.onOpenChange?.(false)
+ }
+ }
+
+ document.addEventListener("click", handleClickOutside)
+ onCleanup(() => document.removeEventListener("click", handleClickOutside))
+ })
+
+ const toggle = () => {
+ const newValue = !store.isOpen
+ setStore("isOpen", newValue)
+ props.onOpenChange?.(newValue)
+ }
+
+ return (
+
+
+ {typeof props.trigger === "string" ? {props.trigger} : props.trigger}
+
+
+
+
+
+ {props.children}
+
+
+
+ )
+}
+
+interface DropdownItemProps {
+ children: JSX.Element
+ selected?: boolean
+ onClick?: () => void
+ type?: "button" | "submit" | "reset"
+}
+
+export function DropdownItem(props: DropdownItemProps) {
+ return (
+
+ {props.children}
+
+ )
+}
diff --git a/packages/console/app/src/component/email-signup.tsx b/packages/console/app/src/component/email-signup.tsx
new file mode 100644
index 0000000..caedaf0
--- /dev/null
+++ b/packages/console/app/src/component/email-signup.tsx
@@ -0,0 +1,47 @@
+import { action, useSubmission } from "@solidjs/router"
+import { Resource } from "@opencode-ai/console-resource"
+import { Show } from "solid-js"
+import { useI18n } from "~/context/i18n"
+
+const emailSignup = action(async (formData: FormData) => {
+ "use server"
+ const emailAddress = formData.get("email")!
+ const listId = "8b9bb82c-9d5f-11f0-975f-0df6fd1e4945"
+ const response = await fetch(`https://api.emailoctopus.com/lists/${listId}/contacts`, {
+ method: "PUT",
+ headers: {
+ Authorization: `Bearer ${Resource.EMAILOCTOPUS_API_KEY.value}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ email_address: emailAddress,
+ }),
+ })
+ console.log(response)
+ return true
+})
+
+export function EmailSignup() {
+ const submission = useSubmission(emailSignup)
+ const i18n = useI18n()
+ return (
+
+
+
{i18n.t("email.title")}
+
{i18n.t("email.subtitle")}
+
+
+
+ {i18n.t("email.success")}
+
+
+ {submission.error}
+
+
+ )
+}
diff --git a/packages/console/app/src/component/faq.tsx b/packages/console/app/src/component/faq.tsx
new file mode 100644
index 0000000..753a0dc
--- /dev/null
+++ b/packages/console/app/src/component/faq.tsx
@@ -0,0 +1,33 @@
+import { Collapsible } from "@kobalte/core/collapsible"
+import { ParentProps } from "solid-js"
+
+export function Faq(props: ParentProps & { question: string }) {
+ return (
+
+
+
+
+
+
+
+
+ {props.question}
+
+ {props.children}
+
+ )
+}
diff --git a/packages/console/app/src/component/footer.tsx b/packages/console/app/src/component/footer.tsx
new file mode 100644
index 0000000..0ea370a
--- /dev/null
+++ b/packages/console/app/src/component/footer.tsx
@@ -0,0 +1,48 @@
+import { createAsync } from "@solidjs/router"
+import { createMemo } from "solid-js"
+import { github } from "~/lib/github"
+import { config } from "~/config"
+import { useLanguage } from "~/context/language"
+import { useI18n } from "~/context/i18n"
+
+export function Footer() {
+ const language = useLanguage()
+ const i18n = useI18n()
+ const community = createMemo(() => {
+ const locale = language.locale()
+ return locale === "zh" || locale === "zht"
+ ? ({ key: "footer.feishu", link: language.route("/feishu") } as const)
+ : ({ key: "footer.discord", link: language.route("/discord") } as const)
+ })
+ const githubData = createAsync(() => github())
+ const starCount = createMemo(() =>
+ githubData()?.stars
+ ? new Intl.NumberFormat(language.tag(language.locale()), {
+ notation: "compact",
+ compactDisplay: "short",
+ }).format(githubData()!.stars!)
+ : config.github.starsFormatted.compact,
+ )
+
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/component/go-referral.css b/packages/console/app/src/component/go-referral.css
new file mode 100644
index 0000000..2959564
--- /dev/null
+++ b/packages/console/app/src/component/go-referral.css
@@ -0,0 +1,289 @@
+[data-component="go-credit-confirm"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+ min-width: min(34rem, calc(100vw - var(--space-8)));
+
+ p {
+ margin: 0;
+ color: var(--color-text-secondary);
+ font-size: var(--font-size-sm);
+ line-height: 1.6;
+ }
+
+ [data-slot="usage-preview"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-5);
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg-surface);
+ }
+
+ [data-slot="usage-preview-item"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+
+ [data-slot="usage-preview-header"] {
+ display: flex;
+ align-items: baseline;
+ justify-content: space-between;
+ gap: var(--space-3);
+ }
+
+ [data-slot="usage-preview-label"] {
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ }
+
+ [data-slot="usage-preview-value"] {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-1);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+ font-size: var(--font-size-xs);
+ white-space: nowrap;
+ }
+
+ [data-slot="usage-preview-after-value"] {
+ color: var(--color-accent);
+ font-weight: 600;
+ }
+
+ [data-slot="usage-preview-progress"] {
+ position: relative;
+ height: 8px;
+ overflow: hidden;
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ }
+
+ [data-slot="usage-preview-before"],
+ [data-slot="usage-preview-after"] {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ border-radius: var(--border-radius-sm);
+ }
+
+ [data-slot="usage-preview-before"] {
+ background-color: var(--color-border);
+ }
+
+ [data-slot="usage-preview-after"] {
+ background-color: var(--color-accent);
+ transition: width 0.35s ease;
+ }
+
+ [data-slot="usage-preview-reset"] {
+ color: var(--color-text-muted);
+ font-size: var(--font-size-xs);
+ }
+
+ [data-slot="modal-actions"] {
+ display: flex;
+ justify-content: flex-end;
+ gap: var(--space-3);
+ }
+}
+
+[data-slot="invite-link-box"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+
+ > div {
+ display: flex;
+ align-items: center;
+ gap: var(--space-3);
+ border-radius: var(--border-radius-sm);
+
+ @media (max-width: 40rem) {
+ align-items: stretch;
+ flex-direction: column;
+ }
+ }
+
+ code {
+ flex: 1;
+ min-width: 0;
+ padding: var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-family: var(--font-mono);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+
+ @media (max-width: 40rem) {
+ padding: var(--space-2-5);
+ font-size: var(--font-size-xs);
+ }
+ }
+
+ button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--space-2);
+ min-width: 130px;
+ white-space: nowrap;
+
+ @media (max-width: 40rem) {
+ min-width: 96px;
+ padding: var(--space-2-5) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+ }
+}
+
+[data-slot="instructions"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+
+ ol {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ margin: 0;
+ padding-left: 0;
+ color: var(--color-text-secondary);
+ font-size: var(--font-size-md);
+ list-style-position: inside;
+ line-height: 1.5;
+ }
+}
+
+[data-component="go-referral-section"] {
+ [data-component="go-referral-overview"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ padding: var(--space-6);
+ border: 1px dashed var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg-surface);
+
+ @media (max-width: 30rem) {
+ gap: var(--space-8);
+ padding: var(--space-4);
+ }
+ }
+
+ [data-component="go-referral-overview"] + [data-slot="section-title"] {
+ margin-top: var(--space-4);
+ }
+
+ [data-slot="referrals-table"] {
+ overflow-x: auto;
+ }
+
+ [data-component="empty-state"] {
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg-surface);
+ color: var(--color-text-muted);
+ font-size: var(--font-size-sm);
+ }
+
+ [data-slot="referrals-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+
+ &:nth-child(1) {
+ width: 120px;
+ }
+
+ &:nth-child(3) {
+ width: 180px;
+ }
+
+ &:nth-child(4) {
+ width: 140px;
+ }
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="referral-amount"] {
+ color: var(--color-text);
+ font-weight: 500;
+ }
+
+ &[data-slot="referral-source"] {
+ color: var(--color-text-secondary);
+ font-family: var(--font-sans);
+ white-space: nowrap;
+ }
+
+ &[data-slot="referral-action"] {
+ text-align: right;
+ font-family: var(--font-sans);
+ white-space: nowrap;
+
+ button {
+ min-width: 96px;
+ }
+ }
+ }
+
+ tbody tr {
+ &[data-status="applied"] {
+ td:not([data-slot="referral-action"]) {
+ opacity: 0.68;
+ }
+ }
+
+ &[data-status="pending"] {
+ td[data-slot="referral-amount"],
+ td[data-slot="referral-date"] {
+ color: var(--color-text-muted);
+ }
+
+ td[data-slot="referral-source"] {
+ color: var(--color-text);
+ }
+ }
+
+ &:last-child td {
+ border-bottom: none;
+ }
+ }
+
+ @media (max-width: 40rem) {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/component/go-referral.tsx b/packages/console/app/src/component/go-referral.tsx
new file mode 100644
index 0000000..4223dfd
--- /dev/null
+++ b/packages/console/app/src/component/go-referral.tsx
@@ -0,0 +1,306 @@
+import { action, json, query, useAction, useSubmission } from "@solidjs/router"
+import { createEffect, createMemo, createSignal, For, onCleanup, Show } from "solid-js"
+import { getRequestEvent } from "solid-js/web"
+import { Referral } from "@opencode-ai/console-core/referral.js"
+import { withActor } from "~/context/auth.withActor"
+import { Modal } from "~/component/modal"
+import { IconCheck, IconCopy } from "~/component/icon"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { formatResetTime, liteResetTimeKeys } from "~/lib/format-reset-time"
+import { queryLiteSubscription } from "~/routes/workspace/[id]/go/lite-section"
+import { createReferralFromCookie } from "~/lib/referral-invite"
+import "./go-referral.css"
+
+type GoReferralSummary = Awaited>
+type GoReferralReward = GoReferralSummary["rewards"][number]
+type GoLiteSubscription = Awaited>
+type GoReferralUsagePreview = NonNullable>>
+type GoReferralUsagePreviewItem = GoReferralUsagePreview["rollingUsage"]
+
+const emptyUsagePreview = {
+ rollingUsage: { beforePercent: 0, afterPercent: 0, resetInSec: 0 },
+ weeklyUsage: { beforePercent: 0, afterPercent: 0, resetInSec: 0 },
+ monthlyUsage: { beforePercent: 0, afterPercent: 0, resetInSec: 0 },
+} satisfies GoReferralUsagePreview
+
+export const queryGoReferral = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ await createReferralFromCookie()
+ return Referral.summary()
+ }, workspaceID)
+}, "go.referral.get")
+
+export const queryGoReferralUsagePreview = query(async (workspaceID: string, referralID?: string) => {
+ "use server"
+ if (!referralID) return null
+ return withActor(() => Referral.usagePreview({ referralID }), workspaceID)
+}, "go.referral.usagePreview")
+
+export const applyGoReferralReward = action(async (workspaceID: string, referralID: string) => {
+ "use server"
+ return json(await withActor(() => Referral.applyReward({ referralID }), workspaceID), {
+ revalidate: [queryGoReferral.key, queryGoReferralUsagePreview.key, queryLiteSubscription.key],
+ })
+}, "go.referral.reward.apply")
+
+function currentUsagePreview(usage: { resetInSec: number; usagePercent: number }) {
+ return {
+ beforePercent: usage.usagePercent,
+ afterPercent: usage.usagePercent,
+ resetInSec: usage.resetInSec,
+ }
+}
+
+function formatCurrency(amount: number) {
+ if (amount % 100 === 0) return `$${amount / 100}`
+ return `$${(amount / 100).toFixed(2)}`
+}
+
+function formatDate(value: string | Date, locale: string) {
+ return new Intl.DateTimeFormat(locale, { month: "short", day: "numeric", year: "numeric" }).format(new Date(value))
+}
+
+function rewardDescriptionKey(source: GoReferralReward["source"]) {
+ if (source === "invitee") return "workspace.referral.reward.description.invitee" as const
+ return "workspace.referral.reward.description.inviter" as const
+}
+
+function rewardActionKey(reward: GoReferralReward, hasActiveGo: boolean) {
+ if (reward.status === "applied") return "workspace.referral.reward.action.applied" as const
+ if (reward.status === "pending" && reward.source === "inviter")
+ return "workspace.referral.reward.source.pendingInviter" as const
+ if (reward.status === "pending" || !hasActiveGo) return "workspace.referral.reward.action.subscribeUnlock" as const
+ return "workspace.referral.reward.action.view" as const
+}
+
+function CopyInviteLink(props: { summary: GoReferralSummary }) {
+ const i18n = useI18n()
+ const [copied, setCopied] = createSignal(false)
+ const event = getRequestEvent()
+ const origin = event
+ ? new URL(event.request.url).origin
+ : typeof window === "object"
+ ? window.location.origin
+ : undefined
+ const inviteUrl = createMemo(() => {
+ const path = `/go?ref=${props.summary.referralCode}`
+ if (!origin) return path
+ return new URL(path, origin).toString()
+ })
+
+ async function copy() {
+ if (typeof navigator !== "object") return
+ await navigator.clipboard.writeText(inviteUrl())
+ setCopied(true)
+ window.setTimeout(() => setCopied(false), 1600)
+ }
+
+ return (
+
+
+ {inviteUrl()}
+
+
+ {i18n.t("workspace.referral.copyLink")}
+ >
+ }
+ >
+ {i18n.t("workspace.referral.copied")}
+
+
+
+
+ )
+}
+
+export function GoReferralSection(props: {
+ workspaceID: string
+ summary: GoReferralSummary
+ lite: GoLiteSubscription | undefined
+}) {
+ const i18n = useI18n()
+ const language = useLanguage()
+ const apply = useAction(applyGoReferralReward)
+ const submission = useSubmission(applyGoReferralReward)
+ const [selected, setSelected] = createSignal()
+ const [preview, setPreview] = createSignal()
+ const displayPreview = createMemo(() => {
+ const loaded = preview()
+ if (loaded) return loaded
+ const current = props.lite
+ if (!current) return emptyUsagePreview
+ return {
+ rollingUsage: currentUsagePreview(current.rollingUsage),
+ weeklyUsage: currentUsagePreview(current.weeklyUsage),
+ monthlyUsage: currentUsagePreview(current.monthlyUsage),
+ } satisfies GoReferralUsagePreview
+ })
+ createEffect(() => {
+ const reward = selected()
+ if (!reward) {
+ setPreview(undefined)
+ return
+ }
+
+ const request = { cancelled: false }
+ setPreview(undefined)
+ queryGoReferralUsagePreview(props.workspaceID, reward.id).then((result) => {
+ if (request.cancelled) return
+ setPreview(result)
+ })
+ onCleanup(() => {
+ request.cancelled = true
+ })
+ })
+
+ async function onApply() {
+ const reward = selected()
+ if (!reward) return
+ await apply(props.workspaceID, reward.id)
+ setSelected(undefined)
+ }
+
+ return (
+ <>
+
+
+
+
+
{i18n.t("workspace.referral.overview.title")}
+
{i18n.t("workspace.referral.overview.subtitle")}
+
+
+
+
+
+ {i18n.t("workspace.referral.instructions.share")}
+ {i18n.t("workspace.referral.instructions.subscribe")}
+ {i18n.t("workspace.referral.instructions.claim")}
+
+
+
+
+
+
+
{i18n.t("workspace.referral.rewards.title")}
+
{i18n.t("workspace.referral.rewards.description")}
+
+
+
+
+
+ {i18n.t("workspace.referral.table.reward")}
+ {i18n.t("workspace.referral.table.referral")}
+ {i18n.t("workspace.referral.table.date")}
+
+
+
+
+
+ {(reward) => {
+ const earnedAt = () => formatDate(reward.timeCreated, language.tag(language.locale()))
+ return (
+
+ {formatCurrency(reward.amount)}
+
+ {i18n.t(rewardDescriptionKey(reward.source), { email: reward.email ?? "" })}
+
+
+ {earnedAt()}
+
+
+ setSelected(reward)}
+ >
+ {i18n.t(rewardActionKey(reward, !!props.lite))}
+
+
+
+ )
+ }}
+
+
+
+
+
+
+
+
+ setSelected(undefined)}
+ title={i18n.t("workspace.referral.apply.confirmTitle")}
+ >
+
+
+ {i18n.t("workspace.referral.apply.confirmBody", {
+ amount: formatCurrency(selected()?.amount ?? 0),
+ })}
+
+
+
+ setSelected(undefined)}>
+ {i18n.t("common.cancel")}
+
+
+ {submission.pending ? i18n.t("workspace.lite.loading") : i18n.t("workspace.referral.apply.confirmAction")}
+
+
+
+
+ >
+ )
+}
+
+function GoReferralUsagePreview(props: { preview: GoReferralUsagePreview }) {
+ const i18n = useI18n()
+
+ return (
+
+
+
+
+
+ )
+}
+
+function GoReferralUsagePreviewRow(props: { label: string; usage: GoReferralUsagePreviewItem }) {
+ const i18n = useI18n()
+
+ return (
+
+
+ {props.label}
+
+ {props.usage.beforePercent}%
+ ->
+ {props.usage.afterPercent}%
+
+
+
+
+ {i18n.t("workspace.lite.subscription.resetsIn")}{" "}
+ {formatResetTime(props.usage.resetInSec, i18n, liteResetTimeKeys)}
+
+
+ )
+}
diff --git a/packages/console/app/src/component/header-context-menu.css b/packages/console/app/src/component/header-context-menu.css
new file mode 100644
index 0000000..3417745
--- /dev/null
+++ b/packages/console/app/src/component/header-context-menu.css
@@ -0,0 +1,63 @@
+.context-menu {
+ position: fixed;
+ z-index: 1000;
+ min-width: 160px;
+ border-radius: 8px;
+ background-color: var(--color-background);
+ box-shadow:
+ 0 0 0 1px rgba(19, 16, 16, 0.08),
+ 0 6px 8px -4px rgba(19, 16, 16, 0.12),
+ 0 4px 3px -2px rgba(19, 16, 16, 0.12),
+ 0 1px 2px -1px rgba(19, 16, 16, 0.12);
+ padding: 6px;
+
+ @media (prefers-color-scheme: dark) {
+ box-shadow: 0 0 0 1px rgba(247, 237, 237, 0.1);
+ }
+}
+
+.context-menu-item {
+ display: flex;
+ gap: 12px;
+ width: 100%;
+ padding: 8px 16px 8px 8px;
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ align-items: center;
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ text-align: left;
+ border-radius: 2px;
+ transition: background-color 0.2s ease;
+
+ [data-slot="copy dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="copy light"] {
+ display: none;
+ }
+ [data-slot="copy dark"] {
+ display: block;
+ }
+ }
+
+ &:hover {
+ background-color: var(--color-background-weak-hover);
+ color: var(--color-text-strong);
+ }
+
+ img {
+ width: 22px;
+ height: 26px;
+ }
+}
+
+.context-menu-divider {
+ border: none;
+ border-top: 1px solid var(--color-border);
+ margin: var(--space-1) 0;
+}
diff --git a/packages/console/app/src/component/header.tsx b/packages/console/app/src/component/header.tsx
new file mode 100644
index 0000000..a0e5ffc
--- /dev/null
+++ b/packages/console/app/src/component/header.tsx
@@ -0,0 +1,288 @@
+import logoLight from "../asset/logo-ornate-light.svg"
+import logoDark from "../asset/logo-ornate-dark.svg"
+import copyLogoLight from "../asset/lander/logo-light.svg"
+import copyLogoDark from "../asset/lander/logo-dark.svg"
+import copyWordmarkLight from "../asset/lander/wordmark-light.svg"
+import copyWordmarkDark from "../asset/lander/wordmark-dark.svg"
+import copyBrandAssetsLight from "../asset/lander/brand-assets-light.svg"
+import copyBrandAssetsDark from "../asset/lander/brand-assets-dark.svg"
+
+// SVG files for copying (separate from button icons)
+// Replace these with your actual SVG files for copying
+import copyLogoSvgLight from "../asset/lander/opencode-logo-light.svg"
+import copyLogoSvgDark from "../asset/lander/opencode-logo-dark.svg"
+import copyWordmarkSvgLight from "../asset/lander/opencode-wordmark-light.svg"
+import copyWordmarkSvgDark from "../asset/lander/opencode-wordmark-dark.svg"
+import { A, useNavigate } from "@solidjs/router"
+import { createMemo, Match, Show, Switch } from "solid-js"
+import { createStore } from "solid-js/store"
+import { createEffect, onCleanup } from "solid-js"
+import { config } from "~/config"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import "./header-context-menu.css"
+
+const isDarkMode = () => window.matchMedia("(prefers-color-scheme: dark)").matches
+
+const fetchSvgContent = async (svgPath: string): Promise => {
+ try {
+ const response = await fetch(svgPath)
+ const svgText = await response.text()
+ return svgText
+ } catch (err) {
+ console.error("Failed to fetch SVG content:", err)
+ throw err
+ }
+}
+
+export function Header(props: { zen?: boolean; go?: boolean; hideGetStarted?: boolean }) {
+ const navigate = useNavigate()
+ const i18n = useI18n()
+ const language = useLanguage()
+
+ const [store, setStore] = createStore({
+ mobileMenuOpen: false,
+ contextMenuOpen: false,
+ contextMenuPosition: { x: 0, y: 0 },
+ })
+
+ createEffect(() => {
+ const handleClickOutside = () => {
+ setStore("contextMenuOpen", false)
+ }
+
+ const handleContextMenu = (event: MouseEvent) => {
+ event.preventDefault()
+ setStore("contextMenuOpen", false)
+ }
+
+ const handleKeyDown = (event: KeyboardEvent) => {
+ if (event.key === "Escape") {
+ setStore("contextMenuOpen", false)
+ }
+ }
+
+ if (store.contextMenuOpen) {
+ document.addEventListener("click", handleClickOutside)
+ document.addEventListener("contextmenu", handleContextMenu)
+ document.addEventListener("keydown", handleKeyDown)
+ onCleanup(() => {
+ document.removeEventListener("click", handleClickOutside)
+ document.removeEventListener("contextmenu", handleContextMenu)
+ document.removeEventListener("keydown", handleKeyDown)
+ })
+ }
+ })
+
+ const handleLogoContextMenu = (event: MouseEvent) => {
+ event.preventDefault()
+ const logoElement = (event.currentTarget as HTMLElement).querySelector("a")
+ if (logoElement) {
+ const rect = logoElement.getBoundingClientRect()
+ setStore("contextMenuPosition", {
+ x: rect.left - 16,
+ y: rect.bottom + 8,
+ })
+ }
+ setStore("contextMenuOpen", true)
+ }
+
+ const copyWordmarkToClipboard = async () => {
+ try {
+ const isDark = isDarkMode()
+ const wordmarkSvgPath = isDark ? copyWordmarkSvgDark : copyWordmarkSvgLight
+ const wordmarkSvg = await fetchSvgContent(wordmarkSvgPath)
+ await navigator.clipboard.writeText(wordmarkSvg)
+ } catch (err) {
+ console.error("Failed to copy wordmark to clipboard:", err)
+ }
+ }
+
+ const copyLogoToClipboard = async () => {
+ try {
+ const isDark = isDarkMode()
+ const logoSvgPath = isDark ? copyLogoSvgDark : copyLogoSvgLight
+ const logoSvg = await fetchSvgContent(logoSvgPath)
+ await navigator.clipboard.writeText(logoSvg)
+ } catch (err) {
+ console.error("Failed to copy logo to clipboard:", err)
+ }
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ setStore("mobileMenuOpen", !store.mobileMenuOpen)}
+ >
+ {i18n.t("nav.openMenu")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/component/icon.tsx b/packages/console/app/src/component/icon.tsx
new file mode 100644
index 0000000..ed83a19
--- /dev/null
+++ b/packages/console/app/src/component/icon.tsx
@@ -0,0 +1,286 @@
+import { JSX } from "solid-js"
+
+export function IconZen(_props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+
+
+
+
+ )
+}
+
+export function IconGo(_props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+
+
+ )
+}
+
+export function IconCopy(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconCheck(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconCreditCard(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconStripe(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconAlipay(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+ )
+}
+
+export function IconUpi(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+
+ )
+}
+
+export function IconWechat(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconChevron(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconWorkspaceLogo(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconOpenAI(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconAnthropic(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+ )
+}
+
+export function IconXai(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+ )
+}
+
+export function IconAlibaba(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconMoonshotAI(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconZai(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconMiniMax(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconGemini(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconDeepSeek(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconMiMo(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconXiaomi(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconNvidia(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconArcee(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+
+
+ )
+}
+
+export function IconStealth(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconChevronLeft(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconChevronRight(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+export function IconBreakdown(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/component/language-picker.css b/packages/console/app/src/component/language-picker.css
new file mode 100644
index 0000000..8ef2306
--- /dev/null
+++ b/packages/console/app/src/component/language-picker.css
@@ -0,0 +1,135 @@
+[data-component="language-picker"] {
+ width: auto;
+}
+
+[data-component="footer"] [data-component="language-picker"] {
+ width: 100%;
+}
+
+[data-component="footer"] [data-component="language-picker"] [data-component="dropdown"] {
+ width: 100%;
+}
+
+/* Standard site footer (grid of cells) */
+[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] {
+ height: 100%;
+}
+
+[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] [data-slot="trigger"] {
+ width: 100%;
+ padding: 2rem 0;
+ border-radius: 0;
+ justify-content: center;
+ gap: var(--space-2);
+ color: inherit;
+ font: inherit;
+}
+
+[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] [data-slot="trigger"] span {
+ flex: 0 0 auto;
+ text-align: center;
+ font-weight: inherit;
+}
+
+[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] [data-slot="trigger"]:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+}
+
+/* Footer dropdown should open upward */
+[data-component="footer"] [data-component="language-picker"] [data-slot="dropdown"] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--space-2);
+ max-height: min(60vh, 420px);
+ overflow: auto;
+}
+
+[data-component="legal"] {
+ flex-wrap: wrap;
+ row-gap: var(--space-2);
+}
+
+[data-component="legal"] [data-component="language-picker"] {
+ width: auto;
+}
+
+[data-component="legal"] [data-component="language-picker"] [data-slot="trigger"] {
+ padding: 0;
+ border-radius: 0;
+ background: transparent;
+ font: inherit;
+ color: var(--color-text-weak);
+ white-space: nowrap;
+}
+
+[data-component="legal"] [data-component="language-picker"] [data-slot="trigger"] span {
+ font-weight: inherit;
+}
+
+[data-component="legal"] [data-component="language-picker"] [data-slot="trigger"]:hover {
+ background: transparent;
+ color: var(--color-text);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+}
+
+[data-component="legal"] [data-component="language-picker"] [data-slot="dropdown"] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--space-2);
+ max-height: min(60vh, 420px);
+ overflow: auto;
+}
+
+/* Black pages footer */
+[data-page="black"] [data-component="language-picker"] {
+ width: auto;
+}
+
+[data-page="black"] [data-component="language-picker"] [data-component="dropdown"] {
+ width: auto;
+}
+
+[data-page="black"] [data-component="language-picker"] [data-slot="trigger"] {
+ padding: 0;
+ border-radius: 0;
+ background: transparent;
+ font: inherit;
+ color: rgba(255, 255, 255, 0.39);
+}
+
+[data-page="black"] [data-component="language-picker"] [data-slot="trigger"]:hover {
+ background: transparent;
+ text-decoration: underline;
+ text-underline-offset: 4px;
+}
+
+[data-page="black"] [data-component="language-picker"] [data-slot="dropdown"] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: 12px;
+ background-color: #0e0e10;
+ border-color: rgba(255, 255, 255, 0.14);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6);
+ max-height: min(60vh, 420px);
+ overflow: auto;
+}
+
+[data-page="black"] [data-component="language-picker"] [data-slot="item"] {
+ color: rgba(255, 255, 255, 0.86);
+}
+
+[data-page="black"] [data-component="language-picker"] [data-slot="item"]:hover {
+ background-color: rgba(255, 255, 255, 0.06);
+}
+
+[data-page="black"] [data-component="language-picker"] [data-slot="item"][data-selected="true"] {
+ background-color: rgba(255, 255, 255, 0.1);
+}
diff --git a/packages/console/app/src/component/language-picker.tsx b/packages/console/app/src/component/language-picker.tsx
new file mode 100644
index 0000000..f42fd80
--- /dev/null
+++ b/packages/console/app/src/component/language-picker.tsx
@@ -0,0 +1,40 @@
+import { For, createSignal } from "solid-js"
+import { useLocation, useNavigate } from "@solidjs/router"
+import { Dropdown, DropdownItem } from "~/component/dropdown"
+import { useLanguage } from "~/context/language"
+import { route, strip } from "~/lib/language"
+import "./language-picker.css"
+
+export function LanguagePicker(props: { align?: "left" | "right" } = {}) {
+ const language = useLanguage()
+ const navigate = useNavigate()
+ const location = useLocation()
+ const [open, setOpen] = createSignal(false)
+
+ return (
+
+
+
+ {(locale) => (
+ {
+ language.setLocale(locale)
+ const href = `${route(locale, strip(location.pathname))}${location.search}${location.hash}`
+ if (href !== `${location.pathname}${location.search}${location.hash}`) navigate(href)
+ setOpen(false)
+ }}
+ >
+ {language.label(locale)}
+
+ )}
+
+
+
+ )
+}
diff --git a/packages/console/app/src/component/legal.tsx b/packages/console/app/src/component/legal.tsx
new file mode 100644
index 0000000..39c534b
--- /dev/null
+++ b/packages/console/app/src/component/legal.tsx
@@ -0,0 +1,28 @@
+import { A } from "@solidjs/router"
+import { LanguagePicker } from "~/component/language-picker"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+
+export function Legal() {
+ const i18n = useI18n()
+ const language = useLanguage()
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/component/locale-links.tsx b/packages/console/app/src/component/locale-links.tsx
new file mode 100644
index 0000000..f773bb8
--- /dev/null
+++ b/packages/console/app/src/component/locale-links.tsx
@@ -0,0 +1,36 @@
+import { Link } from "@solidjs/meta"
+import { For } from "solid-js"
+import { getRequestEvent } from "solid-js/web"
+import { config } from "~/config"
+import { useLanguage } from "~/context/language"
+import { LOCALES, route, tag } from "~/lib/language"
+
+function skip(path: string) {
+ const evt = getRequestEvent()
+ if (!evt) return false
+
+ const key = "__locale_links_seen"
+ const locals = evt.locals as Record
+ const seen = locals[key] instanceof Set ? (locals[key] as Set) : new Set()
+ locals[key] = seen
+ if (seen.has(path)) return true
+ seen.add(path)
+ return false
+}
+
+export function LocaleLinks(props: { path: string }) {
+ const language = useLanguage()
+ if (skip(props.path)) return null
+
+ return (
+ <>
+
+
+ {(locale) => (
+
+ )}
+
+
+ >
+ )
+}
diff --git a/packages/console/app/src/component/modal.css b/packages/console/app/src/component/modal.css
new file mode 100644
index 0000000..ab7f222
--- /dev/null
+++ b/packages/console/app/src/component/modal.css
@@ -0,0 +1,134 @@
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes slideUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+[data-component="modal"][data-slot="overlay"] {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9999;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: rgba(0, 0, 0, 0.5);
+ animation: fadeIn 0.2s ease;
+
+ @media (prefers-color-scheme: dark) {
+ background-color: rgba(0, 0, 0, 0.7);
+ }
+
+ [data-slot="content"] {
+ background-color: var(--color-bg);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-md);
+ padding: var(--space-6);
+ min-width: 400px;
+ max-width: 90vw;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
+ animation: slideUp 0.2s ease;
+
+ @media (max-width: 30rem) {
+ min-width: 300px;
+ padding: var(--space-4);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
+ }
+
+ button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: var(--space-3) var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-sans);
+ font-weight: 500;
+ line-height: 1;
+ cursor: pointer;
+ transition: all 0.15s ease;
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-surface-hover);
+ border-color: var(--color-accent);
+ }
+
+ &:active:not(:disabled) {
+ transform: translateY(1px);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ transform: none;
+ }
+
+ &[data-color="primary"] {
+ background-color: var(--color-primary);
+ border-color: var(--color-primary);
+ color: var(--color-primary-text);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-primary-hover);
+ border-color: var(--color-primary-hover);
+ }
+ }
+
+ &[data-color="ghost"] {
+ background-color: transparent;
+ border-color: transparent;
+ color: var(--color-text-muted);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-surface-hover);
+ border-color: var(--color-border);
+ color: var(--color-text);
+ }
+ }
+ }
+ }
+
+ [data-slot="title"] {
+ margin: 0 0 var(--space-4) 0;
+ font-size: var(--font-size-lg);
+ font-weight: 600;
+ color: var(--color-text);
+ text-align: center;
+ }
+
+ [data-slot="content"][data-variant="black"] {
+ background-color: #000;
+ border-color: rgba(255, 255, 255, 0.17);
+ color: rgba(255, 255, 255, 0.92);
+ font-family: var(--font-mono);
+
+ [data-slot="title"] {
+ color: rgba(255, 255, 255, 0.92);
+ font-family: var(--font-mono);
+ }
+ }
+}
diff --git a/packages/console/app/src/component/modal.tsx b/packages/console/app/src/component/modal.tsx
new file mode 100644
index 0000000..8cac8c4
--- /dev/null
+++ b/packages/console/app/src/component/modal.tsx
@@ -0,0 +1,46 @@
+import { Dialog as Kobalte } from "@kobalte/core/dialog"
+import { JSX, Show } from "solid-js"
+import "./modal.css"
+
+interface ModalProps {
+ open: boolean
+ onClose: () => void
+ title?: string
+ variant?: "black"
+ children: JSX.Element
+}
+
+export function Modal(props: ModalProps) {
+ return (
+
+ {
+ if (!open) props.onClose()
+ }}
+ >
+
+
+ e.stopPropagation()}
+ onOpenAutoFocus={(e) => {
+ e.preventDefault()
+ const target = e.currentTarget as HTMLElement | null
+ target?.focus({ preventScroll: true })
+ }}
+ >
+
+ {props.title}
+
+ {props.children}
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/component/spotlight.css b/packages/console/app/src/component/spotlight.css
new file mode 100644
index 0000000..4b311c3
--- /dev/null
+++ b/packages/console/app/src/component/spotlight.css
@@ -0,0 +1,15 @@
+.spotlight-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 50dvh;
+ pointer-events: none;
+ overflow: hidden;
+}
+
+.spotlight-container canvas {
+ display: block;
+ width: 100%;
+ height: 100%;
+}
diff --git a/packages/console/app/src/component/spotlight.tsx b/packages/console/app/src/component/spotlight.tsx
new file mode 100644
index 0000000..19accb8
--- /dev/null
+++ b/packages/console/app/src/component/spotlight.tsx
@@ -0,0 +1,820 @@
+import { createSignal, createEffect, onMount, onCleanup, Accessor } from "solid-js"
+import "./spotlight.css"
+
+export interface ParticlesConfig {
+ enabled: boolean
+ amount: number
+ size: [number, number]
+ speed: number
+ opacity: number
+ drift: number
+}
+
+export interface SpotlightConfig {
+ placement: [number, number]
+ color: string
+ speed: number
+ spread: number
+ length: number
+ width: number
+ pulsating: false | [number, number]
+ distance: number
+ saturation: number
+ noiseAmount: number
+ distortion: number
+ opacity: number
+ particles: ParticlesConfig
+}
+
+export const defaultConfig: SpotlightConfig = {
+ placement: [0.5, -0.15],
+ color: "#ffffff",
+ speed: 0.8,
+ spread: 0.5,
+ length: 4.0,
+ width: 0.15,
+ pulsating: [0.95, 1.1],
+ distance: 3.5,
+ saturation: 0.35,
+ noiseAmount: 0.15,
+ distortion: 0.05,
+ opacity: 0.325,
+ particles: {
+ enabled: true,
+ amount: 70,
+ size: [1.25, 1.5],
+ speed: 0.75,
+ opacity: 0.9,
+ drift: 1.5,
+ },
+}
+
+export interface SpotlightAnimationState {
+ time: number
+ intensity: number
+ pulseValue: number
+}
+
+interface SpotlightProps {
+ config: Accessor
+ class?: string
+ onAnimationFrame?: (state: SpotlightAnimationState) => void
+}
+
+const hexToRgb = (hex: string): [number, number, number] => {
+ const m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
+ return m ? [parseInt(m[1], 16) / 255, parseInt(m[2], 16) / 255, parseInt(m[3], 16) / 255] : [1, 1, 1]
+}
+
+const getAnchorAndDir = (
+ placement: [number, number],
+ w: number,
+ h: number,
+): { anchor: [number, number]; dir: [number, number] } => {
+ const [px, py] = placement
+ const outside = 0.2
+
+ let anchorX = px * w
+ let anchorY = py * h
+ let dirX = 0
+ let dirY = 0
+
+ const centerX = 0.5
+ const centerY = 0.5
+
+ if (py <= 0.25) {
+ anchorY = -outside * h + py * h
+ dirY = 1
+ dirX = (centerX - px) * 0.5
+ } else if (py >= 0.75) {
+ anchorY = (1 + outside) * h - (1 - py) * h
+ dirY = -1
+ dirX = (centerX - px) * 0.5
+ } else if (px <= 0.25) {
+ anchorX = -outside * w + px * w
+ dirX = 1
+ dirY = (centerY - py) * 0.5
+ } else if (px >= 0.75) {
+ anchorX = (1 + outside) * w - (1 - px) * w
+ dirX = -1
+ dirY = (centerY - py) * 0.5
+ } else {
+ dirY = 1
+ }
+
+ const len = Math.sqrt(dirX * dirX + dirY * dirY)
+ if (len > 0) {
+ dirX /= len
+ dirY /= len
+ }
+
+ return { anchor: [anchorX, anchorY], dir: [dirX, dirY] }
+}
+
+interface UniformData {
+ iTime: number
+ iResolution: [number, number]
+ lightPos: [number, number]
+ lightDir: [number, number]
+ color: [number, number, number]
+ speed: number
+ lightSpread: number
+ lightLength: number
+ sourceWidth: number
+ pulsating: number
+ pulsatingMin: number
+ pulsatingMax: number
+ fadeDistance: number
+ saturation: number
+ noiseAmount: number
+ distortion: number
+ particlesEnabled: number
+ particleAmount: number
+ particleSizeMin: number
+ particleSizeMax: number
+ particleSpeed: number
+ particleOpacity: number
+ particleDrift: number
+}
+
+const WGSL_SHADER = `
+ struct Uniforms {
+ iTime: f32,
+ _pad0: f32,
+ iResolution: vec2,
+ lightPos: vec2,
+ lightDir: vec2,
+ color: vec3,
+ speed: f32,
+ lightSpread: f32,
+ lightLength: f32,
+ sourceWidth: f32,
+ pulsating: f32,
+ pulsatingMin: f32,
+ pulsatingMax: f32,
+ fadeDistance: f32,
+ saturation: f32,
+ noiseAmount: f32,
+ distortion: f32,
+ particlesEnabled: f32,
+ particleAmount: f32,
+ particleSizeMin: f32,
+ particleSizeMax: f32,
+ particleSpeed: f32,
+ particleOpacity: f32,
+ particleDrift: f32,
+ _pad1: f32,
+ _pad2: f32,
+ };
+
+ @group(0) @binding(0) var uniforms: Uniforms;
+
+ struct VertexOutput {
+ @builtin(position) position: vec4,
+ @location(0) vUv: vec2,
+ };
+
+ @vertex
+ fn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
+ var positions = array, 3>(
+ vec2(-1.0, -1.0),
+ vec2(3.0, -1.0),
+ vec2(-1.0, 3.0)
+ );
+
+ var output: VertexOutput;
+ let pos = positions[vertexIndex];
+ output.position = vec4(pos, 0.0, 1.0);
+ output.vUv = pos * 0.5 + 0.5;
+ return output;
+ }
+
+ fn hash(p: vec2) -> f32 {
+ let p3 = fract(p.xyx * 0.1031);
+ return fract((p3.x + p3.y) * p3.z + dot(p3, p3.yzx + 33.33));
+ }
+
+ fn hash2(p: vec2) -> vec2 {
+ let n = sin(dot(p, vec2(41.0, 289.0)));
+ return fract(vec2(n * 262144.0, n * 32768.0));
+ }
+
+ fn fastNoise(st: vec2) -> f32 {
+ return fract(sin(dot(st, vec2(12.9898, 78.233))) * 43758.5453);
+ }
+
+ fn lightStrengthCombined(lightSource: vec2, lightRefDirection: vec2, coord: vec2) -> f32 {
+ let sourceToCoord = coord - lightSource;
+ let distSq = dot(sourceToCoord, sourceToCoord);
+ let distance = sqrt(distSq);
+
+ let baseSize = min(uniforms.iResolution.x, uniforms.iResolution.y);
+ let maxDistance = max(baseSize * uniforms.lightLength, 0.001);
+ if (distance > maxDistance) {
+ return 0.0;
+ }
+
+ let invDist = 1.0 / max(distance, 0.001);
+ let dirNorm = sourceToCoord * invDist;
+ let cosAngle = dot(dirNorm, lightRefDirection);
+
+ if (cosAngle < 0.0) {
+ return 0.0;
+ }
+
+ let side = dot(dirNorm, vec2(-lightRefDirection.y, lightRefDirection.x));
+ let time = uniforms.iTime;
+ let speed = uniforms.speed;
+
+ let asymNoise = fastNoise(vec2(side * 6.0 + time * 0.12, distance * 0.004 + cosAngle * 2.0));
+ let asymShift = (asymNoise - 0.5) * uniforms.distortion * 0.6;
+
+ let distortPhase = time * 1.4 + distance * 0.006 + cosAngle * 4.5 + side * 1.7;
+ let distortedAngle = cosAngle + uniforms.distortion * sin(distortPhase) * 0.22 + asymShift;
+
+ let flickerSeed = cosAngle * 9.0 + side * 4.0 + time * speed * 0.35;
+ let flicker = 0.86 + fastNoise(vec2(flickerSeed, distance * 0.01)) * 0.28;
+
+ let asymSpread = max(uniforms.lightSpread * (0.9 + (asymNoise - 0.5) * 0.25), 0.001);
+ let spreadFactor = pow(max(distortedAngle, 0.0), 1.0 / asymSpread);
+ let lengthFalloff = clamp(1.0 - distance / maxDistance, 0.0, 1.0);
+
+ let fadeMaxDist = max(baseSize * uniforms.fadeDistance, 0.001);
+ let fadeFalloff = clamp((fadeMaxDist - distance) / fadeMaxDist, 0.0, 1.0);
+
+ var pulse: f32 = 1.0;
+ if (uniforms.pulsating > 0.5) {
+ let pulseCenter = (uniforms.pulsatingMin + uniforms.pulsatingMax) * 0.5;
+ let pulseAmplitude = (uniforms.pulsatingMax - uniforms.pulsatingMin) * 0.5;
+ pulse = pulseCenter + pulseAmplitude * sin(time * speed * 3.0);
+ }
+
+ let timeSpeed = time * speed;
+ let wave = 0.5
+ + 0.25 * sin(cosAngle * 28.0 + side * 8.0 + timeSpeed * 1.2)
+ + 0.18 * cos(cosAngle * 22.0 - timeSpeed * 0.95 + side * 6.0)
+ + 0.12 * sin(cosAngle * 35.0 + timeSpeed * 1.6 + asymNoise * 3.0);
+ let minStrength = 0.14 + asymNoise * 0.06;
+ let baseStrength = max(clamp(wave * (0.85 + asymNoise * 0.3), 0.0, 1.0), minStrength);
+
+ let lightStrength = baseStrength * lengthFalloff * fadeFalloff * spreadFactor * pulse * flicker;
+ let ambientLight = (0.06 + asymNoise * 0.04) * lengthFalloff * fadeFalloff * spreadFactor;
+
+ return max(lightStrength, ambientLight);
+ }
+
+ fn particle(coord: vec2, particlePos: vec2, size: f32) -> f32 {
+ let delta = coord - particlePos;
+ let distSq = dot(delta, delta);
+ let sizeSq = size * size;
+
+ if (distSq > sizeSq * 9.0) {
+ return 0.0;
+ }
+
+ let d = sqrt(distSq);
+ let core = smoothstep(size, size * 0.35, d);
+ let glow = smoothstep(size * 3.0, 0.0, d) * 0.55;
+ return core + glow;
+ }
+
+ fn renderParticles(coord: vec2, lightSource: vec2, lightDir: vec2) -> f32 {
+ if (uniforms.particlesEnabled < 0.5 || uniforms.particleAmount < 1.0) {
+ return 0.0;
+ }
+
+ var particleSum: f32 = 0.0;
+ let particleCount = i32(uniforms.particleAmount);
+ let time = uniforms.iTime * uniforms.particleSpeed;
+ let perpDir = vec2(-lightDir.y, lightDir.x);
+ let baseSize = min(uniforms.iResolution.x, uniforms.iResolution.y);
+ let maxDist = max(baseSize * uniforms.lightLength, 1.0);
+ let spreadScale = uniforms.lightSpread * baseSize * 0.65;
+ let coneHalfWidth = uniforms.lightSpread * baseSize * 0.55;
+
+ for (var i: i32 = 0; i < particleCount; i = i + 1) {
+ let fi = f32(i);
+ let seed = vec2(fi * 127.1, fi * 311.7);
+ let rnd = hash2(seed);
+
+ let lifeDuration = 2.0 + hash(seed + vec2(19.0, 73.0)) * 3.0;
+ let lifeOffset = hash(seed + vec2(91.0, 37.0)) * lifeDuration;
+ let lifeProgress = fract((time + lifeOffset) / lifeDuration);
+
+ let fadeIn = smoothstep(0.0, 0.2, lifeProgress);
+ let fadeOut = 1.0 - smoothstep(0.8, 1.0, lifeProgress);
+ let lifeFade = fadeIn * fadeOut;
+ if (lifeFade < 0.01) {
+ continue;
+ }
+
+ let alongLight = rnd.x * maxDist * 0.8;
+ let perpOffset = (rnd.y - 0.5) * spreadScale;
+
+ let floatPhase = rnd.y * 6.28318 + fi * 0.37;
+ let floatSpeed = 0.35 + rnd.x * 0.9;
+ let drift = vec2(
+ sin(time * floatSpeed + floatPhase),
+ cos(time * floatSpeed * 0.85 + floatPhase * 1.3)
+ ) * uniforms.particleDrift * baseSize * 0.08;
+
+ let wobble = vec2(
+ sin(time * 1.4 + floatPhase * 2.1),
+ cos(time * 1.1 + floatPhase * 1.6)
+ ) * uniforms.particleDrift * baseSize * 0.03;
+
+ let flowOffset = (rnd.x - 0.5) * baseSize * 0.12 + fract(time * 0.06 + rnd.y) * baseSize * 0.1;
+
+ let basePos = lightSource + lightDir * (alongLight + flowOffset) + perpDir * perpOffset + drift + wobble;
+
+ let toParticle = basePos - lightSource;
+ let projLen = dot(toParticle, lightDir);
+ if (projLen < 0.0 || projLen > maxDist) {
+ continue;
+ }
+
+ let sideDist = abs(dot(toParticle, perpDir));
+ if (sideDist > coneHalfWidth) {
+ continue;
+ }
+
+ let size = mix(uniforms.particleSizeMin, uniforms.particleSizeMax, rnd.x);
+ let twinkle = 0.7 + 0.3 * sin(time * (1.5 + rnd.y * 2.0) + floatPhase);
+ let distFade = 1.0 - smoothstep(maxDist * 0.2, maxDist * 0.95, projLen);
+ if (distFade < 0.01) {
+ continue;
+ }
+
+ let p = particle(coord, basePos, size);
+ if (p > 0.0) {
+ particleSum = particleSum + p * lifeFade * twinkle * distFade * uniforms.particleOpacity;
+ if (particleSum >= 1.0) {
+ break;
+ }
+ }
+ }
+
+ return min(particleSum, 1.0);
+ }
+
+ @fragment
+ fn fragmentMain(@builtin(position) fragCoord: vec4, @location(0) vUv: vec2) -> @location(0) vec4 {
+ let coord = vec2(fragCoord.x, fragCoord.y);
+
+ let normalizedX = (coord.x / uniforms.iResolution.x) - 0.5;
+ let widthOffset = -normalizedX * uniforms.sourceWidth * uniforms.iResolution.x;
+
+ let perpDir = vec2(-uniforms.lightDir.y, uniforms.lightDir.x);
+ let adjustedLightPos = uniforms.lightPos + perpDir * widthOffset;
+
+ let lightValue = lightStrengthCombined(adjustedLightPos, uniforms.lightDir, coord);
+
+ if (lightValue < 0.001) {
+ let particles = renderParticles(coord, adjustedLightPos, uniforms.lightDir);
+ if (particles < 0.001) {
+ return vec4(0.0, 0.0, 0.0, 0.0);
+ }
+ let particleBrightness = particles * 1.8;
+ return vec4(uniforms.color * particleBrightness, particles * 0.9);
+ }
+
+ var fragColor = vec4(lightValue, lightValue, lightValue, lightValue);
+
+ if (uniforms.noiseAmount > 0.01) {
+ let n = fastNoise(coord * 0.5 + uniforms.iTime * 0.5);
+ let grain = mix(1.0, n, uniforms.noiseAmount * 0.5);
+ fragColor = vec4(fragColor.rgb * grain, fragColor.a);
+ }
+
+ let brightness = 1.0 - (coord.y / uniforms.iResolution.y);
+ fragColor = vec4(
+ fragColor.x * (0.15 + brightness * 0.85),
+ fragColor.y * (0.35 + brightness * 0.65),
+ fragColor.z * (0.55 + brightness * 0.45),
+ fragColor.a
+ );
+
+ if (abs(uniforms.saturation - 1.0) > 0.01) {
+ let gray = dot(fragColor.rgb, vec3(0.299, 0.587, 0.114));
+ fragColor = vec4(mix(vec3(gray), fragColor.rgb, uniforms.saturation), fragColor.a);
+ }
+
+ fragColor = vec4(fragColor.rgb * uniforms.color, fragColor.a);
+
+ let particles = renderParticles(coord, adjustedLightPos, uniforms.lightDir);
+ if (particles > 0.001) {
+ let particleBrightness = particles * 1.8;
+ fragColor = vec4(fragColor.rgb + uniforms.color * particleBrightness, max(fragColor.a, particles * 0.9));
+ }
+
+ return fragColor;
+ }
+`
+
+const UNIFORM_BUFFER_SIZE = 144
+
+function updateUniformBuffer(buffer: Float32Array, data: UniformData): void {
+ buffer[0] = data.iTime
+ buffer[2] = data.iResolution[0]
+ buffer[3] = data.iResolution[1]
+ buffer[4] = data.lightPos[0]
+ buffer[5] = data.lightPos[1]
+ buffer[6] = data.lightDir[0]
+ buffer[7] = data.lightDir[1]
+ buffer[8] = data.color[0]
+ buffer[9] = data.color[1]
+ buffer[10] = data.color[2]
+ buffer[11] = data.speed
+ buffer[12] = data.lightSpread
+ buffer[13] = data.lightLength
+ buffer[14] = data.sourceWidth
+ buffer[15] = data.pulsating
+ buffer[16] = data.pulsatingMin
+ buffer[17] = data.pulsatingMax
+ buffer[18] = data.fadeDistance
+ buffer[19] = data.saturation
+ buffer[20] = data.noiseAmount
+ buffer[21] = data.distortion
+ buffer[22] = data.particlesEnabled
+ buffer[23] = data.particleAmount
+ buffer[24] = data.particleSizeMin
+ buffer[25] = data.particleSizeMax
+ buffer[26] = data.particleSpeed
+ buffer[27] = data.particleOpacity
+ buffer[28] = data.particleDrift
+}
+
+export default function Spotlight(props: SpotlightProps) {
+ let containerRef: HTMLDivElement | undefined
+ let canvasRef: HTMLCanvasElement | null = null
+ let deviceRef: GPUDevice | null = null
+ let contextRef: GPUCanvasContext | null = null
+ let pipelineRef: GPURenderPipeline | null = null
+ let uniformBufferRef: GPUBuffer | null = null
+ let bindGroupRef: GPUBindGroup | null = null
+ let animationIdRef: number | null = null
+ let cleanupFunctionRef: (() => void) | null = null
+ let uniformDataRef: UniformData | null = null
+ let uniformArrayRef: Float32Array | null = null
+ let configRef: SpotlightConfig = props.config()
+ let frameCount = 0
+
+ const [isVisible, setIsVisible] = createSignal(false)
+
+ createEffect(() => {
+ configRef = props.config()
+ })
+
+ onMount(() => {
+ if (!containerRef) return
+
+ const observer = new IntersectionObserver(
+ (entries) => {
+ const entry = entries[0]
+ setIsVisible(entry.isIntersecting)
+ },
+ { threshold: 0.1 },
+ )
+
+ observer.observe(containerRef)
+
+ onCleanup(() => {
+ observer.disconnect()
+ })
+ })
+
+ createEffect(() => {
+ const visible = isVisible()
+ const config = props.config()
+ if (!visible || !containerRef) {
+ return
+ }
+
+ if (cleanupFunctionRef) {
+ cleanupFunctionRef()
+ cleanupFunctionRef = null
+ }
+
+ const initializeWebGPU = async () => {
+ if (!containerRef) {
+ return
+ }
+
+ await new Promise((resolve) => setTimeout(resolve, 10))
+
+ if (!containerRef) {
+ return
+ }
+
+ if (!navigator.gpu) {
+ console.warn("WebGPU is not supported in this browser")
+ return
+ }
+
+ const adapter = await navigator.gpu.requestAdapter({
+ powerPreference: "high-performance",
+ })
+ if (!adapter) {
+ console.warn("Failed to get WebGPU adapter")
+ return
+ }
+
+ const device = await adapter.requestDevice()
+ deviceRef = device
+
+ const canvas = document.createElement("canvas")
+ canvas.style.width = "100%"
+ canvas.style.height = "100%"
+ canvasRef = canvas
+
+ while (containerRef.firstChild) {
+ containerRef.removeChild(containerRef.firstChild)
+ }
+ containerRef.appendChild(canvas)
+
+ const context = canvas.getContext("webgpu")
+ if (!context) {
+ console.warn("Failed to get WebGPU context")
+ return
+ }
+ contextRef = context
+
+ const presentationFormat = navigator.gpu.getPreferredCanvasFormat()
+ context.configure({
+ device,
+ format: presentationFormat,
+ alphaMode: "premultiplied",
+ })
+
+ const shaderModule = device.createShaderModule({
+ code: WGSL_SHADER,
+ })
+
+ const uniformBuffer = device.createBuffer({
+ size: UNIFORM_BUFFER_SIZE,
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
+ })
+ uniformBufferRef = uniformBuffer
+
+ const bindGroupLayout = device.createBindGroupLayout({
+ entries: [
+ {
+ binding: 0,
+ visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
+ buffer: { type: "uniform" },
+ },
+ ],
+ })
+
+ const bindGroup = device.createBindGroup({
+ layout: bindGroupLayout,
+ entries: [
+ {
+ binding: 0,
+ resource: { buffer: uniformBuffer },
+ },
+ ],
+ })
+ bindGroupRef = bindGroup
+
+ const pipelineLayout = device.createPipelineLayout({
+ bindGroupLayouts: [bindGroupLayout],
+ })
+
+ const pipeline = device.createRenderPipeline({
+ layout: pipelineLayout,
+ vertex: {
+ module: shaderModule,
+ entryPoint: "vertexMain",
+ },
+ fragment: {
+ module: shaderModule,
+ entryPoint: "fragmentMain",
+ targets: [
+ {
+ format: presentationFormat,
+ blend: {
+ color: {
+ srcFactor: "src-alpha",
+ dstFactor: "one-minus-src-alpha",
+ operation: "add",
+ },
+ alpha: {
+ srcFactor: "one",
+ dstFactor: "one-minus-src-alpha",
+ operation: "add",
+ },
+ },
+ },
+ ],
+ },
+ primitive: {
+ topology: "triangle-list",
+ },
+ })
+ pipelineRef = pipeline
+
+ const { clientWidth: wCSS, clientHeight: hCSS } = containerRef
+ const dpr = Math.min(window.devicePixelRatio, 2)
+ const w = wCSS * dpr
+ const h = hCSS * dpr
+ const { anchor, dir } = getAnchorAndDir(config.placement, w, h)
+
+ uniformDataRef = {
+ iTime: 0,
+ iResolution: [w, h],
+ lightPos: anchor,
+ lightDir: dir,
+ color: hexToRgb(config.color),
+ speed: config.speed,
+ lightSpread: config.spread,
+ lightLength: config.length,
+ sourceWidth: config.width,
+ pulsating: config.pulsating !== false ? 1.0 : 0.0,
+ pulsatingMin: config.pulsating !== false ? config.pulsating[0] : 1.0,
+ pulsatingMax: config.pulsating !== false ? config.pulsating[1] : 1.0,
+ fadeDistance: config.distance,
+ saturation: config.saturation,
+ noiseAmount: config.noiseAmount,
+ distortion: config.distortion,
+ particlesEnabled: config.particles.enabled ? 1.0 : 0.0,
+ particleAmount: config.particles.amount,
+ particleSizeMin: config.particles.size[0],
+ particleSizeMax: config.particles.size[1],
+ particleSpeed: config.particles.speed,
+ particleOpacity: config.particles.opacity,
+ particleDrift: config.particles.drift,
+ }
+
+ const updatePlacement = () => {
+ if (!containerRef || !canvasRef || !uniformDataRef) {
+ return
+ }
+
+ const dpr = Math.min(window.devicePixelRatio, 2)
+ const { clientWidth: wCSS, clientHeight: hCSS } = containerRef
+ const w = Math.floor(wCSS * dpr)
+ const h = Math.floor(hCSS * dpr)
+
+ canvasRef.width = w
+ canvasRef.height = h
+
+ uniformDataRef.iResolution = [w, h]
+
+ const { anchor, dir } = getAnchorAndDir(configRef.placement, w, h)
+ uniformDataRef.lightPos = anchor
+ uniformDataRef.lightDir = dir
+ }
+
+ const loop = (t: number) => {
+ if (!deviceRef || !contextRef || !pipelineRef || !uniformBufferRef || !bindGroupRef || !uniformDataRef) {
+ return
+ }
+
+ const timeSeconds = t * 0.001
+ uniformDataRef.iTime = timeSeconds
+ frameCount++
+
+ if (props.onAnimationFrame && frameCount % 2 === 0) {
+ const pulsatingMin = configRef.pulsating !== false ? configRef.pulsating[0] : 1.0
+ const pulsatingMax = configRef.pulsating !== false ? configRef.pulsating[1] : 1.0
+ const pulseCenter = (pulsatingMin + pulsatingMax) * 0.5
+ const pulseAmplitude = (pulsatingMax - pulsatingMin) * 0.5
+ const pulseValue =
+ configRef.pulsating !== false
+ ? pulseCenter + pulseAmplitude * Math.sin(timeSeconds * configRef.speed * 3.0)
+ : 1.0
+
+ const baseIntensity1 = 0.45 + 0.15 * Math.sin(timeSeconds * configRef.speed * 1.5)
+ const baseIntensity2 = 0.3 + 0.2 * Math.cos(timeSeconds * configRef.speed * 1.1)
+ const intensity = Math.max((baseIntensity1 + baseIntensity2) * pulseValue, 0.55)
+
+ props.onAnimationFrame({
+ time: timeSeconds,
+ intensity,
+ pulseValue: Math.max(pulseValue, 0.9),
+ })
+ }
+
+ try {
+ if (!uniformArrayRef) {
+ uniformArrayRef = new Float32Array(36)
+ }
+ updateUniformBuffer(uniformArrayRef, uniformDataRef)
+ deviceRef.queue.writeBuffer(uniformBufferRef, 0, uniformArrayRef.buffer)
+
+ const commandEncoder = deviceRef.createCommandEncoder()
+
+ const textureView = contextRef.getCurrentTexture().createView()
+
+ const renderPass = commandEncoder.beginRenderPass({
+ colorAttachments: [
+ {
+ view: textureView,
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
+ loadOp: "clear",
+ storeOp: "store",
+ },
+ ],
+ })
+
+ renderPass.setPipeline(pipelineRef)
+ renderPass.setBindGroup(0, bindGroupRef)
+ renderPass.draw(3)
+ renderPass.end()
+
+ deviceRef.queue.submit([commandEncoder.finish()])
+
+ animationIdRef = requestAnimationFrame(loop)
+ } catch (error) {
+ console.warn("WebGPU rendering error:", error)
+ return
+ }
+ }
+
+ window.addEventListener("resize", updatePlacement)
+ updatePlacement()
+ animationIdRef = requestAnimationFrame(loop)
+
+ cleanupFunctionRef = () => {
+ if (animationIdRef) {
+ cancelAnimationFrame(animationIdRef)
+ animationIdRef = null
+ }
+
+ window.removeEventListener("resize", updatePlacement)
+
+ if (uniformBufferRef) {
+ uniformBufferRef.destroy()
+ uniformBufferRef = null
+ }
+
+ if (deviceRef) {
+ deviceRef.destroy()
+ deviceRef = null
+ }
+
+ if (canvasRef && canvasRef.parentNode) {
+ canvasRef.parentNode.removeChild(canvasRef)
+ }
+
+ canvasRef = null
+ contextRef = null
+ pipelineRef = null
+ bindGroupRef = null
+ uniformDataRef = null
+ }
+ }
+
+ void initializeWebGPU()
+
+ onCleanup(() => {
+ if (cleanupFunctionRef) {
+ cleanupFunctionRef()
+ cleanupFunctionRef = null
+ }
+ })
+ })
+
+ createEffect(() => {
+ if (!uniformDataRef || !containerRef) {
+ return
+ }
+
+ const config = props.config()
+
+ uniformDataRef.color = hexToRgb(config.color)
+ uniformDataRef.speed = config.speed
+ uniformDataRef.lightSpread = config.spread
+ uniformDataRef.lightLength = config.length
+ uniformDataRef.sourceWidth = config.width
+ uniformDataRef.pulsating = config.pulsating !== false ? 1.0 : 0.0
+ uniformDataRef.pulsatingMin = config.pulsating !== false ? config.pulsating[0] : 1.0
+ uniformDataRef.pulsatingMax = config.pulsating !== false ? config.pulsating[1] : 1.0
+ uniformDataRef.fadeDistance = config.distance
+ uniformDataRef.saturation = config.saturation
+ uniformDataRef.noiseAmount = config.noiseAmount
+ uniformDataRef.distortion = config.distortion
+ uniformDataRef.particlesEnabled = config.particles.enabled ? 1.0 : 0.0
+ uniformDataRef.particleAmount = config.particles.amount
+ uniformDataRef.particleSizeMin = config.particles.size[0]
+ uniformDataRef.particleSizeMax = config.particles.size[1]
+ uniformDataRef.particleSpeed = config.particles.speed
+ uniformDataRef.particleOpacity = config.particles.opacity
+ uniformDataRef.particleDrift = config.particles.drift
+
+ const dpr = Math.min(window.devicePixelRatio, 2)
+ const { clientWidth: wCSS, clientHeight: hCSS } = containerRef
+ const { anchor, dir } = getAnchorAndDir(config.placement, wCSS * dpr, hCSS * dpr)
+ uniformDataRef.lightPos = anchor
+ uniformDataRef.lightDir = dir
+ })
+
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/config.ts b/packages/console/app/src/config.ts
new file mode 100644
index 0000000..2cd039f
--- /dev/null
+++ b/packages/console/app/src/config.ts
@@ -0,0 +1,29 @@
+/**
+ * Application-wide constants and configuration
+ */
+export const config = {
+ // Base URL
+ baseUrl: "https://opencode.ai",
+
+ // GitHub
+ github: {
+ repoUrl: "https://github.com/anomalyco/opencode",
+ starsFormatted: {
+ compact: "160K",
+ full: "160,000",
+ },
+ },
+
+ // Social links
+ social: {
+ twitter: "https://x.com/opencode",
+ discord: "https://discord.gg/opencode",
+ },
+
+ // Static stats (used on landing page)
+ stats: {
+ contributors: "900",
+ commits: "13,000",
+ monthlyUsers: "7.5M",
+ },
+} as const
diff --git a/packages/console/app/src/context/auth.session.ts b/packages/console/app/src/context/auth.session.ts
new file mode 100644
index 0000000..336ce12
--- /dev/null
+++ b/packages/console/app/src/context/auth.session.ts
@@ -0,0 +1 @@
+export {}
diff --git a/packages/console/app/src/context/auth.ts b/packages/console/app/src/context/auth.ts
new file mode 100644
index 0000000..aed07a6
--- /dev/null
+++ b/packages/console/app/src/context/auth.ts
@@ -0,0 +1,116 @@
+import { getRequestEvent } from "solid-js/web"
+import { and, Database, eq, inArray, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+import { redirect } from "@solidjs/router"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+
+import { createClient } from "@openauthjs/openauth/client"
+
+export const AuthClient = createClient({
+ clientID: "app",
+ issuer: import.meta.env.VITE_AUTH_URL,
+})
+
+import { useSession } from "@solidjs/start/http"
+import { Resource } from "@opencode-ai/console-resource"
+
+export interface AuthSession {
+ account?: Record<
+ string,
+ {
+ id: string
+ email: string
+ }
+ >
+ current?: string
+}
+
+export function useAuthSession() {
+ return useSession({
+ password: Resource.ZEN_SESSION_SECRET.value,
+ name: "auth",
+ maxAge: 60 * 60 * 24 * 365,
+ cookie: {
+ secure: false,
+ httpOnly: true,
+ },
+ })
+}
+
+export const getActor = async (workspace?: string): Promise => {
+ "use server"
+ const evt = getRequestEvent()
+ if (!evt) throw new Error("No request event")
+ if (evt.locals.actor) return evt.locals.actor
+ evt.locals.actor = (async () => {
+ const auth = await useAuthSession()
+ if (!workspace) {
+ const account = auth.data.account ?? {}
+ const current = account[auth.data.current ?? ""]
+ if (current) {
+ return {
+ type: "account",
+ properties: {
+ email: current.email,
+ accountID: current.id,
+ },
+ }
+ }
+ if (Object.keys(account).length > 0) {
+ const current = Object.values(account)[0]
+ await auth.update((val) => ({
+ ...val,
+ current: current.id,
+ }))
+ return {
+ type: "account",
+ properties: {
+ email: current.email,
+ accountID: current.id,
+ },
+ }
+ }
+ return {
+ type: "public",
+ properties: {},
+ }
+ }
+ const accounts = Object.keys(auth.data.account ?? {})
+ if (accounts.length) {
+ const user = await Database.use((tx) =>
+ tx
+ .select()
+ .from(UserTable)
+ .where(
+ and(
+ eq(UserTable.workspaceID, workspace),
+ isNull(UserTable.timeDeleted),
+ inArray(UserTable.accountID, accounts),
+ ),
+ )
+ .limit(1)
+ .execute()
+ .then((x) => x[0]),
+ )
+ if (user) {
+ await Database.use((tx) =>
+ tx
+ .update(UserTable)
+ .set({ timeSeen: sql`now()` })
+ .where(and(eq(UserTable.workspaceID, workspace), eq(UserTable.id, user.id))),
+ )
+ return {
+ type: "user",
+ properties: {
+ userID: user.id,
+ workspaceID: user.workspaceID,
+ accountID: user.accountID,
+ role: user.role,
+ },
+ }
+ }
+ }
+ throw redirect("/auth/authorize")
+ })()
+ return evt.locals.actor
+}
diff --git a/packages/console/app/src/context/auth.withActor.ts b/packages/console/app/src/context/auth.withActor.ts
new file mode 100644
index 0000000..ff377cd
--- /dev/null
+++ b/packages/console/app/src/context/auth.withActor.ts
@@ -0,0 +1,7 @@
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { getActor } from "./auth"
+
+export async function withActor(fn: () => T, workspace?: string) {
+ const actor = await getActor(workspace)
+ return Actor.provide(actor.type, actor.properties, fn)
+}
diff --git a/packages/console/app/src/context/i18n.tsx b/packages/console/app/src/context/i18n.tsx
new file mode 100644
index 0000000..5d178c8
--- /dev/null
+++ b/packages/console/app/src/context/i18n.tsx
@@ -0,0 +1,27 @@
+import { createMemo } from "solid-js"
+import { createSimpleContext } from "@opencode-ai/ui/context"
+import { i18n, type Key } from "~/i18n"
+import { useLanguage } from "~/context/language"
+
+function resolve(text: string, params?: Record) {
+ if (!params) return text
+ return text.replace(/\{\{(\w+)\}\}/g, (raw, key) => {
+ const value = params[key]
+ if (value === undefined || value === null) return raw
+ return String(value)
+ })
+}
+
+export const { use: useI18n, provider: I18nProvider } = createSimpleContext({
+ name: "I18n",
+ init: () => {
+ const language = useLanguage()
+ const dict = createMemo(() => i18n(language.locale()))
+
+ return {
+ t(key: Key, params?: Record) {
+ return resolve(dict()[key], params)
+ },
+ }
+ },
+})
diff --git a/packages/console/app/src/context/language.tsx b/packages/console/app/src/context/language.tsx
new file mode 100644
index 0000000..2999242
--- /dev/null
+++ b/packages/console/app/src/context/language.tsx
@@ -0,0 +1,72 @@
+import { createEffect } from "solid-js"
+import { createStore } from "solid-js/store"
+import { getRequestEvent } from "solid-js/web"
+import { createSimpleContext } from "@opencode-ai/ui/context"
+import {
+ LOCALES,
+ type Locale,
+ clearCookie,
+ cookie,
+ detectFromLanguages,
+ dir as localeDir,
+ label as localeLabel,
+ localeFromCookieHeader,
+ localeFromRequest,
+ parseLocale,
+ route as localeRoute,
+ tag as localeTag,
+} from "~/lib/language"
+
+function initial() {
+ const evt = getRequestEvent()
+ if (evt) return localeFromRequest(evt.request)
+
+ if (typeof document === "object") {
+ const fromDom = parseLocale(document.documentElement.dataset.locale)
+ if (fromDom) return fromDom
+
+ const fromCookie = localeFromCookieHeader(document.cookie)
+ if (fromCookie) return fromCookie
+ }
+
+ if (typeof navigator !== "object") return "en" satisfies Locale
+
+ const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
+ return detectFromLanguages(languages)
+}
+
+export const { use: useLanguage, provider: LanguageProvider } = createSimpleContext({
+ name: "Language",
+ init: () => {
+ const [store, setStore] = createStore({
+ locale: initial(),
+ })
+
+ createEffect(() => {
+ if (typeof document !== "object") return
+ document.documentElement.lang = localeTag(store.locale)
+ document.documentElement.dir = localeDir(store.locale)
+ document.documentElement.dataset.locale = store.locale
+ })
+
+ return {
+ locale: () => store.locale,
+ locales: LOCALES,
+ label: localeLabel,
+ tag: localeTag,
+ dir: localeDir,
+ route(pathname: string) {
+ return localeRoute(store.locale, pathname)
+ },
+ setLocale(next: Locale) {
+ setStore("locale", next)
+ if (typeof document !== "object") return
+ document.cookie = cookie(next)
+ },
+ clear() {
+ if (typeof document !== "object") return
+ document.cookie = clearCookie()
+ },
+ }
+ },
+})
diff --git a/packages/console/app/src/entry-client.tsx b/packages/console/app/src/entry-client.tsx
new file mode 100644
index 0000000..642deac
--- /dev/null
+++ b/packages/console/app/src/entry-client.tsx
@@ -0,0 +1,4 @@
+// @refresh reload
+import { mount, StartClient } from "@solidjs/start/client"
+
+mount(() => , document.getElementById("app")!)
diff --git a/packages/console/app/src/entry-server.tsx b/packages/console/app/src/entry-server.tsx
new file mode 100644
index 0000000..619a192
--- /dev/null
+++ b/packages/console/app/src/entry-server.tsx
@@ -0,0 +1,37 @@
+// @refresh reload
+import { createHandler, StartServer } from "@solidjs/start/server"
+import { getRequestEvent } from "solid-js/web"
+import { dir, localeFromRequest, tag } from "~/lib/language"
+
+const criticalCSS = `[data-component="top"]{min-height:80px;display:flex;align-items:center}`
+
+export default createHandler(
+ () => (
+ {
+ const evt = getRequestEvent()
+ const locale = evt ? localeFromRequest(evt.request) : "en"
+
+ return (
+
+
+
+
+
+
+
+ {assets}
+
+
+ {children}
+ {scripts}
+
+
+ )
+ }}
+ />
+ ),
+ {
+ mode: "async",
+ },
+)
diff --git a/packages/console/app/src/global.d.ts b/packages/console/app/src/global.d.ts
new file mode 100644
index 0000000..4c2b0a1
--- /dev/null
+++ b/packages/console/app/src/global.d.ts
@@ -0,0 +1,5 @@
+///
+
+export declare module "@solidjs/start/server" {
+ export type APIEvent = { request: Request }
+}
diff --git a/packages/console/app/src/i18n/ar.ts b/packages/console/app/src/i18n/ar.ts
new file mode 100644
index 0000000..4f9ffc1
--- /dev/null
+++ b/packages/console/app/src/i18n/ar.ts
@@ -0,0 +1,814 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "الوثائق",
+ "nav.changelog": "سجل التغييرات",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "المؤسسات",
+ "nav.zen": "Zen",
+ "nav.login": "تسجيل الدخول",
+ "nav.free": "تحميل",
+ "nav.home": "الرئيسية",
+ "nav.openMenu": "فتح القائمة",
+ "nav.getStartedFree": "ابدأ مجانا",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "نسخ الشعار كـ SVG",
+ "nav.context.copyWordmark": "نسخ اسم العلامة كـ SVG",
+ "nav.context.brandAssets": "أصول العلامة التجارية",
+
+ "footer.github": "GitHub",
+ "footer.docs": "الوثائق",
+ "footer.changelog": "سجل التغييرات",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "العلامة التجارية",
+ "legal.privacy": "الخصوصية",
+ "legal.terms": "الشروط",
+
+ "email.title": "كن الأول في المعرفة عند إطلاق منتجات جديدة",
+ "email.subtitle": "انضم إلى قائمة الانتظار للحصول على وصول مبكر.",
+ "email.placeholder": "عنوان البريد الإلكتروني",
+ "email.subscribe": "اشتراك",
+ "email.success": "تبقّت خطوة واحدة: تحقق من بريدك وأكّد عنوانك",
+
+ "notFound.title": "غير موجود | opencode",
+ "notFound.heading": "404 - الصفحة غير موجودة",
+ "notFound.home": "الرئيسية",
+ "notFound.docs": "الوثائق",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "شعار opencode الفاتح",
+ "notFound.logoDarkAlt": "شعار opencode الداكن",
+
+ "user.logout": "تسجيل الخروج",
+
+ "auth.callback.error.codeMissing": "لم يتم العثور على رمز التفويض.",
+
+ "workspace.select": "اختر مساحة العمل",
+ "workspace.createNew": "+ إنشاء مساحة عمل جديدة",
+ "workspace.modal.title": "إنشاء مساحة عمل جديدة",
+ "workspace.modal.placeholder": "أدخل اسم مساحة العمل",
+
+ "common.cancel": "إلغاء",
+ "common.creating": "جارٍ الإنشاء...",
+ "common.create": "إنشاء",
+
+ "common.videoUnsupported": "متصفحك لا يدعم وسم الفيديو.",
+ "common.figure": "شكل {{n}}.",
+ "common.faq": "الأسئلة الشائعة",
+ "common.learnMore": "اعرف المزيد",
+
+ "error.invalidPlan": "خطة غير صالحة",
+ "error.workspaceRequired": "معرف مساحة العمل مطلوب",
+ "error.alreadySubscribed": "مساحة العمل هذه لديها اشتراك بالفعل",
+ "error.limitRequired": "الحد مطلوب.",
+ "error.monthlyLimitInvalid": "قم بتعيين حد شهري صالح.",
+ "error.workspaceNameRequired": "اسم مساحة العمل مطلوب.",
+ "error.nameTooLong": "يجب أن يكون الاسم 255 حرفًا أو أقل.",
+ "error.emailRequired": "البريد الإلكتروني مطلوب",
+ "error.roleRequired": "الدور مطلوب",
+ "error.idRequired": "المعرف مطلوب",
+ "error.nameRequired": "الاسم مطلوب",
+ "error.providerRequired": "المزود مطلوب",
+ "error.apiKeyRequired": "مفتاح API مطلوب",
+ "error.modelRequired": "النموذج مطلوب",
+ "error.reloadAmountMin": "يجب أن يكون مبلغ الشحن ${{amount}} على الأقل",
+ "error.reloadTriggerMin": "يجب أن يكون حد الرصيد ${{amount}} على الأقل",
+
+ "app.meta.description": "OpenCode - وكيل البرمجة مفتوح المصدر.",
+
+ "home.title": "OpenCode | وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
+
+ "temp.title": "opencode | وكيل برمجة بالذكاء الاصطناعي مبني للطرفية",
+ "temp.hero.title": "وكيل البرمجة بالذكاء الاصطناعي المبني للطرفية",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "ابدأ",
+ "temp.feature.native.title": "واجهة طرفية أصلية",
+ "temp.feature.native.body": "واجهة مستخدم طرفية سريعة الاستجابة، أصلية، وقابلة للتخصيص",
+ "temp.feature.zen.beforeLink": "قائمة",
+ "temp.feature.zen.link": "منسقة من النماذج",
+ "temp.feature.zen.afterLink": "مقدمة من opencode",
+ "temp.feature.models.beforeLink": "يدعم أكثر من 75 مزود LLM من خلال",
+ "temp.feature.models.afterLink": "، بما في ذلك النماذج المحلية",
+ "temp.screenshot.caption": "واجهة OpenCode الطرفية مع سمة tokyonight",
+ "temp.screenshot.alt": "واجهة OpenCode الطرفية بسمة tokyonight",
+ "temp.logoLightAlt": "شعار opencode الفاتح",
+ "temp.logoDarkAlt": "شعار opencode الداكن",
+
+ "home.banner.badge": "جديد",
+ "home.banner.text": "تطبيق سطح المكتب متاح بنسخة تجريبية",
+ "home.banner.platforms": "على macOS، Windows، وLinux",
+ "home.banner.downloadNow": "حمّل الآن",
+ "home.banner.downloadBetaNow": "حمّل النسخة التجريبية لتطبيق سطح المكتب الآن",
+
+ "home.hero.title": "وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
+ "home.hero.subtitle.a": "نماذج مجانية مضمّنة أو اربط أي نموذج من أي مزوّد،",
+ "home.hero.subtitle.b": "بما في ذلك Claude، GPT، Gemini وغيرها.",
+
+ "home.install.ariaLabel": "خيارات التثبيت",
+
+ "home.what.title": "ما هو OpenCode؟",
+ "home.what.body": "OpenCode وكيل مفتوح المصدر يساعدك على كتابة الكود في الطرفية، IDE، أو سطح المكتب.",
+ "home.what.lsp.title": "دعم LSP",
+ "home.what.lsp.body": "يحمّل تلقائيًا موافقات LSP المناسبة للـ LLM",
+ "home.what.multiSession.title": "جلسات متعددة",
+ "home.what.multiSession.body": "ابدأ عدة وكلاء بالتوازي على نفس المشروع",
+ "home.what.shareLinks.title": "روابط المشاركة",
+ "home.what.shareLinks.body": "شارك رابطًا لأي جلسة للرجوع إليها أو لتصحيح الأخطاء",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "سجّل الدخول بـ GitHub لاستخدام حسابك في Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "سجّل الدخول بـ OpenAI لاستخدام حسابك في ChatGPT Plus أو Pro",
+ "home.what.anyModel.title": "أي نموذج",
+ "home.what.anyModel.body": "75+ مزوّد LLM عبر Models.dev، بما في ذلك النماذج المحلية",
+ "home.what.anyEditor.title": "أي محرر",
+ "home.what.anyEditor.body": "متاح كواجهة طرفية، وتطبيق سطح مكتب، وامتداد IDE",
+ "home.what.readDocs": "اقرأ الوثائق",
+
+ "home.growth.title": "وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
+ "home.growth.body":
+ "مع أكثر من {{stars}} نجمة على GitHub، و{{contributors}} مساهمًا، وأكثر من {{commits}} Commit، يستخدم OpenCode ويثق به أكثر من {{monthlyUsers}} مطوّر كل شهر.",
+ "home.growth.githubStars": "نجوم GitHub",
+ "home.growth.contributors": "المساهمون",
+ "home.growth.monthlyDevs": "مطورون شهريًا",
+
+ "home.privacy.title": "مصمم للخصوصية أولاً",
+ "home.privacy.body": "لا يخزّن OpenCode أي كود أو بيانات سياق، ليتمكن من العمل في بيئات حساسة للخصوصية.",
+ "home.privacy.learnMore": "اعرف المزيد عن",
+ "home.privacy.link": "الخصوصية",
+
+ "home.faq.q1": "ما هو OpenCode؟",
+ "home.faq.a1":
+ "OpenCode وكيل مفتوح المصدر يساعدك على كتابة وتشغيل الكود مع أي نموذج ذكاء اصطناعي. متاح كواجهة طرفية، وتطبيق سطح مكتب، أو امتداد IDE.",
+ "home.faq.q2": "كيف أستخدم OpenCode؟",
+ "home.faq.a2.before": "أسهل طريقة للبدء هي قراءة",
+ "home.faq.a2.link": "المقدمة",
+ "home.faq.q3": "هل أحتاج لاشتراكات ذكاء اصطناعي إضافية لاستخدام OpenCode؟",
+ "home.faq.a3.p1":
+ "ليس بالضرورة، فـ OpenCode يأتي مع مجموعة من النماذج المجانية التي تستطيع استخدامها دون إنشاء حساب.",
+ "home.faq.a3.p2.beforeZen": "وبخلاف ذلك، يمكنك استخدام أي من نماذج البرمجة الشائعة بإنشاء حساب",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "مع أننا نشجّع المستخدمين على استخدام Zen، فإن OpenCode يعمل أيضًا مع كل المزودين الشائعين مثل OpenAI، Anthropic، xAI إلخ.",
+ "home.faq.a3.p4.beforeLocal": "ويمكنك أيضًا ربط",
+ "home.faq.a3.p4.localLink": "النماذج المحلية",
+ "home.faq.q4": "هل يمكنني استخدام اشتراكاتي الحالية مع OpenCode؟",
+ "home.faq.a4.p1":
+ "نعم، يدعم OpenCode خطط الاشتراك من كل المزودين الرئيسيين. يمكنك استخدام اشتراكات Claude Pro/Max، ChatGPT Plus/Pro، أو GitHub Copilot.",
+ "home.faq.q5": "هل يمكنني استخدام OpenCode في الطرفية فقط؟",
+ "home.faq.a5.beforeDesktop": "ليس بعد الآن! OpenCode متاح الآن كتطبيق لـ",
+ "home.faq.a5.desktop": "سطح المكتب",
+ "home.faq.a5.and": "و",
+ "home.faq.a5.web": "الويب",
+ "home.faq.q6": "كم تكلفة OpenCode؟",
+ "home.faq.a6":
+ "OpenCode مجاني 100% للاستخدام. كما يأتي مع مجموعة من النماذج المجانية. قد توجد تكاليف إضافية إذا ربطت مزوّدًا آخر.",
+ "home.faq.q7": "ماذا عن البيانات والخصوصية؟",
+ "home.faq.a7.p1": "لا يتم تخزين بياناتك ومعلوماتك إلا عندما تستخدم نماذجنا المجانية أو تنشئ روابط قابلة للمشاركة.",
+ "home.faq.a7.p2.beforeModels": "اعرف المزيد عن",
+ "home.faq.a7.p2.modelsLink": "نماذجنا",
+ "home.faq.a7.p2.and": "و",
+ "home.faq.a7.p2.shareLink": "صفحات المشاركة",
+ "home.faq.q8": "هل OpenCode مفتوح المصدر؟",
+ "home.faq.a8.p1": "نعم، OpenCode مفتوح المصدر بالكامل. الكود المصدري متاح علنًا على",
+ "home.faq.a8.p2": "بموجب",
+ "home.faq.a8.mitLicense": "رخصة MIT",
+ "home.faq.a8.p3":
+ "، مما يعني أن أي شخص يستطيع استخدامه أو تعديله أو المساهمة في تطويره. يمكن لأي شخص من المجتمع فتح قضايا، وتقديم طلبات سحب، وتوسيع الوظائف.",
+
+ "home.zenCta.title": "وصول لنماذج محسنة وموثوقة لوكلاء البرمجة",
+ "home.zenCta.body":
+ "يمنحك Zen الوصول إلى مجموعة مختارة بعناية من نماذج الذكاء الاصطناعي التي اختبرها OpenCode وقاس أداءها خصيصًا لوكلاء البرمجة. لا حاجة للقلق بشأن اختلاف الأداء والجودة بين المزودين، استخدم نماذج محققة تعمل بكفاءة.",
+ "home.zenCta.link": "تعرف على Zen",
+
+ "zen.title": "OpenCode Zen | مجموعة منسقة من النماذج المحسنة والموثوقة لوكلاء البرمجة",
+ "zen.hero.title": "نماذج محسنة وموثوقة لوكلاء البرمجة",
+ "zen.hero.body":
+ "يمنحك Zen الوصول إلى مجموعة منسقة من نماذج الذكاء الاصطناعي التي اختبرها OpenCode وقاس أداءها خصيصًا لوكلاء البرمجة. لا حاجة للقلق بشأن اختلاف الأداء والجودة، استخدم نماذج محققة تعمل بكفاءة.",
+
+ "zen.faq.q1": "ما هو OpenCode Zen؟",
+ "zen.faq.a1":
+ "Zen هو مجموعة منسقة من نماذج الذكاء الاصطناعي التي تم اختبارها وقياس أدائها لوكلاء البرمجة، أنشأها الفريق المطور لـ OpenCode.",
+ "zen.faq.q2": "ما الذي يجعل Zen أكثر دقة؟",
+ "zen.faq.a2":
+ "يوفر Zen فقط النماذج التي تم اختبارها وقياس أدائها خصيصًا لوكلاء البرمجة. لن تستخدم سكين زبدة لقطع شريحة لحم، فلا تستخدم نماذج ضعيفة للبرمجة.",
+ "zen.faq.q3": "هل Zen أرخص؟",
+ "zen.faq.a3":
+ "Zen ليس للربح. يمرر Zen التكاليف من مزودي النماذج إليك مباشرة. كلما زاد استخدام Zen، تمكن OpenCode من التفاوض على أسعار أفضل وتمريرها إليك.",
+ "zen.faq.q4": "كم تكلفة Zen؟",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "يحاسب لكل طلب",
+ "zen.faq.a4.p1.afterPricing": "بدون أي هوامش ربح، لذا تدفع بالضبط ما يفرضه مزود النموذج.",
+ "zen.faq.a4.p2.beforeAccount": "تعتمد تكلفتك الإجمالية على الاستخدام، ويمكنك تعيين حدود إنفاق شهرية في",
+ "zen.faq.a4.p2.accountLink": "حسابك",
+ "zen.faq.a4.p3":
+ "لتغطية التكاليف، يضيف OpenCode فقط رسومًا صغيرة لمعالجة الدفع قدرها 1.23 دولار لكل إعادة شحن رصيد بقيمة 20 دولارًا.",
+ "zen.faq.q5": "ماذا عن البيانات والخصوصية؟",
+ "zen.faq.a5.beforeExceptions":
+ "تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
+ "zen.faq.a5.exceptionsLink": "الاستثناءات التالية",
+ "zen.faq.q6": "هل يمكنني تعيين حدود للإنفاق؟",
+ "zen.faq.a6": "نعم، يمكنك تعيين حدود إنفاق شهرية في حسابك.",
+ "zen.faq.q7": "هل يمكنني الإلغاء؟",
+ "zen.faq.a7": "نعم، يمكنك تعطيل الفوترة في أي وقت واستخدام رصيدك المتبقي.",
+ "zen.faq.q8": "هل يمكنني استخدام Zen مع وكلاء برمجة آخرين؟",
+ "zen.faq.a8":
+ "بينما يعمل Zen بشكل رائع مع OpenCode، يمكنك استخدام Zen مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.",
+
+ "zen.cta.start": "ابدأ مع Zen",
+ "zen.pricing.title": "أضف رصيد 20 دولار (دفع حسب الاستخدام)",
+ "zen.pricing.fee": "(+1.23 دولار رسوم معالجة البطاقة)",
+ "zen.pricing.body": "استخدمه مع أي وكيل. عيّن حدود الإنفاق الشهري. ألغِ في أي وقت.",
+ "zen.problem.title": "ما المشكلة التي يحلها Zen؟",
+ "zen.problem.body":
+ "هناك العديد من النماذج المتاحة، ولكن القليل منها فقط يعمل بشكل جيد مع وكلاء البرمجة. يقوم معظم مقدمي الخدمة بتكوينها بشكل مختلف مما يعطي نتائج متفاوتة.",
+ "zen.problem.subtitle": "نحن نعمل على إصلاح هذا للجميع، وليس فقط لمستخدمي OpenCode.",
+ "zen.problem.item1": "اختبار نماذج مختارة واستشارة فرقها",
+ "zen.problem.item2": "العمل مع مقدمي الخدمة لضمان تسليمها بشكل صحيح",
+ "zen.problem.item3": "قياس أداء جميع مجموعات النماذج والمزودين التي نوصي بها",
+ "zen.how.title": "كيف يعمل Zen",
+ "zen.how.body": "بينما نقترح عليك استخدام Zen مع OpenCode، يمكنك استخدام Zen مع أي وكيل.",
+ "zen.how.step1.title": "سجّل وأضف رصيدًا بقيمة 20 دولارًا",
+ "zen.how.step1.beforeLink": "اتبع",
+ "zen.how.step1.link": "تعليمات الإعداد",
+ "zen.how.step2.title": "استخدم Zen بتسعير شفاف",
+ "zen.how.step2.link": "ادفع لكل طلب",
+ "zen.how.step2.afterLink": "بدون أي هوامش ربح",
+ "zen.how.step3.title": "شحن تلقائي",
+ "zen.how.step3.body": "عندما يصل رصيدك إلى 5 دولارات، سنضيف تلقائيًا 20 دولارًا",
+ "zen.privacy.title": "خصوصيتك مهمة بالنسبة لنا",
+ "zen.privacy.beforeExceptions":
+ "تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
+ "zen.privacy.exceptionsLink": "الاستثناءات التالية",
+
+ "go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع",
+ "go.meta.description":
+ "يبدأ Go من $5 للشهر الأول، ثم $10/شهر، مع حدود طلب سخية لمدة 5 ساعات لـ GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash.",
+ "go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع",
+ "go.hero.body":
+ "يجلب Go البرمجة الوكيلة للمبرمجين حول العالم. يوفر حدودًا سخية ووصولًا موثوقًا إلى أقوى النماذج مفتوحة المصدر، حتى تتمكن من البناء باستخدام وكلاء أقوياء دون القلق بشأن التكلفة أو التوفر.",
+
+ "go.cta.start": "اشترك في Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "اشترك في Go",
+ "go.cta.price": "$10/شهر",
+ "go.cta.promo": "$5 للشهر الأول",
+ "go.pricing.body":
+ "استخدمه مع أي وكيل. $5 للشهر الأول، ثم $10/شهر. قم بزيادة الرصيد إذا لزم الأمر. الإلغاء في أي وقت.",
+ "go.graph.free": "مجاني",
+ "go.graph.freePill": "Big Pickle ونماذج مجانية",
+ "go.graph.go": "Go",
+ "go.graph.label": "الطلبات كل 5 ساعات",
+ "go.graph.usageLimits": "حدود الاستخدام",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "الطلبات كل 5 ساعات: {{free}} مقابل {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "الرئيس التنفيذي السابق، منتجات Terminal",
+ "go.testimonials.dax.quoteAfter": "كان تغييرًا جذريًا في الحياة، إنه قرار لا يحتاج لتفكير.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "مؤسس سابق، SEED، PM، Melt، Pop، Dapt، Cadmus، وViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 من كل 5 أشخاص في فريقنا يحبون استخدام",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "بطل سابق، AWS",
+ "go.testimonials.adam.quoteBefore": "لا أستطيع التوصية بـ",
+ "go.testimonials.adam.quoteAfter": "بما فيه الكفاية. بجدية، إنه جيد حقًا.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "رئيس التصميم السابق، Laravel",
+ "go.testimonials.david.quoteBefore": "مع",
+ "go.testimonials.david.quoteAfter": "أعلم أن جميع النماذج مختبرة ومثالية لوكلاء البرمجة.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "متدرب سابق، Nvidia (4 مرات)",
+ "go.testimonials.frank.quote": "أتمنى لو كنت لا أزال في Nvidia.",
+ "go.problem.title": "ما المشكلة التي يحلها Go؟",
+ "go.problem.body":
+ "نحن نركز على تقديم تجربة OpenCode لأكبر عدد ممكن من الناس. OpenCode Go هو اشتراك منخفض التكلفة: $5 للشهر الأول، ثم $10/شهر. يوفر حدودا سخية ووصولا موثوقا إلى نماذج المصدر المفتوح الأكثر قدرة.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "أسعار اشتراك منخفضة التكلفة",
+ "go.problem.item2": "حدود سخية ووصول موثوق",
+ "go.problem.item3": "مصمم لأكبر عدد ممكن من المبرمجين",
+ "go.problem.item4":
+ "يتضمن GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash",
+ "go.how.title": "كيف يعمل Go",
+ "go.how.body": "يبدأ Go من $5 للشهر الأول، ثم $10/شهر. يمكنك استخدامه مع OpenCode أو أي وكيل.",
+ "go.how.step1.title": "أنشئ حسابًا",
+ "go.how.step1.beforeLink": "اتبع",
+ "go.how.step1.link": "تعليمات الإعداد",
+ "go.how.step2.title": "اشترك في Go",
+ "go.how.step2.link": "$5 للشهر الأول",
+ "go.how.step2.afterLink": "ثم $10/شهر مع حدود سخية",
+ "go.how.step3.title": "ابدأ البرمجة",
+ "go.how.step3.body": "مع وصول موثوق لنماذج مفتوحة المصدر",
+ "go.privacy.title": "خصوصيتك مهمة بالنسبة لنا",
+ "go.privacy.body":
+ "تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر.",
+ "go.privacy.contactAfter": "إذا كان لديك أي أسئلة.",
+ "go.privacy.beforeExceptions":
+ "تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
+ "go.privacy.exceptionsLink": "الاستثناءات التالية",
+ "go.faq.q1": "ما هو OpenCode Go؟",
+ "go.faq.a1": "Go هو اشتراك منخفض التكلفة يمنحك وصولًا موثوقًا إلى نماذج مفتوحة المصدر قادرة على البرمجة الوكيلة.",
+ "go.faq.q2": "ما النماذج التي يتضمنها Go؟",
+ "go.faq.a2": "يتضمن Go النماذج المدرجة أدناه، مع حدود سخية وإتاحة موثوقة.",
+ "go.faq.q3": "هل Go هو نفسه Zen؟",
+ "go.faq.a3":
+ "لا. Zen هو الدفع حسب الاستخدام، بينما يبدأ Go من $5 للشهر الأول، ثم $10/شهر، مع حدود سخية ووصول موثوق إلى نماذج المصدر المفتوح GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash.",
+ "go.faq.q4": "كم تكلفة Go؟",
+ "go.faq.a4.p1.beforePricing": "تكلفة Go",
+ "go.faq.a4.p1.pricingLink": "$5 للشهر الأول",
+ "go.faq.a4.p1.afterPricing": "ثم $10/شهر مع حدود سخية.",
+ "go.faq.a4.p2.beforeAccount": "يمكنك إدارة اشتراكك في",
+ "go.faq.a4.p2.accountLink": "حسابك",
+ "go.faq.a4.p3": "ألغِ في أي وقت.",
+ "go.faq.q5": "ماذا عن البيانات والخصوصية؟",
+ "go.faq.a5.body":
+ "تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر. يتبع مزودونا سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج.",
+ "go.faq.a5.beforeExceptions":
+ "تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
+ "go.faq.a5.exceptionsLink": "الاستثناءات التالية",
+ "go.faq.q6": "هل يمكنني شحن رصيد إضافي؟",
+ "go.faq.a6": "إذا كنت بحاجة إلى مزيد من الاستخدام، يمكنك شحن رصيد في حسابك.",
+ "go.faq.q7": "هل يمكنني الإلغاء؟",
+ "go.faq.a7": "نعم، يمكنك الإلغاء في أي وقت.",
+ "go.faq.q8": "هل يمكنني استخدام Go مع وكلاء برمجة آخرين؟",
+ "go.faq.a8": "نعم، يمكنك استخدام Go مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.",
+
+ "go.faq.q9": "ما الفرق بين النماذج المجانية وGo؟",
+ "go.faq.a9":
+ "تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة 200 طلب/يوم. يتضمن Go نماذج GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash مع حصص طلبات أعلى مطبقة عبر نوافذ متجددة (5 ساعات، أسبوعيًا، وشهريًا)، تعادل تقريبًا 12 دولارًا كل 5 ساعات، و30 دولارًا في الأسبوع، و60 دولارًا في الشهر (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).",
+
+ "zen.api.error.rateLimitExceeded": "تم تجاوز حد الطلبات. يرجى المحاولة مرة أخرى لاحقًا.",
+ "zen.api.error.modelNotSupported": "النموذج {{model}} غير مدعوم",
+ "zen.api.error.modelFormatNotSupported": "النموذج {{model}} غير مدعوم للتنسيق {{format}}",
+ "zen.api.error.noProviderAvailable": "لا يوجد مزود متاح",
+ "zen.api.error.providerNotSupported": "المزود {{provider}} غير مدعوم",
+ "zen.api.error.missingApiKey": "مفتاح API مفقود.",
+ "zen.api.error.invalidApiKey": "مفتاح API غير صالح.",
+ "zen.api.error.subscriptionQuotaExceeded": "تم تجاوز حصة الاشتراك. أعد المحاولة خلال {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "تم الوصول إلى حد الاستخدام لمدة 5 ساعات. تتم إعادة التعيين خلال {{retryIn}}. لمواصلة استخدام هذا النموذج الآن، فعّل الاستخدام من رصيدك المتاح: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "تم الوصول إلى حد الاستخدام الأسبوعي. تتم إعادة التعيين خلال {{retryIn}}. لمواصلة استخدام هذا النموذج الآن، فعّل الاستخدام من رصيدك المتاح: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "تم الوصول إلى حد الاستخدام الشهري. تتم إعادة التعيين خلال {{retryIn}}. لمواصلة استخدام هذا النموذج الآن، فعّل الاستخدام من رصيدك المتاح: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "لا توجد طريقة دفع. أضف طريقة دفع هنا: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "رصيد غير كاف. إدارة فواتيرك هنا: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "وصلت مساحة العمل الخاصة بك إلى حد الإنفاق الشهري البالغ ${{amount}}. إدارة حدودك هنا: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "لقد وصلت إلى حد الإنفاق الشهري البالغ ${{amount}}. إدارة حدودك هنا: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "النموذج معطل",
+ "zen.api.error.trialEnded":
+ "انتهى العرض المجاني لـ {{model}}. يمكنك مواصلة استخدام النموذج بالاشتراك في OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | الوصول إلى أفضل نماذج البرمجة في العالم",
+ "black.meta.description": "احصل على وصول إلى Claude، GPT، Gemini والمزيد مع خطط اشتراك OpenCode Black.",
+ "black.hero.title": "الوصول إلى أفضل نماذج البرمجة في العالم",
+ "black.hero.subtitle": "بما في ذلك Claude، GPT، Gemini والمزيد",
+ "black.title": "OpenCode Black | الأسعار",
+ "black.paused": "التسجيل في خطة Black متوقف مؤقتًا.",
+ "black.plan.icon20": "خطة Black 20",
+ "black.plan.icon100": "خطة Black 100",
+ "black.plan.icon200": "خطة Black 200",
+ "black.plan.multiplier100": "استخدام أكثر بـ 5 أضعاف من Black 20",
+ "black.plan.multiplier200": "استخدام أكثر بـ 20 ضعفًا من Black 20",
+ "black.price.perMonth": "شهريًا",
+ "black.price.perPersonBilledMonthly": "للشخص الواحد، يُفوتر شهريًا",
+ "black.terms.1": "لن يبدأ اشتراكك على الفور",
+ "black.terms.2": "ستتم إضافتك إلى قائمة الانتظار وتفعيلك قريبًا",
+ "black.terms.3": "لن يتم خصم المبلغ من بطاقتك إلا عند تفعيل اشتراكك",
+ "black.terms.4": "تطبق حدود الاستخدام، وقد يصل الاستخدام المؤتمت بكثافة إلى الحدود بشكل أسرع",
+ "black.terms.5": "الاشتراكات للأفراد، تواصل مع قسم المؤسسات للفرق",
+ "black.terms.6": "قد يتم تعديل الحدود وقد يتم إيقاف الخطط في المستقبل",
+ "black.terms.7": "ألغِ اشتراكك في أي وقت",
+ "black.action.continue": "متابعة",
+ "black.finePrint.beforeTerms": "الأسعار المعروضة لا تشمل الضرائب المطبقة",
+ "black.finePrint.terms": "شروط الخدمة",
+ "black.workspace.title": "OpenCode Black | اختر مساحة العمل",
+ "black.workspace.selectPlan": "اختر مساحة عمل لهذه الخطة",
+ "black.workspace.name": "مساحة العمل {{n}}",
+ "black.subscribe.title": "اشترك في OpenCode Black",
+ "black.subscribe.paymentMethod": "طريقة الدفع",
+ "black.subscribe.loadingPaymentForm": "جارٍ تحميل نموذج الدفع...",
+ "black.subscribe.selectWorkspaceToContinue": "اختر مساحة عمل للمتابعة",
+ "black.subscribe.failurePrefix": "أوه لا!",
+ "black.subscribe.error.generic": "حدث خطأ",
+ "black.subscribe.error.invalidPlan": "خطة غير صالحة",
+ "black.subscribe.error.workspaceRequired": "معرف مساحة العمل مطلوب",
+ "black.subscribe.error.alreadySubscribed": "مساحة العمل هذه لديها اشتراك بالفعل",
+ "black.subscribe.processing": "جارٍ المعالجة...",
+ "black.subscribe.submit": "اشترك بمبلغ ${{plan}}",
+ "black.subscribe.form.chargeNotice": "لن يتم خصم المبلغ إلا عند تفعيل اشتراكك",
+ "black.subscribe.success.title": "أنت في قائمة انتظار OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "خطة الاشتراك",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "المبلغ",
+ "black.subscribe.success.amountValue": "${{plan}} شهريًا",
+ "black.subscribe.success.paymentMethod": "طريقة الدفع",
+ "black.subscribe.success.dateJoined": "تاريخ الانضمام",
+ "black.subscribe.success.chargeNotice": "سيتم خصم المبلغ من بطاقتك عند تفعيل اشتراكك",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "الاستخدام",
+ "workspace.nav.apiKeys": "مفاتيح API",
+ "workspace.nav.members": "الأعضاء",
+ "workspace.nav.billing": "الفوترة",
+ "workspace.nav.settings": "الإعدادات",
+
+ "workspace.home.banner.beforeLink": "نماذج محسنة وموثوقة لوكلاء البرمجة.",
+ "workspace.lite.banner.beforeLink": "نماذج برمجة منخفضة التكلفة للجميع.",
+ "workspace.home.billing.loading": "جارٍ التحميل...",
+ "workspace.home.billing.enable": "تمكين الفوترة",
+ "workspace.home.billing.currentBalance": "الرصيد الحالي",
+
+ "workspace.newUser.feature.tested.title": "نماذج مُختبرة ومحققة",
+ "workspace.newUser.feature.tested.body": "لقد قمنا بقياس واختبار النماذج خصيصًا لوكلاء البرمجة لضمان أفضل أداء.",
+ "workspace.newUser.feature.quality.title": "أعلى جودة",
+ "workspace.newUser.feature.quality.body":
+ "الوصول إلى النماذج التي تم تكوينها لتحقيق الأداء الأمثل - لا تقليل للجودة أو توجيه إلى موفري خدمة أرخص.",
+ "workspace.newUser.feature.lockin.title": "لا قيود على المزود",
+ "workspace.newUser.feature.lockin.body":
+ "استخدم Zen مع أي وكيل برمجة، واستمر في استخدام موفرين آخرين مع opencode وقتما تشاء.",
+ "workspace.newUser.copyApiKey": "نسخ مفتاح API",
+ "workspace.newUser.copyKey": "نسخ المفتاح",
+ "workspace.newUser.copied": "تم النسخ!",
+ "workspace.newUser.step.enableBilling": "تمكين الفوترة",
+ "workspace.newUser.step.login.before": "شغّل",
+ "workspace.newUser.step.login.after": "واختر opencode",
+ "workspace.newUser.step.pasteKey": "الصق مفتاح API الخاص بك",
+ "workspace.newUser.step.models.before": "ابدأ opencode ثم نفّذ",
+ "workspace.newUser.step.models.after": "لاختيار نموذج",
+
+ "workspace.models.title": "النماذج",
+ "workspace.models.subtitle.beforeLink": "إدارة النماذج التي يمكن لأعضاء مساحة العمل الوصول إليها.",
+ "workspace.models.table.model": "النموذج",
+ "workspace.models.table.enabled": "ممكّن",
+
+ "workspace.providers.title": "أحضر مفتاحك الخاص",
+ "workspace.providers.subtitle": "قم بتكوين مفاتيح API الخاصة بك من موفري الذكاء الاصطناعي.",
+ "workspace.providers.placeholder": "أدخل مفتاح API لـ {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "تكوين",
+ "workspace.providers.edit": "تعديل",
+ "workspace.providers.delete": "حذف",
+ "workspace.providers.saving": "جارٍ الحفظ...",
+ "workspace.providers.save": "حفظ",
+ "workspace.providers.table.provider": "المزود",
+ "workspace.providers.table.apiKey": "مفتاح API",
+
+ "workspace.usage.title": "تاريخ الاستخدام",
+ "workspace.usage.subtitle": "استخدام وتكاليف API الأخيرة.",
+ "workspace.usage.empty": "قم بإجراء أول استدعاء API للبدء.",
+ "workspace.usage.table.date": "التاريخ",
+ "workspace.usage.table.model": "النموذج",
+ "workspace.usage.table.input": "الدخل",
+ "workspace.usage.table.output": "الخرج",
+ "workspace.usage.table.cost": "التكلفة",
+ "workspace.usage.table.session": "الجلسة",
+ "workspace.usage.breakdown.input": "الدخل",
+ "workspace.usage.breakdown.cacheRead": "قراءة الكاش",
+ "workspace.usage.breakdown.cacheWrite": "كتابة الكاش",
+ "workspace.usage.breakdown.output": "الخرج",
+ "workspace.usage.breakdown.reasoning": "المنطق",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "التكلفة",
+ "workspace.cost.subtitle": "تكاليف الاستخدام مقسمة حسب النموذج.",
+ "workspace.cost.allModels": "جميع النماذج",
+ "workspace.cost.allKeys": "جميع المفاتيح",
+ "workspace.cost.deletedSuffix": "(محذوف)",
+ "workspace.cost.empty": "لا توجد بيانات استخدام متاحة للفترة المحددة.",
+ "workspace.cost.subscriptionShort": "اشتراك",
+
+ "workspace.keys.title": "مفاتيح API",
+ "workspace.keys.subtitle": "إدارة مفاتيح API الخاصة بك للوصول إلى خدمات opencode.",
+ "workspace.keys.create": "إنشاء مفتاح API",
+ "workspace.keys.placeholder": "أدخل اسم المفتاح",
+ "workspace.keys.empty": "أنشئ مفتاح API لبوابة opencode",
+ "workspace.keys.table.name": "الاسم",
+ "workspace.keys.table.key": "المفتاح",
+ "workspace.keys.table.createdBy": "تم الإنشاء بواسطة",
+ "workspace.keys.table.lastUsed": "آخر استخدام",
+ "workspace.keys.copyApiKey": "نسخ مفتاح API",
+ "workspace.keys.delete": "حذف",
+
+ "workspace.members.title": "الأعضاء",
+ "workspace.members.subtitle": "إدارة أعضاء مساحة العمل وأذوناتهم.",
+ "workspace.members.invite": "دعوة عضو",
+ "workspace.members.inviting": "جارٍ الدعوة...",
+ "workspace.members.beta.beforeLink": "مساحات العمل مجانية للفرق أثناء الفترة التجريبية.",
+ "workspace.members.form.invitee": "المدعو",
+ "workspace.members.form.emailPlaceholder": "أدخل البريد الإلكتروني",
+ "workspace.members.form.role": "الدور",
+ "workspace.members.form.monthlyLimit": "حد الإنفاق الشهري",
+ "workspace.members.noLimit": "لا يوجد حد",
+ "workspace.members.noLimitLowercase": "لا يوجد حد",
+ "workspace.members.invited": "تمت دعوته",
+ "workspace.members.edit": "تعديل",
+ "workspace.members.delete": "حذف",
+ "workspace.members.saving": "جارٍ الحفظ...",
+ "workspace.members.save": "حفظ",
+ "workspace.members.table.email": "البريد الإلكتروني",
+ "workspace.members.table.role": "الدور",
+ "workspace.members.table.monthLimit": "الحد الشهري",
+ "workspace.members.role.admin": "مسؤول",
+ "workspace.members.role.adminDescription": "يمكنه إدارة النماذج، والأعضاء، والفوترة",
+ "workspace.members.role.member": "عضو",
+ "workspace.members.role.memberDescription": "يمكنه فقط إنشاء مفاتيح API لنفسه",
+
+ "workspace.settings.title": "الإعدادات",
+ "workspace.settings.subtitle": "حدّث اسم مساحة العمل وتفضيلاتك.",
+ "workspace.settings.workspaceName": "اسم مساحة العمل",
+ "workspace.settings.defaultName": "افتراضي",
+ "workspace.settings.updating": "جارٍ التحديث...",
+ "workspace.settings.save": "حفظ",
+ "workspace.settings.edit": "تعديل",
+
+ "workspace.billing.title": "الفوترة",
+ "workspace.billing.subtitle.beforeLink": "إدارة طرق الدفع.",
+ "workspace.billing.contactUs": "اتصل بنا",
+ "workspace.billing.subtitle.afterLink": "إذا كان لديك أي أسئلة.",
+ "workspace.billing.currentBalance": "الرصيد الحالي",
+ "workspace.billing.add": "أضف $",
+ "workspace.billing.enterAmount": "أدخل المبلغ",
+ "workspace.billing.loading": "جارٍ التحميل...",
+ "workspace.billing.addAction": "إضافة",
+ "workspace.billing.addBalance": "إضافة رصيد",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "مرتبط بـ Stripe",
+ "workspace.billing.manage": "إدارة",
+ "workspace.billing.enable": "تمكين الفوترة",
+
+ "workspace.monthlyLimit.title": "الحد الشهري",
+ "workspace.monthlyLimit.subtitle": "عيّن حد الاستخدام الشهري لحسابك.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "جارٍ التعيين...",
+ "workspace.monthlyLimit.set": "تعيين",
+ "workspace.monthlyLimit.edit": "تعديل الحد",
+ "workspace.monthlyLimit.noLimit": "لم يتم تعيين حد للاستخدام.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "الاستخدام الحالي لـ",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "هو $",
+
+ "workspace.redeem.title": "استرداد قسيمة",
+ "workspace.redeem.subtitle": "استرد رمز القسيمة للحصول على رصيد أو مزايا.",
+ "workspace.redeem.placeholder": "أدخل رمز القسيمة",
+ "workspace.redeem.redeem": "استرداد",
+ "workspace.redeem.redeeming": "جارٍ الاسترداد...",
+ "workspace.redeem.success": "تم استرداد القسيمة بنجاح.",
+
+ "workspace.reload.title": "إعادة الشحن التلقائي",
+ "workspace.reload.disabled.before": "إعادة الشحن التلقائي",
+ "workspace.reload.disabled.state": "معطّل",
+ "workspace.reload.disabled.after": "فعّلها لإعادة شحن الرصيد تلقائيًا عندما ينخفض.",
+ "workspace.reload.enabled.before": "إعادة الشحن التلقائي",
+ "workspace.reload.enabled.state": "ممكّن",
+ "workspace.reload.enabled.middle": "سنعيد شحن رصيدك بمبلغ",
+ "workspace.reload.processingFee": "رسوم معالجة",
+ "workspace.reload.enabled.after": "عندما يصل الرصيد إلى",
+ "workspace.reload.edit": "تعديل",
+ "workspace.reload.enable": "تفعيل",
+ "workspace.reload.enableAutoReload": "تفعيل إعادة الشحن التلقائي",
+ "workspace.reload.reloadAmount": "مبلغ الشحن $",
+ "workspace.reload.whenBalanceReaches": "عندما يصل الرصيد إلى $",
+ "workspace.reload.saving": "جارٍ الحفظ...",
+ "workspace.reload.save": "حفظ",
+ "workspace.reload.failedAt": "فشلت إعادة الشحن في",
+ "workspace.reload.reason": "السبب:",
+ "workspace.reload.updatePaymentMethod": "يرجى تحديث طريقة الدفع والمحاولة مرة أخرى.",
+ "workspace.reload.retrying": "جارٍ إعادة المحاولة...",
+ "workspace.reload.retry": "أعد المحاولة",
+ "workspace.reload.error.paymentFailed": "فشلت عملية الدفع.",
+
+ "workspace.payments.title": "سجل المدفوعات",
+ "workspace.payments.subtitle": "معاملات الدفع الأخيرة.",
+ "workspace.payments.table.date": "التاريخ",
+ "workspace.payments.table.paymentId": "معرف الدفع",
+ "workspace.payments.table.amount": "المبلغ",
+ "workspace.payments.table.receipt": "الإيصال",
+ "workspace.payments.type.credit": "رصيد",
+ "workspace.payments.type.subscription": "اشتراك",
+ "workspace.payments.view": "عرض",
+
+ "workspace.black.loading": "جارٍ التحميل...",
+ "workspace.black.time.day": "يوم",
+ "workspace.black.time.days": "أيام",
+ "workspace.black.time.hour": "ساعة",
+ "workspace.black.time.hours": "ساعات",
+ "workspace.black.time.minute": "دقيقة",
+ "workspace.black.time.minutes": "دقائق",
+ "workspace.black.time.fewSeconds": "بضع ثوان",
+ "workspace.black.subscription.title": "الاشتراك",
+ "workspace.black.subscription.message": "أنت مشترك في OpenCode Black مقابل ${{plan}} شهريًا.",
+ "workspace.black.subscription.manage": "إدارة الاشتراك",
+ "workspace.black.subscription.rollingUsage": "استخدام لمدة 5 ساعات",
+ "workspace.black.subscription.weeklyUsage": "الاستخدام الأسبوعي",
+ "workspace.black.subscription.resetsIn": "إعادة تعيين في",
+ "workspace.black.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام",
+ "workspace.black.waitlist.title": "قائمة الانتظار",
+ "workspace.black.waitlist.joined": "أنت في قائمة الانتظار لخطة OpenCode Black بقيمة ${{plan}} شهريًا.",
+ "workspace.black.waitlist.ready": "نحن مستعدون لتسجيلك في خطة OpenCode Black بقيمة ${{plan}} شهريًا.",
+ "workspace.black.waitlist.leave": "ترك قائمة الانتظار",
+ "workspace.black.waitlist.leaving": "جارٍ المغادرة...",
+ "workspace.black.waitlist.left": "غادر",
+ "workspace.black.waitlist.enroll": "تسجيل",
+ "workspace.black.waitlist.enrolling": "جارٍ التسجيل...",
+ "workspace.black.waitlist.enrolled": "مسجل",
+ "workspace.black.waitlist.enrollNote": 'عند النقر فوق "تسجيل"، يبدأ اشتراكك على الفور وسيتم خصم الرسوم من بطاقتك.',
+
+ "workspace.lite.loading": "جارٍ التحميل...",
+ "workspace.lite.time.day": "يوم",
+ "workspace.lite.time.days": "أيام",
+ "workspace.lite.time.hour": "ساعة",
+ "workspace.lite.time.hours": "ساعات",
+ "workspace.lite.time.minute": "دقيقة",
+ "workspace.lite.time.minutes": "دقائق",
+ "workspace.lite.time.fewSeconds": "بضع ثوان",
+ "workspace.lite.subscription.message": "أنت مشترك في OpenCode Go.",
+ "workspace.lite.subscription.manage": "إدارة الاشتراك",
+ "workspace.lite.subscription.rollingUsage": "الاستخدام المتجدد",
+ "workspace.lite.subscription.weeklyUsage": "الاستخدام الأسبوعي",
+ "workspace.lite.subscription.monthlyUsage": "الاستخدام الشهري",
+ "workspace.lite.subscription.resetsIn": "إعادة تعيين في",
+ "workspace.lite.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام",
+ "workspace.lite.subscription.selectProvider":
+ 'اختر "OpenCode Go" كمزود في إعدادات opencode الخاصة بك لاستخدام نماذج Go.',
+ "workspace.lite.black.message":
+ "أنت مشترك حاليًا في OpenCode Black أو في قائمة الانتظار. يرجى إلغاء الاشتراك أولاً إذا كنت ترغب في التبديل إلى Go.",
+ "workspace.lite.other.message":
+ "عضو آخر في مساحة العمل هذه مشترك بالفعل في OpenCode Go. يمكن لعضو واحد فقط لكل مساحة عمل الاشتراك.",
+ "workspace.lite.promo.description":
+ "يبدأ OpenCode Go بسعر {{price}}، ثم $10/شهر، ويوفر وصولا موثوقا لنماذج البرمجة المفتوحة الشهيرة مع حدود استخدام سخية.",
+ "workspace.lite.promo.price": "$5 للشهر الأول",
+ "workspace.lite.promo.modelsTitle": "ما يتضمنه",
+ "workspace.lite.promo.footer":
+ "تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر. قد تتغير الأسعار وحدود الاستخدام بناءً على تعلمنا من الاستخدام المبكر والملاحظات.",
+ "workspace.lite.promo.subscribe": "الاشتراك في Go",
+ "workspace.lite.promo.subscribing": "جارٍ إعادة التوجيه...",
+ "workspace.lite.promo.otherMethods": "طرق دفع أخرى",
+ "workspace.lite.promo.selectMethod": "اختر طريقة الدفع",
+
+ "workspace.referral.copyLink": "نسخ الرابط",
+ "workspace.referral.copied": "تم النسخ",
+ "workspace.referral.overview.title": "ادعُ أصدقاءك",
+ "workspace.referral.overview.subtitle": "احصل على $5 عند اشتراك صديق. وسيحصل هو أيضًا على $5.",
+ "workspace.referral.instructions.share": "شارك رابط الإحالة الخاص بك",
+ "workspace.referral.instructions.subscribe": "ينضم صديقك ويشترك في Go",
+ "workspace.referral.instructions.claim": "تحصلان كلاكما على رصيد استخدام بقيمة $5 لتطبيقه على حدود استخدام Go",
+ "workspace.referral.rewards.title": "مكافآت الإحالة",
+ "workspace.referral.rewards.description": "طبّق أرصدة الإحالة المتاحة على استخدامك لـ Go.",
+ "workspace.referral.rewards.subtitle": "تم تطبيق {{applied}} / {{total}} من المكافآت.",
+ "workspace.referral.rewards.empty": "لا توجد مكافآت إحالة بعد.",
+ "workspace.referral.table.reward": "المكافأة",
+ "workspace.referral.table.referral": "الوصف",
+ "workspace.referral.table.date": "التاريخ",
+ "workspace.referral.reward.description.inviter": "تمت دعوة {{email}}",
+ "workspace.referral.reward.description.invitee": "تمت دعوتك بواسطة {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "اشترك لإلغاء القفل",
+ "workspace.referral.reward.action.view": "عرض المكافأة",
+ "workspace.referral.reward.action.applied": "تم تطبيق المكافأة",
+ "workspace.referral.reward.source.pendingInviter": "بانتظار اشتراكه",
+ "workspace.referral.reward.source.pendingInvitee": "اشترك لإلغاء قفل المكافأة",
+ "workspace.referral.reward.source.available": "المكافأة جاهزة للتطبيق",
+ "workspace.referral.reward.source.applied": "تم تطبيق المكافأة",
+ "workspace.referral.reward.status.applied": "تم تطبيق المكافأة",
+ "workspace.referral.reward.status.pendingInviter": "اشترك لإلغاء القفل",
+ "workspace.referral.reward.status.pendingInvitee": "اشترك لإلغاء القفل",
+ "workspace.referral.apply.noGo": "اشترك لإلغاء القفل",
+ "workspace.referral.apply.preview": "عرض المكافأة",
+ "workspace.referral.apply.action": "تطبيق",
+ "workspace.referral.apply.confirmTitle": "تطبيق المكافأة",
+ "workspace.referral.apply.confirmBody": "طبِّق {{amount}} لتقليل الاستخدام الحالي في مساحة العمل هذه.",
+ "workspace.referral.apply.confirmAction": "تطبيق",
+
+ "download.title": "OpenCode | تنزيل",
+ "download.meta.description": "نزّل OpenCode لـ macOS، Windows، وLinux",
+ "download.hero.title": "تنزيل OpenCode",
+ "download.hero.subtitle": "متاح في نسخة تجريبية لـ macOS، Windows، وLinux",
+ "download.hero.button": "تنزيل لـ {{os}}",
+ "download.section.terminal": "OpenCode للطرفية",
+ "download.section.desktop": "OpenCode لسطح المكتب (Beta)",
+ "download.section.extensions": "امتدادات OpenCode",
+ "download.section.integrations": "تكاملات OpenCode",
+ "download.action.download": "تنزيل",
+ "download.action.install": "تثبيت",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "ليس بالضرورة، ولكن على الأرجح. ستحتاج إلى اشتراك ذكاء اصطناعي إذا كنت تريد ربط OpenCode بمزوّد مدفوع، رغم أنه يمكنك العمل مع",
+ "download.faq.a3.localLink": "النماذج المحلية",
+ "download.faq.a3.afterLocal.beforeZen": "مجانًا. بينما نشجع المستخدمين على استخدام",
+ "download.faq.a3.afterZen": "، فإن OpenCode يعمل مع جميع المزودين الشائعين مثل OpenAI، Anthropic، xAI إلخ.",
+
+ "download.faq.a5.p1": "OpenCode مجاني 100% للاستخدام.",
+ "download.faq.a5.p2.beforeZen":
+ "أي تكاليف إضافية ستأتي من اشتراكك لدى مزود النماذج. بينما يعمل OpenCode مع أي مزود نماذج، نوصي باستخدام",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "يتم حفظ بياناتك ومعلوماتك فقط عند إنشاء روابط قابلة للمشاركة في OpenCode.",
+ "download.faq.a6.p2.beforeShare": "اعرف المزيد عن",
+ "download.faq.a6.shareLink": "صفحات المشاركة",
+
+ "enterprise.title": "OpenCode | حلول المؤسسات لمنظمتك",
+ "enterprise.meta.description": "تواصل مع OpenCode لحلول المؤسسات",
+ "enterprise.hero.title": "كودك ملكك",
+ "enterprise.hero.body1":
+ "يعمل OpenCode بأمان داخل مؤسستك دون تخزين أي بيانات أو سياق، ودون قيود ترخيص أو مطالبات ملكية. ابدأ تجربة مع فريقك، ثم انشره عبر مؤسستك من خلال دمجه مع SSO وبوابة الذكاء الاصطناعي الداخلية لديك.",
+ "enterprise.hero.body2": "أخبرنا كيف يمكننا المساعدة.",
+ "enterprise.form.name.label": "الاسم الكامل",
+ "enterprise.form.name.placeholder": "جيف بيزوس",
+ "enterprise.form.role.label": "المنصب",
+ "enterprise.form.role.placeholder": "رئيس مجلس الإدارة التنفيذي",
+ "enterprise.form.company.label": "الشركة",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "البريد الإلكتروني للشركة",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "رقم الهاتف",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "ما المشكلة التي تحاول حلها؟",
+ "enterprise.form.message.placeholder": "نحتاج مساعدة في...",
+ "enterprise.form.send": "إرسال",
+ "enterprise.form.sending": "جارٍ الإرسال...",
+ "enterprise.form.success": "تم إرسال الرسالة، سنتواصل معك قريبًا.",
+ "enterprise.form.success.submitted": "تم إرسال النموذج بنجاح.",
+ "enterprise.form.error.allFieldsRequired": "جميع الحقول مطلوبة.",
+ "enterprise.form.error.invalidEmailFormat": "تنسيق البريد الإلكتروني غير صالح.",
+ "enterprise.form.error.internalServer": "خطأ داخلي في الخادم.",
+ "enterprise.faq.title": "الأسئلة الشائعة",
+ "enterprise.faq.q1": "ما هو OpenCode Enterprise؟",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise مخصص للمؤسسات التي تريد التأكد من أن الكود والبيانات لا تغادر بنيتها التحتية أبدًا. يتحقق ذلك عبر استخدام تكوين مركزي يندمج مع SSO وبوابة الذكاء الاصطناعي الداخلية لديك.",
+ "enterprise.faq.q2": "كيف أبدأ مع OpenCode Enterprise؟",
+ "enterprise.faq.a2":
+ "ابدأ ببساطة بتجربة داخلية مع فريقك. افتراضيًا، لا يقوم OpenCode بتخزين الكود أو بيانات السياق، مما يجعل البدء سهلاً. ثم اتصل بنا لمناقشة الأسعار وخيارات التنفيذ.",
+ "enterprise.faq.q3": "كيف تعمل تسعيرة المؤسسات؟",
+ "enterprise.faq.a3":
+ "نقدم تسعيرًا للمؤسسات حسب المقعد. إذا كان لديك بوابة LLM خاصة بك، فلن نفرض رسومًا على التوكنات المستخدمة. لمزيد من التفاصيل، اتصل بنا للحصول على عرض سعر مخصص بناءً على احتياجات مؤسستك.",
+ "enterprise.faq.q4": "هل بياناتي آمنة مع OpenCode Enterprise؟",
+ "enterprise.faq.a4":
+ "نعم. لا يقوم OpenCode بتخزين الكود أو بيانات السياق. تتم جميع المعالجة محليًا أو عبر استدعاءات API مباشرة إلى مزود الذكاء الاصطناعي لديك. مع التكوين المركزي وتكامل SSO، تظل بياناتك آمنة داخل البنية التحتية لمؤسستك.",
+
+ "brand.title": "OpenCode | العلامة التجارية",
+ "brand.meta.description": "إرشادات العلامة التجارية لـ OpenCode",
+ "brand.heading": "إرشادات العلامة التجارية",
+ "brand.subtitle": "موارد وأصول لمساعدتك في العمل مع العلامة التجارية لـ OpenCode.",
+ "brand.downloadAll": "تنزيل جميع الأصول",
+
+ "changelog.title": "OpenCode | سجل التغييرات",
+ "changelog.meta.description": "ملاحظات الإصدار وسجل التغييرات لـ OpenCode",
+ "changelog.hero.title": "سجل التغييرات",
+ "changelog.hero.subtitle": "تحديثات وتحسينات جديدة لـ OpenCode",
+ "changelog.empty": "لم يتم العثور على مدخلات في سجل التغييرات.",
+ "changelog.viewJson": "عرض JSON",
+
+ "bench.list.title": "المعيار",
+ "bench.list.heading": "المعايير",
+ "bench.list.table.agent": "الوكيل",
+ "bench.list.table.model": "النموذج",
+ "bench.list.table.score": "الدرجة",
+ "bench.submission.error.allFieldsRequired": "جميع الحقول مطلوبة.",
+
+ "bench.detail.title": "المعيار - {{task}}",
+ "bench.detail.notFound": "المهمة غير موجودة",
+ "bench.detail.na": "غير متاح",
+ "bench.detail.labels.agent": "الوكيل",
+ "bench.detail.labels.model": "النموذج",
+ "bench.detail.labels.task": "المهمة",
+ "bench.detail.labels.repo": "المستودع",
+ "bench.detail.labels.from": "من",
+ "bench.detail.labels.to": "إلى",
+ "bench.detail.labels.prompt": "الموجه",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "متوسط المدة",
+ "bench.detail.labels.averageScore": "متوسط الدرجة",
+ "bench.detail.labels.averageCost": "متوسط التكلفة",
+ "bench.detail.labels.summary": "الملخص",
+ "bench.detail.labels.runs": "تشغيلات",
+ "bench.detail.labels.score": "الدرجة",
+ "bench.detail.labels.base": "الأساس",
+ "bench.detail.labels.penalty": "الجزاء",
+ "bench.detail.labels.weight": "الوزن",
+ "bench.detail.table.run": "تشغيل",
+ "bench.detail.table.score": "الدرجة (الأساس - الجزاء)",
+ "bench.detail.table.cost": "التكلفة",
+ "bench.detail.table.duration": "المدة",
+ "bench.detail.run.title": "تشغيل {{n}}",
+ "bench.detail.rawJson": "JSON خام",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/br.ts b/packages/console/app/src/i18n/br.ts
new file mode 100644
index 0000000..ce58e08
--- /dev/null
+++ b/packages/console/app/src/i18n/br.ts
@@ -0,0 +1,827 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Documentação",
+ "nav.changelog": "Changelog",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Entrar",
+ "nav.free": "Download",
+ "nav.home": "Início",
+ "nav.openMenu": "Abrir menu",
+ "nav.getStartedFree": "Começar grátis",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Copiar logo como SVG",
+ "nav.context.copyWordmark": "Copiar marca como SVG",
+ "nav.context.brandAssets": "Recursos da marca",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Documentação",
+ "footer.changelog": "Changelog",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Marca",
+ "legal.privacy": "Privacidade",
+ "legal.terms": "Termos",
+
+ "email.title": "Seja o primeiro a saber quando lançarmos novos produtos",
+ "email.subtitle": "Entre na lista de espera para acesso antecipado.",
+ "email.placeholder": "Endereço de e-mail",
+ "email.subscribe": "Inscrever-se",
+ "email.success": "Quase lá, verifique sua caixa de entrada e confirme seu e-mail",
+
+ "notFound.title": "Não encontrado | opencode",
+ "notFound.heading": "404 - Página não encontrada",
+ "notFound.home": "Início",
+ "notFound.docs": "Documentação",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "logo opencode claro",
+ "notFound.logoDarkAlt": "logo opencode escuro",
+
+ "user.logout": "Sair",
+
+ "auth.callback.error.codeMissing": "Nenhum código de autorização encontrado.",
+
+ "workspace.select": "Selecionar workspace",
+ "workspace.createNew": "+ Criar novo workspace",
+ "workspace.modal.title": "Criar novo workspace",
+ "workspace.modal.placeholder": "Digite o nome do workspace",
+
+ "common.cancel": "Cancelar",
+ "common.creating": "Criando...",
+ "common.create": "Criar",
+
+ "common.videoUnsupported": "Seu navegador não suporta a tag de vídeo.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Saiba mais",
+
+ "error.invalidPlan": "Plano inválido",
+ "error.workspaceRequired": "ID do workspace é obrigatório",
+ "error.alreadySubscribed": "Este workspace já possui uma assinatura",
+ "error.limitRequired": "Limite é obrigatório.",
+ "error.monthlyLimitInvalid": "Defina um limite mensal válido.",
+ "error.workspaceNameRequired": "Nome do workspace é obrigatório.",
+ "error.nameTooLong": "O nome deve ter 255 caracteres ou menos.",
+ "error.emailRequired": "E-mail é obrigatório",
+ "error.roleRequired": "Função é obrigatória",
+ "error.idRequired": "ID é obrigatório",
+ "error.nameRequired": "Nome é obrigatório",
+ "error.providerRequired": "Provedor é obrigatório",
+ "error.apiKeyRequired": "Chave de API é obrigatória",
+ "error.modelRequired": "Modelo é obrigatório",
+ "error.reloadAmountMin": "O valor de recarga deve ser de pelo menos ${{amount}}",
+ "error.reloadTriggerMin": "O gatilho de saldo deve ser de pelo menos ${{amount}}",
+
+ "app.meta.description": "OpenCode - O agente de codificação de código aberto.",
+
+ "home.title": "OpenCode | O agente de codificação de código aberto com IA",
+
+ "temp.title": "opencode | Agente de codificação com IA feito para o terminal",
+ "temp.hero.title": "O agente de codificação com IA feito para o terminal",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Começar",
+ "temp.feature.native.title": "TUI Nativa",
+ "temp.feature.native.body": "Uma interface de terminal responsiva, nativa e personalizável",
+ "temp.feature.zen.beforeLink": "Uma",
+ "temp.feature.zen.link": "lista selecionada de modelos",
+ "temp.feature.zen.afterLink": "fornecida pela opencode",
+ "temp.feature.models.beforeLink": "Suporta mais de 75 provedores de LLM através do",
+ "temp.feature.models.afterLink": ", incluindo modelos locais",
+ "temp.screenshot.caption": "OpenCode TUI com o tema tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI com tema tokyonight",
+ "temp.logoLightAlt": "logo opencode claro",
+ "temp.logoDarkAlt": "logo opencode escuro",
+
+ "home.banner.badge": "Novo",
+ "home.banner.text": "App desktop disponível em beta",
+ "home.banner.platforms": "no macOS, Windows e Linux",
+ "home.banner.downloadNow": "Baixar agora",
+ "home.banner.downloadBetaNow": "Baixe agora o beta do desktop",
+
+ "home.hero.title": "O agente de codificação de código aberto com IA",
+ "home.hero.subtitle.a": "Modelos grátis incluídos ou conecte qualquer modelo de qualquer provedor,",
+ "home.hero.subtitle.b": "incluindo Claude, GPT, Gemini e mais.",
+
+ "home.install.ariaLabel": "Opções de instalação",
+
+ "home.what.title": "O que é OpenCode?",
+ "home.what.body":
+ "OpenCode é um agente de código aberto que ajuda você a escrever código no seu terminal, IDE ou desktop.",
+ "home.what.lsp.title": "LSP habilitado",
+ "home.what.lsp.body": "Carrega automaticamente os LSPs certos para o LLM",
+ "home.what.multiSession.title": "Multissessão",
+ "home.what.multiSession.body": "Inicie vários agentes em paralelo no mesmo projeto",
+ "home.what.shareLinks.title": "Links compartilháveis",
+ "home.what.shareLinks.body": "Compartilhe um link para qualquer sessão para referência ou depuração",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Entre com o GitHub para usar sua conta do Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Entre com a OpenAI para usar sua conta do ChatGPT Plus ou Pro",
+ "home.what.anyModel.title": "Qualquer modelo",
+ "home.what.anyModel.body": "Mais de 75 provedores de LLM via Models.dev, incluindo modelos locais",
+ "home.what.anyEditor.title": "Qualquer editor",
+ "home.what.anyEditor.body": "Disponível como interface de terminal, app desktop e extensão de IDE",
+ "home.what.readDocs": "Ler documentação",
+
+ "home.growth.title": "O agente de codificação de código aberto com IA",
+ "home.growth.body":
+ "Com mais de {{stars}} estrelas no GitHub, {{contributors}} colaboradores e mais de {{commits}} commits, OpenCode é usado e confiado por mais de {{monthlyUsers}} desenvolvedores todos os meses.",
+ "home.growth.githubStars": "Estrelas no GitHub",
+ "home.growth.contributors": "Colaboradores",
+ "home.growth.monthlyDevs": "Devs mensais",
+
+ "home.privacy.title": "Feito com privacidade em primeiro lugar",
+ "home.privacy.body":
+ "OpenCode não armazena nenhum código seu nem dados de contexto, para que possa operar em ambientes sensíveis à privacidade.",
+ "home.privacy.learnMore": "Saiba mais sobre",
+ "home.privacy.link": "privacidade",
+
+ "home.faq.q1": "O que é OpenCode?",
+ "home.faq.a1":
+ "OpenCode é um agente de código aberto que ajuda você a escrever e executar código com qualquer modelo de IA. Está disponível como interface de terminal, app desktop ou extensão de IDE.",
+ "home.faq.q2": "Como eu uso o OpenCode?",
+ "home.faq.a2.before": "A maneira mais fácil de começar é ler a",
+ "home.faq.a2.link": "introdução",
+ "home.faq.q3": "Preciso de assinaturas extras de IA para usar o OpenCode?",
+ "home.faq.a3.p1":
+ "Não necessariamente, OpenCode vem com um conjunto de modelos grátis que você pode usar sem criar conta.",
+ "home.faq.a3.p2.beforeZen":
+ "Além disso, você pode usar qualquer um dos modelos de codificação populares criando uma conta",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Embora incentivemos os usuários a usar o Zen, OpenCode também funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
+ "home.faq.a3.p4.beforeLocal": "Você pode até conectar seus",
+ "home.faq.a3.p4.localLink": "modelos locais",
+ "home.faq.q4": "Posso usar minhas assinaturas de IA existentes com o OpenCode?",
+ "home.faq.a4.p1":
+ "Sim, OpenCode suporta planos de assinatura de todos os principais provedores. Você pode usar suas assinaturas Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
+ "home.faq.q5": "Posso usar o OpenCode apenas no terminal?",
+ "home.faq.a5.beforeDesktop": "Não mais! OpenCode agora está disponível como um app para o seu",
+ "home.faq.a5.desktop": "desktop",
+ "home.faq.a5.and": "e",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "Quanto custa o OpenCode?",
+ "home.faq.a6":
+ "OpenCode é 100% gratuito para usar. Ele também vem com um conjunto de modelos gratuitos. Pode haver custos adicionais se você conectar qualquer outro provedor.",
+ "home.faq.q7": "E sobre dados e privacidade?",
+ "home.faq.a7.p1":
+ "Seus dados e informações só são armazenados quando você usa nossos modelos gratuitos ou cria links compartilháveis.",
+ "home.faq.a7.p2.beforeModels": "Saiba mais sobre",
+ "home.faq.a7.p2.modelsLink": "nossos modelos",
+ "home.faq.a7.p2.and": "e",
+ "home.faq.a7.p2.shareLink": "páginas de compartilhamento",
+ "home.faq.q8": "OpenCode é código aberto?",
+ "home.faq.a8.p1": "Sim, OpenCode é totalmente open source. O código-fonte é público no",
+ "home.faq.a8.p2": "sob a",
+ "home.faq.a8.mitLicense": "Licença MIT",
+ "home.faq.a8.p3":
+ ", o que significa que qualquer pessoa pode usar, modificar ou contribuir para o seu desenvolvimento. Qualquer pessoa da comunidade pode abrir issues, enviar pull requests e estender a funcionalidade.",
+
+ "home.zenCta.title": "Acesse modelos confiáveis e otimizados para agentes de codificação",
+ "home.zenCta.body":
+ "O Zen dá acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e avaliou especificamente para agentes de codificação. Não precisa se preocupar com desempenho e qualidade inconsistentes entre provedores, use modelos validados que funcionam.",
+ "home.zenCta.link": "Saiba mais sobre o Zen",
+
+ "zen.title": "OpenCode Zen | Um conjunto selecionado de modelos confiáveis e otimizados para agentes de codificação",
+ "zen.hero.title": "Modelos confiáveis e otimizados para agentes de codificação",
+ "zen.hero.body":
+ "O Zen dá acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e avaliou especificamente para agentes de codificação. Não precisa se preocupar com desempenho e qualidade inconsistentes, use modelos validados que funcionam.",
+
+ "zen.faq.q1": "O que é OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen é um conjunto selecionado de modelos de IA testados e avaliados para agentes de codificação, criado pela equipe por trás do OpenCode.",
+ "zen.faq.q2": "O que torna o Zen mais preciso?",
+ "zen.faq.a2":
+ "O Zen fornece apenas modelos que foram especificamente testados e avaliados para agentes de codificação. Você não usaria uma faca de manteiga para cortar um bife, não use modelos ruins para programar.",
+ "zen.faq.q3": "O Zen é mais barato?",
+ "zen.faq.a3":
+ "O Zen não tem fins lucrativos. O Zen repassa os custos dos provedores de modelos para você. Quanto maior o uso do Zen, mais a OpenCode pode negociar melhores taxas e repassá-las para você.",
+ "zen.faq.q4": "Quanto custa o Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "cobra por requisição",
+ "zen.faq.a4.p1.afterPricing": "sem margens de lucro, então você paga exatamente o que o provedor do modelo cobra.",
+ "zen.faq.a4.p2.beforeAccount": "Seu custo total depende do uso, e você pode definir limites de gastos mensais em sua",
+ "zen.faq.a4.p2.accountLink": "conta",
+ "zen.faq.a4.p3":
+ "Para cobrir custos, a OpenCode adiciona apenas uma pequena taxa de processamento de pagamento de $1,23 por recarga de $20.",
+ "zen.faq.q5": "E sobre dados e privacidade?",
+ "zen.faq.a5.beforeExceptions":
+ "Todos os modelos Zen são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
+ "zen.faq.a5.exceptionsLink": "seguintes exceções",
+ "zen.faq.q6": "Posso definir limites de gastos?",
+ "zen.faq.a6": "Sim, você pode definir limites de gastos mensais em sua conta.",
+ "zen.faq.q7": "Posso cancelar?",
+ "zen.faq.a7": "Sim, você pode desativar o faturamento a qualquer momento e usar seu saldo restante.",
+ "zen.faq.q8": "Posso usar o Zen com outros agentes de codificação?",
+ "zen.faq.a8":
+ "Embora o Zen funcione muito bem com o OpenCode, você pode usar o Zen com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.",
+
+ "zen.cta.start": "Comece com o Zen",
+ "zen.pricing.title": "Adicionar $20 de saldo pré-pago",
+ "zen.pricing.fee": "(+$1,23 taxa de processamento do cartão)",
+ "zen.pricing.body": "Use com qualquer agente. Defina limites de gastos mensais. Cancele a qualquer momento.",
+ "zen.problem.title": "Que problema o Zen resolve?",
+ "zen.problem.body":
+ "Existem muitos modelos disponíveis, mas apenas alguns funcionam bem com agentes de codificação. A maioria dos provedores os configura de maneira diferente, com resultados variados.",
+ "zen.problem.subtitle": "Estamos corrigindo isso para todos, não apenas para os usuários do OpenCode.",
+ "zen.problem.item1": "Testando modelos selecionados e consultando suas equipes",
+ "zen.problem.item2": "Trabalhando com provedores para garantir que sejam entregues corretamente",
+ "zen.problem.item3": "Avaliando todas as combinações de modelo-provedor que recomendamos",
+ "zen.how.title": "Como o Zen funciona",
+ "zen.how.body": "Embora sugerimos que você use o Zen com o OpenCode, você pode usá-lo com qualquer agente.",
+ "zen.how.step1.title": "Cadastre-se e adicione $20 de saldo",
+ "zen.how.step1.beforeLink": "siga as",
+ "zen.how.step1.link": "instruções de configuração",
+ "zen.how.step2.title": "Use o Zen com preços transparentes",
+ "zen.how.step2.link": "pague por requisição",
+ "zen.how.step2.afterLink": "sem margens de lucro",
+ "zen.how.step3.title": "Recarga automática",
+ "zen.how.step3.body": "quando seu saldo atingir $5, adicionaremos automaticamente $20",
+ "zen.privacy.title": "Sua privacidade é importante para nós",
+ "zen.privacy.beforeExceptions":
+ "Todos os modelos Zen são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelo, com as",
+ "zen.privacy.exceptionsLink": "seguintes exceções",
+
+ "go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos",
+ "go.meta.description":
+ "O Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos de solicitação de 5 horas para GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash.",
+ "go.hero.title": "Modelos de codificação de baixo custo para todos",
+ "go.hero.body":
+ "O Go traz a codificação com agentes para programadores em todo o mundo. Oferecendo limites generosos e acesso confiável aos modelos de código aberto mais capazes, para que você possa construir com agentes poderosos sem se preocupar com custos ou disponibilidade.",
+
+ "go.cta.start": "Assinar o Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Assinar o Go",
+ "go.cta.price": "$10/mês",
+ "go.cta.promo": "$5 no primeiro mês",
+ "go.pricing.body":
+ "Use com qualquer agente. $5 no primeiro mês, depois $10/mês. Recarregue o crédito se necessário. Cancele a qualquer momento.",
+ "go.graph.free": "Grátis",
+ "go.graph.freePill": "Big Pickle e modelos gratuitos",
+ "go.graph.go": "Go",
+ "go.graph.label": "Requisições por 5 horas",
+ "go.graph.usageLimits": "Limites de uso",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Requisições por 5h: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "mudou minha vida, é realmente uma escolha óbvia.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Fundador, SEED, PM, Melt, Pop, Dapt, Cadmus e ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 de 5 pessoas em nossa equipe adoram usar",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Eu não consigo recomendar o",
+ "go.testimonials.adam.quoteAfter": "o suficiente. Sério, é muito bom.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head de Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Com o",
+ "go.testimonials.david.quoteAfter":
+ "eu sei que todos os modelos são testados e perfeitos para agentes de codificação.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Estagiário, Nvidia (4 vezes)",
+ "go.testimonials.frank.quote": "Eu queria ainda estar na Nvidia.",
+ "go.problem.title": "Que problema o Go resolve?",
+ "go.problem.body":
+ "Estamos focados em levar a experiência do OpenCode para o maior número de pessoas possível. OpenCode Go é uma assinatura de baixo custo: $5 no primeiro mês, depois $10/mês. Oferece limites generosos e acesso confiável aos modelos open source mais capazes.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Preço de assinatura de baixo custo",
+ "go.problem.item2": "Limites generosos e acesso confiável",
+ "go.problem.item3": "Feito para o maior número possível de programadores",
+ "go.problem.item4":
+ "Inclui GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash",
+ "go.how.title": "Como o Go funciona",
+ "go.how.body":
+ "O Go começa em $5 no primeiro mês, depois $10/mês. Você pode usá-lo com o OpenCode ou qualquer agente.",
+ "go.how.step1.title": "Crie uma conta",
+ "go.how.step1.beforeLink": "siga as",
+ "go.how.step1.link": "instruções de configuração",
+ "go.how.step2.title": "Assinar o Go",
+ "go.how.step2.link": "$5 no primeiro mês",
+ "go.how.step2.afterLink": "depois $10/mês com limites generosos",
+ "go.how.step3.title": "Comece a codificar",
+ "go.how.step3.body": "com acesso confiável a modelos de código aberto",
+ "go.privacy.title": "Sua privacidade é importante para nós",
+ "go.privacy.body":
+ "O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável.",
+ "go.privacy.contactAfter": "se você tiver alguma dúvida.",
+ "go.privacy.beforeExceptions":
+ "Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
+ "go.privacy.exceptionsLink": "seguintes exceções",
+ "go.faq.q1": "O que é OpenCode Go?",
+ "go.faq.a1":
+ "Go é uma assinatura de baixo custo que oferece acesso confiável a modelos de código aberto capazes para codificação com agentes.",
+ "go.faq.q2": "Quais modelos o Go inclui?",
+ "go.faq.a2": "O Go inclui os modelos listados abaixo, com limites generosos e acesso confiável.",
+ "go.faq.q3": "O Go é o mesmo que o Zen?",
+ "go.faq.a3":
+ "Não. Zen é pay-as-you-go, enquanto o Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos e acesso confiável aos modelos open source GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash.",
+ "go.faq.q4": "Quanto custa o Go?",
+ "go.faq.a4.p1.beforePricing": "O Go custa",
+ "go.faq.a4.p1.pricingLink": "$5 no primeiro mês",
+ "go.faq.a4.p1.afterPricing": "depois $10/mês com limites generosos.",
+ "go.faq.a4.p2.beforeAccount": "Você pode gerenciar sua assinatura em sua",
+ "go.faq.a4.p2.accountLink": "conta",
+ "go.faq.a4.p3": "Cancele a qualquer momento.",
+ "go.faq.q5": "E sobre dados e privacidade?",
+ "go.faq.a5.body":
+ "O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável. Nossos provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos.",
+ "go.faq.a5.beforeExceptions":
+ "Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
+ "go.faq.a5.exceptionsLink": "seguintes exceções",
+ "go.faq.q6": "Posso recarregar crédito?",
+ "go.faq.a6": "Se você precisar de mais uso, pode recarregar crédito em sua conta.",
+ "go.faq.q7": "Posso cancelar?",
+ "go.faq.a7": "Sim, você pode cancelar a qualquer momento.",
+ "go.faq.q8": "Posso usar o Go com outros agentes de codificação?",
+ "go.faq.a8":
+ "Sim, você pode usar o Go com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.",
+
+ "go.faq.q9": "Qual a diferença entre os modelos gratuitos e o Go?",
+ "go.faq.a9":
+ "Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go inclui GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash com cotas de requisição mais altas aplicadas em janelas móveis (5 horas, semanal e mensal), aproximadamente equivalentes a $12 por 5 horas, $30 por semana e $60 por mês (as contagens reais de requisições variam de acordo com o modelo e o uso).",
+
+ "zen.api.error.rateLimitExceeded": "Limite de taxa excedido. Por favor, tente novamente mais tarde.",
+ "zen.api.error.modelNotSupported": "Modelo {{model}} não suportado",
+ "zen.api.error.modelFormatNotSupported": "Modelo {{model}} não suportado para o formato {{format}}",
+ "zen.api.error.noProviderAvailable": "Nenhum provedor disponível",
+ "zen.api.error.providerNotSupported": "Provedor {{provider}} não suportado",
+ "zen.api.error.missingApiKey": "Chave de API ausente.",
+ "zen.api.error.invalidApiKey": "Chave de API inválida.",
+ "zen.api.error.subscriptionQuotaExceeded": "Cota de assinatura excedida. Tente novamente em {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Limite de uso de 5 horas atingido. Será reiniciado em {{retryIn}}. Para continuar usando este modelo agora, habilite o uso a partir do seu saldo disponível: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Limite de uso semanal atingido. Será reiniciado em {{retryIn}}. Para continuar usando este modelo agora, habilite o uso a partir do seu saldo disponível: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Limite de uso mensal atingido. Será reiniciado em {{retryIn}}. Para continuar usando este modelo agora, habilite o uso a partir do seu saldo disponível: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Nenhuma forma de pagamento. Adicione uma forma de pagamento aqui: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Saldo insuficiente. Gerencie seu faturamento aqui: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Seu workspace atingiu o limite de gastos mensais de ${{amount}}. Gerencie seus limites aqui: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Você atingiu seu limite de gastos mensais de ${{amount}}. Gerencie seus limites aqui: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "O modelo está desabilitado",
+ "zen.api.error.trialEnded":
+ "A promoção gratuita do {{model}} terminou. Você pode continuar usando o modelo assinando o OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Acesse os melhores modelos de codificação do mundo",
+ "black.meta.description": "Tenha acesso ao Claude, GPT, Gemini e mais com os planos de assinatura OpenCode Black.",
+ "black.hero.title": "Acesse os melhores modelos de codificação do mundo",
+ "black.hero.subtitle": "Incluindo Claude, GPT, Gemini e mais",
+ "black.title": "OpenCode Black | Preços",
+ "black.paused": "A inscrição no plano Black está temporariamente pausada.",
+ "black.plan.icon20": "Plano Black 20",
+ "black.plan.icon100": "Plano Black 100",
+ "black.plan.icon200": "Plano Black 200",
+ "black.plan.multiplier100": "5x mais uso que o Black 20",
+ "black.plan.multiplier200": "20x mais uso que o Black 20",
+ "black.price.perMonth": "por mês",
+ "black.price.perPersonBilledMonthly": "por pessoa faturado mensalmente",
+ "black.terms.1": "Sua assinatura não começará imediatamente",
+ "black.terms.2": "Você será adicionado à lista de espera e ativado em breve",
+ "black.terms.3": "Seu cartão só será cobrado quando sua assinatura for ativada",
+ "black.terms.4": "Limites de uso se aplicam; uso fortemente automatizado pode atingir os limites mais cedo",
+ "black.terms.5": "Assinaturas são para indivíduos, contate Enterprise para equipes",
+ "black.terms.6": "Limites podem ser ajustados e planos podem ser descontinuados no futuro",
+ "black.terms.7": "Cancele sua assinatura a qualquer momento",
+ "black.action.continue": "Continuar",
+ "black.finePrint.beforeTerms": "Os preços mostrados não incluem impostos aplicáveis",
+ "black.finePrint.terms": "Termos de Serviço",
+ "black.workspace.title": "OpenCode Black | Selecionar Workspace",
+ "black.workspace.selectPlan": "Selecione um workspace para este plano",
+ "black.workspace.name": "Workspace {{n}}",
+ "black.subscribe.title": "Assinar OpenCode Black",
+ "black.subscribe.paymentMethod": "Forma de pagamento",
+ "black.subscribe.loadingPaymentForm": "Carregando formulário de pagamento...",
+ "black.subscribe.selectWorkspaceToContinue": "Selecione um workspace para continuar",
+ "black.subscribe.failurePrefix": "Ops!",
+ "black.subscribe.error.generic": "Ocorreu um erro",
+ "black.subscribe.error.invalidPlan": "Plano inválido",
+ "black.subscribe.error.workspaceRequired": "ID do workspace é obrigatório",
+ "black.subscribe.error.alreadySubscribed": "Este workspace já possui uma assinatura",
+ "black.subscribe.processing": "Processando...",
+ "black.subscribe.submit": "Assinar ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Você só será cobrado quando sua assinatura for ativada",
+ "black.subscribe.success.title": "Você está na lista de espera do OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "Plano de assinatura",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Valor",
+ "black.subscribe.success.amountValue": "${{plan}} por mês",
+ "black.subscribe.success.paymentMethod": "Forma de pagamento",
+ "black.subscribe.success.dateJoined": "Data de entrada",
+ "black.subscribe.success.chargeNotice": "Seu cartão será cobrado quando sua assinatura for ativada",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Uso",
+ "workspace.nav.apiKeys": "Chaves de API",
+ "workspace.nav.members": "Membros",
+ "workspace.nav.billing": "Faturamento",
+ "workspace.nav.settings": "Configurações",
+
+ "workspace.home.banner.beforeLink": "Modelos otimizados e confiáveis para agentes de codificação.",
+ "workspace.lite.banner.beforeLink": "Modelos de codificação de baixo custo para todos.",
+ "workspace.home.billing.loading": "Carregando...",
+ "workspace.home.billing.enable": "Ativar faturamento",
+ "workspace.home.billing.currentBalance": "Saldo atual",
+
+ "workspace.newUser.feature.tested.title": "Modelos Testados e Verificados",
+ "workspace.newUser.feature.tested.body":
+ "Avaliamos e testamos modelos especificamente para agentes de codificação para garantir o melhor desempenho.",
+ "workspace.newUser.feature.quality.title": "Qualidade Máxima",
+ "workspace.newUser.feature.quality.body":
+ "Acesse modelos configurados para desempenho ideal - sem downgrades ou roteamento para provedores mais baratos.",
+ "workspace.newUser.feature.lockin.title": "Sem Fidelidade",
+ "workspace.newUser.feature.lockin.body":
+ "Use o Zen com qualquer agente de codificação e continue usando outros provedores com opencode sempre que quiser.",
+ "workspace.newUser.copyApiKey": "Copiar chave de API",
+ "workspace.newUser.copyKey": "Copiar Chave",
+ "workspace.newUser.copied": "Copiado!",
+ "workspace.newUser.step.enableBilling": "Ativar faturamento",
+ "workspace.newUser.step.login.before": "Execute",
+ "workspace.newUser.step.login.after": "e selecione opencode",
+ "workspace.newUser.step.pasteKey": "Cole sua chave de API",
+ "workspace.newUser.step.models.before": "Inicie o opencode e execute",
+ "workspace.newUser.step.models.after": "para selecionar um modelo",
+
+ "workspace.models.title": "Modelos",
+ "workspace.models.subtitle.beforeLink": "Gerencie quais modelos os membros do workspace podem acessar.",
+ "workspace.models.table.model": "Modelo",
+ "workspace.models.table.enabled": "Habilitado",
+
+ "workspace.providers.title": "Traga Sua Própria Chave",
+ "workspace.providers.subtitle": "Configure suas próprias chaves de API de provedores de IA.",
+ "workspace.providers.placeholder": "Insira a chave de API {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Configurar",
+ "workspace.providers.edit": "Editar",
+ "workspace.providers.delete": "Excluir",
+ "workspace.providers.saving": "Salvando...",
+ "workspace.providers.save": "Salvar",
+ "workspace.providers.table.provider": "Provedor",
+ "workspace.providers.table.apiKey": "Chave de API",
+
+ "workspace.usage.title": "Histórico de Uso",
+ "workspace.usage.subtitle": "Uso recente da API e custos.",
+ "workspace.usage.empty": "Faça sua primeira chamada de API para começar.",
+ "workspace.usage.table.date": "Data",
+ "workspace.usage.table.model": "Modelo",
+ "workspace.usage.table.input": "Entrada",
+ "workspace.usage.table.output": "Saída",
+ "workspace.usage.table.cost": "Custo",
+ "workspace.usage.table.session": "Sessão",
+ "workspace.usage.breakdown.input": "Entrada",
+ "workspace.usage.breakdown.cacheRead": "Leitura de Cache",
+ "workspace.usage.breakdown.cacheWrite": "Escrita em Cache",
+ "workspace.usage.breakdown.output": "Saída",
+ "workspace.usage.breakdown.reasoning": "Raciocínio",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Custo",
+ "workspace.cost.subtitle": "Custos de uso discriminados por modelo.",
+ "workspace.cost.allModels": "Todos os Modelos",
+ "workspace.cost.allKeys": "Todas as Chaves",
+ "workspace.cost.deletedSuffix": "(excluído)",
+ "workspace.cost.empty": "Nenhum dado de uso disponível para o período selecionado.",
+ "workspace.cost.subscriptionShort": "ass",
+
+ "workspace.keys.title": "Chaves de API",
+ "workspace.keys.subtitle": "Gerencie suas chaves de API para acessar os serviços opencode.",
+ "workspace.keys.create": "Criar Chave de API",
+ "workspace.keys.placeholder": "Digite o nome da chave",
+ "workspace.keys.empty": "Crie uma chave de API do opencode Gateway",
+ "workspace.keys.table.name": "Nome",
+ "workspace.keys.table.key": "Chave",
+ "workspace.keys.table.createdBy": "Criado Por",
+ "workspace.keys.table.lastUsed": "Último Uso",
+ "workspace.keys.copyApiKey": "Copiar chave de API",
+ "workspace.keys.delete": "Excluir",
+
+ "workspace.members.title": "Membros",
+ "workspace.members.subtitle": "Gerencie os membros do workspace e suas permissões.",
+ "workspace.members.invite": "Convidar Membro",
+ "workspace.members.inviting": "Convidando...",
+ "workspace.members.beta.beforeLink": "Workspaces são gratuitos para equipes durante o beta.",
+ "workspace.members.form.invitee": "Convidado",
+ "workspace.members.form.emailPlaceholder": "Digite o e-mail",
+ "workspace.members.form.role": "Função",
+ "workspace.members.form.monthlyLimit": "Limite de gastos mensais",
+ "workspace.members.noLimit": "Sem limite",
+ "workspace.members.noLimitLowercase": "sem limite",
+ "workspace.members.invited": "convidado",
+ "workspace.members.edit": "Editar",
+ "workspace.members.delete": "Excluir",
+ "workspace.members.saving": "Salvando...",
+ "workspace.members.save": "Salvar",
+ "workspace.members.table.email": "E-mail",
+ "workspace.members.table.role": "Função",
+ "workspace.members.table.monthLimit": "Limite mensal",
+ "workspace.members.role.admin": "Admin",
+ "workspace.members.role.adminDescription": "Pode gerenciar modelos, membros e faturamento",
+ "workspace.members.role.member": "Membro",
+ "workspace.members.role.memberDescription": "Só pode gerar chaves de API para si mesmo",
+
+ "workspace.settings.title": "Configurações",
+ "workspace.settings.subtitle": "Atualize o nome e as preferências do seu workspace.",
+ "workspace.settings.workspaceName": "Nome do workspace",
+ "workspace.settings.defaultName": "Padrão",
+ "workspace.settings.updating": "Atualizando...",
+ "workspace.settings.save": "Salvar",
+ "workspace.settings.edit": "Editar",
+
+ "workspace.billing.title": "Faturamento",
+ "workspace.billing.subtitle.beforeLink": "Gerenciar formas de pagamento.",
+ "workspace.billing.contactUs": "Contate-nos",
+ "workspace.billing.subtitle.afterLink": "se você tiver alguma dúvida.",
+ "workspace.billing.currentBalance": "Saldo Atual",
+ "workspace.billing.add": "Adicionar $",
+ "workspace.billing.enterAmount": "Digite o valor",
+ "workspace.billing.loading": "Carregando...",
+ "workspace.billing.addAction": "Adicionar",
+ "workspace.billing.addBalance": "Adicionar Saldo",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Vinculado ao Stripe",
+ "workspace.billing.manage": "Gerenciar",
+ "workspace.billing.enable": "Ativar Faturamento",
+
+ "workspace.monthlyLimit.title": "Limite Mensal",
+ "workspace.monthlyLimit.subtitle": "Defina um limite de uso mensal para sua conta.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Definindo...",
+ "workspace.monthlyLimit.set": "Definir",
+ "workspace.monthlyLimit.edit": "Editar Limite",
+ "workspace.monthlyLimit.noLimit": "Nenhum limite de uso definido.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Uso atual para",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "é $",
+
+ "workspace.redeem.title": "Resgatar Cupom",
+ "workspace.redeem.subtitle": "Resgate um código de cupom para receber créditos ou vantagens.",
+ "workspace.redeem.placeholder": "Digite o código do cupom",
+ "workspace.redeem.redeem": "Resgatar",
+ "workspace.redeem.redeeming": "Resgatando...",
+ "workspace.redeem.success": "Cupom resgatado com sucesso.",
+
+ "workspace.reload.title": "Recarga Automática",
+ "workspace.reload.disabled.before": "A recarga automática está",
+ "workspace.reload.disabled.state": "desativada",
+ "workspace.reload.disabled.after": "Ative para recarregar automaticamente quando o saldo estiver baixo.",
+ "workspace.reload.enabled.before": "A recarga automática está",
+ "workspace.reload.enabled.state": "ativada",
+ "workspace.reload.enabled.middle": "Recarregaremos",
+ "workspace.reload.processingFee": "taxa de processamento",
+ "workspace.reload.enabled.after": "quando o saldo atingir",
+ "workspace.reload.edit": "Editar",
+ "workspace.reload.enable": "Ativar",
+ "workspace.reload.enableAutoReload": "Ativar Recarga Automática",
+ "workspace.reload.reloadAmount": "Recarregar $",
+ "workspace.reload.whenBalanceReaches": "Quando o saldo atingir $",
+ "workspace.reload.saving": "Salvando...",
+ "workspace.reload.save": "Salvar",
+ "workspace.reload.failedAt": "Recarga falhou em",
+ "workspace.reload.reason": "Motivo:",
+ "workspace.reload.updatePaymentMethod": "Por favor, atualize sua forma de pagamento e tente novamente.",
+ "workspace.reload.retrying": "Tentando novamente...",
+ "workspace.reload.retry": "Tentar novamente",
+ "workspace.reload.error.paymentFailed": "Pagamento falhou.",
+
+ "workspace.payments.title": "Histórico de Pagamentos",
+ "workspace.payments.subtitle": "Transações de pagamento recentes.",
+ "workspace.payments.table.date": "Data",
+ "workspace.payments.table.paymentId": "ID do Pagamento",
+ "workspace.payments.table.amount": "Valor",
+ "workspace.payments.table.receipt": "Recibo",
+ "workspace.payments.type.credit": "crédito",
+ "workspace.payments.type.subscription": "assinatura",
+ "workspace.payments.view": "Ver",
+
+ "workspace.black.loading": "Carregando...",
+ "workspace.black.time.day": "dia",
+ "workspace.black.time.days": "dias",
+ "workspace.black.time.hour": "hora",
+ "workspace.black.time.hours": "horas",
+ "workspace.black.time.minute": "minuto",
+ "workspace.black.time.minutes": "minutos",
+ "workspace.black.time.fewSeconds": "alguns segundos",
+ "workspace.black.subscription.title": "Assinatura",
+ "workspace.black.subscription.message": "Você assina o OpenCode Black por ${{plan}} por mês.",
+ "workspace.black.subscription.manage": "Gerenciar Assinatura",
+ "workspace.black.subscription.rollingUsage": "Uso de 5 horas",
+ "workspace.black.subscription.weeklyUsage": "Uso Semanal",
+ "workspace.black.subscription.resetsIn": "Reinicia em",
+ "workspace.black.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
+ "workspace.black.waitlist.title": "Lista de Espera",
+ "workspace.black.waitlist.joined": "Você está na lista de espera para o plano OpenCode Black de ${{plan}} por mês.",
+ "workspace.black.waitlist.ready": "Estamos prontos para inscrever você no plano OpenCode Black de ${{plan}} por mês.",
+ "workspace.black.waitlist.leave": "Sair da Lista de Espera",
+ "workspace.black.waitlist.leaving": "Saindo...",
+ "workspace.black.waitlist.left": "Saiu",
+ "workspace.black.waitlist.enroll": "Inscrever-se",
+ "workspace.black.waitlist.enrolling": "Inscrevendo-se...",
+ "workspace.black.waitlist.enrolled": "Inscrito",
+ "workspace.black.waitlist.enrollNote":
+ "Ao clicar em Inscrever-se, sua assinatura começará imediatamente e seu cartão será cobrado.",
+
+ "workspace.lite.loading": "Carregando...",
+ "workspace.lite.time.day": "dia",
+ "workspace.lite.time.days": "dias",
+ "workspace.lite.time.hour": "hora",
+ "workspace.lite.time.hours": "horas",
+ "workspace.lite.time.minute": "minuto",
+ "workspace.lite.time.minutes": "minutos",
+ "workspace.lite.time.fewSeconds": "alguns segundos",
+ "workspace.lite.subscription.message": "Você assina o OpenCode Go.",
+ "workspace.lite.subscription.manage": "Gerenciar Assinatura",
+ "workspace.lite.subscription.rollingUsage": "Uso Contínuo",
+ "workspace.lite.subscription.weeklyUsage": "Uso Semanal",
+ "workspace.lite.subscription.monthlyUsage": "Uso Mensal",
+ "workspace.lite.subscription.resetsIn": "Reinicia em",
+ "workspace.lite.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
+ "workspace.lite.subscription.selectProvider":
+ 'Selecione "OpenCode Go" como provedor na sua configuração do opencode para usar os modelos Go.',
+ "workspace.lite.black.message":
+ "Você está atualmente inscrito no OpenCode Black ou na lista de espera. Por favor, cancele a assinatura primeiro se desejar mudar para o Go.",
+ "workspace.lite.other.message":
+ "Outro membro neste workspace já assina o OpenCode Go. Apenas um membro por workspace pode assinar.",
+ "workspace.lite.promo.description":
+ "O OpenCode Go começa em {{price}}, depois $10/mês, e oferece acesso confiável a modelos de codificação abertos populares com limites de uso generosos.",
+ "workspace.lite.promo.price": "$5 no primeiro mês",
+ "workspace.lite.promo.modelsTitle": "O que está incluído",
+ "workspace.lite.promo.footer":
+ "O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável. Preços e limites de uso podem mudar conforme aprendemos com o uso inicial e feedback.",
+ "workspace.lite.promo.subscribe": "Assinar Go",
+ "workspace.lite.promo.subscribing": "Redirecionando...",
+ "workspace.lite.promo.otherMethods": "Outros métodos de pagamento",
+ "workspace.lite.promo.selectMethod": "Selecionar método de pagamento",
+
+ "workspace.referral.copyLink": "Copiar link",
+ "workspace.referral.copied": "Copiado",
+ "workspace.referral.overview.title": "Convide amigos",
+ "workspace.referral.overview.subtitle": "Ganhe $5 quando um amigo assinar. Ele também ganha $5.",
+ "workspace.referral.instructions.share": "Compartilhe seu link de indicação",
+ "workspace.referral.instructions.subscribe": "Seu amigo entra e assina o Go",
+ "workspace.referral.instructions.claim":
+ "Vocês dois ganham um crédito de uso de $5 para aplicar aos seus limites de uso do Go",
+ "workspace.referral.rewards.title": "Recompensas de indicação",
+ "workspace.referral.rewards.description": "Aplique os créditos de indicação disponíveis no seu uso do Go.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} recompensas aplicadas.",
+ "workspace.referral.rewards.empty": "Ainda não há recompensas de indicação.",
+ "workspace.referral.table.reward": "Recompensa",
+ "workspace.referral.table.referral": "Descrição",
+ "workspace.referral.table.date": "Data",
+ "workspace.referral.reward.description.inviter": "Convidou {{email}}",
+ "workspace.referral.reward.description.invitee": "Convidado por {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Assine para desbloquear",
+ "workspace.referral.reward.action.view": "Ver recompensa",
+ "workspace.referral.reward.action.applied": "Recompensa aplicada",
+ "workspace.referral.reward.source.pendingInviter": "Aguardando ele assinar",
+ "workspace.referral.reward.source.pendingInvitee": "Assine para desbloquear a recompensa",
+ "workspace.referral.reward.source.available": "Recompensa pronta para usar",
+ "workspace.referral.reward.source.applied": "Recompensa aplicada",
+ "workspace.referral.reward.status.applied": "Recompensa aplicada",
+ "workspace.referral.reward.status.pendingInviter": "Assine para desbloquear",
+ "workspace.referral.reward.status.pendingInvitee": "Assine para desbloquear",
+ "workspace.referral.apply.noGo": "Assine para desbloquear",
+ "workspace.referral.apply.preview": "Ver recompensa",
+ "workspace.referral.apply.action": "Aplicar",
+ "workspace.referral.apply.confirmTitle": "Aplicar recompensa",
+ "workspace.referral.apply.confirmBody": "Aplique {{amount}} para reduzir o uso atual deste workspace.",
+ "workspace.referral.apply.confirmAction": "Aplicar",
+
+ "download.title": "OpenCode | Baixar",
+ "download.meta.description": "Baixe o OpenCode para macOS, Windows e Linux",
+ "download.hero.title": "Baixar OpenCode",
+ "download.hero.subtitle": "Disponível em Beta para macOS, Windows e Linux",
+ "download.hero.button": "Baixar para {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "Extensões OpenCode",
+ "download.section.integrations": "Integrações OpenCode",
+ "download.action.download": "Baixar",
+ "download.action.install": "Instalar",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Não necessariamente, mas provavelmente. Você precisará de uma assinatura de IA se quiser conectar o OpenCode a um provedor pago, embora você possa trabalhar com",
+ "download.faq.a3.localLink": "modelos locais",
+ "download.faq.a3.afterLocal.beforeZen": "de graça. Embora incentivemos os usuários a usar o",
+ "download.faq.a3.afterZen":
+ ", o OpenCode funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
+
+ "download.faq.a5.p1": "O OpenCode é 100% gratuito para usar.",
+ "download.faq.a5.p2.beforeZen":
+ "Quaisquer custos adicionais virão da sua assinatura de um provedor de modelo. Embora o OpenCode funcione com qualquer provedor de modelo, recomendamos o uso do",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1":
+ "Seus dados e informações só são armazenados quando você cria links compartilháveis no OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Saiba mais sobre",
+ "download.faq.a6.shareLink": "páginas de compartilhamento",
+
+ "enterprise.title": "OpenCode | Soluções empresariais para sua organização",
+ "enterprise.meta.description": "Contate a OpenCode para soluções empresariais",
+ "enterprise.hero.title": "Seu código é seu",
+ "enterprise.hero.body1":
+ "O OpenCode opera com segurança dentro da sua organização, sem dados ou contexto armazenados e sem restrições de licenciamento ou reivindicações de propriedade. Inicie um teste com sua equipe e, em seguida, implante em toda a organização integrando-o ao seu SSO e gateway de IA interno.",
+ "enterprise.hero.body2": "Deixe-nos saber como podemos ajudar.",
+ "enterprise.form.name.label": "Nome completo",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Cargo",
+ "enterprise.form.role.placeholder": "Presidente Executivo",
+ "enterprise.form.company.label": "Empresa",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "E-mail corporativo",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Telefone",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Qual problema você está tentando resolver?",
+ "enterprise.form.message.placeholder": "Precisamos de ajuda com...",
+ "enterprise.form.send": "Enviar",
+ "enterprise.form.sending": "Enviando...",
+ "enterprise.form.success": "Mensagem enviada, entraremos em contato em breve.",
+ "enterprise.form.success.submitted": "Formulário enviado com sucesso.",
+ "enterprise.form.error.allFieldsRequired": "Todos os campos são obrigatórios.",
+ "enterprise.form.error.invalidEmailFormat": "Formato de e-mail inválido.",
+ "enterprise.form.error.internalServer": "Erro interno do servidor.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "O que é OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise é para organizações que desejam garantir que seu código e dados nunca saiam de sua infraestrutura. Isso pode ser feito usando uma configuração centralizada que se integra ao seu SSO e gateway de IA interno.",
+ "enterprise.faq.q2": "Como faço para começar com o OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Basta começar com um teste interno com sua equipe. O OpenCode por padrão não armazena seu código ou dados de contexto, facilitando o início. Em seguida, entre em contato conosco para discutir opções de preços e implementação.",
+ "enterprise.faq.q3": "Como funciona o preço empresarial?",
+ "enterprise.faq.a3":
+ "Oferecemos preços empresariais por assento. Se você tiver seu próprio gateway de LLM, não cobramos pelos tokens usados. Para mais detalhes, entre em contato conosco para um orçamento personalizado com base nas necessidades da sua organização.",
+ "enterprise.faq.q4": "Meus dados estão seguros com o OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Sim. O OpenCode não armazena seu código ou dados de contexto. Todo o processamento acontece localmente ou por meio de chamadas de API diretas para seu provedor de IA. Com configuração centralizada e integração de SSO, seus dados permanecem seguros dentro da infraestrutura de sua organização.",
+
+ "brand.title": "OpenCode | Marca",
+ "brand.meta.description": "Diretrizes da marca OpenCode",
+ "brand.heading": "Diretrizes da marca",
+ "brand.subtitle": "Recursos e ativos para ajudá-lo a trabalhar com a marca OpenCode.",
+ "brand.downloadAll": "Baixar todos os recursos",
+
+ "changelog.title": "OpenCode | Changelog",
+ "changelog.meta.description": "Notas de versão e changelog do OpenCode",
+ "changelog.hero.title": "Changelog",
+ "changelog.hero.subtitle": "Novas atualizações e melhorias no OpenCode",
+ "changelog.empty": "Nenhuma entrada de changelog encontrada.",
+ "changelog.viewJson": "Ver JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agente",
+ "bench.list.table.model": "Modelo",
+ "bench.list.table.score": "Pontuação",
+ "bench.submission.error.allFieldsRequired": "Todos os campos são obrigatórios.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Tarefa não encontrada",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "Agente",
+ "bench.detail.labels.model": "Modelo",
+ "bench.detail.labels.task": "Tarefa",
+ "bench.detail.labels.repo": "Repositório",
+ "bench.detail.labels.from": "De",
+ "bench.detail.labels.to": "Para",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Duração Média",
+ "bench.detail.labels.averageScore": "Pontuação Média",
+ "bench.detail.labels.averageCost": "Custo Médio",
+ "bench.detail.labels.summary": "Resumo",
+ "bench.detail.labels.runs": "Execuções",
+ "bench.detail.labels.score": "Pontuação",
+ "bench.detail.labels.base": "Base",
+ "bench.detail.labels.penalty": "Penalidade",
+ "bench.detail.labels.weight": "peso",
+ "bench.detail.table.run": "Execução",
+ "bench.detail.table.score": "Pontuação (Base - Penalidade)",
+ "bench.detail.table.cost": "Custo",
+ "bench.detail.table.duration": "Duração",
+ "bench.detail.run.title": "Execução {{n}}",
+ "bench.detail.rawJson": "JSON Bruto",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/da.ts b/packages/console/app/src/i18n/da.ts
new file mode 100644
index 0000000..4e05829
--- /dev/null
+++ b/packages/console/app/src/i18n/da.ts
@@ -0,0 +1,820 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Dokumentation",
+ "nav.changelog": "Changelog",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Log ind",
+ "nav.free": "Download",
+ "nav.home": "Hjem",
+ "nav.openMenu": "Åbn menu",
+ "nav.getStartedFree": "Kom i gang gratis",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Kopier logo som SVG",
+ "nav.context.copyWordmark": "Kopier wordmark som SVG",
+ "nav.context.brandAssets": "Brand-assets",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Dokumentation",
+ "footer.changelog": "Changelog",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Brand",
+ "legal.privacy": "Privatliv",
+ "legal.terms": "Vilkår",
+
+ "email.title": "Få besked først, når vi lancerer nye produkter",
+ "email.subtitle": "Tilmeld dig ventelisten for tidlig adgang.",
+ "email.placeholder": "E-mailadresse",
+ "email.subscribe": "Tilmeld",
+ "email.success": "Næsten færdig - tjek din indbakke og bekræft din e-mailadresse",
+
+ "notFound.title": "Ikke fundet | opencode",
+ "notFound.heading": "404 - Siden blev ikke fundet",
+ "notFound.home": "Hjem",
+ "notFound.docs": "Dokumentation",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode logo light",
+ "notFound.logoDarkAlt": "opencode logo dark",
+
+ "user.logout": "Log ud",
+
+ "auth.callback.error.codeMissing": "Ingen autorisationskode fundet.",
+
+ "workspace.select": "Vælg workspace",
+ "workspace.createNew": "+ Opret nyt workspace",
+ "workspace.modal.title": "Opret nyt workspace",
+ "workspace.modal.placeholder": "Indtast workspace-navn",
+
+ "common.cancel": "Annuller",
+ "common.creating": "Opretter...",
+ "common.create": "Opret",
+
+ "common.videoUnsupported": "Din browser understøtter ikke video-tagget.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Læs mere",
+
+ "error.invalidPlan": "Ugyldig plan",
+ "error.workspaceRequired": "Workspace-ID er påkrævet",
+ "error.alreadySubscribed": "Dette workspace har allerede et abonnement",
+ "error.limitRequired": "Grænse er påkrævet.",
+ "error.monthlyLimitInvalid": "Angiv en gyldig månedlig grænse.",
+ "error.workspaceNameRequired": "Workspace-navn er påkrævet.",
+ "error.nameTooLong": "Navnet må højst være på 255 tegn.",
+ "error.emailRequired": "E-mail er påkrævet",
+ "error.roleRequired": "Rolle er påkrævet",
+ "error.idRequired": "ID er påkrævet",
+ "error.nameRequired": "Navn er påkrævet",
+ "error.providerRequired": "Udbyder er påkrævet",
+ "error.apiKeyRequired": "API-nøgle er påkrævet",
+ "error.modelRequired": "Model er påkrævet",
+ "error.reloadAmountMin": "Genopfyldningsbeløb skal være mindst ${{amount}}",
+ "error.reloadTriggerMin": "Saldogrænse skal være mindst ${{amount}}",
+
+ "app.meta.description": "OpenCode - Den open source kodningsagent.",
+
+ "home.title": "OpenCode | Den open source AI-kodningsagent",
+
+ "temp.title": "opencode | AI-kodningsagent bygget til terminalen",
+ "temp.hero.title": "AI-kodningsagenten bygget til terminalen",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Kom i gang",
+ "temp.feature.native.title": "Native TUI",
+ "temp.feature.native.body": "En responsiv, native, tema-bar terminal-UI",
+ "temp.feature.zen.beforeLink": "En",
+ "temp.feature.zen.link": "kurateret liste over modeller",
+ "temp.feature.zen.afterLink": "leveret af opencode",
+ "temp.feature.models.beforeLink": "Understøtter 75+ LLM-udbydere gennem",
+ "temp.feature.models.afterLink": ", inklusive lokale modeller",
+ "temp.screenshot.caption": "opencode TUI med tokyonight-temaet",
+ "temp.screenshot.alt": "opencode TUI med tokyonight-temaet",
+ "temp.logoLightAlt": "opencode logo light",
+ "temp.logoDarkAlt": "opencode logo dark",
+
+ "home.banner.badge": "Ny",
+ "home.banner.text": "Desktop-app tilgængelig i beta",
+ "home.banner.platforms": "på macOS, Windows og Linux",
+ "home.banner.downloadNow": "Download nu",
+ "home.banner.downloadBetaNow": "Download desktop-betaen nu",
+
+ "home.hero.title": "Den open source AI-kodningsagent",
+ "home.hero.subtitle.a": "Gratis modeller inkluderet, eller forbind enhver model fra enhver udbyder,",
+ "home.hero.subtitle.b": "inklusive Claude, GPT, Gemini og mere.",
+
+ "home.install.ariaLabel": "Installationsmuligheder",
+
+ "home.what.title": "Hvad er OpenCode?",
+ "home.what.body":
+ "OpenCode er en open source agent, der hjælper dig med at skrive kode i din terminal, IDE eller desktop.",
+ "home.what.lsp.title": "LSP aktiveret",
+ "home.what.lsp.body": "Indlæser automatisk de rigtige LSP'er til LLM'en",
+ "home.what.multiSession.title": "Multi-session",
+ "home.what.multiSession.body": "Start flere agenter parallelt på det samme projekt",
+ "home.what.shareLinks.title": "Del links",
+ "home.what.shareLinks.body": "Del et link til enhver session til reference eller debugging",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Log ind med GitHub for at bruge din Copilot-konto",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Log ind med OpenAI for at bruge din ChatGPT Plus- eller Pro-konto",
+ "home.what.anyModel.title": "Enhver model",
+ "home.what.anyModel.body": "75+ LLM-udbydere via Models.dev, inklusive lokale modeller",
+ "home.what.anyEditor.title": "Enhver editor",
+ "home.what.anyEditor.body": "Tilgængelig som terminal-interface, desktop-app og IDE-udvidelse",
+ "home.what.readDocs": "Læs docs",
+
+ "home.growth.title": "Den open source AI-kodningsagent",
+ "home.growth.body":
+ "Med over {{stars}} GitHub-stjerner, {{contributors}} bidragsydere og over {{commits}} commits bruges OpenCode af over {{monthlyUsers}} udviklere hver måned.",
+ "home.growth.githubStars": "GitHub-stjerner",
+ "home.growth.contributors": "Bidragsydere",
+ "home.growth.monthlyDevs": "Månedlige udviklere",
+
+ "home.privacy.title": "Bygget med privatliv først",
+ "home.privacy.body":
+ "OpenCode gemmer ikke din kode eller kontekstdata, så den kan bruges i privatlivsfølsomme miljøer.",
+ "home.privacy.learnMore": "Læs mere om",
+ "home.privacy.link": "privatliv",
+
+ "home.faq.q1": "Hvad er OpenCode?",
+ "home.faq.a1":
+ "OpenCode er en open source agent, der hjælper dig med at skrive og køre kode med enhver AI-model. Den er tilgængelig som terminal-interface, desktop-app eller IDE-udvidelse.",
+ "home.faq.q2": "Hvordan bruger jeg OpenCode?",
+ "home.faq.a2.before": "Den nemmeste måde at komme i gang på er at læse",
+ "home.faq.a2.link": "introen",
+ "home.faq.q3": "Skal jeg have ekstra AI-abonnementer for at bruge OpenCode?",
+ "home.faq.a3.p1":
+ "Ikke nødvendigvis. OpenCode kommer med gratis modeller, som du kan bruge uden at oprette en konto.",
+ "home.faq.a3.p2.beforeZen": "Derudover kan du bruge populære kodningsmodeller ved at oprette en",
+ "home.faq.a3.p2.afterZen": " konto.",
+ "home.faq.a3.p3":
+ "Vi opfordrer til at bruge Zen, men OpenCode virker også med populære udbydere som OpenAI, Anthropic, xAI osv.",
+ "home.faq.a3.p4.beforeLocal": "Du kan endda forbinde dine",
+ "home.faq.a3.p4.localLink": "lokale modeller",
+ "home.faq.q4": "Kan jeg bruge mine eksisterende AI-abonnementer med OpenCode?",
+ "home.faq.a4.p1":
+ "Ja. OpenCode understøtter abonnementer fra alle store udbydere. Du kan bruge Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot.",
+ "home.faq.q5": "Kan jeg kun bruge OpenCode i terminalen?",
+ "home.faq.a5.beforeDesktop": "Ikke længere! OpenCode er nu tilgængelig som en app til",
+ "home.faq.a5.desktop": "desktop",
+ "home.faq.a5.and": "og",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "Hvad koster OpenCode?",
+ "home.faq.a6":
+ "OpenCode er 100% gratis at bruge. Det kommer også med et sæt gratis modeller. Der kan være ekstra omkostninger, hvis du forbinder en anden udbyder.",
+ "home.faq.q7": "Hvad med data og privatliv?",
+ "home.faq.a7.p1": "Dine data gemmes kun, når du bruger vores gratis modeller eller opretter delbare links.",
+ "home.faq.a7.p2.beforeModels": "Læs mere om",
+ "home.faq.a7.p2.modelsLink": "vores modeller",
+ "home.faq.a7.p2.and": "og",
+ "home.faq.a7.p2.shareLink": "delingssider",
+ "home.faq.q8": "Er OpenCode open source?",
+ "home.faq.a8.p1": "Ja, OpenCode er fuldt open source. Kildekoden er offentlig på",
+ "home.faq.a8.p2": "under",
+ "home.faq.a8.mitLicense": "MIT-licensen",
+ "home.faq.a8.p3":
+ ", hvilket betyder at alle kan bruge, ændre eller bidrage til udviklingen. Alle i communityet kan oprette issues, indsende pull requests og udvide funktionalitet.",
+
+ "home.zenCta.title": "Få adgang til pålidelige, optimerede modeller til kodningsagenter",
+ "home.zenCta.body":
+ "Zen giver dig adgang til et håndplukket sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet på tværs af udbydere: brug validerede modeller, der virker.",
+ "home.zenCta.link": "Læs om Zen",
+
+ "zen.title": "OpenCode Zen | Et kurateret sæt af pålidelige, optimerede modeller til kodningsagenter",
+ "zen.hero.title": "Pålidelige optimerede modeller til kodningsagenter",
+ "zen.hero.body":
+ "Zen giver dig adgang til et kurateret sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet: brug validerede modeller, der virker.",
+
+ "zen.faq.q1": "Hvad er OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen er et kurateret sæt AI-modeller testet og benchmarked til kodningsagenter, skabt af teamet bag OpenCode.",
+ "zen.faq.q2": "Hvad gør Zen mere præcis?",
+ "zen.faq.a2":
+ "Zen tilbyder kun modeller, der er testet og benchmarked specifikt til kodningsagenter. Du ville ikke bruge en smørkniv til at skære steak; brug ikke dårlige modeller til kodning.",
+ "zen.faq.q3": "Er Zen billigere?",
+ "zen.faq.a3":
+ "Zen er ikke for profit. Zen videregiver omkostningerne fra modeludbyderne til dig. Jo mere Zen bruges, desto mere kan OpenCode forhandle bedre priser og give dem videre til dig.",
+ "zen.faq.q4": "Hvad koster Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "opkræver per request",
+ "zen.faq.a4.p1.afterPricing": "uden markups, så du betaler præcis det, som modeludbyderen opkræver.",
+ "zen.faq.a4.p2.beforeAccount": "Din samlede pris afhænger af brug, og du kan sætte månedlige udgiftsgrænser i din",
+ "zen.faq.a4.p2.accountLink": "konto",
+ "zen.faq.a4.p3":
+ "For at dække omkostninger tilføjer OpenCode kun et lille betalingsgebyr på $1.23 per $20 saldo-opfyldning.",
+ "zen.faq.q5": "Hvad med data og privatliv?",
+ "zen.faq.a5.beforeExceptions":
+ "Alle Zen-modeller hostes i USA. Udbydere følger en zero-retention-policy og bruger ikke dine data til modeltræning, med de",
+ "zen.faq.a5.exceptionsLink": "følgende undtagelser",
+ "zen.faq.q6": "Kan jeg sætte udgiftsgrænser?",
+ "zen.faq.a6": "Ja, du kan sætte månedlige udgiftsgrænser i din konto.",
+ "zen.faq.q7": "Kan jeg afmelde?",
+ "zen.faq.a7": "Ja, du kan deaktivere betaling når som helst og bruge din resterende saldo.",
+ "zen.faq.q8": "Kan jeg bruge Zen med andre kodningsagenter?",
+ "zen.faq.a8":
+ "Selvom Zen fungerer godt med OpenCode, kan du bruge Zen med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.",
+
+ "zen.cta.start": "Kom godt i gang med Zen",
+ "zen.pricing.title": "Tilføj $20 Pay as you go-saldo",
+ "zen.pricing.fee": "(+$1.23 kortbehandlingsgebyr)",
+ "zen.pricing.body": "Brug med enhver agent. Indstil månedlige forbrugsgrænser. Annuller til enhver tid.",
+ "zen.problem.title": "Hvilket problem løser Zen?",
+ "zen.problem.body":
+ "Der er så mange modeller tilgængelige, men kun få fungerer godt med kodningsagenter. De fleste udbydere konfigurerer dem anderledes med forskellige resultater.",
+ "zen.problem.subtitle": "Vi løser dette for alle, ikke kun OpenCode-brugere.",
+ "zen.problem.item1": "Test af udvalgte modeller og høring af deres teams",
+ "zen.problem.item2": "Samarbejde med udbydere for at sikre, at de bliver leveret korrekt",
+ "zen.problem.item3": "Benchmarking af alle model-udbyder kombinationer, vi anbefaler",
+ "zen.how.title": "Hvordan Zen virker",
+ "zen.how.body": "Selvom vi foreslår, at du bruger Zen med OpenCode, kan du bruge Zen med enhver agent.",
+ "zen.how.step1.title": "Tilmeld dig og tilføj saldo på $20",
+ "zen.how.step1.beforeLink": "følg",
+ "zen.how.step1.link": "opsætningsinstruktioner",
+ "zen.how.step2.title": "Brug Zen med gennemsigtige priser",
+ "zen.how.step2.link": "betal per request",
+ "zen.how.step2.afterLink": "med nul markups",
+ "zen.how.step3.title": "Auto-top op",
+ "zen.how.step3.body": "når din saldo når $5, tilføjer vi automatisk $20",
+ "zen.privacy.title": "Dit privatliv er vigtigt for os",
+ "zen.privacy.beforeExceptions":
+ "Alle Zen-modeller er hostet i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning med",
+ "zen.privacy.exceptionsLink": "følgende undtagelser",
+
+ "go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle",
+ "go.meta.description":
+ "Go starter ved $5 for den første måned, derefter $10/måned, med generøse 5-timers anmodningsgrænser for GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash.",
+ "go.hero.title": "Kodningsmodeller til lav pris for alle",
+ "go.hero.body":
+ "Go bringer agentisk kodning til programmører over hele verden. Med generøse grænser og pålidelig adgang til de mest kapable open source-modeller, så du kan bygge med kraftfulde agenter uden at bekymre dig om omkostninger eller tilgængelighed.",
+
+ "go.cta.start": "Abonner på Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Abonner på Go",
+ "go.cta.price": "$10/måned",
+ "go.cta.promo": "$5 første måned",
+ "go.pricing.body":
+ "Brug med enhver agent. $5 første måned, derefter $10/måned. Tank op med kredit efter behov. Afmeld når som helst.",
+ "go.graph.free": "Gratis",
+ "go.graph.freePill": "Big Pickle og gratis modeller",
+ "go.graph.go": "Go",
+ "go.graph.label": "Forespørgsler pr. 5 timer",
+ "go.graph.usageLimits": "Brugsgrænser",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Forespørgsler pr. 5t: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "har været livsændrende, det er virkelig en no-brainer.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, og ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 ud af 5 personer på vores team elsker at bruge",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Jeg kan ikke anbefale",
+ "go.testimonials.adam.quoteAfter": "nok. Seriøst, det er virkelig godt.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Med",
+ "go.testimonials.david.quoteAfter": "ved jeg, at alle modellerne er testede og perfekte til kodningsagenter.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 gange)",
+ "go.testimonials.frank.quote": "Jeg ville ønske, jeg stadig var hos Nvidia.",
+ "go.problem.title": "Hvilket problem løser Go?",
+ "go.problem.body":
+ "Vi fokuserer på at bringe OpenCode-oplevelsen ud til så mange som muligt. OpenCode Go er et lavprisabonnement: $5 for den første måned, derefter $10/måned. Det giver generøse grænser og pålidelig adgang til de mest kapable open source-modeller.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Lavpris abonnementspriser",
+ "go.problem.item2": "Generøse grænser og pålidelig adgang",
+ "go.problem.item3": "Bygget til så mange programmører som muligt",
+ "go.problem.item4":
+ "Inkluderer GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash",
+ "go.how.title": "Hvordan Go virker",
+ "go.how.body":
+ "Go starter ved $5 for den første måned, derefter $10/måned. Du kan bruge det med OpenCode eller enhver agent.",
+ "go.how.step1.title": "Opret en konto",
+ "go.how.step1.beforeLink": "følg",
+ "go.how.step1.link": "opsætningsinstruktionerne",
+ "go.how.step2.title": "Abonner på Go",
+ "go.how.step2.link": "$5 første måned",
+ "go.how.step2.afterLink": "derefter $10/måned med generøse grænser",
+ "go.how.step3.title": "Start kodning",
+ "go.how.step3.body": "med pålidelig adgang til open source-modeller",
+ "go.privacy.title": "Dit privatliv er vigtigt for os",
+ "go.privacy.body":
+ "Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang.",
+ "go.privacy.contactAfter": "hvis du har spørgsmål.",
+ "go.privacy.beforeExceptions":
+ "Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
+ "go.privacy.exceptionsLink": "følgende undtagelser",
+ "go.faq.q1": "Hvad er OpenCode Go?",
+ "go.faq.a1":
+ "Go er et lavprisabonnement, der giver dig pålidelig adgang til kapable open source-modeller til agentisk kodning.",
+ "go.faq.q2": "Hvilke modeller inkluderer Go?",
+ "go.faq.a2": "Go inkluderer modellerne nedenfor med generøse grænser og pålidelig adgang.",
+ "go.faq.q3": "Er Go det samme som Zen?",
+ "go.faq.a3":
+ "Nej. Zen er pay-as-you-go, mens Go starter ved $5 for den første måned, derefter $10/måned, med generøse grænser og pålidelig adgang til open source-modellerne GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash.",
+ "go.faq.q4": "Hvad koster Go?",
+ "go.faq.a4.p1.beforePricing": "Go koster",
+ "go.faq.a4.p1.pricingLink": "$5 første måned",
+ "go.faq.a4.p1.afterPricing": "derefter $10/måned med generøse grænser.",
+ "go.faq.a4.p2.beforeAccount": "Du kan administrere dit abonnement i din",
+ "go.faq.a4.p2.accountLink": "konto",
+ "go.faq.a4.p3": "Annuller til enhver tid.",
+ "go.faq.q5": "Hvad med data og privatliv?",
+ "go.faq.a5.body":
+ "Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang. Vores udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning.",
+ "go.faq.a5.beforeExceptions":
+ "Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
+ "go.faq.a5.exceptionsLink": "følgende undtagelser",
+ "go.faq.q6": "Kan jeg tanke kredit op?",
+ "go.faq.a6": "Hvis du har brug for mere forbrug, kan du tanke kredit op på din konto.",
+ "go.faq.q7": "Kan jeg annullere?",
+ "go.faq.a7": "Ja, du kan annullere til enhver tid.",
+ "go.faq.q8": "Kan jeg bruge Go med andre kodningsagenter?",
+ "go.faq.a8": "Ja, du kan bruge Go med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.",
+
+ "go.faq.q9": "Hvad er forskellen på gratis modeller og Go?",
+ "go.faq.a9":
+ "Gratis modeller inkluderer Big Pickle plus salgsfremmende modeller tilgængelige på det tidspunkt, med en kvote på 200 forespørgsler/dag. Go inkluderer GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash med højere anmodningskvoter håndhævet over rullende vinduer (5-timers, ugentlig og månedlig), nogenlunde svarende til $12 pr. 5 timer, $30 pr. uge og $60 pr. måned (faktiske anmodningstal varierer efter model og brug).",
+
+ "zen.api.error.rateLimitExceeded": "Hastighedsgrænse overskredet. Prøv venligst igen senere.",
+ "zen.api.error.modelNotSupported": "Model {{model}} understøttes ikke",
+ "zen.api.error.modelFormatNotSupported": "Model {{model}} understøttes ikke for format {{format}}",
+ "zen.api.error.noProviderAvailable": "Ingen udbyder tilgængelig",
+ "zen.api.error.providerNotSupported": "Udbyder {{provider}} understøttes ikke",
+ "zen.api.error.missingApiKey": "Manglende API-nøgle.",
+ "zen.api.error.invalidApiKey": "Ugyldig API-nøgle.",
+ "zen.api.error.subscriptionQuotaExceeded": "Abonnementskvote overskredet. Prøv igen om {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Forbrugsgrænsen for 5 timer er nået. Nulstilles om {{retryIn}}. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Ugentlig forbrugsgrænse er nået. Nulstilles om {{retryIn}}. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Månedlig forbrugsgrænse er nået. Nulstilles om {{retryIn}}. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Ingen betalingsmetode. Tilføj en betalingsmetode her: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Utilstrækkelig saldo. Administrer din fakturering her: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Dit workspace har nået sin månedlige forbrugsgrænse på ${{amount}}. Administrer dine grænser her: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Du har nået din månedlige forbrugsgrænse på ${{amount}}. Administrer dine grænser her: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Modellen er deaktiveret",
+ "zen.api.error.trialEnded":
+ "Den gratis kampagne for {{model}} er afsluttet. Du kan fortsætte med at bruge modellen ved at abonnere på OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Få adgang til verdens bedste kodningsmodeller",
+ "black.meta.description": "Få adgang til Claude, GPT, Gemini og mere med OpenCode Black-abonnementer.",
+ "black.hero.title": "Få adgang til verdens bedste kodningsmodeller",
+ "black.hero.subtitle": "Inklusive Claude, GPT, Gemini og mere",
+ "black.title": "OpenCode Black | Priser",
+ "black.paused": "Black-plantilmelding er midlertidigt sat på pause.",
+ "black.plan.icon20": "Black 20-plan",
+ "black.plan.icon100": "Black 100-plan",
+ "black.plan.icon200": "Black 200-plan",
+ "black.plan.multiplier100": "5x mere brug end Black 20",
+ "black.plan.multiplier200": "20x mere brug end Black 20",
+ "black.price.perMonth": "pr. måned",
+ "black.price.perPersonBilledMonthly": "pr. person faktureret månedligt",
+ "black.terms.1": "Dit abonnement starter ikke med det samme",
+ "black.terms.2": "Du bliver sat på ventelisten og aktiveret snart",
+ "black.terms.3": "Dit kort debiteres først, når dit abonnement er aktiveret",
+ "black.terms.4": "Forbrugsgrænser gælder, tung automatiseret brug kan nå grænserne hurtigere",
+ "black.terms.5": "Abonnementer er for enkeltpersoner, kontakt Enterprise for teams",
+ "black.terms.6": "Grænser kan justeres, og planer kan blive udfaset i fremtiden",
+ "black.terms.7": "Opsig dit abonnement når som helst",
+ "black.action.continue": "Fortsæt",
+ "black.finePrint.beforeTerms": "Viste priser inkluderer ikke gældende skat",
+ "black.finePrint.terms": "Servicevilkår",
+ "black.workspace.title": "OpenCode Black | Vælg workspace",
+ "black.workspace.selectPlan": "Vælg et workspace til denne plan",
+ "black.workspace.name": "Workspace {{n}}",
+ "black.subscribe.title": "Abonner på OpenCode Black",
+ "black.subscribe.paymentMethod": "Betalingsmetode",
+ "black.subscribe.loadingPaymentForm": "Indlæser betalingsformular...",
+ "black.subscribe.selectWorkspaceToContinue": "Vælg et workspace for at fortsætte",
+ "black.subscribe.failurePrefix": "Åh nej!",
+ "black.subscribe.error.generic": "Der opstod en fejl",
+ "black.subscribe.error.invalidPlan": "Ugyldig plan",
+ "black.subscribe.error.workspaceRequired": "Workspace-ID er påkrævet",
+ "black.subscribe.error.alreadySubscribed": "Dette workspace har allerede et abonnement",
+ "black.subscribe.processing": "Behandler...",
+ "black.subscribe.submit": "Abonner ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Du bliver først debiteret, når dit abonnement er aktiveret",
+ "black.subscribe.success.title": "Du er på OpenCode Black-ventelisten",
+ "black.subscribe.success.subscriptionPlan": "Abonnementsplan",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Beløb",
+ "black.subscribe.success.amountValue": "${{plan}} pr. måned",
+ "black.subscribe.success.paymentMethod": "Betalingsmetode",
+ "black.subscribe.success.dateJoined": "Dato tilmeldt",
+ "black.subscribe.success.chargeNotice": "Dit kort vil blive debiteret, når dit abonnement er aktiveret",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Brug",
+ "workspace.nav.apiKeys": "API-nøgler",
+ "workspace.nav.members": "Medlemmer",
+ "workspace.nav.billing": "Fakturering",
+ "workspace.nav.settings": "Indstillinger",
+
+ "workspace.home.banner.beforeLink": "Pålidelige optimerede modeller til kodningsagenter.",
+ "workspace.lite.banner.beforeLink": "Lavpris kodemodeller for alle.",
+ "workspace.home.billing.loading": "Indlæser...",
+ "workspace.home.billing.enable": "Aktiver fakturering",
+ "workspace.home.billing.currentBalance": "Nuværende saldo",
+
+ "workspace.newUser.feature.tested.title": "Testede og verificerede modeller",
+ "workspace.newUser.feature.tested.body":
+ "Vi har benchmarket og testet modeller specifikt til kodningsagenter for at sikre den bedste ydeevne.",
+ "workspace.newUser.feature.quality.title": "Højeste kvalitet",
+ "workspace.newUser.feature.quality.body":
+ "Få adgang til modeller konfigureret til optimal ydeevne - ingen nedgraderinger eller routing til billigere udbydere.",
+ "workspace.newUser.feature.lockin.title": "Ingen indlåsning",
+ "workspace.newUser.feature.lockin.body":
+ "Brug Zen med en hvilken som helst kodningsagent, og fortsæt med at bruge andre udbydere med opencode, når du vil.",
+ "workspace.newUser.copyApiKey": "Kopiér API-nøgle",
+ "workspace.newUser.copyKey": "Kopier nøgle",
+ "workspace.newUser.copied": "Kopieret!",
+ "workspace.newUser.step.enableBilling": "Aktiver fakturering",
+ "workspace.newUser.step.login.before": "Kør",
+ "workspace.newUser.step.login.after": "og vælg opencode",
+ "workspace.newUser.step.pasteKey": "Indsæt din API-nøgle",
+ "workspace.newUser.step.models.before": "Start opencode og kør",
+ "workspace.newUser.step.models.after": "for at vælge en model",
+
+ "workspace.models.title": "Modeller",
+ "workspace.models.subtitle.beforeLink": "Administrer, hvilke modeller workspace-medlemmer kan få adgang til.",
+ "workspace.models.table.model": "Model",
+ "workspace.models.table.enabled": "Aktiveret",
+
+ "workspace.providers.title": "Medbring din egen nøgle",
+ "workspace.providers.subtitle": "Konfigurer dine egne API-nøgler fra AI-udbydere.",
+ "workspace.providers.placeholder": "Indtast {{provider}} API-nøgle ({{prefix}}...)",
+ "workspace.providers.configure": "Konfigurer",
+ "workspace.providers.edit": "Rediger",
+ "workspace.providers.delete": "Slet",
+ "workspace.providers.saving": "Gemmer...",
+ "workspace.providers.save": "Gem",
+ "workspace.providers.table.provider": "Udbyder",
+ "workspace.providers.table.apiKey": "API-nøgle",
+
+ "workspace.usage.title": "Brugshistorik",
+ "workspace.usage.subtitle": "Seneste API-brug og omkostninger.",
+ "workspace.usage.empty": "Foretag dit første API-opkald for at komme i gang.",
+ "workspace.usage.table.date": "Dato",
+ "workspace.usage.table.model": "Model",
+ "workspace.usage.table.input": "Input",
+ "workspace.usage.table.output": "Output",
+ "workspace.usage.table.cost": "Omkostning",
+ "workspace.usage.table.session": "Session",
+ "workspace.usage.breakdown.input": "Input",
+ "workspace.usage.breakdown.cacheRead": "Cache læst",
+ "workspace.usage.breakdown.cacheWrite": "Cache skriv",
+ "workspace.usage.breakdown.output": "Output",
+ "workspace.usage.breakdown.reasoning": "Ræsonnement",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Omkostninger",
+ "workspace.cost.subtitle": "Brugsomkostninger opdelt efter model.",
+ "workspace.cost.allModels": "Alle modeller",
+ "workspace.cost.allKeys": "Alle nøgler",
+ "workspace.cost.deletedSuffix": "(slettet)",
+ "workspace.cost.empty": "Ingen brugsdata tilgængelige for den valgte periode.",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "API-nøgler",
+ "workspace.keys.subtitle": "Administrer dine API-nøgler for at få adgang til opencode-tjenester.",
+ "workspace.keys.create": "Opret API-nøgle",
+ "workspace.keys.placeholder": "Indtast nøglenavn",
+ "workspace.keys.empty": "Opret en opencode Gateway API-nøgle",
+ "workspace.keys.table.name": "Navn",
+ "workspace.keys.table.key": "Nøgle",
+ "workspace.keys.table.createdBy": "Oprettet af",
+ "workspace.keys.table.lastUsed": "Sidst brugt",
+ "workspace.keys.copyApiKey": "Kopiér API-nøgle",
+ "workspace.keys.delete": "Slet",
+
+ "workspace.members.title": "Medlemmer",
+ "workspace.members.subtitle": "Administrer workspace-medlemmer og deres tilladelser.",
+ "workspace.members.invite": "Inviter medlem",
+ "workspace.members.inviting": "Inviterer...",
+ "workspace.members.beta.beforeLink": "Workspaces er gratis for teams under betaversionen.",
+ "workspace.members.form.invitee": "Inviteret",
+ "workspace.members.form.emailPlaceholder": "Indtast e-mail",
+ "workspace.members.form.role": "Rolle",
+ "workspace.members.form.monthlyLimit": "Månedlig forbrugsgrænse",
+ "workspace.members.noLimit": "Ingen grænse",
+ "workspace.members.noLimitLowercase": "ingen grænse",
+ "workspace.members.invited": "inviteret",
+ "workspace.members.edit": "Rediger",
+ "workspace.members.delete": "Slet",
+ "workspace.members.saving": "Gemmer...",
+ "workspace.members.save": "Gem",
+ "workspace.members.table.email": "E-mail",
+ "workspace.members.table.role": "Rolle",
+ "workspace.members.table.monthLimit": "Månedsgrænse",
+ "workspace.members.role.admin": "Admin",
+ "workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
+ "workspace.members.role.member": "Medlem",
+ "workspace.members.role.memberDescription": "Kan kun generere API-nøgler til sig selv",
+
+ "workspace.settings.title": "Indstillinger",
+ "workspace.settings.subtitle": "Opdater dit workspace-navn og præferencer.",
+ "workspace.settings.workspaceName": "Workspace-navn",
+ "workspace.settings.defaultName": "Standard",
+ "workspace.settings.updating": "Opdaterer...",
+ "workspace.settings.save": "Gem",
+ "workspace.settings.edit": "Rediger",
+
+ "workspace.billing.title": "Fakturering",
+ "workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.",
+ "workspace.billing.contactUs": "Kontakt os",
+ "workspace.billing.subtitle.afterLink": "hvis du har spørgsmål.",
+ "workspace.billing.currentBalance": "Nuværende saldo",
+ "workspace.billing.add": "Tilføj $",
+ "workspace.billing.enterAmount": "Indtast beløb",
+ "workspace.billing.loading": "Indlæser...",
+ "workspace.billing.addAction": "Tilføj",
+ "workspace.billing.addBalance": "Tilføj saldo",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Forbundet til Stripe",
+ "workspace.billing.manage": "Administrer",
+ "workspace.billing.enable": "Aktiver fakturering",
+
+ "workspace.monthlyLimit.title": "Månedlig grænse",
+ "workspace.monthlyLimit.subtitle": "Indstil en månedlig forbrugsgrænse for din konto.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Indstiller...",
+ "workspace.monthlyLimit.set": "Sæt",
+ "workspace.monthlyLimit.edit": "Rediger grænse",
+ "workspace.monthlyLimit.noLimit": "Ingen forbrugsgrænse angivet.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Nuværende brug for",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
+
+ "workspace.redeem.title": "Indløs kupon",
+ "workspace.redeem.subtitle": "Indløs en kuponkode for at få kreditter eller fordele.",
+ "workspace.redeem.placeholder": "Indtast kuponkode",
+ "workspace.redeem.redeem": "Indløs",
+ "workspace.redeem.redeeming": "Indløser...",
+ "workspace.redeem.success": "Kuponen blev indløst.",
+
+ "workspace.reload.title": "Automatisk genopfyldning",
+ "workspace.reload.disabled.before": "Automatisk genopfyldning er",
+ "workspace.reload.disabled.state": "deaktiveret",
+ "workspace.reload.disabled.after": "Aktiver for automatisk at genopfylde, når saldoen er lav.",
+ "workspace.reload.enabled.before": "Automatisk genopfyldning er",
+ "workspace.reload.enabled.state": "aktiveret",
+ "workspace.reload.enabled.middle": "Vi genopfylder",
+ "workspace.reload.processingFee": "ekspeditionsgebyr",
+ "workspace.reload.enabled.after": "når saldoen når",
+ "workspace.reload.edit": "Rediger",
+ "workspace.reload.enable": "Aktiver",
+ "workspace.reload.enableAutoReload": "Aktiver automatisk genopfyldning",
+ "workspace.reload.reloadAmount": "Genopfyld $",
+ "workspace.reload.whenBalanceReaches": "Når saldoen når $",
+ "workspace.reload.saving": "Gemmer...",
+ "workspace.reload.save": "Gem",
+ "workspace.reload.failedAt": "Genopfyldning mislykkedes kl",
+ "workspace.reload.reason": "Årsag:",
+ "workspace.reload.updatePaymentMethod": "Opdater din betalingsmetode, og prøv igen.",
+ "workspace.reload.retrying": "Prøver igen...",
+ "workspace.reload.retry": "Prøv igen",
+ "workspace.reload.error.paymentFailed": "Betaling mislykkedes.",
+
+ "workspace.payments.title": "Betalingshistorik",
+ "workspace.payments.subtitle": "Seneste betalingstransaktioner.",
+ "workspace.payments.table.date": "Dato",
+ "workspace.payments.table.paymentId": "Betalings-ID",
+ "workspace.payments.table.amount": "Beløb",
+ "workspace.payments.table.receipt": "Kvittering",
+ "workspace.payments.type.credit": "kredit",
+ "workspace.payments.type.subscription": "abonnement",
+ "workspace.payments.view": "Vis",
+
+ "workspace.black.loading": "Indlæser...",
+ "workspace.black.time.day": "dag",
+ "workspace.black.time.days": "dage",
+ "workspace.black.time.hour": "time",
+ "workspace.black.time.hours": "timer",
+ "workspace.black.time.minute": "minut",
+ "workspace.black.time.minutes": "minutter",
+ "workspace.black.time.fewSeconds": "et par sekunder",
+ "workspace.black.subscription.title": "Abonnement",
+ "workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} om måneden.",
+ "workspace.black.subscription.manage": "Administrer abonnement",
+ "workspace.black.subscription.rollingUsage": "5-timers brug",
+ "workspace.black.subscription.weeklyUsage": "Ugentlig brug",
+ "workspace.black.subscription.resetsIn": "Nulstiller i",
+ "workspace.black.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
+ "workspace.black.waitlist.title": "Venteliste",
+ "workspace.black.waitlist.joined": "Du er på ventelisten for ${{plan}} per måned OpenCode Black plan.",
+ "workspace.black.waitlist.ready": "Vi er klar til at tilmelde dig ${{plan}} per måned OpenCode Black plan.",
+ "workspace.black.waitlist.leave": "Forlad venteliste",
+ "workspace.black.waitlist.leaving": "Forlader...",
+ "workspace.black.waitlist.left": "Forladt",
+ "workspace.black.waitlist.enroll": "Tilmeld",
+ "workspace.black.waitlist.enrolling": "Tilmelder...",
+ "workspace.black.waitlist.enrolled": "Tilmeldt",
+ "workspace.black.waitlist.enrollNote":
+ "Når du klikker på Tilmeld, starter dit abonnement med det samme, og dit kort vil blive debiteret.",
+
+ "workspace.lite.loading": "Indlæser...",
+ "workspace.lite.time.day": "dag",
+ "workspace.lite.time.days": "dage",
+ "workspace.lite.time.hour": "time",
+ "workspace.lite.time.hours": "timer",
+ "workspace.lite.time.minute": "minut",
+ "workspace.lite.time.minutes": "minutter",
+ "workspace.lite.time.fewSeconds": "et par sekunder",
+ "workspace.lite.subscription.message": "Du abonnerer på OpenCode Go.",
+ "workspace.lite.subscription.manage": "Administrer abonnement",
+ "workspace.lite.subscription.rollingUsage": "Løbende forbrug",
+ "workspace.lite.subscription.weeklyUsage": "Ugentligt forbrug",
+ "workspace.lite.subscription.monthlyUsage": "Månedligt forbrug",
+ "workspace.lite.subscription.resetsIn": "Nulstiller i",
+ "workspace.lite.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
+ "workspace.lite.subscription.selectProvider":
+ 'Vælg "OpenCode Go" som udbyder i din opencode-konfiguration for at bruge Go-modeller.',
+ "workspace.lite.black.message":
+ "Du abonnerer i øjeblikket på OpenCode Black eller er på venteliste. Afmeld venligst først, hvis du vil skifte til Go.",
+ "workspace.lite.other.message":
+ "Et andet medlem i dette workspace abonnerer allerede på OpenCode Go. Kun ét medlem pr. workspace kan abonnere.",
+ "workspace.lite.promo.description":
+ "OpenCode Go starter ved {{price}}, derefter $10/måned, og giver pålidelig adgang til populære åbne kodningsmodeller med generøse brugsgrænser.",
+ "workspace.lite.promo.price": "$5 for den første måned",
+ "workspace.lite.promo.modelsTitle": "Hvad er inkluderet",
+ "workspace.lite.promo.footer":
+ "Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang. Priser og forbrugsgrænser kan ændre sig, efterhånden som vi lærer af tidlig brug og feedback.",
+ "workspace.lite.promo.subscribe": "Abonner på Go",
+ "workspace.lite.promo.subscribing": "Omdirigerer...",
+ "workspace.lite.promo.otherMethods": "Andre betalingsmetoder",
+ "workspace.lite.promo.selectMethod": "Vælg betalingsmetode",
+
+ "workspace.referral.copyLink": "Kopiér link",
+ "workspace.referral.copied": "Kopieret",
+ "workspace.referral.overview.title": "Inviter venner",
+ "workspace.referral.overview.subtitle": "Få $5, når en ven abonnerer. De får også $5.",
+ "workspace.referral.instructions.share": "Del dit henvisningslink",
+ "workspace.referral.instructions.subscribe": "Din ven tilmelder sig og abonnerer på Go",
+ "workspace.referral.instructions.claim": "I får begge $5 i forbrugskredit til at bruge på jeres Go-forbrugsgrænser",
+ "workspace.referral.rewards.title": "Henvisningsbelønninger",
+ "workspace.referral.rewards.description": "Brug tilgængelige henvisningskreditter på dit Go-forbrug.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} belønninger brugt.",
+ "workspace.referral.rewards.empty": "Ingen henvisningsbelønninger endnu.",
+ "workspace.referral.table.reward": "Belønning",
+ "workspace.referral.table.referral": "Beskrivelse",
+ "workspace.referral.table.date": "Dato",
+ "workspace.referral.reward.description.inviter": "Inviterede {{email}}",
+ "workspace.referral.reward.description.invitee": "Inviteret af {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Abonner for at låse op",
+ "workspace.referral.reward.action.view": "Vis belønning",
+ "workspace.referral.reward.action.applied": "Belønning brugt",
+ "workspace.referral.reward.source.pendingInviter": "Venter på, at de abonnerer",
+ "workspace.referral.reward.source.pendingInvitee": "Abonner for at låse belønningen op",
+ "workspace.referral.reward.source.available": "Belønning klar til brug",
+ "workspace.referral.reward.source.applied": "Belønning brugt",
+ "workspace.referral.reward.status.applied": "Belønning brugt",
+ "workspace.referral.reward.status.pendingInviter": "Abonner for at låse op",
+ "workspace.referral.reward.status.pendingInvitee": "Abonner for at låse op",
+ "workspace.referral.apply.noGo": "Abonner for at låse op",
+ "workspace.referral.apply.preview": "Vis belønning",
+ "workspace.referral.apply.action": "Brug",
+ "workspace.referral.apply.confirmTitle": "Brug belønning",
+ "workspace.referral.apply.confirmBody": "Brug {{amount}} til at reducere dette workspaces nuværende forbrug.",
+ "workspace.referral.apply.confirmAction": "Brug",
+
+ "download.title": "OpenCode | Download",
+ "download.meta.description": "Download OpenCode til macOS, Windows og Linux",
+ "download.hero.title": "Download OpenCode",
+ "download.hero.subtitle": "Tilgængelig i beta til macOS, Windows og Linux",
+ "download.hero.button": "Download til {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Extensions",
+ "download.section.integrations": "OpenCode Integrations",
+ "download.action.download": "Download",
+ "download.action.install": "Installer",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Ikke nødvendigvis, men sandsynligvis. Du skal bruge et AI-abonnement hvis du vil forbinde OpenCode til en betalt udbyder, men du kan arbejde med",
+ "download.faq.a3.localLink": "lokale modeller",
+ "download.faq.a3.afterLocal.beforeZen": "gratis. Selvom vi opfordrer brugere til at bruge",
+ "download.faq.a3.afterZen": ", fungerer OpenCode med alle populære udbydere som OpenAI, Anthropic, xAI osv.",
+
+ "download.faq.a5.p1": "OpenCode er 100% gratis at bruge.",
+ "download.faq.a5.p2.beforeZen":
+ "Eventuelle ekstra omkostninger kommer fra dit abonnement hos en modeludbyder. Selvom OpenCode fungerer med enhver modeludbyder, anbefaler vi at bruge",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "Dine data og oplysninger gemmes kun når du opretter delbare links i OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Læs mere om",
+ "download.faq.a6.shareLink": "delingssider",
+
+ "enterprise.title": "OpenCode | Enterprise-løsninger til din organisation",
+ "enterprise.meta.description": "Kontakt OpenCode for enterprise-løsninger",
+ "enterprise.hero.title": "Din kode er din egen",
+ "enterprise.hero.body1":
+ "OpenCode fungerer sikkert inde i din organisation uden at lagre data eller kontekst og uden licensbegrænsninger eller ejerskabskrav. Start en prøveperiode med dit team, og udrul det derefter i hele din organisation ved at integrere det med dit SSO og din interne AI-gateway.",
+ "enterprise.hero.body2": "Fortæl os, hvordan vi kan hjælpe.",
+ "enterprise.form.name.label": "Fulde navn",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Rolle",
+ "enterprise.form.role.placeholder": "Bestyrelsesformand",
+ "enterprise.form.company.label": "Virksomhed",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Firma-e-mail",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Telefonnummer",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Hvilket problem prøver du at løse?",
+ "enterprise.form.message.placeholder": "Vi har brug for hjælp med...",
+ "enterprise.form.send": "Send",
+ "enterprise.form.sending": "Sender...",
+ "enterprise.form.success": "Besked sendt, vi vender tilbage snart.",
+ "enterprise.form.success.submitted": "Formular indsendt med succes.",
+ "enterprise.form.error.allFieldsRequired": "Alle felter er påkrævet.",
+ "enterprise.form.error.invalidEmailFormat": "Ugyldigt e-mailformat.",
+ "enterprise.form.error.internalServer": "Intern serverfejl.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Hvad er OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise er til organisationer, der vil sikre, at deres kode og data aldrig forlader deres infrastruktur. Det kan gøres med en central konfiguration, der integrerer med dit SSO og din interne AI-gateway.",
+ "enterprise.faq.q2": "Hvordan kommer jeg i gang med OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Start blot med en intern prøveperiode med dit team. OpenCode gemmer som standard ikke din kode eller kontekstdata, hvilket gør det nemt at komme i gang. Kontakt os derefter for at tale om priser og implementeringsmuligheder.",
+ "enterprise.faq.q3": "Hvordan fungerer enterprise-priser?",
+ "enterprise.faq.a3":
+ "Vi tilbyder enterprise-priser pr. bruger. Hvis du har din egen LLM-gateway, opkræver vi ikke for brugte tokens. Kontakt os for flere detaljer og et tilbud tilpasset din organisations behov.",
+ "enterprise.faq.q4": "Er mine data sikre med OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Ja. OpenCode gemmer ikke din kode eller kontekstdata. Al behandling sker lokalt eller via direkte API-kald til din AI-udbyder. Med central konfiguration og SSO-integration forbliver dine data sikre inden for din organisations infrastruktur.",
+
+ "brand.title": "OpenCode | Brand",
+ "brand.meta.description": "OpenCode brandretningslinjer",
+ "brand.heading": "Brandretningslinjer",
+ "brand.subtitle": "Ressourcer og assets, der hjælper dig med at arbejde med OpenCode-brandet.",
+ "brand.downloadAll": "Download alle assets",
+
+ "changelog.title": "OpenCode | Changelog",
+ "changelog.meta.description": "OpenCode versionsnoter og changelog",
+ "changelog.hero.title": "Changelog",
+ "changelog.hero.subtitle": "Nye opdateringer og forbedringer til OpenCode",
+ "changelog.empty": "Ingen changelog-indlæg fundet.",
+ "changelog.viewJson": "Se JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agent",
+ "bench.list.table.model": "Model",
+ "bench.list.table.score": "Score",
+ "bench.submission.error.allFieldsRequired": "Alle felter er påkrævet.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Opgave ikke fundet",
+ "bench.detail.na": "Ikke tilgængelig",
+ "bench.detail.labels.agent": "Agent",
+ "bench.detail.labels.model": "Model",
+ "bench.detail.labels.task": "Opgave",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "Fra",
+ "bench.detail.labels.to": "Til",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Gennemsnitlig varighed",
+ "bench.detail.labels.averageScore": "Gennemsnitlig score",
+ "bench.detail.labels.averageCost": "Gennemsnitlig omkostning",
+ "bench.detail.labels.summary": "Resumé",
+ "bench.detail.labels.runs": "Kørsler",
+ "bench.detail.labels.score": "Score",
+ "bench.detail.labels.base": "Basis",
+ "bench.detail.labels.penalty": "Straf",
+ "bench.detail.labels.weight": "vægt",
+ "bench.detail.table.run": "Kørsel",
+ "bench.detail.table.score": "Score (Basis - Straf)",
+ "bench.detail.table.cost": "Omkostning",
+ "bench.detail.table.duration": "Varighed",
+ "bench.detail.run.title": "Kørsel {{n}}",
+ "bench.detail.rawJson": "Rå JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/de.ts b/packages/console/app/src/i18n/de.ts
new file mode 100644
index 0000000..3a583bb
--- /dev/null
+++ b/packages/console/app/src/i18n/de.ts
@@ -0,0 +1,827 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Dokumentation",
+ "nav.changelog": "Changelog",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Anmelden",
+ "nav.free": "Download",
+ "nav.home": "Startseite",
+ "nav.openMenu": "Menü öffnen",
+ "nav.getStartedFree": "Kostenlos starten",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Logo als SVG kopieren",
+ "nav.context.copyWordmark": "Wortmarke als SVG kopieren",
+ "nav.context.brandAssets": "Marken-Assets",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Dokumentation",
+ "footer.changelog": "Changelog",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Marke",
+ "legal.privacy": "Datenschutz",
+ "legal.terms": "AGB",
+
+ "email.title": "Erfahre als Erste:r, wenn wir neue Produkte veröffentlichen",
+ "email.subtitle": "Trage dich in die Warteliste für frühen Zugang ein.",
+ "email.placeholder": "E-Mail-Adresse",
+ "email.subscribe": "Anmelden",
+ "email.success": "Fast geschafft, überprüfe deinen Posteingang und bestätige deine E-Mail-Adresse",
+
+ "notFound.title": "Nicht gefunden | OpenCode",
+ "notFound.heading": "404 - Seite nicht gefunden",
+ "notFound.home": "Startseite",
+ "notFound.docs": "Dokumentation",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "OpenCode Logo hell",
+ "notFound.logoDarkAlt": "OpenCode Logo dunkel",
+
+ "user.logout": "Abmelden",
+
+ "auth.callback.error.codeMissing": "Kein Autorisierungscode gefunden.",
+
+ "workspace.select": "Workspace auswählen",
+ "workspace.createNew": "+ Neuen Workspace erstellen",
+ "workspace.modal.title": "Neuen Workspace erstellen",
+ "workspace.modal.placeholder": "Workspace-Namen eingeben",
+
+ "common.cancel": "Abbrechen",
+ "common.creating": "Erstelle...",
+ "common.create": "Erstellen",
+
+ "common.videoUnsupported": "Dein Browser unterstützt das Video-Tag nicht.",
+ "common.figure": "Abb. {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Mehr erfahren",
+
+ "error.invalidPlan": "Ungültiger Plan",
+ "error.workspaceRequired": "Workspace-ID ist erforderlich",
+ "error.alreadySubscribed": "Dieser Workspace hat bereits ein Abonnement",
+ "error.limitRequired": "Limit ist erforderlich.",
+ "error.monthlyLimitInvalid": "Bitte gib ein gültiges monatliches Limit ein.",
+ "error.workspaceNameRequired": "Workspace-Name ist erforderlich.",
+ "error.nameTooLong": "Der Name darf höchstens 255 Zeichen lang sein.",
+ "error.emailRequired": "E-Mail ist erforderlich",
+ "error.roleRequired": "Rolle ist erforderlich",
+ "error.idRequired": "ID ist erforderlich",
+ "error.nameRequired": "Name ist erforderlich",
+ "error.providerRequired": "Anbieter ist erforderlich",
+ "error.apiKeyRequired": "API-Key ist erforderlich",
+ "error.modelRequired": "Modell ist erforderlich",
+ "error.reloadAmountMin": "Aufladebetrag muss mindestens ${{amount}} betragen",
+ "error.reloadTriggerMin": "Guthaben-Auslöser muss mindestens ${{amount}} betragen",
+
+ "app.meta.description": "OpenCode - Der Open-Source Coding-Agent.",
+
+ "home.title": "OpenCode | Der Open-Source AI-Coding-Agent",
+
+ "temp.title": "OpenCode | Für das Terminal gebauter AI-Coding-Agent",
+ "temp.hero.title": "Der für das Terminal gebaute AI-Coding-Agent",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "Loslegen",
+ "temp.feature.native.title": "Native TUI",
+ "temp.feature.native.body": "Eine reaktionsschnelle, native, thematisierbare Terminal-UI",
+ "temp.feature.zen.beforeLink": "Eine",
+ "temp.feature.zen.link": "kuratierte Liste von Modellen",
+ "temp.feature.zen.afterLink": "bereitgestellt von OpenCode",
+ "temp.feature.models.beforeLink": "Unterstützt 75+ LLM-Anbieter durch",
+ "temp.feature.models.afterLink": ", einschließlich lokaler Modelle",
+ "temp.screenshot.caption": "OpenCode TUI mit dem Tokyonight-Theme",
+ "temp.screenshot.alt": "OpenCode TUI mit Tokyonight-Theme",
+ "temp.logoLightAlt": "OpenCode Logo hell",
+ "temp.logoDarkAlt": "OpenCode Logo dunkel",
+
+ "home.banner.badge": "Neu",
+ "home.banner.text": "Desktop-App in der Beta verfügbar",
+ "home.banner.platforms": "auf macOS, Windows und Linux",
+ "home.banner.downloadNow": "Jetzt herunterladen",
+ "home.banner.downloadBetaNow": "Desktop-Beta jetzt herunterladen",
+
+ "home.hero.title": "Der Open-Source AI-Coding-Agent",
+ "home.hero.subtitle.a": "Kostenlose Modelle inklusive oder verbinde jedes Modell eines beliebigen Anbieters,",
+ "home.hero.subtitle.b": "einschließlich Claude, GPT, Gemini und mehr.",
+
+ "home.install.ariaLabel": "Installationsoptionen",
+
+ "home.what.title": "Was ist OpenCode?",
+ "home.what.body":
+ "OpenCode ist ein Open-Source-Agent, der dir hilft, Code in deinem Terminal, deiner IDE oder auf dem Desktop zu schreiben.",
+ "home.what.lsp.title": "LSP-fähig",
+ "home.what.lsp.body": "Lädt automatisch die richtigen LSPs für das LLM",
+ "home.what.multiSession.title": "Multi-Session",
+ "home.what.multiSession.body": "Starte mehrere Agenten parallel im selben Projekt",
+ "home.what.shareLinks.title": "Links teilen",
+ "home.what.shareLinks.body": "Teile einen Link zu jeder Sitzung als Referenz oder zum Debuggen",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Melde dich mit GitHub an, um deinen Copilot-Account zu nutzen",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Melde dich mit OpenAI an, um deinen ChatGPT Plus- oder Pro-Account zu nutzen",
+ "home.what.anyModel.title": "Jedes Modell",
+ "home.what.anyModel.body": "75+ LLM-Anbieter durch Models.dev, einschließlich lokaler Modelle",
+ "home.what.anyEditor.title": "Jeder Editor",
+ "home.what.anyEditor.body": "Verfügbar als Terminal-Interface, Desktop-App und IDE-Extension",
+ "home.what.readDocs": "Doku lesen",
+
+ "home.growth.title": "Der Open-Source AI-Coding-Agent",
+ "home.growth.body":
+ "Mit über {{stars}} GitHub-Stars, {{contributors}} Contributors und über {{commits}} Commits wird OpenCode von über {{monthlyUsers}} Entwickler:innen jeden Monat genutzt und geschätzt.",
+ "home.growth.githubStars": "GitHub Stars",
+ "home.growth.contributors": "Contributors",
+ "home.growth.monthlyDevs": "Monatliche Devs",
+
+ "home.privacy.title": "Built for privacy first",
+ "home.privacy.body":
+ "OpenCode speichert keinen deiner Codes oder Kontextdaten, sodass es in datenschutzsensiblen Umgebungen arbeiten kann.",
+ "home.privacy.learnMore": "Erfahre mehr über",
+ "home.privacy.link": "Datenschutz",
+
+ "home.faq.q1": "Was ist OpenCode?",
+ "home.faq.a1":
+ "OpenCode ist ein Open-Source-Agent, der dir hilft, Code mit jedem KI-Modell zu schreiben und auszuführen. Er ist als Terminal-Interface, Desktop-App oder IDE-Erweiterung verfügbar.",
+ "home.faq.q2": "Wie nutze ich OpenCode?",
+ "home.faq.a2.before": "Der einfachste Weg zu starten ist, die",
+ "home.faq.a2.link": "Einführung zu lesen",
+ "home.faq.q3": "Brauche ich zusätzliche AI-Abos, um OpenCode zu nutzen?",
+ "home.faq.a3.p1":
+ "Nicht unbedingt, OpenCode kommt mit einer Reihe kostenloser Modelle, die du ohne Account nutzen kannst.",
+ "home.faq.a3.p2.beforeZen": "Abgesehen davon kannst du jedes beliebige Coding-Modell nutzen, indem du einen",
+ "home.faq.a3.p2.afterZen": " Account erstellst.",
+ "home.faq.a3.p3":
+ "Während wir dazu raten, Zen zu nutzen, funktioniert OpenCode auch mit allen beliebten Anbietern wie OpenAI, Anthropic, xAI etc.",
+ "home.faq.a3.p4.beforeLocal": "Du kannst sogar deine",
+ "home.faq.a3.p4.localLink": "lokalen Modelle verbinden",
+ "home.faq.q4": "Kann ich meine bestehenden AI-Abos mit OpenCode nutzen?",
+ "home.faq.a4.p1":
+ "Ja, OpenCode unterstützt Abos von allen großen Anbietern. Du kannst deine Claude Pro/Max, ChatGPT Plus/Pro oder GitHub Copilot Abos nutzen.",
+ "home.faq.q5": "Kann ich OpenCode nur im Terminal nutzen?",
+ "home.faq.a5.beforeDesktop": "Nicht mehr! OpenCode ist jetzt als App für",
+ "home.faq.a5.desktop": "Desktop",
+ "home.faq.a5.and": "und",
+ "home.faq.a5.web": "Web verfügbar",
+ "home.faq.q6": "Wie viel kostet OpenCode?",
+ "home.faq.a6":
+ "OpenCode ist zu 100% kostenlos. Es enthält auch eine Reihe kostenloser Modelle. Zusätzliche Kosten können entstehen, wenn du andere Anbieter verbindest.",
+ "home.faq.q7": "Was ist mit Daten und Privatsphäre?",
+ "home.faq.a7.p1":
+ "Deine Daten und Informationen werden nur gespeichert, wenn du unsere kostenlosen Modelle nutzt oder teilbare Links erstellst.",
+ "home.faq.a7.p2.beforeModels": "Erfahre mehr über",
+ "home.faq.a7.p2.modelsLink": "unsere Modelle",
+ "home.faq.a7.p2.and": "und",
+ "home.faq.a7.p2.shareLink": "Share-Pages",
+ "home.faq.q8": "Ist OpenCode Open Source?",
+ "home.faq.a8.p1": "Ja, OpenCode ist vollständig Open Source. Der Quellcode ist öffentlich auf",
+ "home.faq.a8.p2": "unter der",
+ "home.faq.a8.mitLicense": "MIT Lizenz",
+ "home.faq.a8.p3":
+ ", was bedeutet, dass jeder ihn nutzen, modifizieren oder zu seiner Entwicklung beitragen kann. Jeder aus der Community kann Issues melden, Pull Requests einreichen und die Funktionalität erweitern.",
+
+ "home.zenCta.title": "Zugriff auf zuverlässige, optimierte Modelle für Coding-Agents",
+ "home.zenCta.body":
+ "Zen gibt dir Zugriff auf ein handverlesenes Set an AI-Modellen, die OpenCode speziell für Coding-Agents getestet und bewertet hat. Keine Sorge wegen inkonsistenter Leistung und Qualität bei verschiedenen Anbietern – nutze validierte Modelle, die funktionieren.",
+ "home.zenCta.link": "Erfahre mehr über Zen",
+
+ "zen.title": "OpenCode Zen | Ein kuratiertes Set zuverlässiger, optimierter Modelle für Coding-Agents",
+ "zen.hero.title": "Zuverlässige, optimierte Modelle für Coding-Agents",
+ "zen.hero.body":
+ "Zen gibt dir Zugriff auf ein kuratiertes Set an AI-Modellen, die OpenCode speziell für Coding-Agents getestet und bewertet hat. Keine Sorge wegen inkonsistenter Leistung und Qualität – nutze validierte Modelle, die funktionieren.",
+
+ "zen.faq.q1": "Was ist OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen ist ein kuratiertes Set an AI-Modellen, getestet und bewertet für Coding-Agents, erstellt vom Team hinter OpenCode.",
+ "zen.faq.q2": "Was macht Zen genauer?",
+ "zen.faq.a2":
+ "Zen bietet nur Modelle, die speziell für Coding-Agents getestet und bewertet wurden. Du würdest kein Buttermesser nehmen, um ein Steak zu schneiden – nutze keine schlechten Modelle zum Coden.",
+ "zen.faq.q3": "Ist Zen günstiger?",
+ "zen.faq.a3":
+ "Zen ist nicht gewinnorientiert. Zen gibt die Kosten der Modellanbieter an dich weiter. Je höher die Nutzung von Zen, desto besser kann OpenCode Preise verhandeln und diese an dich weitergeben.",
+ "zen.faq.q4": "Wie viel kostet Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "berechnet pro Anfrage",
+ "zen.faq.a4.p1.afterPricing": "ohne Aufschläge, also zahlst du genau das, was der Modellanbieter berechnet.",
+ "zen.faq.a4.p2.beforeAccount":
+ "Deine Gesamtkosten hängen von der Nutzung ab, und du kannst monatliche Ausgabenlimits in deinem",
+ "zen.faq.a4.p2.accountLink": "Account festlegen",
+ "zen.faq.a4.p3":
+ "Um die Kosten zu decken, fügt OpenCode nur eine kleine Bearbeitungsgebühr von $1.23 pro $20 Guthabenaufladung hinzu.",
+ "zen.faq.q5": "Was ist mit Daten und Privatsphäre?",
+ "zen.faq.a5.beforeExceptions":
+ "Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht zum Trainieren von Modellen, mit den",
+ "zen.faq.a5.exceptionsLink": "folgenden Ausnahmen",
+ "zen.faq.q6": "Kann ich Ausgabenlimits setzen?",
+ "zen.faq.a6": "Ja, du kannst monatliche Ausgabenlimits in deinem Account setzen.",
+ "zen.faq.q7": "Kann ich kündigen?",
+ "zen.faq.a7": "Ja, du kannst die Abrechnung jederzeit deaktivieren und dein verbleibendes Guthaben nutzen.",
+ "zen.faq.q8": "Kann ich Zen mit anderen Coding-Agents nutzen?",
+ "zen.faq.a8":
+ "Während Zen großartig mit OpenCode funktioniert, kannst du Zen mit jedem Agent nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agent.",
+
+ "zen.cta.start": "Starte mit Zen",
+ "zen.pricing.title": "Füge $20 Pay-as-you-go Guthaben hinzu",
+ "zen.pricing.fee": "(+$1.23 Bearbeitungsgebühr)",
+ "zen.pricing.body": "Nutze es mit jedem Agent. Setze monatliche Ausgabenlimits. Jederzeit kündbar.",
+ "zen.problem.title": "Welches Problem löst Zen?",
+ "zen.problem.body":
+ "Es gibt so viele Modelle, aber nur wenige funktionieren gut mit Coding-Agents. Die meisten Anbieter konfigurieren sie unterschiedlich, was zu variierenden Ergebnissen führt.",
+ "zen.problem.subtitle": "Wir beheben das für alle, nicht nur für OpenCode-Nutzer.",
+ "zen.problem.item1": "Testen ausgewählter Modelle und Beratung mit deren Teams",
+ "zen.problem.item2": "Zusammenarbeit mit Anbietern, um korrekte Bereitstellung zu sichern",
+ "zen.problem.item3": "Benchmarking aller Modell-Anbieter-Kombinationen, die wir empfehlen",
+ "zen.how.title": "Wie Zen funktioniert",
+ "zen.how.body": "Während wir dir raten, Zen mit OpenCode zu nutzen, kannst du Zen mit jedem Agent nutzen.",
+ "zen.how.step1.title": "Melde dich an und füge $20 Guthaben hinzu",
+ "zen.how.step1.beforeLink": "folge den",
+ "zen.how.step1.link": "Einrichtungsanweisungen",
+ "zen.how.step2.title": "Nutze Zen mit transparenter Preisgestaltung",
+ "zen.how.step2.link": "zahle pro Anfrage",
+ "zen.how.step2.afterLink": "ohne Aufschläge",
+ "zen.how.step3.title": "Auto-Top-up",
+ "zen.how.step3.body": "wenn dein Guthaben $5 erreicht, fügen wir automatisch $20 hinzu",
+ "zen.privacy.title": "Deine Privatsphäre ist uns wichtig",
+ "zen.privacy.beforeExceptions":
+ "Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht für Modelltraining, mit den",
+ "zen.privacy.exceptionsLink": "folgenden Ausnahmen",
+
+ "go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle",
+ "go.meta.description":
+ "Go beginnt bei $5 für den ersten Monat, danach $10/Monat, mit großzügigen 5-Stunden-Anfragelimits für GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash.",
+ "go.hero.title": "Kostengünstige Coding-Modelle für alle",
+ "go.hero.body":
+ "Go bringt Agentic Coding zu Programmierern auf der ganzen Welt. Mit großzügigen Limits und zuverlässigem Zugang zu den leistungsfähigsten Open-Source-Modellen, damit du mit leistungsstarken Agenten entwickeln kannst, ohne dir Gedanken über Kosten oder Verfügbarkeit zu machen.",
+
+ "go.cta.start": "Go abonnieren",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Go abonnieren",
+ "go.cta.price": "$10/Monat",
+ "go.cta.promo": "$5 im ersten Monat",
+ "go.pricing.body":
+ "Mit jedem Agenten nutzbar. $5 im ersten Monat, danach $10/Monat. Guthaben bei Bedarf aufladen. Jederzeit kündbar.",
+ "go.graph.free": "Kostenlos",
+ "go.graph.freePill": "Big Pickle und kostenlose Modelle",
+ "go.graph.go": "Go",
+ "go.graph.label": "Anfragen pro 5 Stunden",
+ "go.graph.usageLimits": "Nutzungslimits",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Anfragen pro 5h: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "hat mein Leben verändert, es ist wirklich ein No-Brainer.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Gründer, SEED, PM, Melt, Pop, Dapt, Cadmus und ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 von 5 Leuten in unserem Team lieben die Nutzung von",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Ich kann",
+ "go.testimonials.adam.quoteAfter": "nicht genug empfehlen. Ernsthaft, es ist wirklich gut.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Mit",
+ "go.testimonials.david.quoteAfter": "weiß ich, dass alle Modelle getestet und perfekt für Coding-Agenten sind.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Praktikant, Nvidia (4 mal)",
+ "go.testimonials.frank.quote": "Ich wünschte, ich wäre noch bei Nvidia.",
+ "go.problem.title": "Welches Problem löst Go?",
+ "go.problem.body":
+ "Wir konzentrieren uns darauf, die OpenCode-Erfahrung so vielen Menschen wie möglich zugänglich zu machen. OpenCode Go ist ein kostengünstiges Abonnement: $5 im ersten Monat, danach $10/Monat. Es bietet großzügige Limits und zuverlässigen Zugang zu den leistungsfähigsten Open-Source-Modellen.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Kostengünstiges Abonnement",
+ "go.problem.item2": "Großzügige Limits und zuverlässiger Zugang",
+ "go.problem.item3": "Für so viele Programmierer wie möglich gebaut",
+ "go.problem.item4":
+ "Beinhaltet GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash",
+ "go.how.title": "Wie Go funktioniert",
+ "go.how.body":
+ "Go beginnt bei $5 für den ersten Monat, danach $10/Monat. Du kannst es mit OpenCode oder jedem Agenten nutzen.",
+ "go.how.step1.title": "Konto erstellen",
+ "go.how.step1.beforeLink": "folge den",
+ "go.how.step1.link": "Einrichtungsanweisungen",
+ "go.how.step2.title": "Go abonnieren",
+ "go.how.step2.link": "$5 im ersten Monat",
+ "go.how.step2.afterLink": "danach $10/Monat mit großzügigen Limits",
+ "go.how.step3.title": "Loslegen mit Coding",
+ "go.how.step3.body": "mit zuverlässigem Zugang zu Open-Source-Modellen",
+ "go.privacy.title": "Deine Privatsphäre ist uns wichtig",
+ "go.privacy.body":
+ "Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang.",
+ "go.privacy.contactAfter": "wenn du Fragen hast.",
+ "go.privacy.beforeExceptions":
+ "Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
+ "go.privacy.exceptionsLink": "folgenden Ausnahmen",
+ "go.faq.q1": "Was ist OpenCode Go?",
+ "go.faq.a1":
+ "Go ist ein kostengünstiges Abonnement, das dir zuverlässigen Zugang zu leistungsfähigen Open-Source-Modellen für Agentic Coding bietet.",
+ "go.faq.q2": "Welche Modelle beinhaltet Go?",
+ "go.faq.a2": "Go umfasst die unten aufgeführten Modelle mit großzügigen Limits und zuverlässigem Zugriff.",
+ "go.faq.q3": "Ist Go dasselbe wie Zen?",
+ "go.faq.a3":
+ "Nein. Zen ist Pay-as-you-go, während Go bei $5 für den ersten Monat beginnt, danach $10/Monat, mit großzügigen Limits und zuverlässigem Zugang zu den Open-Source-Modellen GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash.",
+ "go.faq.q4": "Wie viel kostet Go?",
+ "go.faq.a4.p1.beforePricing": "Go kostet",
+ "go.faq.a4.p1.pricingLink": "$5 im ersten Monat",
+ "go.faq.a4.p1.afterPricing": "danach $10/Monat mit großzügigen Limits.",
+ "go.faq.a4.p2.beforeAccount": "Du kannst dein Abonnement in deinem",
+ "go.faq.a4.p2.accountLink": "Konto verwalten",
+ "go.faq.a4.p3": "Jederzeit kündbar.",
+ "go.faq.q5": "Was ist mit Daten und Privatsphäre?",
+ "go.faq.a5.body":
+ "Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang. Unsere Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen.",
+ "go.faq.a5.beforeExceptions":
+ "Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
+ "go.faq.a5.exceptionsLink": "folgenden Ausnahmen",
+ "go.faq.q6": "Kann ich Guthaben aufladen?",
+ "go.faq.a6": "Wenn du mehr Nutzung benötigst, kannst du Guthaben in deinem Konto aufladen.",
+ "go.faq.q7": "Kann ich kündigen?",
+ "go.faq.a7": "Ja, du kannst jederzeit kündigen.",
+ "go.faq.q8": "Kann ich Go mit anderen Coding-Agenten nutzen?",
+ "go.faq.a8":
+ "Ja, du kannst Go mit jedem Agenten nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agenten.",
+
+ "go.faq.q9": "Was ist der Unterschied zwischen kostenlosen Modellen und Go?",
+ "go.faq.a9":
+ "Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go beinhaltet GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash mit höheren Anfragekontingenten, die über rollierende Zeitfenster (5 Stunden, wöchentlich und monatlich) durchgesetzt werden, grob äquivalent zu $12 pro 5 Stunden, $30 pro Woche und $60 pro Monat (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).",
+
+ "zen.api.error.rateLimitExceeded": "Ratenlimit überschritten. Bitte versuche es später erneut.",
+ "zen.api.error.modelNotSupported": "Modell {{model}} wird nicht unterstützt",
+ "zen.api.error.modelFormatNotSupported": "Modell {{model}} wird für das Format {{format}} nicht unterstützt",
+ "zen.api.error.noProviderAvailable": "Kein Anbieter verfügbar",
+ "zen.api.error.providerNotSupported": "Anbieter {{provider}} wird nicht unterstützt",
+ "zen.api.error.missingApiKey": "Fehlender API-Key.",
+ "zen.api.error.invalidApiKey": "Ungültiger API-Key.",
+ "zen.api.error.subscriptionQuotaExceeded": "Abonnement-Quote überschritten. Erneuter Versuch in {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "5-Stunden-Nutzungslimit erreicht. Wird in {{retryIn}} zurückgesetzt. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Wöchentliches Nutzungslimit erreicht. Wird in {{retryIn}} zurückgesetzt. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Monatliches Nutzungslimit erreicht. Wird in {{retryIn}} zurückgesetzt. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Keine Zahlungsmethode. Füge hier eine Zahlungsmethode hinzu: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Unzureichendes Guthaben. Verwalte deine Abrechnung hier: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Dein Workspace hat sein monatliches Ausgabenlimit von ${{amount}} erreicht. Verwalte deine Limits hier: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Du hast dein monatliches Ausgabenlimit von ${{amount}} erreicht. Verwalte deine Limits hier: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Modell ist deaktiviert",
+ "zen.api.error.trialEnded":
+ "Die kostenlose Aktion für {{model}} ist beendet. Du kannst das Modell weiterhin nutzen, indem du OpenCode Go abonnierst - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Zugriff auf die weltweit besten Coding-Modelle",
+ "black.meta.description": "Erhalte Zugriff auf Claude, GPT, Gemini und mehr mit OpenCode Black Abos.",
+ "black.hero.title": "Zugriff auf die weltweit besten Coding-Modelle",
+ "black.hero.subtitle": "Einschließlich Claude, GPT, Gemini und mehr",
+ "black.title": "OpenCode Black | Preise",
+ "black.paused": "Die Anmeldung zum Black-Plan ist vorübergehend pausiert.",
+ "black.plan.icon20": "Black 20 Plan",
+ "black.plan.icon100": "Black 100 Plan",
+ "black.plan.icon200": "Black 200 Plan",
+ "black.plan.multiplier100": "5x mehr Nutzung als Black 20",
+ "black.plan.multiplier200": "20x mehr Nutzung als Black 20",
+ "black.price.perMonth": "pro Monat",
+ "black.price.perPersonBilledMonthly": "pro Person, monatlich abgerechnet",
+ "black.terms.1": "Dein Abonnement startet nicht sofort",
+ "black.terms.2": "Du wirst auf die Warteliste gesetzt und bald freigeschaltet",
+ "black.terms.3": "Deine Karte wird erst belastet, wenn dein Abonnement aktiviert ist",
+ "black.terms.4": "Nutzungslimits gelten, stark automatisierte Nutzung kann Limits schneller erreichen",
+ "black.terms.5": "Abonnements sind für Einzelpersonen, kontaktiere Enterprise für Teams",
+ "black.terms.6": "Limits können angepasst werden und Pläne können in Zukunft eingestellt werden",
+ "black.terms.7": "Kündige dein Abonnement jederzeit",
+ "black.action.continue": "Weiter",
+ "black.finePrint.beforeTerms": "Angezeigte Preise enthalten keine anfallenden Steuern",
+ "black.finePrint.terms": "Nutzungsbedingungen",
+ "black.workspace.title": "OpenCode Black | Workspace wählen",
+ "black.workspace.selectPlan": "Wähle einen Workspace für diesen Plan",
+ "black.workspace.name": "Workspace {{n}}",
+ "black.subscribe.title": "OpenCode Black abonnieren",
+ "black.subscribe.paymentMethod": "Zahlungsmethode",
+ "black.subscribe.loadingPaymentForm": "Lade Zahlungsformular...",
+ "black.subscribe.selectWorkspaceToContinue": "Wähle einen Workspace um fortzufahren",
+ "black.subscribe.failurePrefix": "Oh nein!",
+ "black.subscribe.error.generic": "Ein Fehler ist aufgetreten",
+ "black.subscribe.error.invalidPlan": "Ungültiger Plan",
+ "black.subscribe.error.workspaceRequired": "Workspace-ID ist erforderlich",
+ "black.subscribe.error.alreadySubscribed": "Dieser Workspace hat bereits ein Abonnement",
+ "black.subscribe.processing": "Verarbeitung...",
+ "black.subscribe.submit": "Abonnieren ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Du wirst erst belastet, wenn dein Abonnement aktiviert ist",
+ "black.subscribe.success.title": "Du bist auf der OpenCode Black Warteliste",
+ "black.subscribe.success.subscriptionPlan": "Abo-Plan",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Betrag",
+ "black.subscribe.success.amountValue": "${{plan}} pro Monat",
+ "black.subscribe.success.paymentMethod": "Zahlungsmethode",
+ "black.subscribe.success.dateJoined": "Beitrittsdatum",
+ "black.subscribe.success.chargeNotice": "Deine Karte wird belastet, sobald dein Abonnement aktiviert ist",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Nutzung",
+ "workspace.nav.apiKeys": "API Keys",
+ "workspace.nav.members": "Mitglieder",
+ "workspace.nav.billing": "Abrechnung",
+ "workspace.nav.settings": "Einstellungen",
+
+ "workspace.home.banner.beforeLink": "Zuverlässige, optimierte Modelle für Coding-Agents.",
+ "workspace.lite.banner.beforeLink": "Kostengünstige Coding-Modelle für alle.",
+ "workspace.home.billing.loading": "Laden...",
+ "workspace.home.billing.enable": "Abrechnung aktivieren",
+ "workspace.home.billing.currentBalance": "Aktuelles Guthaben",
+
+ "workspace.newUser.feature.tested.title": "Getestete & Verifizierte Modelle",
+ "workspace.newUser.feature.tested.body":
+ "Wir haben Modelle speziell für Coding-Agents getestet und bewertet, um beste Leistung zu garantieren.",
+ "workspace.newUser.feature.quality.title": "Höchste Qualität",
+ "workspace.newUser.feature.quality.body":
+ "Zugriff auf Modelle, die für optimale Leistung konfiguriert sind – keine Downgrades oder Routing zu billigeren Anbietern.",
+ "workspace.newUser.feature.lockin.title": "Kein Lock-in",
+ "workspace.newUser.feature.lockin.body":
+ "Nutze Zen mit jedem Coding-Agent und nutze weiterhin andere Anbieter mit OpenCode, wann immer du willst.",
+ "workspace.newUser.copyApiKey": "API Key kopieren",
+ "workspace.newUser.copyKey": "Key kopieren",
+ "workspace.newUser.copied": "Kopiert!",
+ "workspace.newUser.step.enableBilling": "Abrechnung aktivieren",
+ "workspace.newUser.step.login.before": "Führe",
+ "workspace.newUser.step.login.after": "aus und wähle OpenCode",
+ "workspace.newUser.step.pasteKey": "Füge deinen API Key ein",
+ "workspace.newUser.step.models.before": "Starte OpenCode und führe",
+ "workspace.newUser.step.models.after": "aus, um ein Modell zu wählen",
+
+ "workspace.models.title": "Modelle",
+ "workspace.models.subtitle.beforeLink": "Verwalte, auf welche Modelle Workspace-Mitglieder zugreifen können.",
+ "workspace.models.table.model": "Modell",
+ "workspace.models.table.enabled": "Aktiviert",
+
+ "workspace.providers.title": "Bring Your Own Key",
+ "workspace.providers.subtitle": "Konfiguriere deine eigenen API Keys von AI-Anbietern.",
+ "workspace.providers.placeholder": "Gib {{provider}} API Key ein ({{prefix}}...)",
+ "workspace.providers.configure": "Konfigurieren",
+ "workspace.providers.edit": "Bearbeiten",
+ "workspace.providers.delete": "Löschen",
+ "workspace.providers.saving": "Speichere...",
+ "workspace.providers.save": "Speichern",
+ "workspace.providers.table.provider": "Anbieter",
+ "workspace.providers.table.apiKey": "API Key",
+
+ "workspace.usage.title": "Nutzungsverlauf",
+ "workspace.usage.subtitle": "Kürzliche API-Nutzung und Kosten.",
+ "workspace.usage.empty": "Mache deinen ersten API-Aufruf, um loszulegen.",
+ "workspace.usage.table.date": "Datum",
+ "workspace.usage.table.model": "Modell",
+ "workspace.usage.table.input": "Input",
+ "workspace.usage.table.output": "Output",
+ "workspace.usage.table.cost": "Kosten",
+ "workspace.usage.table.session": "Sitzung",
+ "workspace.usage.breakdown.input": "Input",
+ "workspace.usage.breakdown.cacheRead": "Cache Read",
+ "workspace.usage.breakdown.cacheWrite": "Cache Write",
+ "workspace.usage.breakdown.output": "Output",
+ "workspace.usage.breakdown.reasoning": "Reasoning",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Kosten",
+ "workspace.cost.subtitle": "Nutzungskosten aufgeschlüsselt nach Modell.",
+ "workspace.cost.allModels": "Alle Modelle",
+ "workspace.cost.allKeys": "Alle Keys",
+ "workspace.cost.deletedSuffix": "(gelöscht)",
+ "workspace.cost.empty": "Keine Nutzungsdaten für den gewählten Zeitraum verfügbar.",
+ "workspace.cost.subscriptionShort": "Abo",
+
+ "workspace.keys.title": "API Keys",
+ "workspace.keys.subtitle": "Verwalte deine API Keys für den Zugriff auf OpenCode-Dienste.",
+ "workspace.keys.create": "API Key erstellen",
+ "workspace.keys.placeholder": "Key-Namen eingeben",
+ "workspace.keys.empty": "Erstelle einen OpenCode Gateway API Key",
+ "workspace.keys.table.name": "Name",
+ "workspace.keys.table.key": "Key",
+ "workspace.keys.table.createdBy": "Erstellt von",
+ "workspace.keys.table.lastUsed": "Zuletzt genutzt",
+ "workspace.keys.copyApiKey": "API Key kopieren",
+ "workspace.keys.delete": "Löschen",
+
+ "workspace.members.title": "Mitglieder",
+ "workspace.members.subtitle": "Verwalte Workspace-Mitglieder und deren Berechtigungen.",
+ "workspace.members.invite": "Mitglied einladen",
+ "workspace.members.inviting": "Lade ein...",
+ "workspace.members.beta.beforeLink": "Workspaces sind für Teams während der Beta kostenlos.",
+ "workspace.members.form.invitee": "Eingeladene Person",
+ "workspace.members.form.emailPlaceholder": "E-Mail eingeben",
+ "workspace.members.form.role": "Rolle",
+ "workspace.members.form.monthlyLimit": "Monatliches Ausgabenlimit",
+ "workspace.members.noLimit": "Kein Limit",
+ "workspace.members.noLimitLowercase": "kein Limit",
+ "workspace.members.invited": "eingeladen",
+ "workspace.members.edit": "Bearbeiten",
+ "workspace.members.delete": "Löschen",
+ "workspace.members.saving": "Speichere...",
+ "workspace.members.save": "Speichern",
+ "workspace.members.table.email": "E-Mail",
+ "workspace.members.table.role": "Rolle",
+ "workspace.members.table.monthLimit": "Monatslimit",
+ "workspace.members.role.admin": "Admin",
+ "workspace.members.role.adminDescription": "Kann Modelle, Mitglieder und Abrechnung verwalten",
+ "workspace.members.role.member": "Mitglied",
+ "workspace.members.role.memberDescription": "Kann nur API Keys für sich selbst generieren",
+
+ "workspace.settings.title": "Einstellungen",
+ "workspace.settings.subtitle": "Aktualisiere deinen Workspace-Namen und Präferenzen.",
+ "workspace.settings.workspaceName": "Workspace-Name",
+ "workspace.settings.defaultName": "Standard",
+ "workspace.settings.updating": "Aktualisiere...",
+ "workspace.settings.save": "Speichern",
+ "workspace.settings.edit": "Bearbeiten",
+
+ "workspace.billing.title": "Abrechnung",
+ "workspace.billing.subtitle.beforeLink": "Zahlungsmethoden verwalten.",
+ "workspace.billing.contactUs": "Kontaktiere uns",
+ "workspace.billing.subtitle.afterLink": "wenn du Fragen hast.",
+ "workspace.billing.currentBalance": "Aktuelles Guthaben",
+ "workspace.billing.add": "$ hinzufügen",
+ "workspace.billing.enterAmount": "Betrag eingeben",
+ "workspace.billing.loading": "Lade...",
+ "workspace.billing.addAction": "Hinzufügen",
+ "workspace.billing.addBalance": "Guthaben aufladen",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Mit Stripe verbunden",
+ "workspace.billing.manage": "Verwalten",
+ "workspace.billing.enable": "Abrechnung aktivieren",
+
+ "workspace.monthlyLimit.title": "Monatliches Limit",
+ "workspace.monthlyLimit.subtitle": "Setze ein monatliches Nutzungslimit für deinen Account.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Setze...",
+ "workspace.monthlyLimit.set": "Setzen",
+ "workspace.monthlyLimit.edit": "Limit bearbeiten",
+ "workspace.monthlyLimit.noLimit": "Kein Nutzungslimit gesetzt.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Aktuelle Nutzung für",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "ist $",
+
+ "workspace.redeem.title": "Gutschein einlösen",
+ "workspace.redeem.subtitle": "Löse einen Gutscheincode ein, um Guthaben oder Vorteile zu erhalten.",
+ "workspace.redeem.placeholder": "Gutscheincode eingeben",
+ "workspace.redeem.redeem": "Einlösen",
+ "workspace.redeem.redeeming": "Wird eingelöst...",
+ "workspace.redeem.success": "Gutschein erfolgreich eingelöst.",
+
+ "workspace.reload.title": "Auto-Reload",
+ "workspace.reload.disabled.before": "Auto-Reload ist",
+ "workspace.reload.disabled.state": "deaktiviert",
+ "workspace.reload.disabled.after": "Aktivieren, um automatisch aufzuladen, wenn das Guthaben niedrig ist.",
+ "workspace.reload.enabled.before": "Auto-Reload ist",
+ "workspace.reload.enabled.state": "aktiviert",
+ "workspace.reload.enabled.middle": "Wir laden auf",
+ "workspace.reload.processingFee": "Bearbeitungsgebühr",
+ "workspace.reload.enabled.after": "wenn das Guthaben erreicht:",
+ "workspace.reload.edit": "Bearbeiten",
+ "workspace.reload.enable": "Aktivieren",
+ "workspace.reload.enableAutoReload": "Auto-Reload aktivieren",
+ "workspace.reload.reloadAmount": "Aufladebetrag $",
+ "workspace.reload.whenBalanceReaches": "Wenn Guthaben $ erreicht",
+ "workspace.reload.saving": "Speichere...",
+ "workspace.reload.save": "Speichern",
+ "workspace.reload.failedAt": "Aufladung fehlgeschlagen am",
+ "workspace.reload.reason": "Grund:",
+ "workspace.reload.updatePaymentMethod": "Bitte aktualisiere deine Zahlungsmethode und versuche es erneut.",
+ "workspace.reload.retrying": "Versuche erneut...",
+ "workspace.reload.retry": "Erneut versuchen",
+ "workspace.reload.error.paymentFailed": "Zahlung fehlgeschlagen.",
+
+ "workspace.payments.title": "Zahlungshistorie",
+ "workspace.payments.subtitle": "Kürzliche Zahlungstransaktionen.",
+ "workspace.payments.table.date": "Datum",
+ "workspace.payments.table.paymentId": "Zahlungs-ID",
+ "workspace.payments.table.amount": "Betrag",
+ "workspace.payments.table.receipt": "Beleg",
+ "workspace.payments.type.credit": "Guthaben",
+ "workspace.payments.type.subscription": "Abonnement",
+ "workspace.payments.view": "Ansehen",
+
+ "workspace.black.loading": "Lade...",
+ "workspace.black.time.day": "Tag",
+ "workspace.black.time.days": "Tage",
+ "workspace.black.time.hour": "Stunde",
+ "workspace.black.time.hours": "Stunden",
+ "workspace.black.time.minute": "Minute",
+ "workspace.black.time.minutes": "Minuten",
+ "workspace.black.time.fewSeconds": "einige Sekunden",
+ "workspace.black.subscription.title": "Abonnement",
+ "workspace.black.subscription.message": "Du hast OpenCode Black für ${{plan}} pro Monat abonniert.",
+ "workspace.black.subscription.manage": "Abo verwalten",
+ "workspace.black.subscription.rollingUsage": "5-Stunden-Nutzung",
+ "workspace.black.subscription.weeklyUsage": "Wöchentliche Nutzung",
+ "workspace.black.subscription.resetsIn": "Setzt zurück in",
+ "workspace.black.subscription.useBalance": "Nutze dein verfügbares Guthaben, nachdem die Limits erreicht sind",
+ "workspace.black.waitlist.title": "Warteliste",
+ "workspace.black.waitlist.joined": "Du bist auf der Warteliste für den ${{plan}} pro Monat OpenCode Black Plan.",
+ "workspace.black.waitlist.ready": "Wir sind bereit, dich in den ${{plan}} pro Monat OpenCode Black Plan aufzunehmen.",
+ "workspace.black.waitlist.leave": "Warteliste verlassen",
+ "workspace.black.waitlist.leaving": "Verlasse...",
+ "workspace.black.waitlist.left": "Verlassen",
+ "workspace.black.waitlist.enroll": "Einschreiben",
+ "workspace.black.waitlist.enrolling": "Schreibe ein...",
+ "workspace.black.waitlist.enrolled": "Eingeschrieben",
+ "workspace.black.waitlist.enrollNote":
+ "Wenn du auf Einschreiben klickst, startet dein Abo sofort und deine Karte wird belastet.",
+
+ "workspace.lite.loading": "Lade...",
+ "workspace.lite.time.day": "Tag",
+ "workspace.lite.time.days": "Tage",
+ "workspace.lite.time.hour": "Stunde",
+ "workspace.lite.time.hours": "Stunden",
+ "workspace.lite.time.minute": "Minute",
+ "workspace.lite.time.minutes": "Minuten",
+ "workspace.lite.time.fewSeconds": "einige Sekunden",
+ "workspace.lite.subscription.message": "Du hast OpenCode Go abonniert.",
+ "workspace.lite.subscription.manage": "Abo verwalten",
+ "workspace.lite.subscription.rollingUsage": "Fortlaufende Nutzung",
+ "workspace.lite.subscription.weeklyUsage": "Wöchentliche Nutzung",
+ "workspace.lite.subscription.monthlyUsage": "Monatliche Nutzung",
+ "workspace.lite.subscription.resetsIn": "Setzt zurück in",
+ "workspace.lite.subscription.useBalance": "Nutze dein verfügbares Guthaben, nachdem die Nutzungslimits erreicht sind",
+ "workspace.lite.subscription.selectProvider":
+ 'Wähle "OpenCode Go" als Anbieter in deiner opencode-Konfiguration, um Go-Modelle zu verwenden.',
+ "workspace.lite.black.message":
+ "Du hast derzeit OpenCode Black abonniert oder stehst auf der Warteliste. Bitte kündige zuerst, wenn du zu Go wechseln möchtest.",
+ "workspace.lite.other.message":
+ "Ein anderes Mitglied in diesem Workspace hat OpenCode Go bereits abonniert. Nur ein Mitglied pro Workspace kann abonnieren.",
+ "workspace.lite.promo.description":
+ "OpenCode Go startet bei {{price}}, danach $10/Monat, und bietet zuverlässigen Zugang zu beliebten offenen Coding-Modellen mit großzügigen Nutzungslimits.",
+ "workspace.lite.promo.price": "$5 im ersten Monat",
+ "workspace.lite.promo.modelsTitle": "Was enthalten ist",
+ "workspace.lite.promo.footer":
+ "Der Plan wurde hauptsächlich für internationale Nutzer entwickelt, wobei die Modelle in den USA, der EU und Singapur gehostet werden, um einen stabilen weltweiten Zugriff zu gewährleisten. Preise und Nutzungslimits können sich ändern, während wir aus der frühen Nutzung und dem Feedback lernen.",
+ "workspace.lite.promo.subscribe": "Go abonnieren",
+ "workspace.lite.promo.subscribing": "Leite weiter...",
+ "workspace.lite.promo.otherMethods": "Andere Zahlungsmethoden",
+ "workspace.lite.promo.selectMethod": "Zahlungsmethode auswählen",
+
+ "workspace.referral.copyLink": "Link kopieren",
+ "workspace.referral.copied": "Kopiert",
+ "workspace.referral.overview.title": "Freunde einladen",
+ "workspace.referral.overview.subtitle": "Erhalte $5, wenn ein Freund abonniert. Er bekommt ebenfalls $5.",
+ "workspace.referral.instructions.share": "Teile deinen Empfehlungslink",
+ "workspace.referral.instructions.subscribe": "Dein Freund tritt bei und abonniert Go",
+ "workspace.referral.instructions.claim":
+ "Ihr erhaltet beide ein Nutzungsguthaben von $5, das ihr auf eure Go-Nutzungslimits anrechnen könnt",
+ "workspace.referral.rewards.title": "Empfehlungsbelohnungen",
+ "workspace.referral.rewards.description": "Verfügbare Empfehlungsguthaben auf deine Go-Nutzung anwenden.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} Belohnungen eingelöst.",
+ "workspace.referral.rewards.empty": "Noch keine Empfehlungsbelohnungen.",
+ "workspace.referral.table.reward": "Belohnung",
+ "workspace.referral.table.referral": "Beschreibung",
+ "workspace.referral.table.date": "Datum",
+ "workspace.referral.reward.description.inviter": "{{email}} eingeladen",
+ "workspace.referral.reward.description.invitee": "Eingeladen von {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Abonnieren zum Freischalten",
+ "workspace.referral.reward.action.view": "Belohnung ansehen",
+ "workspace.referral.reward.action.applied": "Belohnung eingelöst",
+ "workspace.referral.reward.source.pendingInviter": "Warten auf das Abo des Freundes",
+ "workspace.referral.reward.source.pendingInvitee": "Abonnieren, um Belohnung freizuschalten",
+ "workspace.referral.reward.source.available": "Belohnung kann eingelöst werden",
+ "workspace.referral.reward.source.applied": "Belohnung eingelöst",
+ "workspace.referral.reward.status.applied": "Belohnung eingelöst",
+ "workspace.referral.reward.status.pendingInviter": "Abonnieren zum Freischalten",
+ "workspace.referral.reward.status.pendingInvitee": "Abonnieren zum Freischalten",
+ "workspace.referral.apply.noGo": "Abonnieren zum Freischalten",
+ "workspace.referral.apply.preview": "Belohnung ansehen",
+ "workspace.referral.apply.action": "Einlösen",
+ "workspace.referral.apply.confirmTitle": "Belohnung einlösen",
+ "workspace.referral.apply.confirmBody":
+ "Löse {{amount}} ein, um die aktuelle Nutzung dieses Workspace zu reduzieren.",
+ "workspace.referral.apply.confirmAction": "Einlösen",
+
+ "download.title": "OpenCode | Download",
+ "download.meta.description": "Lade OpenCode für macOS, Windows und Linux herunter",
+ "download.hero.title": "OpenCode herunterladen",
+ "download.hero.subtitle": "In Beta verfügbar für macOS, Windows und Linux",
+ "download.hero.button": "Download für {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Extensions",
+ "download.section.integrations": "OpenCode Integrationen",
+ "download.action.download": "Download",
+ "download.action.install": "Installieren",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Nicht unbedingt, aber wahrscheinlich. Du brauchst ein AI-Abo, wenn du OpenCode mit einem bezahlten Anbieter verbinden willst, obwohl du mit",
+ "download.faq.a3.localLink": "lokalen Modellen",
+ "download.faq.a3.afterLocal.beforeZen": "kostenlos arbeiten kannst. Während wir Nutzern raten,",
+ "download.faq.a3.afterZen":
+ " zu nutzen, funktioniert OpenCode mit allen populären Anbietern wie OpenAI, Anthropic, xAI etc.",
+
+ "download.faq.a5.p1": "OpenCode ist 100% kostenlos.",
+ "download.faq.a5.p2.beforeZen":
+ "Zusätzliche Kosten entstehen durch dein Abo bei einem Modellanbieter. Während OpenCode mit jedem Modellanbieter funktioniert, empfehlen wir",
+ "download.faq.a5.p2.afterZen": " zu nutzen.",
+
+ "download.faq.a6.p1":
+ "Deine Daten und Informationen werden nur gespeichert, wenn du teilbare Links in OpenCode erstellst.",
+ "download.faq.a6.p2.beforeShare": "Erfahre mehr über",
+ "download.faq.a6.shareLink": "Share-Pages",
+
+ "enterprise.title": "OpenCode | Enterprise-Lösungen für Ihre Organisation",
+ "enterprise.meta.description": "Kontaktieren Sie OpenCode für Enterprise-Lösungen",
+ "enterprise.hero.title": "Ihr Code gehört Ihnen",
+ "enterprise.hero.body1":
+ "OpenCode arbeitet sicher innerhalb Ihrer Organisation, ohne dass Daten oder Kontext gespeichert werden und ohne Lizenzbeschränkungen oder Eigentumsansprüche. Starten Sie einen Testlauf mit Ihrem Team, dann rollen Sie es in Ihrer Organisation aus, indem Sie es in Ihr SSO und internes AI-Gateway integrieren.",
+ "enterprise.hero.body2": "Lassen Sie uns wissen, wie wir helfen können.",
+ "enterprise.form.name.label": "Vollständiger Name",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Rolle",
+ "enterprise.form.role.placeholder": "Executive Chairman",
+ "enterprise.form.company.label": "Unternehmen",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Firmen-E-Mail",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Telefonnummer",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Welches Problem versuchen Sie zu lösen?",
+ "enterprise.form.message.placeholder": "Wir brauchen Hilfe bei...",
+ "enterprise.form.send": "Senden",
+ "enterprise.form.sending": "Sende...",
+ "enterprise.form.success": "Nachricht gesendet, wir melden uns bald.",
+ "enterprise.form.success.submitted": "Formular erfolgreich gesendet.",
+ "enterprise.form.error.allFieldsRequired": "Alle Felder sind erforderlich.",
+ "enterprise.form.error.invalidEmailFormat": "Ungültiges E-Mail-Format.",
+ "enterprise.form.error.internalServer": "Interner Serverfehler.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Was ist OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise ist für Organisationen, die sicherstellen wollen, dass Code und Daten niemals ihre Infrastruktur verlassen. Dies geschieht durch eine zentrale Konfiguration, die in Ihr SSO und internes AI-Gateway integriert wird.",
+ "enterprise.faq.q2": "Wie starte ich mit OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Starten Sie einfach mit einem internen Testlauf mit Ihrem Team. OpenCode speichert standardmäßig weder Code noch Kontextdaten, was den Einstieg erleichtert. Kontaktieren Sie uns dann, um Preise und Implementierungsoptionen zu besprechen.",
+ "enterprise.faq.q3": "Wie funktioniert das Enterprise-Pricing?",
+ "enterprise.faq.a3":
+ "Wir bieten eine Preisgestaltung pro Arbeitsplatz (Seat) an. Wenn Sie Ihr eigenes LLM-Gateway haben, berechnen wir keine Gebühren für genutzte Token. Für weitere Details kontaktieren Sie uns für ein individuelles Angebot basierend auf den Anforderungen Ihrer Organisation.",
+ "enterprise.faq.q4": "Sind meine Daten mit OpenCode Enterprise sicher?",
+ "enterprise.faq.a4":
+ "Ja. OpenCode speichert weder Ihren Code noch Kontextdaten. Alle Verarbeitungen finden lokal oder über direkte API-Aufrufe an Ihren AI-Anbieter statt. Mit zentraler Konfiguration und SSO-Integration bleiben Ihre Daten sicher innerhalb der Infrastruktur Ihrer Organisation.",
+
+ "brand.title": "OpenCode | Marke",
+ "brand.meta.description": "OpenCode Markenrichtlinien",
+ "brand.heading": "Markenrichtlinien",
+ "brand.subtitle": "Ressourcen und Assets, die dir helfen, mit der OpenCode-Marke zu arbeiten.",
+ "brand.downloadAll": "Alle Assets herunterladen",
+
+ "changelog.title": "OpenCode | Changelog",
+ "changelog.meta.description": "OpenCode Release Notes und Changelog",
+ "changelog.hero.title": "Changelog",
+ "changelog.hero.subtitle": "Neue Updates und Verbesserungen für OpenCode",
+ "changelog.empty": "Keine Changelog-Einträge gefunden.",
+ "changelog.viewJson": "JSON ansehen",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agent",
+ "bench.list.table.model": "Modell",
+ "bench.list.table.score": "Score",
+ "bench.submission.error.allFieldsRequired": "Alle Felder sind erforderlich.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Task nicht gefunden",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "Agent",
+ "bench.detail.labels.model": "Modell",
+ "bench.detail.labels.task": "Task",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "Von",
+ "bench.detail.labels.to": "Bis",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Durchschnittliche Dauer",
+ "bench.detail.labels.averageScore": "Durchschnittlicher Score",
+ "bench.detail.labels.averageCost": "Durchschnittliche Kosten",
+ "bench.detail.labels.summary": "Zusammenfassung",
+ "bench.detail.labels.runs": "Durchläufe",
+ "bench.detail.labels.score": "Score",
+ "bench.detail.labels.base": "Basis",
+ "bench.detail.labels.penalty": "Strafe",
+ "bench.detail.labels.weight": "Gewichtung",
+ "bench.detail.table.run": "Durchlauf",
+ "bench.detail.table.score": "Score (Basis - Strafe)",
+ "bench.detail.table.cost": "Kosten",
+ "bench.detail.table.duration": "Dauer",
+ "bench.detail.run.title": "Durchlauf {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts
new file mode 100644
index 0000000..d465555
--- /dev/null
+++ b/packages/console/app/src/i18n/en.ts
@@ -0,0 +1,820 @@
+export const dict = {
+ "nav.github": "GitHub",
+ "nav.docs": "Docs",
+ "nav.data": "Data",
+ "nav.changelog": "Changelog",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.go": "Go",
+ "nav.login": "Login",
+ "nav.free": "Download",
+ "nav.home": "Home",
+ "nav.openMenu": "Open menu",
+ "nav.getStartedFree": "Get started for free",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Copy logo as SVG",
+ "nav.context.copyWordmark": "Copy wordmark as SVG",
+ "nav.context.brandAssets": "Brand assets",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Docs",
+ "footer.changelog": "Changelog",
+ "footer.feishu": "Feishu",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Brand",
+ "legal.privacy": "Privacy",
+ "legal.terms": "Terms",
+
+ "email.title": "Be the first to know when we release new products",
+ "email.subtitle": "Join the waitlist for early access.",
+ "email.placeholder": "Email address",
+ "email.subscribe": "Subscribe",
+ "email.success": "Almost done, check your inbox and confirm your email address",
+
+ "notFound.title": "Not Found | opencode",
+ "notFound.heading": "404 - Page Not Found",
+ "notFound.home": "Home",
+ "notFound.docs": "Docs",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode logo light",
+ "notFound.logoDarkAlt": "opencode logo dark",
+
+ "user.logout": "Logout",
+
+ "auth.callback.error.codeMissing": "No authorization code found.",
+
+ "workspace.select": "Select workspace",
+ "workspace.createNew": "+ Create New Workspace",
+ "workspace.modal.title": "Create New Workspace",
+ "workspace.modal.placeholder": "Enter workspace name",
+
+ "common.cancel": "Cancel",
+ "common.creating": "Creating...",
+ "common.create": "Create",
+ "common.contactUs": "Contact us",
+
+ "common.videoUnsupported": "Your browser does not support the video tag.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Learn more",
+
+ "error.invalidPlan": "Invalid plan",
+ "error.workspaceRequired": "Workspace ID is required",
+ "error.alreadySubscribed": "This workspace already has a subscription",
+ "error.limitRequired": "Limit is required.",
+ "error.monthlyLimitInvalid": "Set a valid monthly limit.",
+ "error.workspaceNameRequired": "Workspace name is required.",
+ "error.nameTooLong": "Name must be 255 characters or less.",
+ "error.emailRequired": "Email is required",
+ "error.roleRequired": "Role is required",
+ "error.idRequired": "ID is required",
+ "error.nameRequired": "Name is required",
+ "error.providerRequired": "Provider is required",
+ "error.apiKeyRequired": "API key is required",
+ "error.modelRequired": "Model is required",
+ "error.reloadAmountMin": "Reload amount must be at least ${{amount}}",
+ "error.reloadTriggerMin": "Balance trigger must be at least ${{amount}}",
+
+ "app.meta.description": "OpenCode - The open source coding agent.",
+
+ "home.title": "OpenCode | The open source AI coding agent",
+
+ "temp.title": "opencode | AI coding agent built for the terminal",
+ "temp.hero.title": "The AI coding agent built for the terminal",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Get Started",
+ "temp.feature.native.title": "Native TUI",
+ "temp.feature.native.body": "A responsive, native, themeable terminal UI",
+ "temp.feature.zen.beforeLink": "A",
+ "temp.feature.zen.link": "curated list of models",
+ "temp.feature.zen.afterLink": "provided by opencode",
+ "temp.feature.models.beforeLink": "Supports 75+ LLM providers through",
+ "temp.feature.models.afterLink": ", including local models",
+ "temp.screenshot.caption": "opencode TUI with the tokyonight theme",
+ "temp.screenshot.alt": "opencode TUI with tokyonight theme",
+ "temp.logoLightAlt": "opencode logo light",
+ "temp.logoDarkAlt": "opencode logo dark",
+
+ "home.banner.badge": "New",
+ "home.banner.text": "Desktop app available in beta",
+ "home.banner.platforms": "on macOS, Windows, and Linux",
+ "home.banner.downloadNow": "Download now",
+ "home.banner.downloadBetaNow": "Download the desktop beta now",
+
+ "home.hero.title": "The open source AI coding agent",
+ "home.hero.subtitle.a": "Free models included or connect any model from any provider,",
+ "home.hero.subtitle.b": "including Claude, GPT, Gemini and more.",
+
+ "home.install.ariaLabel": "Install options",
+
+ "home.what.title": "What is OpenCode?",
+ "home.what.body": "OpenCode is an open source agent that helps you write code in your terminal, IDE, or desktop.",
+ "home.what.lsp.title": "LSP enabled",
+ "home.what.lsp.body": "Automatically loads the right LSPs for the LLM",
+ "home.what.multiSession.title": "Multi-session",
+ "home.what.multiSession.body": "Start multiple agents in parallel on the same project",
+ "home.what.shareLinks.title": "Share links",
+ "home.what.shareLinks.body": "Share a link to any session for reference or to debug",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Log in with GitHub to use your Copilot account",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Log in with OpenAI to use your ChatGPT Plus or Pro account",
+ "home.what.anyModel.title": "Any model",
+ "home.what.anyModel.body": "75+ LLM providers through Models.dev, including local models",
+ "home.what.anyEditor.title": "Any editor",
+ "home.what.anyEditor.body": "Available as a terminal interface, desktop app, and IDE extension",
+ "home.what.readDocs": "Read docs",
+
+ "home.growth.title": "The open source AI coding agent",
+ "home.growth.body":
+ "With over {{stars}} GitHub stars, {{contributors}} contributors, and over {{commits}} commits, OpenCode is used and trusted by over {{monthlyUsers}} developers every month.",
+ "home.growth.githubStars": "GitHub Stars",
+ "home.growth.contributors": "Contributors",
+ "home.growth.monthlyDevs": "Monthly Devs",
+
+ "home.privacy.title": "Built for privacy first",
+ "home.privacy.body":
+ "OpenCode does not store any of your code or context data, so that it can operate in privacy sensitive environments.",
+ "home.privacy.learnMore": "Learn more about",
+ "home.privacy.link": "privacy",
+
+ "home.faq.q1": "What is OpenCode?",
+ "home.faq.a1":
+ "OpenCode is an open source agent that helps you write and run code with any AI model. It's available as a terminal-based interface, desktop app, or IDE extension.",
+ "home.faq.q2": "How do I use OpenCode?",
+ "home.faq.a2.before": "The easiest way to get started is to read the",
+ "home.faq.a2.link": "intro",
+ "home.faq.q3": "Do I need extra AI subscriptions to use OpenCode?",
+ "home.faq.a3.p1":
+ "Not necessarily, OpenCode comes with a set of free models that you can use without creating an account.",
+ "home.faq.a3.p2.beforeZen": "Aside from these, you can use any of the popular coding models by creating a",
+ "home.faq.a3.p2.afterZen": " account.",
+ "home.faq.a3.p3":
+ "While we encourage users to use Zen, OpenCode also works with all popular providers such as OpenAI, Anthropic, xAI etc.",
+ "home.faq.a3.p4.beforeLocal": "You can even connect your",
+ "home.faq.a3.p4.localLink": "local models",
+ "home.faq.q4": "Can I use my existing AI subscriptions with OpenCode?",
+ "home.faq.a4.p1":
+ "Yes, OpenCode supports subscription plans from all major providers. You can use your Claude Pro/Max, ChatGPT Plus/Pro, or GitHub Copilot subscriptions.",
+ "home.faq.q5": "Can I only use OpenCode in the terminal?",
+ "home.faq.a5.beforeDesktop": "Not anymore! OpenCode is now available as an app for your",
+ "home.faq.a5.desktop": "desktop",
+ "home.faq.a5.and": "and",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "How much does OpenCode cost?",
+ "home.faq.a6":
+ "OpenCode is 100% free to use. It also comes with a set of free models. There might be additional costs if you connect any other provider.",
+ "home.faq.q7": "What about data and privacy?",
+ "home.faq.a7.p1": "Your data and information is only stored when you use our free models or create sharable links.",
+ "home.faq.a7.p2.beforeModels": "Learn more about",
+ "home.faq.a7.p2.modelsLink": "our models",
+ "home.faq.a7.p2.and": "and",
+ "home.faq.a7.p2.shareLink": "share pages",
+ "home.faq.q8": "Is OpenCode open source?",
+ "home.faq.a8.p1": "Yes, OpenCode is fully open source. The source code is public on",
+ "home.faq.a8.p2": "under the",
+ "home.faq.a8.mitLicense": "MIT License",
+ "home.faq.a8.p3":
+ ", meaning anyone can use, modify, or contribute to its development. Anyone from the community can file issues, submit pull requests, and extend functionality.",
+
+ "home.zenCta.title": "Access reliable optimized models for coding agents",
+ "home.zenCta.body":
+ "Zen gives you access to a handpicked set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality across providers, use validated models that work.",
+ "home.zenCta.link": "Learn about Zen",
+
+ "zen.title": "OpenCode Zen | A curated set of reliable optimized models for coding agents",
+ "zen.hero.title": "Reliable optimized models for coding agents",
+ "zen.hero.body":
+ "Zen gives you access to a curated set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality, use validated models that work.",
+
+ "zen.faq.q1": "What is OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen is a curated set of AI models tested and benchmarked for coding agents created by the team behind OpenCode.",
+ "zen.faq.q2": "What makes Zen more accurate?",
+ "zen.faq.a2":
+ "Zen only provides models that have been specifically tested and benchmarked for coding agents. You wouldn't use a butter knife to cut steak, don't use poor models for coding.",
+ "zen.faq.q3": "Is Zen cheaper?",
+ "zen.faq.a3":
+ "Zen is not for profit. Zen passes through the costs from the model providers to you. The higher Zen's usage the more OpenCode can negotiate better rates and pass those to you.",
+ "zen.faq.q4": "How much does Zen cost?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "charges per request",
+ "zen.faq.a4.p1.afterPricing": "with zero markups, so you pay exactly what the model provider charges.",
+ "zen.faq.a4.p2.beforeAccount": "Your total cost depends on usage, and you can set monthly spend limits in your",
+ "zen.faq.a4.p2.accountLink": "account",
+ "zen.faq.a4.p3": "To cover costs, OpenCode adds only a small payment processing fee of $1.23 per $20 balance top-up.",
+ "zen.faq.q5": "What about data and privacy?",
+ "zen.faq.a5.beforeExceptions":
+ "All Zen models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
+ "zen.faq.a5.exceptionsLink": "following exceptions",
+ "zen.faq.q6": "Can I set spend limits?",
+ "zen.faq.a6": "Yes, you can set monthly spending limits in your account.",
+ "zen.faq.q7": "Can I cancel?",
+ "zen.faq.a7": "Yes, you can disable billing at any time and use your remaining balance.",
+ "zen.faq.q8": "Can I use Zen with other coding agents?",
+ "zen.faq.a8":
+ "While Zen works great with OpenCode, you can use Zen with any agent. Follow the setup instructions in your preferred coding agent.",
+
+ "zen.cta.start": "Get started with Zen",
+ "zen.pricing.title": "Add $20 Pay as you go balance",
+ "zen.pricing.fee": "(+$1.23 card processing fee)",
+ "zen.pricing.body": "Use with any agent. Set monthly spend limits. Cancel any time.",
+ "zen.problem.title": "What problem is Zen solving?",
+ "zen.problem.body":
+ "There are so many models available, but only a few work well with coding agents. Most providers configure them differently with varying results.",
+ "zen.problem.subtitle": "We're fixing this for everyone, not just OpenCode users.",
+ "zen.problem.item1": "Testing select models and consulting their teams",
+ "zen.problem.item2": "Working with providers to ensure they're delivered properly",
+ "zen.problem.item3": "Benchmarking all model-provider combinations we recommend",
+ "zen.how.title": "How Zen works",
+ "zen.how.body": "While we suggest you use Zen with OpenCode, you can use Zen with any agent.",
+ "zen.how.step1.title": "Sign up and add $20 balance",
+ "zen.how.step1.beforeLink": "follow the",
+ "zen.how.step1.link": "setup instructions",
+ "zen.how.step2.title": "Use Zen with transparent pricing",
+ "zen.how.step2.link": "pay per request",
+ "zen.how.step2.afterLink": "with zero markups",
+ "zen.how.step3.title": "Auto-top up",
+ "zen.how.step3.body": "when your balance reaches $5 we'll automatically add $20",
+ "zen.privacy.title": "Your privacy is important to us",
+ "zen.privacy.beforeExceptions":
+ "All Zen models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
+ "zen.privacy.exceptionsLink": "following exceptions",
+
+ "go.title": "OpenCode Go | Low cost coding models for everyone",
+ "go.meta.description":
+ "Go starts at $5 for your first month, then $10/month, with generous 5-hour request limits for GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash.",
+ "go.hero.title": "Low cost coding models for everyone",
+ "go.hero.body":
+ "Go brings agentic coding to programmers around the world. Offering generous limits and reliable access to the most capable open-source models, so you can build with powerful agents without worrying about cost or availability.",
+
+ "go.cta.start": "Subscribe to Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Subscribe to Go",
+ "go.cta.price": "$10/month",
+ "go.cta.promo": "$5 first month",
+ "go.pricing.body": "Use with any agent. $5 first month, then $10/month. Top up credit if needed. Cancel any time.",
+ "go.graph.free": "Free",
+ "go.graph.freePill": "Big Pickle and free models",
+ "go.graph.go": "Go",
+ "go.graph.label": "Requests per 5 hour",
+ "go.graph.usageLimits": "Usage limits",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Requests per 5h: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "has been life changing, it's truly a no-brainer.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 out of 5 people on our team love using",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "I can't recommend",
+ "go.testimonials.adam.quoteAfter": "enough. Seriously, it's really good.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "With",
+ "go.testimonials.david.quoteAfter": "I know all the models are tested and perfect for coding agents.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
+ "go.testimonials.frank.quote": "I wish I was still at Nvidia.",
+ "go.problem.title": "What problem is Go solving?",
+ "go.problem.body":
+ "We're focused on bringing the OpenCode experience to as many people as possible. OpenCode Go is a low cost subscription: $5 for your first month, then $10/month. It provides generous limits and reliable access to the most capable open source models.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Low cost subscription pricing",
+ "go.problem.item2": "Generous limits and reliable access",
+ "go.problem.item3": "Built for as many programmers as possible",
+ "go.problem.item4":
+ "Includes GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash",
+ "go.how.title": "How Go works",
+ "go.how.body": "Go starts at $5 for your first month, then $10/month. You can use it with OpenCode or any agent.",
+ "go.how.step1.title": "Create an account",
+ "go.how.step1.beforeLink": "follow the",
+ "go.how.step1.link": "setup instructions",
+ "go.how.step2.title": "Subscribe to Go",
+ "go.how.step2.link": "$5 first month",
+ "go.how.step2.afterLink": "then $10/month with generous limits",
+ "go.how.step3.title": "Start coding",
+ "go.how.step3.body": "with reliable access to open-source models",
+ "go.privacy.title": "Your privacy is important to us",
+ "go.privacy.body":
+ "The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access.",
+ "go.privacy.contactAfter": "if you have any questions.",
+ "go.privacy.beforeExceptions":
+ "Go models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
+ "go.privacy.exceptionsLink": "following exceptions",
+ "go.faq.q1": "What is OpenCode Go?",
+ "go.faq.a1":
+ "Go is a low-cost subscription that gives you reliable access to capable open-source models for agentic coding.",
+ "go.faq.q2": "What models does Go include?",
+ "go.faq.a2": "Go includes the models listed below, with generous limits and reliable access.",
+ "go.faq.q3": "Is Go the same as Zen?",
+ "go.faq.a3":
+ "No. Zen is pay-as-you-go, while Go starts at $5 for your first month, then $10/month, with generous limits and reliable access to open-source models GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash.",
+ "go.faq.q4": "How much does Go cost?",
+ "go.faq.a4.p1.beforePricing": "Go costs",
+ "go.faq.a4.p1.pricingLink": "$5 first month",
+ "go.faq.a4.p1.afterPricing": "then $10/month with generous limits.",
+ "go.faq.a4.p2.beforeAccount": "You can manage your subscription in your",
+ "go.faq.a4.p2.accountLink": "account",
+ "go.faq.a4.p3": "Cancel any time.",
+ "go.faq.q5": "What about data and privacy?",
+ "go.faq.a5.body":
+ "The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Our providers follow a zero-retention policy and do not use your data for model training.",
+
+ "go.faq.a5.beforeExceptions":
+ "Go models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
+ "go.faq.a5.exceptionsLink": "following exceptions",
+ "go.faq.q6": "Can I top up credit?",
+ "go.faq.a6": "If you need more usage, you can top up credit in your account.",
+ "go.faq.q7": "Can I cancel?",
+ "go.faq.a7": "Yes, you can cancel any time.",
+ "go.faq.q8": "Can I use Go with other coding agents?",
+ "go.faq.a8": "Yes, you can use Go with any agent. Follow the setup instructions in your preferred coding agent.",
+
+ "go.faq.q9": "What is the difference between free models and Go?",
+ "go.faq.a9":
+ "Free models include Big Pickle plus promotional models available at the time, with a quota of 200 requests/day. Go includes GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash with higher request quotas enforced across rolling windows (5-hour, weekly, and monthly), roughly equivalent to $12 per 5 hours, $30 per week, and $60 per month (actual request counts vary by model and usage).",
+
+ "zen.api.error.rateLimitExceeded": "Rate limit exceeded. Please try again later.",
+ "zen.api.error.modelNotSupported": "Model {{model}} is not supported",
+ "zen.api.error.modelFormatNotSupported": "Model {{model}} is not supported for format {{format}}",
+ "zen.api.error.noProviderAvailable": "No provider available",
+ "zen.api.error.providerNotSupported": "Provider {{provider}} not supported",
+ "zen.api.error.missingApiKey": "Missing API key.",
+ "zen.api.error.invalidApiKey": "Invalid API key.",
+ "zen.api.error.subscriptionQuotaExceeded": "Subscription quota exceeded. Retry in {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "5-hour usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Weekly usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Monthly usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "No payment method. Add a payment method here: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Insufficient balance. Manage your billing here: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Your workspace has reached its monthly spending limit of ${{amount}}. Manage your limits here: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "You have reached your monthly spending limit of ${{amount}}. Manage your limits here: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Model is disabled",
+ "zen.api.error.trialEnded":
+ "Free promotion has ended for {{model}}. You can continue using the model by subscribing to OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Access all the world's best coding models",
+ "black.meta.description": "Get access to Claude, GPT, Gemini and more with OpenCode Black subscription plans.",
+ "black.hero.title": "Access all the world's best coding models",
+ "black.hero.subtitle": "Including Claude, GPT, Gemini and more",
+ "black.title": "OpenCode Black | Pricing",
+ "black.paused": "Black plan enrollment is temporarily paused.",
+ "black.plan.icon20": "Black 20 plan",
+ "black.plan.icon100": "Black 100 plan",
+ "black.plan.icon200": "Black 200 plan",
+ "black.plan.multiplier100": "5x more usage than Black 20",
+ "black.plan.multiplier200": "20x more usage than Black 20",
+ "black.price.perMonth": "per month",
+ "black.price.perPersonBilledMonthly": "per person billed monthly",
+ "black.terms.1": "Your subscription will not start immediately",
+ "black.terms.2": "You will be added to the waitlist and activated soon",
+ "black.terms.3": "Your card will only be charged when your subscription is activated",
+ "black.terms.4": "Usage limits apply, heavily automated use may reach limits sooner",
+ "black.terms.5": "Subscriptions are for individuals, contact Enterprise for teams",
+ "black.terms.6": "Limits may be adjusted and plans may be discontinued in the future",
+ "black.terms.7": "Cancel your subscription at any time",
+ "black.action.continue": "Continue",
+ "black.finePrint.beforeTerms": "Prices shown don't include applicable tax",
+ "black.finePrint.terms": "Terms of Service",
+ "black.workspace.title": "OpenCode Black | Select Workspace",
+ "black.workspace.selectPlan": "Select a workspace for this plan",
+ "black.workspace.name": "Workspace {{n}}",
+ "black.subscribe.title": "Subscribe to OpenCode Black",
+ "black.subscribe.paymentMethod": "Payment method",
+ "black.subscribe.loadingPaymentForm": "Loading payment form...",
+ "black.subscribe.selectWorkspaceToContinue": "Select a workspace to continue",
+ "black.subscribe.failurePrefix": "Uh oh!",
+ "black.subscribe.error.generic": "An error occurred",
+ "black.subscribe.error.invalidPlan": "Invalid plan",
+ "black.subscribe.error.workspaceRequired": "Workspace ID is required",
+ "black.subscribe.error.alreadySubscribed": "This workspace already has a subscription",
+ "black.subscribe.processing": "Processing...",
+ "black.subscribe.submit": "Subscribe ${{plan}}",
+ "black.subscribe.form.chargeNotice": "You will only be charged when your subscription is activated",
+ "black.subscribe.success.title": "You're on the OpenCode Black waitlist",
+ "black.subscribe.success.subscriptionPlan": "Subscription plan",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Amount",
+ "black.subscribe.success.amountValue": "${{plan}} per month",
+ "black.subscribe.success.paymentMethod": "Payment method",
+ "black.subscribe.success.dateJoined": "Date joined",
+ "black.subscribe.success.chargeNotice": "Your card will be charged when your subscription is activated",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Usage",
+ "workspace.nav.apiKeys": "API Keys",
+ "workspace.nav.members": "Members",
+ "workspace.nav.billing": "Billing",
+ "workspace.nav.settings": "Settings",
+
+ "workspace.home.banner.beforeLink": "Reliable optimized models for coding agents.",
+ "workspace.lite.banner.beforeLink": "Low cost coding models for everyone.",
+ "workspace.home.billing.loading": "Loading...",
+ "workspace.home.billing.enable": "Enable billing",
+ "workspace.home.billing.currentBalance": "Current balance",
+
+ "workspace.newUser.feature.tested.title": "Tested & Verified Models",
+ "workspace.newUser.feature.tested.body":
+ "We've benchmarked and tested models specifically for coding agents to ensure the best performance.",
+ "workspace.newUser.feature.quality.title": "Highest Quality",
+ "workspace.newUser.feature.quality.body":
+ "Access models configured for optimal performance - no downgrades or routing to cheaper providers.",
+ "workspace.newUser.feature.lockin.title": "No Lock-in",
+ "workspace.newUser.feature.lockin.body":
+ "Use Zen with any coding agent, and continue using other providers with opencode whenever you want.",
+ "workspace.newUser.copyApiKey": "Copy API key",
+ "workspace.newUser.copyKey": "Copy Key",
+ "workspace.newUser.copied": "Copied!",
+ "workspace.newUser.step.enableBilling": "Enable billing",
+ "workspace.newUser.step.login.before": "Run",
+ "workspace.newUser.step.login.after": "and select opencode",
+ "workspace.newUser.step.pasteKey": "Paste your API key",
+ "workspace.newUser.step.models.before": "Start opencode and run",
+ "workspace.newUser.step.models.after": "to select a model",
+
+ "workspace.models.title": "Models",
+ "workspace.models.subtitle.beforeLink": "Manage which models workspace members can access.",
+ "workspace.models.table.model": "Model",
+ "workspace.models.table.enabled": "Enabled",
+
+ "workspace.providers.title": "Bring Your Own Key",
+ "workspace.providers.subtitle": "Configure your own API keys from AI providers.",
+ "workspace.providers.placeholder": "Enter {{provider}} API key ({{prefix}}...)",
+ "workspace.providers.configure": "Configure",
+ "workspace.providers.edit": "Edit",
+ "workspace.providers.delete": "Delete",
+ "workspace.providers.saving": "Saving...",
+ "workspace.providers.save": "Save",
+ "workspace.providers.table.provider": "Provider",
+ "workspace.providers.table.apiKey": "API Key",
+
+ "workspace.usage.title": "Usage History",
+ "workspace.usage.subtitle": "Recent API usage and costs.",
+ "workspace.usage.empty": "Make your first API call to get started.",
+ "workspace.usage.table.date": "Date",
+ "workspace.usage.table.model": "Model",
+ "workspace.usage.table.input": "Input",
+ "workspace.usage.table.output": "Output",
+ "workspace.usage.table.cost": "Cost",
+ "workspace.usage.table.session": "Session",
+ "workspace.usage.breakdown.input": "Input",
+ "workspace.usage.breakdown.cacheRead": "Cache Read",
+ "workspace.usage.breakdown.cacheWrite": "Cache Write",
+ "workspace.usage.breakdown.output": "Output",
+ "workspace.usage.breakdown.reasoning": "Reasoning",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Cost",
+ "workspace.cost.subtitle": "Usage costs broken down by model.",
+ "workspace.cost.allModels": "All Models",
+ "workspace.cost.allKeys": "All Keys",
+ "workspace.cost.deletedSuffix": "(deleted)",
+ "workspace.cost.empty": "No usage data available for the selected period.",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "API Keys",
+ "workspace.keys.subtitle": "Manage your API keys for accessing opencode services.",
+ "workspace.keys.create": "Create API Key",
+ "workspace.keys.placeholder": "Enter key name",
+ "workspace.keys.empty": "Create an opencode Gateway API key",
+ "workspace.keys.table.name": "Name",
+ "workspace.keys.table.key": "Key",
+ "workspace.keys.table.createdBy": "Created By",
+ "workspace.keys.table.lastUsed": "Last Used",
+ "workspace.keys.copyApiKey": "Copy API key",
+ "workspace.keys.delete": "Delete",
+
+ "workspace.members.title": "Members",
+ "workspace.members.subtitle": "Manage workspace members and their permissions.",
+ "workspace.members.invite": "Invite Member",
+ "workspace.members.inviting": "Inviting...",
+ "workspace.members.beta.beforeLink": "Workspaces are free for teams during the beta.",
+ "workspace.members.form.invitee": "Invitee",
+ "workspace.members.form.emailPlaceholder": "Enter email",
+ "workspace.members.form.role": "Role",
+ "workspace.members.form.monthlyLimit": "Monthly spending limit",
+ "workspace.members.noLimit": "No limit",
+ "workspace.members.noLimitLowercase": "no limit",
+ "workspace.members.invited": "invited",
+ "workspace.members.edit": "Edit",
+ "workspace.members.delete": "Delete",
+ "workspace.members.saving": "Saving...",
+ "workspace.members.save": "Save",
+ "workspace.members.table.email": "Email",
+ "workspace.members.table.role": "Role",
+ "workspace.members.table.monthLimit": "Month limit",
+ "workspace.members.role.admin": "Admin",
+ "workspace.members.role.adminDescription": "Can manage models, members, and billing",
+ "workspace.members.role.member": "Member",
+ "workspace.members.role.memberDescription": "Can only generate API keys for themselves",
+
+ "workspace.settings.title": "Settings",
+ "workspace.settings.subtitle": "Update your workspace name and preferences.",
+ "workspace.settings.workspaceName": "Workspace name",
+ "workspace.settings.defaultName": "Default",
+ "workspace.settings.updating": "Updating...",
+ "workspace.settings.save": "Save",
+ "workspace.settings.edit": "Edit",
+
+ "workspace.billing.title": "Billing",
+ "workspace.billing.subtitle.beforeLink": "Manage payment methods.",
+ "workspace.billing.contactUs": "Contact us",
+ "workspace.billing.subtitle.afterLink": "if you have any questions.",
+ "workspace.billing.currentBalance": "Current Balance",
+ "workspace.billing.add": "Add $",
+ "workspace.billing.enterAmount": "Enter amount",
+ "workspace.billing.loading": "Loading...",
+ "workspace.billing.addAction": "Add",
+ "workspace.billing.addBalance": "Add Balance",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Linked to Stripe",
+ "workspace.billing.manage": "Manage",
+ "workspace.billing.enable": "Enable Billing",
+
+ "workspace.monthlyLimit.title": "Monthly Limit",
+ "workspace.monthlyLimit.subtitle": "Set a monthly usage limit for your account.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Setting...",
+ "workspace.monthlyLimit.set": "Set",
+ "workspace.monthlyLimit.edit": "Edit Limit",
+ "workspace.monthlyLimit.noLimit": "No usage limit set.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Current usage for",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "is $",
+
+ "workspace.redeem.title": "Redeem Coupon",
+ "workspace.redeem.subtitle": "Redeem a coupon code to claim credits or perks.",
+ "workspace.redeem.placeholder": "Enter coupon code",
+ "workspace.redeem.redeem": "Redeem",
+ "workspace.redeem.redeeming": "Redeeming...",
+ "workspace.redeem.success": "Coupon redeemed successfully.",
+
+ "workspace.reload.title": "Auto Reload",
+ "workspace.reload.disabled.before": "Auto reload is",
+ "workspace.reload.disabled.state": "disabled",
+ "workspace.reload.disabled.after": "Enable to automatically reload when balance is low.",
+ "workspace.reload.enabled.before": "Auto reload is",
+ "workspace.reload.enabled.state": "enabled",
+ "workspace.reload.enabled.middle": "We'll reload",
+ "workspace.reload.processingFee": "processing fee",
+ "workspace.reload.enabled.after": "when balance reaches",
+ "workspace.reload.edit": "Edit",
+ "workspace.reload.enable": "Enable",
+ "workspace.reload.enableAutoReload": "Enable Auto Reload",
+ "workspace.reload.reloadAmount": "Reload $",
+ "workspace.reload.whenBalanceReaches": "When balance reaches $",
+ "workspace.reload.saving": "Saving...",
+ "workspace.reload.save": "Save",
+ "workspace.reload.failedAt": "Reload failed at",
+ "workspace.reload.reason": "Reason:",
+ "workspace.reload.updatePaymentMethod": "Please update your payment method and try again.",
+ "workspace.reload.retrying": "Retrying...",
+ "workspace.reload.retry": "Retry",
+ "workspace.reload.error.paymentFailed": "Payment failed.",
+
+ "workspace.payments.title": "Payments History",
+ "workspace.payments.subtitle": "Recent payment transactions.",
+ "workspace.payments.table.date": "Date",
+ "workspace.payments.table.paymentId": "Payment ID",
+ "workspace.payments.table.amount": "Amount",
+ "workspace.payments.table.receipt": "Receipt",
+ "workspace.payments.type.credit": "credit",
+ "workspace.payments.type.subscription": "subscription",
+ "workspace.payments.view": "View",
+
+ "workspace.black.loading": "Loading...",
+ "workspace.black.time.day": "day",
+ "workspace.black.time.days": "days",
+ "workspace.black.time.hour": "hour",
+ "workspace.black.time.hours": "hours",
+ "workspace.black.time.minute": "minute",
+ "workspace.black.time.minutes": "minutes",
+ "workspace.black.time.fewSeconds": "a few seconds",
+ "workspace.black.subscription.title": "Subscription",
+ "workspace.black.subscription.message": "You are subscribed to OpenCode Black for ${{plan}} per month.",
+ "workspace.black.subscription.manage": "Manage Subscription",
+ "workspace.black.subscription.rollingUsage": "5-hour Usage",
+ "workspace.black.subscription.weeklyUsage": "Weekly Usage",
+ "workspace.black.subscription.resetsIn": "Resets in",
+ "workspace.black.subscription.useBalance": "Use your available balance after reaching the usage limits",
+ "workspace.black.waitlist.title": "Waitlist",
+ "workspace.black.waitlist.joined": "You are on the waitlist for the ${{plan}} per month OpenCode Black plan.",
+ "workspace.black.waitlist.ready": "We're ready to enroll you into the ${{plan}} per month OpenCode Black plan.",
+ "workspace.black.waitlist.leave": "Leave Waitlist",
+ "workspace.black.waitlist.leaving": "Leaving...",
+ "workspace.black.waitlist.left": "Left",
+ "workspace.black.waitlist.enroll": "Enroll",
+ "workspace.black.waitlist.enrolling": "Enrolling...",
+ "workspace.black.waitlist.enrolled": "Enrolled",
+ "workspace.black.waitlist.enrollNote":
+ "When you click Enroll, your subscription starts immediately and your card will be charged.",
+
+ "workspace.lite.loading": "Loading...",
+ "workspace.lite.time.day": "day",
+ "workspace.lite.time.days": "days",
+ "workspace.lite.time.hour": "hour",
+ "workspace.lite.time.hours": "hours",
+ "workspace.lite.time.minute": "minute",
+ "workspace.lite.time.minutes": "minutes",
+ "workspace.lite.time.fewSeconds": "a few seconds",
+ "workspace.lite.subscription.message": "You are subscribed to OpenCode Go.",
+ "workspace.lite.subscription.manage": "Manage Subscription",
+ "workspace.lite.subscription.rollingUsage": "Rolling Usage",
+ "workspace.lite.subscription.weeklyUsage": "Weekly Usage",
+ "workspace.lite.subscription.monthlyUsage": "Monthly Usage",
+ "workspace.lite.subscription.resetsIn": "Resets in",
+ "workspace.lite.subscription.useBalance": "Use your available balance after reaching the usage limits",
+ "workspace.lite.subscription.selectProvider":
+ 'Select "OpenCode Go" as the provider in your opencode configuration to use Go models.',
+ "workspace.lite.black.message":
+ "You're currently subscribed to OpenCode Black or on the waitlist. Please unsubscribe first if you'd like to switch to Go.",
+ "workspace.lite.other.message":
+ "Another member in this workspace is already subscribed to OpenCode Go. Only one member per workspace can subscribe.",
+ "workspace.lite.promo.description":
+ "OpenCode Go starts at {{price}}, then $10/month, and provides reliable access to popular open coding models with generous usage limits.",
+ "workspace.lite.promo.price": "$5 for your first month",
+ "workspace.lite.promo.modelsTitle": "What's Included",
+ "workspace.lite.promo.footer":
+ "The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Pricing and usage limits may change as we learn from early usage and feedback.",
+ "workspace.lite.promo.subscribe": "Subscribe to Go",
+ "workspace.lite.promo.subscribing": "Redirecting...",
+ "workspace.lite.promo.otherMethods": "Other payment methods",
+ "workspace.lite.promo.selectMethod": "Select payment method",
+
+ "workspace.referral.copyLink": "Copy Link",
+ "workspace.referral.copied": "Copied",
+ "workspace.referral.overview.title": "Invite friends",
+ "workspace.referral.overview.subtitle": "Earn $5 when a friend subscribes. They’ll get $5 too.",
+ "workspace.referral.instructions.share": "Share your referral link",
+ "workspace.referral.instructions.subscribe": "Your friend joins and subscribes to Go",
+ "workspace.referral.instructions.claim": "You both get a $5 usage credit to apply toward your Go usage limits",
+ "workspace.referral.rewards.title": "Referral rewards",
+ "workspace.referral.rewards.description": "Apply available referral credits toward your Go usage.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} rewards applied.",
+ "workspace.referral.rewards.empty": "No referral rewards yet.",
+ "workspace.referral.table.reward": "Reward",
+ "workspace.referral.table.referral": "Description",
+ "workspace.referral.table.date": "Date",
+ "workspace.referral.reward.description.inviter": "Invited {{email}}",
+ "workspace.referral.reward.description.invitee": "Invited by {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Subscribe to unlock",
+ "workspace.referral.reward.action.view": "View Reward",
+ "workspace.referral.reward.action.applied": "Reward Applied",
+ "workspace.referral.reward.source.pendingInviter": "Waiting for them to subscribe",
+ "workspace.referral.reward.source.pendingInvitee": "Subscribe to unlock reward",
+ "workspace.referral.reward.source.available": "Reward ready to apply",
+ "workspace.referral.reward.source.applied": "Reward applied",
+ "workspace.referral.reward.status.applied": "Reward Applied",
+ "workspace.referral.reward.status.pendingInviter": "Subscribe to unlock",
+ "workspace.referral.reward.status.pendingInvitee": "Subscribe to unlock",
+ "workspace.referral.apply.noGo": "Subscribe to unlock",
+ "workspace.referral.apply.preview": "View Reward",
+ "workspace.referral.apply.action": "Apply",
+ "workspace.referral.apply.confirmTitle": "Apply reward",
+ "workspace.referral.apply.confirmBody": "Apply {{amount}} to reduce this workspace's current usage.",
+ "workspace.referral.apply.confirmAction": "Apply",
+
+ "download.title": "OpenCode | Download",
+ "download.meta.description": "Download OpenCode for macOS, Windows, and Linux",
+ "download.hero.title": "Download OpenCode",
+ "download.hero.subtitle": "Available in Beta for macOS, Windows, and Linux",
+ "download.hero.button": "Download for {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Extensions",
+ "download.section.integrations": "OpenCode Integrations",
+ "download.action.download": "Download",
+ "download.action.install": "Install",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Not necessarily, but probably. You'll need an AI subscription if you want to connect OpenCode to a paid provider, although you can work with",
+ "download.faq.a3.localLink": "local models",
+ "download.faq.a3.afterLocal.beforeZen": "for free. While we encourage users to use",
+ "download.faq.a3.afterZen": ", OpenCode works with all popular providers such as OpenAI, Anthropic, xAI etc.",
+
+ "download.faq.a5.p1": "OpenCode is 100% free to use.",
+ "download.faq.a5.p2.beforeZen":
+ "Any additional costs will come from your subscription to a model provider. While OpenCode works with any model provider, we recommend using",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "Your data and information is only stored when you create sharable links in OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Learn more about",
+ "download.faq.a6.shareLink": "share pages",
+
+ "enterprise.title": "OpenCode | Enterprise solutions for your organisation",
+ "enterprise.meta.description": "Contact OpenCode for enterprise solutions",
+ "enterprise.hero.title": "Your code is yours",
+ "enterprise.hero.body1":
+ "OpenCode operates securely inside your organization with no data or context stored and no licensing restrictions or ownership claims. Start a trial with your team, then deploy it across your organization by integrating it with your SSO and internal AI gateway.",
+ "enterprise.hero.body2": "Let us know how we can help.",
+ "enterprise.form.name.label": "Full name",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Role",
+ "enterprise.form.role.placeholder": "Executive Chairman",
+ "enterprise.form.company.label": "Company",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Company email",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Phone number",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "What problem are you trying to solve?",
+ "enterprise.form.message.placeholder": "We need help with...",
+ "enterprise.form.send": "Send",
+ "enterprise.form.sending": "Sending...",
+ "enterprise.form.success": "Message sent, we'll be in touch soon.",
+ "enterprise.form.success.submitted": "Form submitted successfully.",
+ "enterprise.form.error.allFieldsRequired": "All fields are required.",
+ "enterprise.form.error.invalidEmailFormat": "Invalid email format.",
+ "enterprise.form.error.internalServer": "Internal server error.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "What is OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise is for organizations that want to ensure that their code and data never leaves their infrastructure. It can do this by using a centralized config that integrates with your SSO and internal AI gateway.",
+ "enterprise.faq.q2": "How do I get started with OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Simply start with an internal trial with your team. OpenCode by default does not store your code or context data, making it easy to get started. Then contact us to discuss pricing and implementation options.",
+ "enterprise.faq.q3": "How does enterprise pricing work?",
+ "enterprise.faq.a3":
+ "We offer per-seat enterprise pricing. If you have your own LLM gateway, we do not charge for tokens used. For further details, contact us for a custom quote based on your organization's needs.",
+ "enterprise.faq.q4": "Is my data secure with OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Yes. OpenCode does not store your code or context data. All processing happens locally or through direct API calls to your AI provider. With central config and SSO integration, your data remains secure within your organization's infrastructure.",
+
+ "brand.title": "OpenCode | Brand",
+ "brand.meta.description": "OpenCode brand guidelines",
+ "brand.heading": "Brand guidelines",
+ "brand.subtitle": "Resources and assets to help you work with the OpenCode brand.",
+ "brand.downloadAll": "Download all assets",
+
+ "changelog.title": "OpenCode | Changelog",
+ "changelog.meta.description": "OpenCode release notes and changelog",
+ "changelog.hero.title": "Changelog",
+ "changelog.hero.subtitle": "New updates and improvements to OpenCode",
+ "changelog.empty": "No changelog entries found.",
+ "changelog.viewJson": "View JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agent",
+ "bench.list.table.model": "Model",
+ "bench.list.table.score": "Score",
+ "bench.submission.error.allFieldsRequired": "All fields are required.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Task not found",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "Agent",
+ "bench.detail.labels.model": "Model",
+ "bench.detail.labels.task": "Task",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "From",
+ "bench.detail.labels.to": "To",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Average Duration",
+ "bench.detail.labels.averageScore": "Average Score",
+ "bench.detail.labels.averageCost": "Average Cost",
+ "bench.detail.labels.summary": "Summary",
+ "bench.detail.labels.runs": "Runs",
+ "bench.detail.labels.score": "Score",
+ "bench.detail.labels.base": "Base",
+ "bench.detail.labels.penalty": "Penalty",
+ "bench.detail.labels.weight": "weight",
+ "bench.detail.table.run": "Run",
+ "bench.detail.table.score": "Score (Base - Penalty)",
+ "bench.detail.table.cost": "Cost",
+ "bench.detail.table.duration": "Duration",
+ "bench.detail.run.title": "Run {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} as const
+
+export type Key = keyof typeof dict
+export type Dict = Record
diff --git a/packages/console/app/src/i18n/es.ts b/packages/console/app/src/i18n/es.ts
new file mode 100644
index 0000000..7ef4b5b
--- /dev/null
+++ b/packages/console/app/src/i18n/es.ts
@@ -0,0 +1,826 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Documentación",
+ "nav.changelog": "Registro de cambios",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Iniciar sesión",
+ "nav.free": "Descargar",
+ "nav.home": "Inicio",
+ "nav.openMenu": "Abrir menú",
+ "nav.getStartedFree": "Empezar gratis",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Copiar logo como SVG",
+ "nav.context.copyWordmark": "Copiar marca como SVG",
+ "nav.context.brandAssets": "Activos de marca",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Documentación",
+ "footer.changelog": "Registro de cambios",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Marca",
+ "legal.privacy": "Privacidad",
+ "legal.terms": "Términos",
+
+ "email.title": "Sé el primero en enterarte cuando lancemos nuevos productos",
+ "email.subtitle": "Únete a la lista de espera para acceso anticipado.",
+ "email.placeholder": "Dirección de correo",
+ "email.subscribe": "Suscribirse",
+ "email.success": "Casi listo, revisa tu bandeja de entrada y confirma tu correo",
+
+ "notFound.title": "No encontrado | opencode",
+ "notFound.heading": "404 - Página no encontrada",
+ "notFound.home": "Inicio",
+ "notFound.docs": "Documentación",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode logo claro",
+ "notFound.logoDarkAlt": "opencode logo oscuro",
+
+ "user.logout": "Cerrar sesión",
+
+ "auth.callback.error.codeMissing": "No se encontró código de autorización.",
+
+ "workspace.select": "Seleccionar espacio de trabajo",
+ "workspace.createNew": "+ Crear nuevo espacio de trabajo",
+ "workspace.modal.title": "Crear nuevo espacio de trabajo",
+ "workspace.modal.placeholder": "Introduce nombre del espacio de trabajo",
+
+ "common.cancel": "Cancelar",
+ "common.creating": "Creando...",
+ "common.create": "Crear",
+
+ "common.videoUnsupported": "Tu navegador no soporta la etiqueta de video.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Más información",
+
+ "error.invalidPlan": "Plan inválido",
+ "error.workspaceRequired": "Se requiere ID del espacio de trabajo",
+ "error.alreadySubscribed": "Este espacio de trabajo ya tiene una suscripción",
+ "error.limitRequired": "El límite es obligatorio.",
+ "error.monthlyLimitInvalid": "Establece un límite mensual válido.",
+ "error.workspaceNameRequired": "El nombre del espacio de trabajo es obligatorio.",
+ "error.nameTooLong": "El nombre debe tener 255 caracteres o menos.",
+ "error.emailRequired": "El correo es obligatorio",
+ "error.roleRequired": "El rol es obligatorio",
+ "error.idRequired": "El ID es obligatorio",
+ "error.nameRequired": "El nombre es obligatorio",
+ "error.providerRequired": "El proveedor es obligatorio",
+ "error.apiKeyRequired": "La clave de API es obligatoria",
+ "error.modelRequired": "El modelo es obligatorio",
+ "error.reloadAmountMin": "La cantidad de recarga debe ser al menos ${{amount}}",
+ "error.reloadTriggerMin": "El disparador de saldo debe ser al menos ${{amount}}",
+
+ "app.meta.description": "OpenCode - El agente de codificación de código abierto.",
+
+ "home.title": "OpenCode | El agente de codificación IA de código abierto",
+
+ "temp.title": "opencode | Agente de codificación IA creado para la terminal",
+ "temp.hero.title": "El agente de codificación IA creado para la terminal",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Empezar",
+ "temp.feature.native.title": "TUI Nativa",
+ "temp.feature.native.body": "Una interfaz de terminal responsiva, nativa y personalizable",
+ "temp.feature.zen.beforeLink": "Una lista",
+ "temp.feature.zen.link": "seleccionada de modelos",
+ "temp.feature.zen.afterLink": "proporcionada por opencode",
+ "temp.feature.models.beforeLink": "Soporta más de 75 proveedores de LLM a través de",
+ "temp.feature.models.afterLink": ", incluyendo modelos locales",
+ "temp.screenshot.caption": "opencode TUI con el tema tokyonight",
+ "temp.screenshot.alt": "opencode TUI con tema tokyonight",
+ "temp.logoLightAlt": "logo de opencode claro",
+ "temp.logoDarkAlt": "logo de opencode oscuro",
+
+ "home.banner.badge": "Nuevo",
+ "home.banner.text": "Aplicación de escritorio disponible en beta",
+ "home.banner.platforms": "en macOS, Windows y Linux",
+ "home.banner.downloadNow": "Descargar ahora",
+ "home.banner.downloadBetaNow": "Descargar la beta de escritorio ahora",
+
+ "home.hero.title": "El agente de codificación IA de código abierto",
+ "home.hero.subtitle.a": "Modelos gratuitos incluidos o conecta cualquier modelo de cualquier proveedor,",
+ "home.hero.subtitle.b": "incluyendo Claude, GPT, Gemini y más.",
+
+ "home.install.ariaLabel": "Opciones de instalación",
+
+ "home.what.title": "¿Qué es OpenCode?",
+ "home.what.body":
+ "OpenCode es un agente de código abierto que te ayuda a escribir código en tu terminal, IDE o escritorio.",
+ "home.what.lsp.title": "LSP habilitado",
+ "home.what.lsp.body": "Carga automáticamente los LSPs correctos para el LLM",
+ "home.what.multiSession.title": "Multi-sesión",
+ "home.what.multiSession.body": "Inicia múltiples agentes en paralelo en el mismo proyecto",
+ "home.what.shareLinks.title": "Compartir enlaces",
+ "home.what.shareLinks.body": "Comparte un enlace a cualquier sesión para referencia o depuración",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Inicia sesión con GitHub para usar tu cuenta de Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Inicia sesión con OpenAI para usar tu cuenta de ChatGPT Plus o Pro",
+ "home.what.anyModel.title": "Cualquier modelo",
+ "home.what.anyModel.body": "Más de 75 proveedores de LLM a través de Models.dev, incluyendo modelos locales",
+ "home.what.anyEditor.title": "Cualquier editor",
+ "home.what.anyEditor.body": "Disponible como interfaz de terminal, aplicación de escritorio y extensión de IDE",
+ "home.what.readDocs": "Leer documentación",
+
+ "home.growth.title": "El agente de codificación IA de código abierto",
+ "home.growth.body":
+ "Con más de {{stars}} estrellas en GitHub, {{contributors}} colaboradores y más de {{commits}} commits, OpenCode es usado y confiado por más de {{monthlyUsers}} desarrolladores cada mes.",
+ "home.growth.githubStars": "Estrellas en GitHub",
+ "home.growth.contributors": "Colaboradores",
+ "home.growth.monthlyDevs": "Desarrolladores Mensuales",
+
+ "home.privacy.title": "Creado pensando en la privacidad",
+ "home.privacy.body":
+ "OpenCode no almacena tu código ni datos de contexto, para que pueda operar en entornos sensibles a la privacidad.",
+ "home.privacy.learnMore": "Más información sobre",
+ "home.privacy.link": "privacidad",
+
+ "home.faq.q1": "¿Qué es OpenCode?",
+ "home.faq.a1":
+ "OpenCode es un agente de código abierto que te ayuda a escribir y ejecutar código con cualquier modelo de IA. Está disponible como interfaz de terminal, aplicación de escritorio o extensión de IDE.",
+ "home.faq.q2": "¿Cómo uso OpenCode?",
+ "home.faq.a2.before": "La forma más fácil de empezar es leer la",
+ "home.faq.a2.link": "introducción",
+ "home.faq.q3": "¿Necesito suscripciones extra de IA para usar OpenCode?",
+ "home.faq.a3.p1":
+ "No necesariamente, OpenCode viene con un conjunto de modelos gratuitos que puedes usar sin crear una cuenta.",
+ "home.faq.a3.p2.beforeZen":
+ "Aparte de estos, puedes usar cualquiera de los modelos de codificación populares creando una cuenta de",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Aunque animamos a los usuarios a usar Zen, OpenCode también funciona con todos los proveedores populares como OpenAI, Anthropic, xAI, etc.",
+ "home.faq.a3.p4.beforeLocal": "Incluso puedes conectar tus",
+ "home.faq.a3.p4.localLink": "modelos locales",
+ "home.faq.q4": "¿Puedo usar mis suscripciones de IA existentes con OpenCode?",
+ "home.faq.a4.p1":
+ "Sí, OpenCode soporta planes de suscripción de los principales proveedores. Puedes usar tus suscripciones de Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
+ "home.faq.q5": "¿Solo puedo usar OpenCode en la terminal?",
+ "home.faq.a5.beforeDesktop": "¡Ya no! OpenCode ahora está disponible como una aplicación para tu",
+ "home.faq.a5.desktop": "escritorio",
+ "home.faq.a5.and": "y",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "¿Cuánto cuesta OpenCode?",
+ "home.faq.a6":
+ "OpenCode es 100% gratuito de usar. También viene con un conjunto de modelos gratuitos. Puede haber costos adicionales si conectas cualquier otro proveedor.",
+ "home.faq.q7": "¿Qué hay sobre datos y privacidad?",
+ "home.faq.a7.p1":
+ "Tus datos e información solo se almacenan cuando usas nuestros modelos gratuitos o creas enlaces compartibles.",
+ "home.faq.a7.p2.beforeModels": "Más información sobre",
+ "home.faq.a7.p2.modelsLink": "nuestros modelos",
+ "home.faq.a7.p2.and": "y",
+ "home.faq.a7.p2.shareLink": "páginas compartidas",
+ "home.faq.q8": "¿Es OpenCode de código abierto?",
+ "home.faq.a8.p1": "Sí, OpenCode es totalmente de código abierto. El código fuente es público en",
+ "home.faq.a8.p2": "bajo la",
+ "home.faq.a8.mitLicense": "Licencia MIT",
+ "home.faq.a8.p3":
+ ", lo que significa que cualquiera puede usar, modificar o contribuir a su desarrollo. Cualquiera de la comunidad puede abrir problemas, enviar solicitudes de extracción y extender la funcionalidad.",
+
+ "home.zenCta.title": "Accede a modelos optimizados y confiables para agentes de codificación",
+ "home.zenCta.body":
+ "Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y evaluado específicamente para agentes de codificación. No necesitas preocuparte por el rendimiento y la calidad inconsistentes entre proveedores, usa modelos validados que funcionan.",
+ "home.zenCta.link": "Aprende sobre Zen",
+
+ "zen.title":
+ "OpenCode Zen | Un conjunto seleccionado de modelos optimizados y confiables para agentes de codificación",
+ "zen.hero.title": "Modelos optimizados y confiables para agentes de codificación",
+ "zen.hero.body":
+ "Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y evaluado específicamente para agentes de codificación. No necesitas preocuparte por el rendimiento y la calidad inconsistentes, usa modelos validados que funcionan.",
+
+ "zen.faq.q1": "¿Qué es OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen es un conjunto seleccionado de modelos de IA probados y evaluados para agentes de codificación, creado por el equipo detrás de OpenCode.",
+ "zen.faq.q2": "¿Qué hace a Zen más preciso?",
+ "zen.faq.a2":
+ "Zen solo proporciona modelos que han sido específicamente probados y evaluados para agentes de codificación. No usarías un cuchillo de mantequilla para cortar carne, no uses modelos pobres para codificar.",
+ "zen.faq.q3": "¿Es Zen más barato?",
+ "zen.faq.a3":
+ "Zen no tiene fines de lucro. Zen te transfiere los costos de los proveedores de modelos. Cuanto mayor sea el uso de Zen, más podrá OpenCode negociar mejores tarifas y transferírtelas.",
+ "zen.faq.q4": "¿Cuánto cuesta Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "cobra por solicitud",
+ "zen.faq.a4.p1.afterPricing": "sin recargos, así que pagas exactamente lo que cobra el proveedor del modelo.",
+ "zen.faq.a4.p2.beforeAccount": "Tu costo total depende del uso, y puedes establecer límites de gasto mensuales en tu",
+ "zen.faq.a4.p2.accountLink": "cuenta",
+ "zen.faq.a4.p3":
+ "Para cubrir costos, OpenCode añade solo una pequeña tarifa de procesamiento de pagos de $1.23 por cada recarga de saldo de $20.",
+ "zen.faq.q5": "¿Qué hay sobre datos y privacidad?",
+ "zen.faq.a5.beforeExceptions":
+ "Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las",
+ "zen.faq.a5.exceptionsLink": "siguientes excepciones",
+ "zen.faq.q6": "¿Puedo establecer límites de gasto?",
+ "zen.faq.a6": "Sí, puedes establecer límites de gasto mensuales en tu cuenta.",
+ "zen.faq.q7": "¿Puedo cancelar?",
+ "zen.faq.a7": "Sí, puedes deshabilitar la facturación en cualquier momento y usar tu saldo restante.",
+ "zen.faq.q8": "¿Puedo usar Zen con otros agentes de codificación?",
+ "zen.faq.a8":
+ "Aunque Zen funciona genial con OpenCode, puedes usar Zen con cualquier agente. Sigue las instrucciones de configuración en tu agente de codificación preferido.",
+
+ "zen.cta.start": "Empieza con Zen",
+ "zen.pricing.title": "Añade $20 de saldo prepago",
+ "zen.pricing.fee": "(+$1.23 tarifa de procesamiento de tarjeta)",
+ "zen.pricing.body": "Úsalo con cualquier agente. Establece límites de gasto mensual. Cancela en cualquier momento.",
+ "zen.problem.title": "¿Qué problema está resolviendo Zen?",
+ "zen.problem.body":
+ "Hay muchos modelos disponibles, pero solo unos pocos funcionan bien con agentes de codificación. La mayoría de los proveedores los configuran de manera diferente con resultados variables.",
+ "zen.problem.subtitle": "Estamos arreglando esto para todos, no solo para usuarios de OpenCode.",
+ "zen.problem.item1": "Probando modelos seleccionados y consultando a sus equipos",
+ "zen.problem.item2": "Trabajando con proveedores para asegurar que se entreguen correctamente",
+ "zen.problem.item3": "Evaluando todas las combinaciones modelo-proveedor que recomendamos",
+ "zen.how.title": "Cómo funciona Zen",
+ "zen.how.body": "Aunque sugerimos usar Zen con OpenCode, puedes usar Zen con cualquier agente.",
+ "zen.how.step1.title": "Regístrate y añade $20 de saldo",
+ "zen.how.step1.beforeLink": "sigue las",
+ "zen.how.step1.link": "instrucciones de configuración",
+ "zen.how.step2.title": "Usa Zen con precios transparentes",
+ "zen.how.step2.link": "paga por solicitud",
+ "zen.how.step2.afterLink": "con cero recargos",
+ "zen.how.step3.title": "Auto-recarga",
+ "zen.how.step3.body": "cuando tu saldo alcance $5 añadiremos automáticamente $20",
+ "zen.privacy.title": "Tu privacidad es importante para nosotros",
+ "zen.privacy.beforeExceptions":
+ "Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las",
+ "zen.privacy.exceptionsLink": "siguientes excepciones",
+
+ "go.title": "OpenCode Go | Modelos de programación de bajo coste para todos",
+ "go.meta.description":
+ "Go comienza en $5 el primer mes, luego 10 $/mes, con generosos límites de solicitudes de 5 horas para GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash.",
+ "go.hero.title": "Modelos de programación de bajo coste para todos",
+ "go.hero.body":
+ "Go lleva la programación agéntica a programadores de todo el mundo. Ofrece límites generosos y acceso fiable a los modelos de código abierto más capaces, para que puedas crear con agentes potentes sin preocuparte por el coste o la disponibilidad.",
+
+ "go.cta.start": "Suscribirse a Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Suscribirse a Go",
+ "go.cta.price": "10 $/mes",
+ "go.cta.promo": "$5 el primer mes",
+ "go.pricing.body":
+ "Úsalo con cualquier agente. $5 el primer mes, luego 10 $/mes. Recarga crédito si es necesario. Cancela en cualquier momento.",
+ "go.graph.free": "Gratis",
+ "go.graph.freePill": "Big Pickle y modelos gratuitos",
+ "go.graph.go": "Go",
+ "go.graph.label": "Solicitudes por 5 horas",
+ "go.graph.usageLimits": "Límites de uso",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Solicitudes por 5h: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "ha cambiado mi vida, es realmente una obviedad.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
+ "go.testimonials.jay.quoteBefore": "A 4 de cada 5 personas en nuestro equipo les encanta usar",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "No puedo recomendar",
+ "go.testimonials.adam.quoteAfter": "lo suficiente. En serio, es realmente bueno.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Con",
+ "go.testimonials.david.quoteAfter":
+ "sé que todos los modelos están probados y son perfectos para agentes de programación.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
+ "go.testimonials.frank.quote": "Ojalá siguiera en Nvidia.",
+ "go.problem.title": "¿Qué problema resuelve Go?",
+ "go.problem.body":
+ "Nos enfocamos en llevar la experiencia de OpenCode a tantas personas como sea posible. OpenCode Go es una suscripción de bajo coste: $5 el primer mes, luego 10 $/mes. Proporciona límites generosos y acceso fiable a los modelos de código abierto más capaces.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Precios de suscripción de bajo coste",
+ "go.problem.item2": "Límites generosos y acceso fiable",
+ "go.problem.item3": "Creado para tantos programadores como sea posible",
+ "go.problem.item4":
+ "Incluye GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash",
+ "go.how.title": "Cómo funciona Go",
+ "go.how.body": "Go comienza en $5 el primer mes, luego 10 $/mes. Puedes usarlo con OpenCode o cualquier agente.",
+ "go.how.step1.title": "Crear una cuenta",
+ "go.how.step1.beforeLink": "sigue las",
+ "go.how.step1.link": "instrucciones de configuración",
+ "go.how.step2.title": "Suscribirse a Go",
+ "go.how.step2.link": "$5 el primer mes",
+ "go.how.step2.afterLink": "luego 10 $/mes con límites generosos",
+ "go.how.step3.title": "Empezar a programar",
+ "go.how.step3.body": "con acceso fiable a modelos de código abierto",
+ "go.privacy.title": "Tu privacidad es importante para nosotros",
+ "go.privacy.body":
+ "El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable.",
+ "go.privacy.contactAfter": "si tienes alguna pregunta.",
+ "go.privacy.beforeExceptions":
+ "Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
+ "go.privacy.exceptionsLink": "siguientes excepciones",
+ "go.faq.q1": "¿Qué es OpenCode Go?",
+ "go.faq.a1":
+ "Go es una suscripción de bajo coste que te da acceso fiable a modelos de código abierto capaces para programación agéntica.",
+ "go.faq.q2": "¿Qué modelos incluye Go?",
+ "go.faq.a2": "Go incluye los modelos que se indican abajo, con límites generosos y acceso confiable.",
+ "go.faq.q3": "¿Es Go lo mismo que Zen?",
+ "go.faq.a3":
+ "No. Zen es pago por uso, mientras que Go comienza en $5 el primer mes, luego 10 $/mes, con límites generosos y acceso fiable a los modelos de código abierto GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash.",
+ "go.faq.q4": "¿Cuánto cuesta Go?",
+ "go.faq.a4.p1.beforePricing": "Go cuesta",
+ "go.faq.a4.p1.pricingLink": "$5 el primer mes",
+ "go.faq.a4.p1.afterPricing": "luego 10 $/mes con límites generosos.",
+ "go.faq.a4.p2.beforeAccount": "Puedes gestionar tu suscripción en tu",
+ "go.faq.a4.p2.accountLink": "cuenta",
+ "go.faq.a4.p3": "Cancela en cualquier momento.",
+ "go.faq.q5": "¿Qué pasa con los datos y la privacidad?",
+ "go.faq.a5.body":
+ "El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable. Nuestros proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos.",
+ "go.faq.a5.beforeExceptions":
+ "Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
+ "go.faq.a5.exceptionsLink": "siguientes excepciones",
+ "go.faq.q6": "¿Puedo recargar crédito?",
+ "go.faq.a6": "Si necesitas más uso, puedes recargar crédito en tu cuenta.",
+ "go.faq.q7": "¿Puedo cancelar?",
+ "go.faq.a7": "Sí, puedes cancelar en cualquier momento.",
+ "go.faq.q8": "¿Puedo usar Go con otros agentes de programación?",
+ "go.faq.a8":
+ "Sí, puedes usar Go con cualquier agente. Sigue las instrucciones de configuración en tu agente de programación preferido.",
+
+ "go.faq.q9": "¿Cuál es la diferencia entre los modelos gratuitos y Go?",
+ "go.faq.a9":
+ "Los modelos gratuitos incluyen Big Pickle más modelos promocionales disponibles en el momento, con una cuota de 200 solicitudes/día. Go incluye GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash con cuotas de solicitud más altas aplicadas a través de ventanas móviles (5 horas, semanal y mensual), aproximadamente equivalente a 12 $ por 5 horas, 30 $ por semana y 60 $ por mes (los recuentos reales de solicitudes varían según el modelo y el uso).",
+
+ "zen.api.error.rateLimitExceeded": "Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.",
+ "zen.api.error.modelNotSupported": "Modelo {{model}} no soportado",
+ "zen.api.error.modelFormatNotSupported": "Modelo {{model}} no soportado para el formato {{format}}",
+ "zen.api.error.noProviderAvailable": "Ningún proveedor disponible",
+ "zen.api.error.providerNotSupported": "Proveedor {{provider}} no soportado",
+ "zen.api.error.missingApiKey": "Falta la clave API.",
+ "zen.api.error.invalidApiKey": "Clave API inválida.",
+ "zen.api.error.subscriptionQuotaExceeded": "Cuota de suscripción excedida. Reintenta en {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Límite de uso de 5 horas alcanzado. Se restablece en {{retryIn}}. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Límite de uso semanal alcanzado. Se restablece en {{retryIn}}. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Límite de uso mensual alcanzado. Se restablece en {{retryIn}}. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Sin método de pago. Añade un método de pago aquí: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Saldo insuficiente. Gestiona tu facturación aquí: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Tu espacio de trabajo ha alcanzado su límite de gasto mensual de ${{amount}}. Gestiona tus límites aquí: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Has alcanzado tu límite de gasto mensual de ${{amount}}. Gestiona tus límites aquí: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "El modelo está deshabilitado",
+ "zen.api.error.trialEnded":
+ "La promoción gratuita de {{model}} ha finalizado. Puedes seguir usando el modelo suscribiéndote a OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Accede a los mejores modelos de codificación del mundo",
+ "black.meta.description": "Obtén acceso a Claude, GPT, Gemini y más con los planes de suscripción de OpenCode Black.",
+ "black.hero.title": "Accede a los mejores modelos de codificación del mundo",
+ "black.hero.subtitle": "Incluyendo Claude, GPT, Gemini y más",
+ "black.title": "OpenCode Black | Precios",
+ "black.paused": "La inscripción al plan Black está temporalmente pausada.",
+ "black.plan.icon20": "Plan Black 20",
+ "black.plan.icon100": "Plan Black 100",
+ "black.plan.icon200": "Plan Black 200",
+ "black.plan.multiplier100": "5x más uso que Black 20",
+ "black.plan.multiplier200": "20x más uso que Black 20",
+ "black.price.perMonth": "al mes",
+ "black.price.perPersonBilledMonthly": "por persona facturado mensualmente",
+ "black.terms.1": "Tu suscripción no comenzará inmediatamente",
+ "black.terms.2": "Serás añadido a la lista de espera y activado pronto",
+ "black.terms.3": "Tu tarjeta solo se cargará cuando tu suscripción se active",
+ "black.terms.4": "Aplican límites de uso, el uso fuertemente automatizado puede alcanzar los límites antes",
+ "black.terms.5": "Las suscripciones son para individuos, contacta a Enterprise para equipos",
+ "black.terms.6": "Los límites pueden ajustarse y los planes pueden discontinuarse en el futuro",
+ "black.terms.7": "Cancela tu suscripción en cualquier momento",
+ "black.action.continue": "Continuar",
+ "black.finePrint.beforeTerms": "Los precios mostrados no incluyen impuestos aplicables",
+ "black.finePrint.terms": "Términos de Servicio",
+ "black.workspace.title": "OpenCode Black | Seleccionar Espacio de Trabajo",
+ "black.workspace.selectPlan": "Selecciona un espacio de trabajo para este plan",
+ "black.workspace.name": "Espacio de trabajo {{n}}",
+ "black.subscribe.title": "Suscribirse a OpenCode Black",
+ "black.subscribe.paymentMethod": "Método de pago",
+ "black.subscribe.loadingPaymentForm": "Cargando formulario de pago...",
+ "black.subscribe.selectWorkspaceToContinue": "Selecciona un espacio de trabajo para continuar",
+ "black.subscribe.failurePrefix": "¡Oh no!",
+ "black.subscribe.error.generic": "Ocurrió un error",
+ "black.subscribe.error.invalidPlan": "Plan inválido",
+ "black.subscribe.error.workspaceRequired": "Se requiere ID del espacio de trabajo",
+ "black.subscribe.error.alreadySubscribed": "Este espacio de trabajo ya tiene una suscripción",
+ "black.subscribe.processing": "Procesando...",
+ "black.subscribe.submit": "Suscribirse ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Solo se te cobrará cuando tu suscripción se active",
+ "black.subscribe.success.title": "Estás en la lista de espera de OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "Plan de suscripción",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Cantidad",
+ "black.subscribe.success.amountValue": "${{plan}} al mes",
+ "black.subscribe.success.paymentMethod": "Método de pago",
+ "black.subscribe.success.dateJoined": "Fecha de unión",
+ "black.subscribe.success.chargeNotice": "Tu tarjeta se cargará cuando tu suscripción se active",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Uso",
+ "workspace.nav.apiKeys": "Claves API",
+ "workspace.nav.members": "Miembros",
+ "workspace.nav.billing": "Facturación",
+ "workspace.nav.settings": "Configuración",
+
+ "workspace.home.banner.beforeLink": "Modelos optimizados y confiables para agentes de codificación.",
+ "workspace.lite.banner.beforeLink": "Modelos de codificación de bajo costo para todos.",
+ "workspace.home.billing.loading": "Cargando...",
+ "workspace.home.billing.enable": "Habilitar facturación",
+ "workspace.home.billing.currentBalance": "Saldo actual",
+
+ "workspace.newUser.feature.tested.title": "Modelos Probados y Verificados",
+ "workspace.newUser.feature.tested.body":
+ "Hemos evaluado y probado modelos específicamente para agentes de codificación para asegurar el mejor rendimiento.",
+ "workspace.newUser.feature.quality.title": "Máxima Calidad",
+ "workspace.newUser.feature.quality.body":
+ "Accede a modelos configurados para un rendimiento óptimo - sin degradaciones ni enrutamiento a proveedores más baratos.",
+ "workspace.newUser.feature.lockin.title": "Sin Bloqueo",
+ "workspace.newUser.feature.lockin.body":
+ "Usa Zen con cualquier agente de codificación, y continúa usando otros proveedores con opencode cuando quieras.",
+ "workspace.newUser.copyApiKey": "Copiar clave API",
+ "workspace.newUser.copyKey": "Copiar Clave",
+ "workspace.newUser.copied": "¡Copiada!",
+ "workspace.newUser.step.enableBilling": "Habilitar facturación",
+ "workspace.newUser.step.login.before": "Ejecuta",
+ "workspace.newUser.step.login.after": "y selecciona opencode",
+ "workspace.newUser.step.pasteKey": "Pega tu clave API",
+ "workspace.newUser.step.models.before": "Inicia opencode y ejecuta",
+ "workspace.newUser.step.models.after": "para seleccionar un modelo",
+
+ "workspace.models.title": "Modelos",
+ "workspace.models.subtitle.beforeLink": "Gestiona qué modelos pueden acceder los miembros del espacio de trabajo.",
+ "workspace.models.table.model": "Modelo",
+ "workspace.models.table.enabled": "Habilitado",
+
+ "workspace.providers.title": "Trae Tu Propia Clave",
+ "workspace.providers.subtitle": "Configura tus propias claves API de proveedores de IA.",
+ "workspace.providers.placeholder": "Introduce clave API de {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Configurar",
+ "workspace.providers.edit": "Editar",
+ "workspace.providers.delete": "Eliminar",
+ "workspace.providers.saving": "Guardando...",
+ "workspace.providers.save": "Guardar",
+ "workspace.providers.table.provider": "Proveedor",
+ "workspace.providers.table.apiKey": "Clave API",
+
+ "workspace.usage.title": "Historial de Uso",
+ "workspace.usage.subtitle": "Uso reciente de API y costos.",
+ "workspace.usage.empty": "Haz tu primera llamada a la API para empezar.",
+ "workspace.usage.table.date": "Fecha",
+ "workspace.usage.table.model": "Modelo",
+ "workspace.usage.table.input": "Entrada",
+ "workspace.usage.table.output": "Salida",
+ "workspace.usage.table.cost": "Costo",
+ "workspace.usage.table.session": "Sesión",
+ "workspace.usage.breakdown.input": "Entrada",
+ "workspace.usage.breakdown.cacheRead": "Lectura de Caché",
+ "workspace.usage.breakdown.cacheWrite": "Escritura de Caché",
+ "workspace.usage.breakdown.output": "Salida",
+ "workspace.usage.breakdown.reasoning": "Razonamiento",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Costo",
+ "workspace.cost.subtitle": "Costos de uso desglosados por modelo.",
+ "workspace.cost.allModels": "Todos los Modelos",
+ "workspace.cost.allKeys": "Todas las Claves",
+ "workspace.cost.deletedSuffix": "(eliminado)",
+ "workspace.cost.empty": "No hay datos de uso disponibles para el periodo seleccionado.",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "Claves API",
+ "workspace.keys.subtitle": "Gestiona tus claves API para acceder a los servicios de opencode.",
+ "workspace.keys.create": "Crear Clave API",
+ "workspace.keys.placeholder": "Introduce nombre de la clave",
+ "workspace.keys.empty": "Crea una clave API de opencode Gateway",
+ "workspace.keys.table.name": "Nombre",
+ "workspace.keys.table.key": "Clave",
+ "workspace.keys.table.createdBy": "Creado Por",
+ "workspace.keys.table.lastUsed": "Último Uso",
+ "workspace.keys.copyApiKey": "Copiar clave API",
+ "workspace.keys.delete": "Eliminar",
+
+ "workspace.members.title": "Miembros",
+ "workspace.members.subtitle": "Gestiona miembros del espacio de trabajo y sus permisos.",
+ "workspace.members.invite": "Invitar Miembro",
+ "workspace.members.inviting": "Invitando...",
+ "workspace.members.beta.beforeLink": "Los espacios de trabajo son gratuitos para equipos durante la beta.",
+ "workspace.members.form.invitee": "Invitado",
+ "workspace.members.form.emailPlaceholder": "Introduce correo",
+ "workspace.members.form.role": "Rol",
+ "workspace.members.form.monthlyLimit": "Límite de gasto mensual",
+ "workspace.members.noLimit": "Sin límite",
+ "workspace.members.noLimitLowercase": "sin límite",
+ "workspace.members.invited": "invitado",
+ "workspace.members.edit": "Editar",
+ "workspace.members.delete": "Eliminar",
+ "workspace.members.saving": "Guardando...",
+ "workspace.members.save": "Guardar",
+ "workspace.members.table.email": "Correo",
+ "workspace.members.table.role": "Rol",
+ "workspace.members.table.monthLimit": "Límite mensual",
+ "workspace.members.role.admin": "Administrador",
+ "workspace.members.role.adminDescription": "Puede gestionar modelos, miembros y facturación",
+ "workspace.members.role.member": "Miembro",
+ "workspace.members.role.memberDescription": "Solo puede generar claves API para sí mismo",
+
+ "workspace.settings.title": "Configuración",
+ "workspace.settings.subtitle": "Actualiza el nombre de tu espacio de trabajo y preferencias.",
+ "workspace.settings.workspaceName": "Nombre del espacio de trabajo",
+ "workspace.settings.defaultName": "Por defecto",
+ "workspace.settings.updating": "Actualizando...",
+ "workspace.settings.save": "Guardar",
+ "workspace.settings.edit": "Editar",
+
+ "workspace.billing.title": "Facturación",
+ "workspace.billing.subtitle.beforeLink": "Gestionar métodos de pago.",
+ "workspace.billing.contactUs": "Contáctanos",
+ "workspace.billing.subtitle.afterLink": "si tienes alguna pregunta.",
+ "workspace.billing.currentBalance": "Saldo Actual",
+ "workspace.billing.add": "Añadir $",
+ "workspace.billing.enterAmount": "Introduce cantidad",
+ "workspace.billing.loading": "Cargando...",
+ "workspace.billing.addAction": "Añadir",
+ "workspace.billing.addBalance": "Añadir Saldo",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Vinculado con Stripe",
+ "workspace.billing.manage": "Gestionar",
+ "workspace.billing.enable": "Habilitar Facturación",
+
+ "workspace.monthlyLimit.title": "Límite Mensual",
+ "workspace.monthlyLimit.subtitle": "Establece un límite de uso mensual para tu cuenta.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Estableciendo...",
+ "workspace.monthlyLimit.set": "Establecer",
+ "workspace.monthlyLimit.edit": "Editar Límite",
+ "workspace.monthlyLimit.noLimit": "Sin límite de uso establecido.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Uso actual para",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "es $",
+
+ "workspace.redeem.title": "Canjear cupón",
+ "workspace.redeem.subtitle": "Canjea un código de cupón para obtener crédito o beneficios.",
+ "workspace.redeem.placeholder": "Introduce el código del cupón",
+ "workspace.redeem.redeem": "Canjear",
+ "workspace.redeem.redeeming": "Canjeando...",
+ "workspace.redeem.success": "Cupón canjeado correctamente.",
+
+ "workspace.reload.title": "Auto Recarga",
+ "workspace.reload.disabled.before": "La auto recarga está",
+ "workspace.reload.disabled.state": "deshabilitada",
+ "workspace.reload.disabled.after": "Habilita para recargar automáticamente cuando el saldo sea bajo.",
+ "workspace.reload.enabled.before": "La auto recarga está",
+ "workspace.reload.enabled.state": "habilitada",
+ "workspace.reload.enabled.middle": "Recargaremos",
+ "workspace.reload.processingFee": "tarifa de procesamiento",
+ "workspace.reload.enabled.after": "cuando el saldo alcance",
+ "workspace.reload.edit": "Editar",
+ "workspace.reload.enable": "Habilitar",
+ "workspace.reload.enableAutoReload": "Habilitar Auto Recarga",
+ "workspace.reload.reloadAmount": "Recargar $",
+ "workspace.reload.whenBalanceReaches": "Cuando el saldo alcance $",
+ "workspace.reload.saving": "Guardando...",
+ "workspace.reload.save": "Guardar",
+ "workspace.reload.failedAt": "La recarga falló en",
+ "workspace.reload.reason": "Razón:",
+ "workspace.reload.updatePaymentMethod": "Por favor actualiza tu método de pago e intenta de nuevo.",
+ "workspace.reload.retrying": "Reintentando...",
+ "workspace.reload.retry": "Reintentar",
+ "workspace.reload.error.paymentFailed": "El pago falló.",
+
+ "workspace.payments.title": "Historial de Pagos",
+ "workspace.payments.subtitle": "Transacciones de pago recientes.",
+ "workspace.payments.table.date": "Fecha",
+ "workspace.payments.table.paymentId": "ID de Pago",
+ "workspace.payments.table.amount": "Cantidad",
+ "workspace.payments.table.receipt": "Recibo",
+ "workspace.payments.type.credit": "crédito",
+ "workspace.payments.type.subscription": "suscripción",
+ "workspace.payments.view": "Ver",
+
+ "workspace.black.loading": "Cargando...",
+ "workspace.black.time.day": "día",
+ "workspace.black.time.days": "días",
+ "workspace.black.time.hour": "hora",
+ "workspace.black.time.hours": "horas",
+ "workspace.black.time.minute": "minuto",
+ "workspace.black.time.minutes": "minutos",
+ "workspace.black.time.fewSeconds": "unos pocos segundos",
+ "workspace.black.subscription.title": "Suscripción",
+ "workspace.black.subscription.message": "Estás suscrito a OpenCode Black por ${{plan}} al mes.",
+ "workspace.black.subscription.manage": "Gestionar Suscripción",
+ "workspace.black.subscription.rollingUsage": "Uso de 5 horas",
+ "workspace.black.subscription.weeklyUsage": "Uso Semanal",
+ "workspace.black.subscription.resetsIn": "Se reinicia en",
+ "workspace.black.subscription.useBalance": "Usa tu saldo disponible después de alcanzar los límites de uso",
+ "workspace.black.waitlist.title": "Lista de Espera",
+ "workspace.black.waitlist.joined": "Estás en la lista de espera para el plan OpenCode Black de ${{plan}} al mes.",
+ "workspace.black.waitlist.ready": "Estamos listos para inscribirte en el plan OpenCode Black de ${{plan}} al mes.",
+ "workspace.black.waitlist.leave": "Abandonar Lista de Espera",
+ "workspace.black.waitlist.leaving": "Abandonando...",
+ "workspace.black.waitlist.left": "Abandonada",
+ "workspace.black.waitlist.enroll": "Inscribirse",
+ "workspace.black.waitlist.enrolling": "Inscribiéndose...",
+ "workspace.black.waitlist.enrolled": "Inscrito",
+ "workspace.black.waitlist.enrollNote":
+ "Cuando haces clic en Inscribirse, tu suscripción comienza inmediatamente y se cargará a tu tarjeta.",
+
+ "workspace.lite.loading": "Cargando...",
+ "workspace.lite.time.day": "día",
+ "workspace.lite.time.days": "días",
+ "workspace.lite.time.hour": "hora",
+ "workspace.lite.time.hours": "horas",
+ "workspace.lite.time.minute": "minuto",
+ "workspace.lite.time.minutes": "minutos",
+ "workspace.lite.time.fewSeconds": "unos pocos segundos",
+ "workspace.lite.subscription.message": "Estás suscrito a OpenCode Go.",
+ "workspace.lite.subscription.manage": "Gestionar Suscripción",
+ "workspace.lite.subscription.rollingUsage": "Uso Continuo",
+ "workspace.lite.subscription.weeklyUsage": "Uso Semanal",
+ "workspace.lite.subscription.monthlyUsage": "Uso Mensual",
+ "workspace.lite.subscription.resetsIn": "Se reinicia en",
+ "workspace.lite.subscription.useBalance": "Usa tu saldo disponible después de alcanzar los límites de uso",
+ "workspace.lite.subscription.selectProvider":
+ 'Selecciona "OpenCode Go" como proveedor en tu configuración de opencode para usar los modelos Go.',
+ "workspace.lite.black.message":
+ "Actualmente estás suscrito a OpenCode Black o estás en la lista de espera. Por favor, cancela la suscripción primero si deseas cambiar a Go.",
+ "workspace.lite.other.message":
+ "Otro miembro de este espacio de trabajo ya está suscrito a OpenCode Go. Solo un miembro por espacio de trabajo puede suscribirse.",
+ "workspace.lite.promo.description":
+ "OpenCode Go comienza en {{price}}, luego $10/mes, y ofrece acceso confiable a modelos de codificación abiertos populares con límites de uso generosos.",
+ "workspace.lite.promo.price": "$5 el primer mes",
+ "workspace.lite.promo.modelsTitle": "Qué incluye",
+ "workspace.lite.promo.footer":
+ "El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., la UE y Singapur para un acceso global estable. Los precios y los límites de uso pueden cambiar a medida que aprendemos del uso inicial y los comentarios.",
+ "workspace.lite.promo.subscribe": "Suscribirse a Go",
+ "workspace.lite.promo.subscribing": "Redirigiendo...",
+ "workspace.lite.promo.otherMethods": "Otros métodos de pago",
+ "workspace.lite.promo.selectMethod": "Seleccionar método de pago",
+
+ "workspace.referral.copyLink": "Copiar enlace",
+ "workspace.referral.copied": "Copiado",
+ "workspace.referral.overview.title": "Invita amigos",
+ "workspace.referral.overview.subtitle": "Gana $5 cuando un amigo se suscriba. Él también recibirá $5.",
+ "workspace.referral.instructions.share": "Comparte tu enlace de referido",
+ "workspace.referral.instructions.subscribe": "Tu amigo se une y se suscribe a Go",
+ "workspace.referral.instructions.claim":
+ "Ambos reciben un crédito de uso de $5 para aplicar a sus límites de uso de Go",
+ "workspace.referral.rewards.title": "Recompensas por referidos",
+ "workspace.referral.rewards.description": "Aplica los créditos por referidos disponibles a tu uso de Go.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} recompensas aplicadas.",
+ "workspace.referral.rewards.empty": "Aún no hay recompensas por referidos.",
+ "workspace.referral.table.reward": "Recompensa",
+ "workspace.referral.table.referral": "Descripción",
+ "workspace.referral.table.date": "Fecha",
+ "workspace.referral.reward.description.inviter": "Invitaste a {{email}}",
+ "workspace.referral.reward.description.invitee": "Invitado por {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Suscríbete para desbloquear",
+ "workspace.referral.reward.action.view": "Ver recompensa",
+ "workspace.referral.reward.action.applied": "Recompensa aplicada",
+ "workspace.referral.reward.source.pendingInviter": "Esperando a que se suscriba",
+ "workspace.referral.reward.source.pendingInvitee": "Suscríbete para desbloquear la recompensa",
+ "workspace.referral.reward.source.available": "Recompensa lista para aplicar",
+ "workspace.referral.reward.source.applied": "Recompensa aplicada",
+ "workspace.referral.reward.status.applied": "Recompensa aplicada",
+ "workspace.referral.reward.status.pendingInviter": "Suscríbete para desbloquear",
+ "workspace.referral.reward.status.pendingInvitee": "Suscríbete para desbloquear",
+ "workspace.referral.apply.noGo": "Suscríbete para desbloquear",
+ "workspace.referral.apply.preview": "Ver recompensa",
+ "workspace.referral.apply.action": "Aplicar",
+ "workspace.referral.apply.confirmTitle": "Aplicar recompensa",
+ "workspace.referral.apply.confirmBody": "Aplica {{amount}} para reducir el uso actual de este workspace.",
+ "workspace.referral.apply.confirmAction": "Aplicar",
+
+ "download.title": "OpenCode | Descargar",
+ "download.meta.description": "Descarga OpenCode para macOS, Windows y Linux",
+ "download.hero.title": "Descargar OpenCode",
+ "download.hero.subtitle": "Disponible en Beta para macOS, Windows y Linux",
+ "download.hero.button": "Descargar para {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "Extensiones OpenCode",
+ "download.section.integrations": "Integraciones OpenCode",
+ "download.action.download": "Descargar",
+ "download.action.install": "Instalar",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "No necesariamente, pero probablemente. Necesitarás una suscripción de IA si quieres conectar OpenCode a un proveedor de pago, aunque puedes trabajar con",
+ "download.faq.a3.localLink": "modelos locales",
+ "download.faq.a3.afterLocal.beforeZen": "gratis. Aunque animamos a los usuarios a usar",
+ "download.faq.a3.afterZen":
+ ", OpenCode funciona con todos los proveedores populares como OpenAI, Anthropic, xAI, etc.",
+
+ "download.faq.a5.p1": "OpenCode es 100% gratuito de usar.",
+ "download.faq.a5.p2.beforeZen":
+ "Cualquier costo adicional vendrá de tu suscripción a un proveedor de modelos. Aunque OpenCode funciona con cualquier proveedor de modelos, recomendamos usar",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "Tus datos e información solo se almacenan cuando creas enlaces compartibles en OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Más información sobre",
+ "download.faq.a6.shareLink": "páginas compartidas",
+
+ "enterprise.title": "OpenCode | Soluciones empresariales para tu organización",
+ "enterprise.meta.description": "Contacta a OpenCode para soluciones empresariales",
+ "enterprise.hero.title": "Tu código es tuyo",
+ "enterprise.hero.body1":
+ "OpenCode opera de forma segura dentro de tu organización sin almacenar datos ni contexto, y sin restricciones de licencia ni reclamaciones de propiedad. Inicia una prueba con tu equipo, luego despliégalo en toda tu organización integrándolo con tu SSO y pasarela de IA interna.",
+ "enterprise.hero.body2": "Déjanos saber cómo podemos ayudar.",
+ "enterprise.form.name.label": "Nombre completo",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Rol",
+ "enterprise.form.role.placeholder": "Presidente Ejecutivo",
+ "enterprise.form.company.label": "Empresa",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Correo de empresa",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Teléfono",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "¿Qué problema estás intentando resolver?",
+ "enterprise.form.message.placeholder": "Necesitamos ayuda con...",
+ "enterprise.form.send": "Enviar",
+ "enterprise.form.sending": "Enviando...",
+ "enterprise.form.success": "Mensaje enviado, estaremos en contacto pronto.",
+ "enterprise.form.success.submitted": "Formulario enviado con éxito.",
+ "enterprise.form.error.allFieldsRequired": "Todos los campos son obligatorios.",
+ "enterprise.form.error.invalidEmailFormat": "Formato de correo inválido.",
+ "enterprise.form.error.internalServer": "Error interno del servidor.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "¿Qué es OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise es para organizaciones que quieren asegurar que su código y datos nunca salgan de su infraestructura. Puede hacer esto usando una configuración centralizada que se integra con tu SSO y pasarela de IA interna.",
+ "enterprise.faq.q2": "¿Cómo empiezo con OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Simplemente empieza con una prueba interna con tu equipo. OpenCode por defecto no almacena tu código ni datos de contexto, haciendo fácil empezar. Luego contáctanos para discutir precios y opciones de implementación.",
+ "enterprise.faq.q3": "¿Cómo funciona el precio para empresas?",
+ "enterprise.faq.a3":
+ "Ofrecemos precios empresariales por asiento. Si tienes tu propia pasarela de LLM, no cobramos por los tokens usados. Para más detalles, contáctanos para una cotización personalizada basada en las necesidades de tu organización.",
+ "enterprise.faq.q4": "¿Están mis datos seguros con OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Sí. OpenCode no almacena tu código ni datos de contexto. Todo el procesamiento ocurre localmente o a través de llamadas directas a la API de tu proveedor de IA. Con configuración central y integración SSO, tus datos permanecen seguros dentro de la infraestructura de tu organización.",
+
+ "brand.title": "OpenCode | Marca",
+ "brand.meta.description": "Guías de marca de OpenCode",
+ "brand.heading": "Guías de marca",
+ "brand.subtitle": "Recursos y activos para ayudarte a trabajar con la marca OpenCode.",
+ "brand.downloadAll": "Descargar todos los activos",
+
+ "changelog.title": "OpenCode | Registro de cambios",
+ "changelog.meta.description": "Notas de versión y registro de cambios de OpenCode",
+ "changelog.hero.title": "Registro de cambios",
+ "changelog.hero.subtitle": "Nuevas actualizaciones y mejoras para OpenCode",
+ "changelog.empty": "No se encontraron entradas en el registro de cambios.",
+ "changelog.viewJson": "Ver JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agente",
+ "bench.list.table.model": "Modelo",
+ "bench.list.table.score": "Puntuación",
+ "bench.submission.error.allFieldsRequired": "Todos los campos son obligatorios.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Tarea no encontrada",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "Agente",
+ "bench.detail.labels.model": "Modelo",
+ "bench.detail.labels.task": "Tarea",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "De",
+ "bench.detail.labels.to": "A",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Duración Promedio",
+ "bench.detail.labels.averageScore": "Puntuación Promedio",
+ "bench.detail.labels.averageCost": "Costo Promedio",
+ "bench.detail.labels.summary": "Resumen",
+ "bench.detail.labels.runs": "Ejecuciones",
+ "bench.detail.labels.score": "Puntuación",
+ "bench.detail.labels.base": "Base",
+ "bench.detail.labels.penalty": "Penalización",
+ "bench.detail.labels.weight": "peso",
+ "bench.detail.table.run": "Ejecución",
+ "bench.detail.table.score": "Puntuación (Base - Penalización)",
+ "bench.detail.table.cost": "Costo",
+ "bench.detail.table.duration": "Duración",
+ "bench.detail.run.title": "Ejecución {{n}}",
+ "bench.detail.rawJson": "JSON Crudo",
+} as const satisfies Dict
diff --git a/packages/console/app/src/i18n/fr.ts b/packages/console/app/src/i18n/fr.ts
new file mode 100644
index 0000000..e8ebf69
--- /dev/null
+++ b/packages/console/app/src/i18n/fr.ts
@@ -0,0 +1,834 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "app.meta.description": "OpenCode - L'agent de code open source.",
+ "nav.github": "GitHub",
+ "nav.docs": "Documentation",
+ "nav.changelog": "Changelog",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Entreprise",
+ "nav.zen": "Zen",
+ "nav.login": "Se connecter",
+ "nav.free": "Télécharger",
+ "nav.home": "Accueil",
+ "nav.openMenu": "Ouvrir le menu",
+ "nav.getStartedFree": "Commencer gratuitement",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Copier le logo en SVG",
+ "nav.context.copyWordmark": "Copier le logotype en SVG",
+ "nav.context.brandAssets": "Ressources de marque",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Documentation",
+ "footer.changelog": "Changelog",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Marque",
+ "legal.privacy": "Confidentialité",
+ "legal.terms": "Conditions",
+
+ "email.title": "Soyez le premier à être informé de nos nouveaux produits",
+ "email.subtitle": "Inscrivez-vous à la liste d'attente pour un accès anticipé.",
+ "email.placeholder": "Adresse e-mail",
+ "email.subscribe": "S'abonner",
+ "email.success": "Presque terminé - vérifiez votre boîte de réception et confirmez votre adresse e-mail",
+
+ "notFound.title": "Introuvable | OpenCode",
+ "notFound.heading": "404 - Page introuvable",
+ "notFound.home": "Accueil",
+ "notFound.docs": "Documentation",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode logo light",
+ "notFound.logoDarkAlt": "opencode logo dark",
+
+ "user.logout": "Se déconnecter",
+
+ "workspace.select": "Sélectionner un espace de travail",
+ "workspace.createNew": "+ Créer un nouvel espace",
+ "workspace.modal.title": "Créer un nouvel espace",
+ "workspace.modal.placeholder": "Saisir le nom de l'espace",
+
+ "common.cancel": "Annuler",
+ "common.creating": "Création...",
+ "common.create": "Créer",
+
+ "common.videoUnsupported": "Votre navigateur ne prend pas en charge la balise vidéo.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "En savoir plus",
+
+ "error.invalidPlan": "Forfait invalide",
+ "error.workspaceRequired": "L'ID de l'espace de travail est requis",
+ "error.alreadySubscribed": "Cet espace de travail a déjà un abonnement",
+ "error.limitRequired": "La limite est requise.",
+ "error.monthlyLimitInvalid": "Définissez une limite mensuelle valide.",
+ "error.workspaceNameRequired": "Le nom de l'espace de travail est requis.",
+ "error.nameTooLong": "Le nom doit comporter 255 caractères ou moins.",
+ "error.emailRequired": "L'e-mail est requis",
+ "error.roleRequired": "Le rôle est requis",
+ "error.idRequired": "L'ID est requis",
+ "error.nameRequired": "Le nom est requis",
+ "error.providerRequired": "Le fournisseur est requis",
+ "error.apiKeyRequired": "La clé API est requise",
+ "error.modelRequired": "Le modèle est requis",
+ "error.reloadAmountMin": "Le montant de recharge doit être d'au moins {{amount}} $",
+ "error.reloadTriggerMin": "Le seuil de déclenchement doit être d'au moins {{amount}} $",
+ "auth.callback.error.codeMissing": "Aucun code d'autorisation trouvé.",
+
+ "home.title": "OpenCode | L'agent de code IA open source",
+
+ "temp.title": "OpenCode | Agent de code IA conçu pour le terminal",
+ "temp.hero.title": "L'agent de code IA conçu pour le terminal",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "Commencer",
+ "temp.feature.native.title": "TUI Native",
+ "temp.feature.native.body": "Une interface terminal native, réactive et thémable",
+ "temp.feature.zen.beforeLink": "Une",
+ "temp.feature.zen.link": "liste organisée de modèles",
+ "temp.feature.zen.afterLink": "fournie par OpenCode",
+ "temp.feature.models.beforeLink": "Prend en charge plus de 75 fournisseurs LLM via",
+ "temp.feature.models.afterLink": ", y compris les modèles locaux",
+ "temp.screenshot.caption": "OpenCode TUI avec le thème tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI avec le thème tokyonight",
+ "temp.logoLightAlt": "opencode logo light",
+ "temp.logoDarkAlt": "opencode logo dark",
+
+ "home.banner.badge": "Nouveau",
+ "home.banner.text": "Application desktop disponible en bêta",
+ "home.banner.platforms": "sur macOS, Windows et Linux",
+ "home.banner.downloadNow": "Télécharger maintenant",
+ "home.banner.downloadBetaNow": "Télécharger la bêta desktop maintenant",
+
+ "home.hero.title": "L'agent de code IA open source",
+ "home.hero.subtitle.a":
+ "Modèles gratuits inclus ou connectez n'importe quel modèle depuis n'importe quel fournisseur,",
+ "home.hero.subtitle.b": "dont Claude, GPT, Gemini et plus.",
+
+ "home.install.ariaLabel": "Options d'installation",
+
+ "home.what.title": "Qu'est-ce que OpenCode ?",
+ "home.what.body":
+ "OpenCode est un agent open source qui vous aide à écrire du code dans votre terminal, IDE ou desktop.",
+ "home.what.lsp.title": "LSP activé",
+ "home.what.lsp.body": "Charge automatiquement les bons LSP pour le LLM",
+ "home.what.multiSession.title": "Multi-session",
+ "home.what.multiSession.body": "Lancez plusieurs agents en parallèle sur le même projet",
+ "home.what.shareLinks.title": "Liens de partage",
+ "home.what.shareLinks.body": "Partagez un lien vers n'importe quelle session pour référence ou debug",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Connectez-vous avec GitHub pour utiliser votre compte Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Connectez-vous avec OpenAI pour utiliser votre compte ChatGPT Plus ou Pro",
+ "home.what.anyModel.title": "N'importe quel modèle",
+ "home.what.anyModel.body": "75+ fournisseurs de LLM via Models.dev, y compris des modèles locaux",
+ "home.what.anyEditor.title": "N'importe quel éditeur",
+ "home.what.anyEditor.body": "Disponible en interface terminal, application desktop et extension IDE",
+ "home.what.readDocs": "Lire la doc",
+
+ "home.growth.title": "L'agent de code IA open source",
+ "home.growth.body":
+ "Avec plus de {{stars}} étoiles sur GitHub, {{contributors}} contributeurs et plus de {{commits}} commits, OpenCode est utilisé et approuvé par plus de {{monthlyUsers}} développeurs chaque mois.",
+ "home.growth.githubStars": "Étoiles GitHub",
+ "home.growth.contributors": "Contributeurs",
+ "home.growth.monthlyDevs": "Devs mensuels",
+
+ "home.privacy.title": "Conçu pour la confidentialité",
+ "home.privacy.body":
+ "OpenCode ne stocke ni votre code ni vos données de contexte, afin de pouvoir fonctionner dans des environnements sensibles à la confidentialité.",
+ "home.privacy.learnMore": "En savoir plus sur",
+ "home.privacy.link": "la confidentialité",
+
+ "home.faq.q1": "Qu'est-ce que OpenCode ?",
+ "home.faq.a1":
+ "OpenCode est un agent open source qui vous aide à écrire et exécuter du code avec n'importe quel modèle d'IA. Il est disponible en interface terminal, application desktop ou extension IDE.",
+ "home.faq.q2": "Comment utiliser OpenCode ?",
+ "home.faq.a2.before": "Le moyen le plus simple de commencer est de lire l'",
+ "home.faq.a2.link": "intro",
+ "home.faq.q3": "Ai-je besoin d'abonnements IA supplémentaires pour utiliser OpenCode ?",
+ "home.faq.a3.p1":
+ "Pas forcément : OpenCode propose des modèles gratuits que vous pouvez utiliser sans créer de compte.",
+ "home.faq.a3.p2.beforeZen": "En plus, vous pouvez utiliser des modèles populaires pour le code en créant un compte",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Nous encourageons l'utilisation de Zen, mais OpenCode fonctionne aussi avec les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
+ "home.faq.a3.p4.beforeLocal": "Vous pouvez même connecter vos",
+ "home.faq.a3.p4.localLink": "modèles locaux",
+ "home.faq.q4": "Puis-je utiliser mes abonnements IA existants avec OpenCode ?",
+ "home.faq.a4.p1":
+ "Oui, OpenCode prend en charge les abonnements des principaux fournisseurs. Vous pouvez utiliser Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
+ "home.faq.q5": "Puis-je utiliser OpenCode uniquement dans le terminal ?",
+ "home.faq.a5.beforeDesktop": "Plus maintenant ! OpenCode est désormais disponible en application pour",
+ "home.faq.a5.desktop": "desktop",
+ "home.faq.a5.and": "et",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "Combien coûte OpenCode ?",
+ "home.faq.a6":
+ "OpenCode est 100% gratuit. Il inclut aussi des modèles gratuits. Des coûts supplémentaires peuvent s'appliquer si vous connectez un autre fournisseur.",
+ "home.faq.q7": "Qu'en est-il des données et de la confidentialité ?",
+ "home.faq.a7.p1":
+ "Vos données ne sont stockées que lorsque vous utilisez nos modèles gratuits ou créez des liens partageables.",
+ "home.faq.a7.p2.beforeModels": "En savoir plus sur",
+ "home.faq.a7.p2.modelsLink": "nos modèles",
+ "home.faq.a7.p2.and": "et",
+ "home.faq.a7.p2.shareLink": "les pages de partage",
+ "home.faq.q8": "OpenCode est-il open source ?",
+ "home.faq.a8.p1": "Oui, OpenCode est entièrement open source. Le code source est public sur",
+ "home.faq.a8.p2": "sous la",
+ "home.faq.a8.mitLicense": "Licence MIT",
+ "home.faq.a8.p3":
+ ", ce qui signifie que tout le monde peut l'utiliser, le modifier ou contribuer à son développement. Toute personne de la communauté peut ouvrir des tickets, soumettre des pull requests et étendre les fonctionnalités.",
+
+ "home.zenCta.title": "Accédez à des modèles fiables et optimisés pour les agents de code",
+ "home.zenCta.body":
+ "Zen vous donne accès à un ensemble sélectionné de modèles d'IA que OpenCode a testés et benchmarkés spécifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualité selon les fournisseurs : utilisez des modèles validés qui fonctionnent.",
+ "home.zenCta.link": "En savoir plus sur Zen",
+
+ "zen.title": "OpenCode Zen | Un ensemble sélectionné de modèles fiables et optimisés pour les agents de code",
+ "zen.hero.title": "Modèles fiables et optimisés pour les agents de code",
+ "zen.hero.body":
+ "Zen vous donne accès à un ensemble sélectionné de modèles d'IA que OpenCode a testés et benchmarkés spécifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualité selon les fournisseurs : utilisez des modèles validés qui fonctionnent.",
+
+ "zen.faq.q1": "Qu'est-ce que OpenCode Zen ?",
+ "zen.faq.a1":
+ "Zen est un ensemble sélectionné de modèles d'IA testés et benchmarkés pour les agents de code, créé par l'équipe derrière OpenCode.",
+ "zen.faq.q2": "Qu'est-ce qui rend Zen plus précis ?",
+ "zen.faq.a2":
+ "Zen ne propose que des modèles testés et benchmarkés spécifiquement pour les agents de code. Vous n'utiliseriez pas un couteau à beurre pour couper un steak ; n'utilisez pas de mauvais modèles pour coder.",
+ "zen.faq.q3": "Zen est-il moins cher ?",
+ "zen.faq.a3":
+ "Zen n'est pas à but lucratif. Zen vous facture au prix coûtant des fournisseurs de modèles. Plus Zen est utilisé, plus OpenCode peut négocier de meilleurs tarifs et vous les répercuter.",
+ "zen.faq.q4": "Combien coûte Zen ?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "facture par requête",
+ "zen.faq.a4.p1.afterPricing": "sans marge, vous payez donc exactement ce que facture le fournisseur du modèle.",
+ "zen.faq.a4.p2.beforeAccount":
+ "Votre coût total dépend de l'usage, et vous pouvez définir des limites de dépense mensuelles dans votre",
+ "zen.faq.a4.p2.accountLink": "compte",
+ "zen.faq.a4.p3":
+ "Pour couvrir les coûts, OpenCode ajoute uniquement de petits frais de traitement de paiement de 1,23 $ par recharge de 20 $.",
+ "zen.faq.q5": "Et pour les données et la confidentialité ?",
+ "zen.faq.a5.beforeExceptions":
+ "Tous les modèles Zen sont hébergés aux États-Unis. Les fournisseurs appliquent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
+ "zen.faq.a5.exceptionsLink": "exceptions suivantes",
+ "zen.faq.q6": "Puis-je définir des limites de dépense ?",
+ "zen.faq.a6": "Oui, vous pouvez définir des limites de dépense mensuelles dans votre compte.",
+ "zen.faq.q7": "Puis-je annuler ?",
+ "zen.faq.a7": "Oui, vous pouvez désactiver la facturation à tout moment et utiliser votre solde restant.",
+ "zen.faq.q8": "Puis-je utiliser Zen avec d'autres agents de code ?",
+ "zen.faq.a8":
+ "Zen fonctionne très bien avec OpenCode, mais vous pouvez utiliser Zen avec n'importe quel agent. Suivez les instructions de configuration dans votre agent préféré.",
+
+ "zen.cta.start": "Commencez avec Zen",
+ "zen.pricing.title": "Ajoutez 20 $ de solde Pay as you go",
+ "zen.pricing.fee": "(+1,23 $ de frais de traitement de carte)",
+ "zen.pricing.body":
+ "Utilisez avec n'importe quel agent. Fixez des limites de dépenses mensuelles. Annulez à tout moment.",
+ "zen.problem.title": "Quel problème Zen résout-il ?",
+ "zen.problem.body":
+ "Il existe de nombreux modèles disponibles, mais seuls quelques-uns fonctionnent bien avec les agents de code. La plupart des fournisseurs les configurent différemment avec des résultats variables.",
+ "zen.problem.subtitle":
+ "Nous résolvons ce problème pour tout le monde, pas seulement pour les utilisateurs de OpenCode.",
+ "zen.problem.item1": "Test des modèles sélectionnés et consultation de leurs équipes",
+ "zen.problem.item2": "Collaboration avec les fournisseurs pour garantir une livraison correcte",
+ "zen.problem.item3": "Benchmark de toutes les combinaisons modèle-fournisseur que nous recommandons",
+ "zen.how.title": "Comment fonctionne Zen",
+ "zen.how.body":
+ "Bien que nous vous suggérions d'utiliser Zen avec OpenCode, vous pouvez utiliser Zen avec n'importe quel agent.",
+ "zen.how.step1.title": "Inscrivez-vous et ajoutez un solde de 20 $",
+ "zen.how.step1.beforeLink": "suivez les",
+ "zen.how.step1.link": "instructions de configuration",
+ "zen.how.step2.title": "Utilisez Zen avec une tarification transparente",
+ "zen.how.step2.link": "payez par requête",
+ "zen.how.step2.afterLink": "sans marge",
+ "zen.how.step3.title": "Recharge automatique",
+ "zen.how.step3.body": "lorsque votre solde atteint 5 $, nous ajouterons automatiquement 20 $",
+ "zen.privacy.title": "Votre vie privée est importante pour nous",
+ "zen.privacy.beforeExceptions":
+ "Tous les modèles Zen sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
+ "zen.privacy.exceptionsLink": "exceptions suivantes",
+
+ "go.title": "OpenCode Go | Modèles de code à faible coût pour tous",
+ "go.meta.description":
+ "Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites de requêtes généreuses sur 5 heures pour GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash.",
+ "go.hero.title": "Modèles de code à faible coût pour tous",
+ "go.hero.body":
+ "Go apporte le codage agentique aux programmeurs du monde entier. Offrant des limites généreuses et un accès fiable aux modèles open source les plus capables, pour que vous puissiez construire avec des agents puissants sans vous soucier du coût ou de la disponibilité.",
+
+ "go.cta.start": "S'abonner à Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "S'abonner à Go",
+ "go.cta.price": "10 $/mois",
+ "go.cta.promo": "$5 le premier mois",
+ "go.pricing.body":
+ "Utilisez-le avec n'importe quel agent. $5 le premier mois, puis 10 $/mois. Rechargez du crédit si nécessaire. Annulez à tout moment.",
+ "go.graph.free": "Gratuit",
+ "go.graph.freePill": "Big Pickle et modèles gratuits",
+ "go.graph.go": "Go",
+ "go.graph.label": "Requêtes par tranche de 5 heures",
+ "go.graph.usageLimits": "Limites d'utilisation",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Requêtes par 5h : {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-PDG, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "a changé ma vie, c'est vraiment une évidence.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Fondateur, SEED, PM, Melt, Pop, Dapt, Cadmus, et ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 personnes sur 5 dans notre équipe adorent utiliser",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Je ne peux pas recommander",
+ "go.testimonials.adam.quoteAfter": "assez. Sérieusement, c'est vraiment bien.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Directeur du Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Avec",
+ "go.testimonials.david.quoteAfter": "je sais que tous les modèles sont testés et parfaits pour les agents de code.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Stagiaire, Nvidia (4 fois)",
+ "go.testimonials.frank.quote": "J'aimerais être encore chez Nvidia.",
+ "go.problem.title": "Quel problème Go résout-il ?",
+ "go.problem.body":
+ "Nous nous efforçons d'apporter l'expérience OpenCode au plus grand nombre. OpenCode Go est un abonnement à faible coût : $5 pour le premier mois, puis 10 $/mois. Il offre des limites généreuses et un accès fiable aux modèles open source les plus performants.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Prix d'abonnement bas",
+ "go.problem.item2": "Limites généreuses et accès fiable",
+ "go.problem.item3": "Conçu pour autant de programmeurs que possible",
+ "go.problem.item4":
+ "Inclut GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash",
+ "go.how.title": "Comment fonctionne Go",
+ "go.how.body":
+ "Go commence à $5 pour le premier mois, puis 10 $/mois. Vous pouvez l'utiliser avec OpenCode ou n'importe quel agent.",
+ "go.how.step1.title": "Créez un compte",
+ "go.how.step1.beforeLink": "suivez les",
+ "go.how.step1.link": "instructions de configuration",
+ "go.how.step2.title": "Abonnez-vous à Go",
+ "go.how.step2.link": "$5 le premier mois",
+ "go.how.step2.afterLink": "puis 10 $/mois avec des limites généreuses",
+ "go.how.step3.title": "Commencez à coder",
+ "go.how.step3.body": "avec un accès fiable aux modèles open source",
+ "go.privacy.title": "Votre vie privée est importante pour nous",
+ "go.privacy.body":
+ "Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable.",
+ "go.privacy.contactAfter": "si vous avez des questions.",
+ "go.privacy.beforeExceptions":
+ "Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
+ "go.privacy.exceptionsLink": "exceptions suivantes",
+ "go.faq.q1": "Qu'est-ce que OpenCode Go ?",
+ "go.faq.a1":
+ "Go est un abonnement à faible coût qui vous donne un accès fiable à des modèles open source performants pour le codage agentique.",
+ "go.faq.q2": "Quels modèles Go inclut-il ?",
+ "go.faq.a2": "Go inclut les modèles ci-dessous, avec des limites généreuses et un accès fiable.",
+ "go.faq.q3": "Est-ce que Go est la même chose que Zen ?",
+ "go.faq.a3":
+ "Non. Zen est un paiement à l'utilisation, tandis que Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites généreuses et un accès fiable aux modèles open source GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash.",
+ "go.faq.q4": "Combien coûte Go ?",
+ "go.faq.a4.p1.beforePricing": "Go coûte",
+ "go.faq.a4.p1.pricingLink": "$5 le premier mois",
+ "go.faq.a4.p1.afterPricing": "puis 10 $/mois avec des limites généreuses.",
+ "go.faq.a4.p2.beforeAccount": "Vous pouvez gérer votre abonnement dans votre",
+ "go.faq.a4.p2.accountLink": "compte",
+ "go.faq.a4.p3": "Annulez à tout moment.",
+ "go.faq.q5": "Et pour les données et la confidentialité ?",
+ "go.faq.a5.body":
+ "Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable. Nos fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles.",
+ "go.faq.a5.beforeExceptions":
+ "Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
+ "go.faq.a5.exceptionsLink": "exceptions suivantes",
+ "go.faq.q6": "Puis-je recharger mon crédit ?",
+ "go.faq.a6": "Si vous avez besoin de plus d'utilisation, vous pouvez recharger du crédit dans votre compte.",
+ "go.faq.q7": "Puis-je annuler ?",
+ "go.faq.a7": "Oui, vous pouvez annuler à tout moment.",
+ "go.faq.q8": "Puis-je utiliser Go avec d'autres agents de code ?",
+ "go.faq.a8":
+ "Oui, vous pouvez utiliser Go avec n'importe quel agent. Suivez les instructions de configuration dans votre agent de code préféré.",
+ "go.faq.q9": "Quelle est la différence entre les modèles gratuits et Go ?",
+ "go.faq.a9":
+ "Les modèles gratuits incluent Big Pickle ainsi que des modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go inclut GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash avec des quotas de requêtes plus élevés appliqués sur des fenêtres glissantes (5 heures, hebdomadaire et mensuelle), à peu près équivalent à 12 $ par 5 heures, 30 $ par semaine et 60 $ par mois (le nombre réel de requêtes varie selon le modèle et l'utilisation).",
+
+ "zen.api.error.rateLimitExceeded": "Limite de débit dépassée. Veuillez réessayer plus tard.",
+ "zen.api.error.modelNotSupported": "Modèle {{model}} non pris en charge",
+ "zen.api.error.modelFormatNotSupported": "Modèle {{model}} non pris en charge pour le format {{format}}",
+ "zen.api.error.noProviderAvailable": "Aucun fournisseur disponible",
+ "zen.api.error.providerNotSupported": "Fournisseur {{provider}} non pris en charge",
+ "zen.api.error.missingApiKey": "Clé API manquante.",
+ "zen.api.error.invalidApiKey": "Clé API invalide.",
+ "zen.api.error.subscriptionQuotaExceeded": "Quota d'abonnement dépassé. Réessayez dans {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Limite d'utilisation sur 5 heures atteinte. Réinitialisation dans {{retryIn}}. Pour continuer à utiliser ce modèle dès maintenant, activez l'utilisation depuis votre solde disponible : {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Limite d'utilisation hebdomadaire atteinte. Réinitialisation dans {{retryIn}}. Pour continuer à utiliser ce modèle dès maintenant, activez l'utilisation depuis votre solde disponible : {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Limite d'utilisation mensuelle atteinte. Réinitialisation dans {{retryIn}}. Pour continuer à utiliser ce modèle dès maintenant, activez l'utilisation depuis votre solde disponible : {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Aucune méthode de paiement. Ajoutez une méthode de paiement ici : {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Solde insuffisant. Gérez votre facturation ici : {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Votre espace de travail a atteint sa limite de dépense mensuelle de {{amount}} $. Gérez vos limites ici : {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Vous avez atteint votre limite de dépense mensuelle de {{amount}} $. Gérez vos limites ici : {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Le modèle est désactivé",
+ "zen.api.error.trialEnded":
+ "La promotion gratuite de {{model}} est terminée. Vous pouvez continuer à utiliser le modèle en vous abonnant à OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Accédez aux meilleurs modèles de code au monde",
+ "black.meta.description": "Accédez à Claude, GPT, Gemini et plus avec les forfaits d'abonnement OpenCode Black.",
+ "black.hero.title": "Accédez aux meilleurs modèles de code au monde",
+ "black.hero.subtitle": "Y compris Claude, GPT, Gemini et plus",
+ "black.title": "OpenCode Black | Tarification",
+ "black.paused": "L'inscription au plan Black est temporairement suspendue.",
+ "black.plan.icon20": "Forfait Black 20",
+ "black.plan.icon100": "Forfait Black 100",
+ "black.plan.icon200": "Forfait Black 200",
+ "black.plan.multiplier100": "5x plus d'utilisation que Black 20",
+ "black.plan.multiplier200": "20x plus d'utilisation que Black 20",
+ "black.price.perMonth": "par mois",
+ "black.price.perPersonBilledMonthly": "par personne facturé mensuellement",
+ "black.terms.1": "Votre abonnement ne commencera pas immédiatement",
+ "black.terms.2": "Vous serez ajouté à la liste d'attente et activé bientôt",
+ "black.terms.3": "Votre carte ne sera débitée que lorsque votre abonnement sera activé",
+ "black.terms.4":
+ "Des limites d'utilisation s'appliquent, une utilisation fortement automatisée peut atteindre les limites plus tôt",
+ "black.terms.5": "Les abonnements sont pour les individus, contactez Enterprise pour les équipes",
+ "black.terms.6": "Les limites peuvent être ajustées et les forfaits peuvent être interrompus à l'avenir",
+ "black.terms.7": "Annulez votre abonnement à tout moment",
+ "black.action.continue": "Continuer",
+ "black.finePrint.beforeTerms": "Les prix affichés n'incluent pas les taxes applicables",
+ "black.finePrint.terms": "Conditions d'utilisation",
+ "black.workspace.title": "OpenCode Black | Sélectionner un espace de travail",
+ "black.workspace.selectPlan": "Sélectionnez un espace de travail pour ce forfait",
+ "black.workspace.name": "Espace de travail {{n}}",
+ "black.subscribe.title": "S'abonner à OpenCode Black",
+ "black.subscribe.paymentMethod": "Méthode de paiement",
+ "black.subscribe.loadingPaymentForm": "Chargement du formulaire de paiement...",
+ "black.subscribe.selectWorkspaceToContinue": "Sélectionnez un espace de travail pour continuer",
+ "black.subscribe.failurePrefix": "Oh oh !",
+ "black.subscribe.error.generic": "Une erreur est survenue",
+ "black.subscribe.error.invalidPlan": "Forfait invalide",
+ "black.subscribe.error.workspaceRequired": "L'ID de l'espace de travail est requis",
+ "black.subscribe.error.alreadySubscribed": "Cet espace de travail a déjà un abonnement",
+ "black.subscribe.processing": "Traitement...",
+ "black.subscribe.submit": "S'abonner ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Vous ne serez débité que lorsque votre abonnement sera activé",
+ "black.subscribe.success.title": "Vous êtes sur la liste d'attente OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "Forfait d'abonnement",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Montant",
+ "black.subscribe.success.amountValue": "{{plan}} $ par mois",
+ "black.subscribe.success.paymentMethod": "Méthode de paiement",
+ "black.subscribe.success.dateJoined": "Date d'inscription",
+ "black.subscribe.success.chargeNotice": "Votre carte sera débitée lorsque votre abonnement sera activé",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Utilisation",
+ "workspace.nav.apiKeys": "Clés API",
+ "workspace.nav.members": "Membres",
+ "workspace.nav.billing": "Facturation",
+ "workspace.nav.settings": "Paramètres",
+
+ "workspace.home.banner.beforeLink": "Modèles optimisés fiables pour les agents de code.",
+ "workspace.lite.banner.beforeLink": "Modèles de code à faible coût pour tous.",
+ "workspace.home.billing.loading": "Chargement...",
+ "workspace.home.billing.enable": "Activer la facturation",
+ "workspace.home.billing.currentBalance": "Solde actuel",
+
+ "workspace.newUser.feature.tested.title": "Modèles testés et vérifiés",
+ "workspace.newUser.feature.tested.body":
+ "Nous avons benchmarké et testé des modèles spécifiquement pour les agents de code afin de garantir les meilleures performances.",
+ "workspace.newUser.feature.quality.title": "La plus haute qualité",
+ "workspace.newUser.feature.quality.body":
+ "Accédez à des modèles configurés pour des performances optimales - pas de rétrogradation ni de routage vers des fournisseurs moins chers.",
+ "workspace.newUser.feature.lockin.title": "Pas de verrouillage",
+ "workspace.newUser.feature.lockin.body":
+ "Utilisez Zen avec n'importe quel agent de code et continuez à utiliser d'autres fournisseurs avec OpenCode quand vous le souhaitez.",
+ "workspace.newUser.copyApiKey": "Copier la clé API",
+ "workspace.newUser.copyKey": "Copier la clé",
+ "workspace.newUser.copied": "Copié !",
+ "workspace.newUser.step.enableBilling": "Activer la facturation",
+ "workspace.newUser.step.login.before": "Exécuter",
+ "workspace.newUser.step.login.after": "et sélectionnez OpenCode",
+ "workspace.newUser.step.pasteKey": "Collez votre clé API",
+ "workspace.newUser.step.models.before": "Démarrez OpenCode et exécutez",
+ "workspace.newUser.step.models.after": "pour sélectionner un modèle",
+
+ "workspace.models.title": "Modèles",
+ "workspace.models.subtitle.beforeLink":
+ "Gérez les modèles auxquels les membres de l'espace de travail peuvent accéder.",
+ "workspace.models.table.model": "Modèle",
+ "workspace.models.table.enabled": "Activé",
+
+ "workspace.providers.title": "Apportez votre propre clé",
+ "workspace.providers.subtitle": "Configurez vos propres clés API auprès des fournisseurs d'IA.",
+ "workspace.providers.placeholder": "Entrez la clé API {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Configurer",
+ "workspace.providers.edit": "Modifier",
+ "workspace.providers.delete": "Supprimer",
+ "workspace.providers.saving": "Enregistrement...",
+ "workspace.providers.save": "Enregistrer",
+ "workspace.providers.table.provider": "Fournisseur",
+ "workspace.providers.table.apiKey": "Clé API",
+
+ "workspace.usage.title": "Historique d'utilisation",
+ "workspace.usage.subtitle": "Utilisation récente de l'API et coûts.",
+ "workspace.usage.empty": "Faites votre premier appel API pour commencer.",
+ "workspace.usage.table.date": "Date",
+ "workspace.usage.table.model": "Modèle",
+ "workspace.usage.table.input": "Entrée",
+ "workspace.usage.table.output": "Sortie",
+ "workspace.usage.table.cost": "Coût",
+ "workspace.usage.table.session": "Session",
+ "workspace.usage.breakdown.input": "Entrée",
+ "workspace.usage.breakdown.cacheRead": "Lecture cache",
+ "workspace.usage.breakdown.cacheWrite": "Écriture cache",
+ "workspace.usage.breakdown.output": "Sortie",
+ "workspace.usage.breakdown.reasoning": "Raisonnement",
+ "workspace.usage.subscription": "Black ({{amount}} $)",
+ "workspace.usage.lite": "Go ({{amount}} $)",
+ "workspace.usage.byok": "BYOK ({{amount}} $)",
+
+ "workspace.cost.title": "Coût",
+ "workspace.cost.subtitle": "Coûts d'utilisation répartis par modèle.",
+ "workspace.cost.allModels": "Tous les modèles",
+ "workspace.cost.allKeys": "Toutes les clés",
+ "workspace.cost.deletedSuffix": "(supprimé)",
+ "workspace.cost.empty": "Aucune donnée d'utilisation disponible pour la période sélectionnée.",
+ "workspace.cost.subscriptionShort": "abo",
+
+ "workspace.keys.title": "Clés API",
+ "workspace.keys.subtitle": "Gérez vos clés API pour accéder aux services OpenCode.",
+ "workspace.keys.create": "Créer une clé API",
+ "workspace.keys.placeholder": "Entrez le nom de la clé",
+ "workspace.keys.empty": "Créer une clé API OpenCode Gateway",
+ "workspace.keys.table.name": "Nom",
+ "workspace.keys.table.key": "Clé",
+ "workspace.keys.table.createdBy": "Créé par",
+ "workspace.keys.table.lastUsed": "Dernière utilisation",
+ "workspace.keys.copyApiKey": "Copier la clé API",
+ "workspace.keys.delete": "Supprimer",
+
+ "workspace.members.title": "Membres",
+ "workspace.members.subtitle": "Gérez les membres de l'espace de travail et leurs autorisations.",
+ "workspace.members.invite": "Inviter un membre",
+ "workspace.members.inviting": "Invitation en cours...",
+ "workspace.members.beta.beforeLink": "Les espaces de travail sont gratuits pour les équipes pendant la version bêta.",
+ "workspace.members.form.invitee": "Invité",
+ "workspace.members.form.emailPlaceholder": "Entrez l'e-mail",
+ "workspace.members.form.role": "Rôle",
+ "workspace.members.form.monthlyLimit": "Limite de dépense mensuelle",
+ "workspace.members.noLimit": "Aucune limite",
+ "workspace.members.noLimitLowercase": "pas de limite",
+ "workspace.members.invited": "invité",
+ "workspace.members.edit": "Modifier",
+ "workspace.members.delete": "Supprimer",
+ "workspace.members.saving": "Enregistrement...",
+ "workspace.members.save": "Enregistrer",
+ "workspace.members.table.email": "E-mail",
+ "workspace.members.table.role": "Rôle",
+ "workspace.members.table.monthLimit": "Limite mensuelle",
+ "workspace.members.role.admin": "Administrateur",
+ "workspace.members.role.adminDescription": "Peut gérer les modèles, les membres et la facturation",
+ "workspace.members.role.member": "Membre",
+ "workspace.members.role.memberDescription": "Ne peut générer que des clés API pour lui-même",
+
+ "workspace.settings.title": "Paramètres",
+ "workspace.settings.subtitle": "Mettez à jour le nom et les préférences de votre espace de travail.",
+ "workspace.settings.workspaceName": "Nom de l'espace de travail",
+ "workspace.settings.defaultName": "Défaut",
+ "workspace.settings.updating": "Mise à jour...",
+ "workspace.settings.save": "Enregistrer",
+ "workspace.settings.edit": "Modifier",
+
+ "workspace.billing.title": "Facturation",
+ "workspace.billing.subtitle.beforeLink": "Gérer les méthodes de paiement.",
+ "workspace.billing.contactUs": "Contactez-nous",
+ "workspace.billing.subtitle.afterLink": "si vous avez des questions.",
+ "workspace.billing.currentBalance": "Solde actuel",
+ "workspace.billing.add": "Ajouter $",
+ "workspace.billing.enterAmount": "Saisir le montant",
+ "workspace.billing.loading": "Chargement...",
+ "workspace.billing.addAction": "Ajouter",
+ "workspace.billing.addBalance": "Ajouter un solde",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Lié à Stripe",
+ "workspace.billing.manage": "Gérer",
+ "workspace.billing.enable": "Activer la facturation",
+
+ "workspace.monthlyLimit.title": "Limite mensuelle",
+ "workspace.monthlyLimit.subtitle": "Définissez une limite d'utilisation mensuelle pour votre compte.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Définition...",
+ "workspace.monthlyLimit.set": "Défini",
+ "workspace.monthlyLimit.edit": "Modifier la limite",
+ "workspace.monthlyLimit.noLimit": "Aucune limite d'utilisation définie.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "L'utilisation actuelle pour",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "est de",
+
+ "workspace.redeem.title": "Utiliser un coupon",
+ "workspace.redeem.subtitle": "Utilisez un code promo pour obtenir du crédit ou des avantages.",
+ "workspace.redeem.placeholder": "Saisissez le code promo",
+ "workspace.redeem.redeem": "Utiliser",
+ "workspace.redeem.redeeming": "Utilisation...",
+ "workspace.redeem.success": "Coupon utilisé avec succès.",
+
+ "workspace.reload.title": "Rechargement automatique",
+ "workspace.reload.disabled.before": "Le rechargement automatique est",
+ "workspace.reload.disabled.state": "désactivé",
+ "workspace.reload.disabled.after": "Activer le rechargement automatique lorsque le solde est faible.",
+ "workspace.reload.enabled.before": "Le rechargement automatique est",
+ "workspace.reload.enabled.state": "activé",
+ "workspace.reload.enabled.middle": "Nous rechargerons",
+ "workspace.reload.processingFee": "frais de traitement",
+ "workspace.reload.enabled.after": "quand le solde atteint",
+ "workspace.reload.edit": "Modifier",
+ "workspace.reload.enable": "Activer",
+ "workspace.reload.enableAutoReload": "Activer le rechargement automatique",
+ "workspace.reload.reloadAmount": "Recharger $",
+ "workspace.reload.whenBalanceReaches": "Lorsque le solde atteint $",
+ "workspace.reload.saving": "Enregistrement...",
+ "workspace.reload.save": "Enregistrer",
+ "workspace.reload.failedAt": "Le rechargement a échoué à",
+ "workspace.reload.reason": "Raison :",
+ "workspace.reload.updatePaymentMethod": "Veuillez mettre à jour votre méthode de paiement et réessayer.",
+ "workspace.reload.retrying": "Nouvelle tentative...",
+ "workspace.reload.retry": "Réessayer",
+ "workspace.reload.error.paymentFailed": "Échec du paiement.",
+
+ "workspace.payments.title": "Historique des paiements",
+ "workspace.payments.subtitle": "Transactions de paiement récentes.",
+ "workspace.payments.table.date": "Date",
+ "workspace.payments.table.paymentId": "ID de paiement",
+ "workspace.payments.table.amount": "Montant",
+ "workspace.payments.table.receipt": "Reçu",
+ "workspace.payments.type.credit": "crédit",
+ "workspace.payments.type.subscription": "abonnement",
+ "workspace.payments.view": "Voir",
+
+ "workspace.black.loading": "Chargement...",
+ "workspace.black.time.day": "jour",
+ "workspace.black.time.days": "jours",
+ "workspace.black.time.hour": "heure",
+ "workspace.black.time.hours": "heures",
+ "workspace.black.time.minute": "minute",
+ "workspace.black.time.minutes": "minutes",
+ "workspace.black.time.fewSeconds": "quelques secondes",
+ "workspace.black.subscription.title": "Abonnement",
+ "workspace.black.subscription.message": "Vous êtes abonné à OpenCode Black pour {{plan}} $ par mois.",
+ "workspace.black.subscription.manage": "Gérer l'abonnement",
+ "workspace.black.subscription.rollingUsage": "Utilisation 5 heures",
+ "workspace.black.subscription.weeklyUsage": "Utilisation hebdomadaire",
+ "workspace.black.subscription.resetsIn": "Réinitialisation dans",
+ "workspace.black.subscription.useBalance":
+ "Utilisez votre solde disponible après avoir atteint les limites d'utilisation",
+ "workspace.black.waitlist.title": "Liste d'attente",
+ "workspace.black.waitlist.joined":
+ "Vous êtes sur la liste d'attente pour le forfait OpenCode Black à {{plan}} $ par mois.",
+ "workspace.black.waitlist.ready":
+ "Nous sommes prêts à vous inscrire au forfait OpenCode Black à {{plan}} $ par mois.",
+ "workspace.black.waitlist.leave": "Quitter la liste d'attente",
+ "workspace.black.waitlist.leaving": "Sortie...",
+ "workspace.black.waitlist.left": "Quitté",
+ "workspace.black.waitlist.enroll": "S'inscrire",
+ "workspace.black.waitlist.enrolling": "Inscription...",
+ "workspace.black.waitlist.enrolled": "Inscrit",
+ "workspace.black.waitlist.enrollNote":
+ "Lorsque vous cliquez sur S'inscrire, votre abonnement démarre immédiatement et votre carte sera débitée.",
+
+ "workspace.lite.loading": "Chargement...",
+ "workspace.lite.time.day": "jour",
+ "workspace.lite.time.days": "jours",
+ "workspace.lite.time.hour": "heure",
+ "workspace.lite.time.hours": "heures",
+ "workspace.lite.time.minute": "minute",
+ "workspace.lite.time.minutes": "minutes",
+ "workspace.lite.time.fewSeconds": "quelques secondes",
+ "workspace.lite.subscription.message": "Vous êtes abonné à OpenCode Go.",
+ "workspace.lite.subscription.manage": "Gérer l'abonnement",
+ "workspace.lite.subscription.rollingUsage": "Utilisation glissante",
+ "workspace.lite.subscription.weeklyUsage": "Utilisation hebdomadaire",
+ "workspace.lite.subscription.monthlyUsage": "Utilisation mensuelle",
+ "workspace.lite.subscription.resetsIn": "Réinitialisation dans",
+ "workspace.lite.subscription.useBalance":
+ "Utilisez votre solde disponible après avoir atteint les limites d'utilisation",
+ "workspace.lite.subscription.selectProvider":
+ 'Sélectionnez "OpenCode Go" comme fournisseur dans votre configuration opencode pour utiliser les modèles Go.',
+ "workspace.lite.black.message":
+ "Vous êtes actuellement abonné à OpenCode Black ou sur liste d'attente. Veuillez d'abord vous désabonner si vous souhaitez passer à Go.",
+ "workspace.lite.other.message":
+ "Un autre membre de cet espace de travail est déjà abonné à OpenCode Go. Un seul membre par espace de travail peut s'abonner.",
+ "workspace.lite.promo.description":
+ "OpenCode Go commence à {{price}}, puis 10 $/mois, et offre un accès fiable aux modèles de code ouverts populaires avec des limites d'utilisation généreuses.",
+ "workspace.lite.promo.price": "$5 le premier mois",
+ "workspace.lite.promo.modelsTitle": "Ce qui est inclus",
+ "workspace.lite.promo.footer":
+ "Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable. Les tarifs et les limites d'utilisation peuvent changer à mesure que nous apprenons des premières utilisations et des commentaires.",
+ "workspace.lite.promo.subscribe": "S'abonner à Go",
+ "workspace.lite.promo.subscribing": "Redirection...",
+ "workspace.lite.promo.otherMethods": "Autres méthodes de paiement",
+ "workspace.lite.promo.selectMethod": "Sélectionner la méthode de paiement",
+
+ "workspace.referral.copyLink": "Copier le lien",
+ "workspace.referral.copied": "Copié",
+ "workspace.referral.overview.title": "Inviter des amis",
+ "workspace.referral.overview.subtitle": "Gagnez $5 lorsqu'un ami s'abonne. Il recevra également $5.",
+ "workspace.referral.instructions.share": "Partagez votre lien de parrainage",
+ "workspace.referral.instructions.subscribe": "Votre ami rejoint et s'abonne à Go",
+ "workspace.referral.instructions.claim":
+ "Vous recevez tous les deux un crédit d'utilisation de $5 à appliquer à vos limites d'utilisation Go",
+ "workspace.referral.rewards.title": "Récompenses de parrainage",
+ "workspace.referral.rewards.description":
+ "Utilisez les crédits de parrainage disponibles pour votre utilisation de Go.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} récompenses utilisées.",
+ "workspace.referral.rewards.empty": "Aucune récompense de parrainage pour l'instant.",
+ "workspace.referral.table.reward": "Récompense",
+ "workspace.referral.table.referral": "Description",
+ "workspace.referral.table.date": "Date",
+ "workspace.referral.reward.description.inviter": "Vous avez invité {{email}}",
+ "workspace.referral.reward.description.invitee": "Invité par {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Abonnez-vous pour débloquer",
+ "workspace.referral.reward.action.view": "Voir la récompense",
+ "workspace.referral.reward.action.applied": "Récompense utilisée",
+ "workspace.referral.reward.source.pendingInviter": "En attente de son abonnement",
+ "workspace.referral.reward.source.pendingInvitee": "Abonnez-vous pour débloquer la récompense",
+ "workspace.referral.reward.source.available": "Récompense prête à utiliser",
+ "workspace.referral.reward.source.applied": "Récompense utilisée",
+ "workspace.referral.reward.status.applied": "Récompense utilisée",
+ "workspace.referral.reward.status.pendingInviter": "Abonnez-vous pour débloquer",
+ "workspace.referral.reward.status.pendingInvitee": "Abonnez-vous pour débloquer",
+ "workspace.referral.apply.noGo": "Abonnez-vous pour débloquer",
+ "workspace.referral.apply.preview": "Voir la récompense",
+ "workspace.referral.apply.action": "Utiliser",
+ "workspace.referral.apply.confirmTitle": "Utiliser la récompense",
+ "workspace.referral.apply.confirmBody": "Utilisez {{amount}} pour réduire l'utilisation actuelle de ce workspace.",
+ "workspace.referral.apply.confirmAction": "Utiliser",
+
+ "download.title": "OpenCode | Téléchargement",
+ "download.meta.description": "Téléchargez OpenCode pour macOS, Windows et Linux",
+ "download.hero.title": "Télécharger OpenCode",
+ "download.hero.subtitle": "Disponible en bêta pour macOS, Windows et Linux",
+ "download.hero.button": "Télécharger pour {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Bêta)",
+ "download.section.extensions": "Extensions OpenCode",
+ "download.section.integrations": "Intégrations OpenCode",
+ "download.action.download": "Télécharger",
+ "download.action.install": "Installer",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Pas forcément, mais probablement. Vous aurez besoin d'un abonnement IA si vous voulez connecter OpenCode à un fournisseur payant, mais vous pouvez travailler avec des",
+ "download.faq.a3.localLink": "modèles locaux",
+ "download.faq.a3.afterLocal.beforeZen": "gratuitement. Même si nous encourageons les utilisateurs à utiliser",
+ "download.faq.a3.afterZen":
+ ", OpenCode fonctionne avec tous les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
+
+ "download.faq.a5.p1": "OpenCode est 100% gratuit à utiliser.",
+ "download.faq.a5.p2.beforeZen":
+ "Les coûts supplémentaires viendront de votre abonnement à un fournisseur de modèle. Même si OpenCode fonctionne avec n'importe quel fournisseur, nous recommandons d'utiliser",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1":
+ "Vos données et informations ne sont stockées que lorsque vous créez des liens partageables dans OpenCode.",
+ "download.faq.a6.p2.beforeShare": "En savoir plus sur",
+ "download.faq.a6.shareLink": "les pages de partage",
+
+ "enterprise.title": "OpenCode | Solutions entreprise pour votre organisation",
+ "enterprise.meta.description": "Contactez OpenCode pour des solutions entreprise",
+ "enterprise.hero.title": "Votre code vous appartient",
+ "enterprise.hero.body1":
+ "OpenCode fonctionne de manière sécurisée au sein de votre organisation, sans stocker de données ni de contexte, et sans restrictions de licence ni revendications de propriété. Démarrez un essai avec votre équipe, puis déployez-le dans votre organisation en l'intégrant à votre SSO et à votre passerelle IA interne.",
+ "enterprise.hero.body2": "Dites-nous comment nous pouvons vous aider.",
+ "enterprise.form.name.label": "Nom complet",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Poste",
+ "enterprise.form.role.placeholder": "Président exécutif",
+ "enterprise.form.company.label": "Entreprise",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "E-mail professionnel",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Téléphone",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Quel problème essayez-vous de résoudre ?",
+ "enterprise.form.message.placeholder": "Nous avons besoin d'aide pour...",
+ "enterprise.form.send": "Envoyer",
+ "enterprise.form.sending": "Envoi...",
+ "enterprise.form.success": "Message envoyé, nous vous contacterons bientôt.",
+ "enterprise.form.success.submitted": "Formulaire soumis avec succès.",
+ "enterprise.form.error.allFieldsRequired": "Tous les champs sont requis.",
+ "enterprise.form.error.invalidEmailFormat": "Format d'e-mail invalide.",
+ "enterprise.form.error.internalServer": "Erreur interne du serveur.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Qu'est-ce que OpenCode Enterprise ?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise s'adresse aux organisations qui veulent s'assurer que leur code et leurs données ne quittent jamais leur infrastructure. Cela est possible grâce à une configuration centralisée qui s'intègre à votre SSO et à votre passerelle IA interne.",
+ "enterprise.faq.q2": "Comment démarrer avec OpenCode Enterprise ?",
+ "enterprise.faq.a2":
+ "Commencez simplement par un essai interne avec votre équipe. Par défaut, OpenCode ne stocke pas votre code ni vos données de contexte, ce qui facilite la prise en main. Ensuite, contactez-nous pour discuter des tarifs et des options de mise en œuvre.",
+ "enterprise.faq.q3": "Comment fonctionne la tarification entreprise ?",
+ "enterprise.faq.a3":
+ "Nous proposons une tarification entreprise par siège. Si vous avez votre propre passerelle LLM, nous ne facturons pas les tokens utilisés. Pour plus de détails, contactez-nous pour un devis sur mesure en fonction des besoins de votre organisation.",
+ "enterprise.faq.q4": "Mes données sont-elles sécurisées avec OpenCode Enterprise ?",
+ "enterprise.faq.a4":
+ "Oui. OpenCode ne stocke pas votre code ni vos données de contexte. Tout le traitement se fait localement ou via des appels API directs vers votre fournisseur d'IA. Avec une configuration centralisée et une intégration SSO, vos données restent sécurisées au sein de l'infrastructure de votre organisation.",
+
+ "brand.title": "OpenCode | Marque",
+ "brand.meta.description": "Guide de marque OpenCode",
+ "brand.heading": "Guide de marque",
+ "brand.subtitle": "Ressources et éléments pour vous aider à travailler avec la marque OpenCode.",
+ "brand.downloadAll": "Télécharger tous les assets",
+
+ "changelog.title": "OpenCode | Changelog",
+ "changelog.meta.description": "Notes de version et changelog d'OpenCode",
+ "changelog.hero.title": "Changelog",
+ "changelog.hero.subtitle": "Nouvelles mises à jour et améliorations pour OpenCode",
+ "changelog.empty": "Aucune entrée de changelog trouvée.",
+ "changelog.viewJson": "Voir le JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agent",
+ "bench.list.table.model": "Modèle",
+ "bench.list.table.score": "Score",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Tâche introuvable",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "Agent",
+ "bench.detail.labels.model": "Modèle",
+ "bench.detail.labels.task": "Tâche",
+ "bench.detail.labels.repo": "Dépôt",
+ "bench.detail.labels.from": "De",
+ "bench.detail.labels.to": "À",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Durée moyenne",
+ "bench.detail.labels.averageScore": "Score moyen",
+ "bench.detail.labels.averageCost": "Coût moyen",
+ "bench.detail.labels.summary": "Résumé",
+ "bench.detail.labels.runs": "Exécutions",
+ "bench.detail.labels.score": "Score",
+ "bench.detail.labels.base": "Base",
+ "bench.detail.labels.penalty": "Pénalité",
+ "bench.detail.labels.weight": "poids",
+ "bench.detail.table.run": "Exécution",
+ "bench.detail.table.score": "Score (Base - Pénalité)",
+ "bench.detail.table.cost": "Coût",
+ "bench.detail.table.duration": "Durée",
+ "bench.detail.run.title": "Exécution {{n}}",
+ "bench.detail.rawJson": "JSON brut",
+ "bench.submission.error.allFieldsRequired": "Tous les champs sont requis.",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/index.ts b/packages/console/app/src/i18n/index.ts
new file mode 100644
index 0000000..a855ccf
--- /dev/null
+++ b/packages/console/app/src/i18n/index.ts
@@ -0,0 +1,45 @@
+import type { Locale } from "~/lib/language"
+import { dict as en } from "~/i18n/en"
+import { dict as zh } from "~/i18n/zh"
+import { dict as zht } from "~/i18n/zht"
+import { dict as ko } from "~/i18n/ko"
+import { dict as de } from "~/i18n/de"
+import { dict as es } from "~/i18n/es"
+import { dict as fr } from "~/i18n/fr"
+import { dict as it } from "~/i18n/it"
+import { dict as da } from "~/i18n/da"
+import { dict as ja } from "~/i18n/ja"
+import { dict as pl } from "~/i18n/pl"
+import { dict as ru } from "~/i18n/ru"
+import { dict as uk } from "~/i18n/uk"
+import { dict as ar } from "~/i18n/ar"
+import { dict as no } from "~/i18n/no"
+import { dict as br } from "~/i18n/br"
+import { dict as th } from "~/i18n/th"
+import { dict as tr } from "~/i18n/tr"
+
+export type Key = keyof typeof en
+export type Dict = Record
+
+const base = en satisfies Dict
+
+export function i18n(locale: Locale): Dict {
+ if (locale === "en") return base
+ if (locale === "zh") return { ...base, ...zh }
+ if (locale === "zht") return { ...base, ...zht }
+ if (locale === "ko") return { ...base, ...ko }
+ if (locale === "de") return { ...base, ...de }
+ if (locale === "es") return { ...base, ...es }
+ if (locale === "fr") return { ...base, ...fr }
+ if (locale === "it") return { ...base, ...it }
+ if (locale === "da") return { ...base, ...da }
+ if (locale === "ja") return { ...base, ...ja }
+ if (locale === "pl") return { ...base, ...pl }
+ if (locale === "ru") return { ...base, ...ru }
+ if (locale === "uk") return { ...base, ...uk }
+ if (locale === "ar") return { ...base, ...ar }
+ if (locale === "no") return { ...base, ...no }
+ if (locale === "br") return { ...base, ...br }
+ if (locale === "th") return { ...base, ...th }
+ return { ...base, ...tr }
+}
diff --git a/packages/console/app/src/i18n/it.ts b/packages/console/app/src/i18n/it.ts
new file mode 100644
index 0000000..7d45ab7
--- /dev/null
+++ b/packages/console/app/src/i18n/it.ts
@@ -0,0 +1,823 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Documentazione",
+ "nav.changelog": "Changelog",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Accedi",
+ "nav.free": "Scarica",
+ "nav.home": "Home",
+ "nav.openMenu": "Apri menu",
+ "nav.getStartedFree": "Inizia gratis",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Copia il logo come SVG",
+ "nav.context.copyWordmark": "Copia il wordmark come SVG",
+ "nav.context.brandAssets": "Asset del brand",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Documentazione",
+ "footer.changelog": "Changelog",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Brand",
+ "legal.privacy": "Privacy",
+ "legal.terms": "Termini",
+
+ "email.title": "Sii il primo a sapere quando rilasciamo nuovi prodotti",
+ "email.subtitle": "Iscriviti alla waitlist per l'accesso anticipato.",
+ "email.placeholder": "Indirizzo email",
+ "email.subscribe": "Iscriviti",
+ "email.success": "Quasi fatto, controlla la posta in arrivo e conferma il tuo indirizzo email",
+
+ "notFound.title": "Non trovato | opencode",
+ "notFound.heading": "404 - Pagina non trovata",
+ "notFound.home": "Home",
+ "notFound.docs": "Documentazione",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "logo chiaro di opencode",
+ "notFound.logoDarkAlt": "logo scuro di opencode",
+
+ "user.logout": "Esci",
+
+ "auth.callback.error.codeMissing": "Nessun codice di autorizzazione trovato.",
+
+ "workspace.select": "Seleziona workspace",
+ "workspace.createNew": "+ Crea nuovo workspace",
+ "workspace.modal.title": "Crea nuovo workspace",
+ "workspace.modal.placeholder": "Inserisci il nome del workspace",
+
+ "common.cancel": "Annulla",
+ "common.creating": "Creazione...",
+ "common.create": "Crea",
+
+ "common.videoUnsupported": "Il tuo browser non supporta il tag video.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Scopri di più",
+
+ "error.invalidPlan": "Piano non valido",
+ "error.workspaceRequired": "ID Workspace richiesto",
+ "error.alreadySubscribed": "Questo workspace ha già un abbonamento",
+ "error.limitRequired": "Il limite è richiesto.",
+ "error.monthlyLimitInvalid": "Imposta un limite mensile valido.",
+ "error.workspaceNameRequired": "Il nome del workspace è richiesto.",
+ "error.nameTooLong": "Il nome deve essere di 255 caratteri o meno.",
+ "error.emailRequired": "L'email è richiesta",
+ "error.roleRequired": "Il ruolo è richiesto",
+ "error.idRequired": "L'ID è richiesto",
+ "error.nameRequired": "Il nome è richiesto",
+ "error.providerRequired": "Il provider è richiesto",
+ "error.apiKeyRequired": "La chiave API è richiesta",
+ "error.modelRequired": "Il modello è richiesto",
+ "error.reloadAmountMin": "L'importo della ricarica deve essere almeno ${{amount}}",
+ "error.reloadTriggerMin": "La soglia del saldo deve essere almeno ${{amount}}",
+
+ "app.meta.description": "OpenCode - L'agente di programmazione open source.",
+
+ "home.title": "OpenCode | L'agente di coding IA open source",
+
+ "temp.title": "opencode | Agente di coding IA costruito per il terminale",
+ "temp.hero.title": "L'agente di coding IA costruito per il terminale",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Inizia",
+ "temp.feature.native.title": "TUI Nativa",
+ "temp.feature.native.body": "Un'interfaccia terminale reattiva, nativa e personalizzabile",
+ "temp.feature.zen.beforeLink": "Una",
+ "temp.feature.zen.link": "lista curata di modelli",
+ "temp.feature.zen.afterLink": "fornita da opencode",
+ "temp.feature.models.beforeLink": "Supporta 75+ provider LLM tramite",
+ "temp.feature.models.afterLink": ", inclusi modelli locali",
+ "temp.screenshot.caption": "OpenCode TUI con il tema tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI con tema tokyonight",
+ "temp.logoLightAlt": "logo chiaro di opencode",
+ "temp.logoDarkAlt": "logo scuro di opencode",
+
+ "home.banner.badge": "Nuovo",
+ "home.banner.text": "App desktop disponibile in beta",
+ "home.banner.platforms": "su macOS, Windows e Linux",
+ "home.banner.downloadNow": "Scarica ora",
+ "home.banner.downloadBetaNow": "Scarica ora la beta desktop",
+
+ "home.hero.title": "L'agente di coding IA open source",
+ "home.hero.subtitle.a": "Modelli gratuiti inclusi o collega qualsiasi modello da qualsiasi provider,",
+ "home.hero.subtitle.b": "inclusi Claude, GPT, Gemini e altri.",
+
+ "home.install.ariaLabel": "Opzioni di installazione",
+
+ "home.what.title": "Che cos'è OpenCode?",
+ "home.what.body": "OpenCode è un agente open source che ti aiuta a scrivere codice nel terminale, IDE o desktop.",
+ "home.what.lsp.title": "LSP abilitato",
+ "home.what.lsp.body": "Carica automaticamente gli LSP giusti per il LLM",
+ "home.what.multiSession.title": "Multi-session",
+ "home.what.multiSession.body": "Avvia più agenti in parallelo sullo stesso progetto",
+ "home.what.shareLinks.title": "Link condivisi",
+ "home.what.shareLinks.body": "Condividi un link a qualsiasi sessione per riferimento o debug",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Accedi con GitHub per usare il tuo account Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Accedi con OpenAI per usare il tuo account ChatGPT Plus o Pro",
+ "home.what.anyModel.title": "Qualsiasi modello",
+ "home.what.anyModel.body": "75+ provider LLM tramite Models.dev, inclusi modelli locali",
+ "home.what.anyEditor.title": "Qualsiasi editor",
+ "home.what.anyEditor.body": "Disponibile come interfaccia terminale, app desktop ed estensione IDE",
+ "home.what.readDocs": "Leggi la doc",
+
+ "home.growth.title": "L'agente di coding IA open source",
+ "home.growth.body":
+ "Con oltre {{stars}} stelle su GitHub, {{contributors}} contributori e oltre {{commits}} commit, OpenCode è usato e apprezzato da oltre {{monthlyUsers}} sviluppatori ogni mese.",
+ "home.growth.githubStars": "Stelle GitHub",
+ "home.growth.contributors": "Contributori",
+ "home.growth.monthlyDevs": "Devs mensili",
+
+ "home.privacy.title": "Progettato per la privacy",
+ "home.privacy.body":
+ "OpenCode non archivia il tuo codice né i dati di contesto, così può operare in ambienti sensibili alla privacy.",
+ "home.privacy.learnMore": "Scopri di più su",
+ "home.privacy.link": "privacy",
+
+ "home.faq.q1": "Che cos'è OpenCode?",
+ "home.faq.a1":
+ "OpenCode è un agente open source che ti aiuta a scrivere ed eseguire codice con qualsiasi modello di IA. È disponibile come interfaccia terminale, app desktop o estensione IDE.",
+ "home.faq.q2": "Come uso OpenCode?",
+ "home.faq.a2.before": "Il modo più semplice per iniziare è leggere l'",
+ "home.faq.a2.link": "introduzione",
+ "home.faq.q3": "Mi servono abbonamenti IA extra per usare OpenCode?",
+ "home.faq.a3.p1":
+ "Non necessariamente: OpenCode include un set di modelli gratuiti che puoi usare senza creare un account.",
+ "home.faq.a3.p2.beforeZen": "Inoltre, puoi usare modelli popolari per il coding creando un account",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Anche se incoraggiamo gli utenti a usare Zen, OpenCode funziona anche con i provider più diffusi come OpenAI, Anthropic, xAI, ecc.",
+ "home.faq.a3.p4.beforeLocal": "Puoi anche collegare i tuoi",
+ "home.faq.a3.p4.localLink": "modelli locali",
+ "home.faq.q4": "Posso usare i miei abbonamenti IA esistenti con OpenCode?",
+ "home.faq.a4.p1":
+ "Sì, OpenCode supporta gli abbonamenti dei principali provider. Puoi usare Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
+ "home.faq.q5": "Posso usare OpenCode solo nel terminale?",
+ "home.faq.a5.beforeDesktop": "Non più! OpenCode ora è disponibile come app per",
+ "home.faq.a5.desktop": "desktop",
+ "home.faq.a5.and": "e",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "Quanto costa OpenCode?",
+ "home.faq.a6":
+ "OpenCode è gratuito al 100%. Include anche un set di modelli gratuiti. Potrebbero esserci costi aggiuntivi se colleghi altri provider.",
+ "home.faq.q7": "E per quanto riguarda dati e privacy?",
+ "home.faq.a7.p1":
+ "I tuoi dati vengono archiviati solo quando usi i nostri modelli gratuiti o crei link condivisibili.",
+ "home.faq.a7.p2.beforeModels": "Scopri di più su",
+ "home.faq.a7.p2.modelsLink": "i nostri modelli",
+ "home.faq.a7.p2.and": "e",
+ "home.faq.a7.p2.shareLink": "le pagine di condivisione",
+ "home.faq.q8": "OpenCode è open source?",
+ "home.faq.a8.p1": "Sì, OpenCode è completamente open source. Il codice sorgente è pubblico su",
+ "home.faq.a8.p2": "sotto la",
+ "home.faq.a8.mitLicense": "Licenza MIT",
+ "home.faq.a8.p3":
+ ", il che significa che chiunque può usarlo, modificarlo o contribuire al suo sviluppo. Chiunque nella comunità può aprire issue, inviare pull request ed estendere le funzionalità.",
+
+ "home.zenCta.title": "Accedi a modelli affidabili e ottimizzati per agenti di coding",
+ "home.zenCta.body":
+ "Zen ti dà accesso a una selezione di modelli di IA che OpenCode ha testato e benchmarkato specificamente per agenti di coding. Niente più preoccupazioni per prestazioni e qualità incoerenti tra provider: usa modelli validati che funzionano.",
+ "home.zenCta.link": "Scopri Zen",
+
+ "zen.title": "OpenCode Zen | Una selezione curata di modelli affidabili e ottimizzati per agenti di coding",
+ "zen.hero.title": "Accedi a modelli affidabili e ottimizzati per agenti di coding",
+ "zen.hero.body":
+ "Zen ti dà accesso a una selezione di modelli di IA che OpenCode ha testato e benchmarkato specificamente per agenti di coding. Niente più preoccupazioni per prestazioni e qualità incoerenti tra provider: usa modelli validati che funzionano.",
+
+ "zen.faq.q1": "Cos'è OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen è un set curato di modelli di IA testati e benchmarkati per agenti di coding, creato dal team dietro OpenCode.",
+ "zen.faq.q2": "Cosa rende Zen più accurato?",
+ "zen.faq.a2":
+ "Zen offre solo modelli testati e benchmarkati specificamente per agenti di coding. Non useresti un coltello da burro per tagliare una bistecca; non usare modelli scarsi per programmare.",
+ "zen.faq.q3": "Zen è più economico?",
+ "zen.faq.a3":
+ "Zen non è a scopo di lucro. Zen ribalta i costi dei provider di modelli direttamente su di te. Più Zen viene usato, più OpenCode può negoziare tariffe migliori e passarle a te.",
+ "zen.faq.q4": "Quanto costa Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "addebita per richiesta",
+ "zen.faq.a4.p1.afterPricing": "senza ricarichi, quindi paghi esattamente ciò che addebita il provider del modello.",
+ "zen.faq.a4.p2.beforeAccount": "Il costo totale dipende dall'uso e puoi impostare limiti di spesa mensili nel tuo",
+ "zen.faq.a4.p2.accountLink": "account",
+ "zen.faq.a4.p3":
+ "Per coprire i costi, OpenCode aggiunge solo una piccola commissione di elaborazione del pagamento di $1.23 per ogni ricarica di saldo da $20.",
+ "zen.faq.q5": "E per quanto riguarda dati e privacy?",
+ "zen.faq.a5.beforeExceptions":
+ "Tutti i modelli Zen sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
+ "zen.faq.a5.exceptionsLink": "seguenti eccezioni",
+ "zen.faq.q6": "Posso impostare limiti di spesa?",
+ "zen.faq.a6": "Sì, puoi impostare limiti di spesa mensuali nel tuo account.",
+ "zen.faq.q7": "Posso annullare?",
+ "zen.faq.a7": "Sì, puoi disattivare la fatturazione in qualsiasi momento e usare il saldo rimanente.",
+ "zen.faq.q8": "Posso usare Zen con altri agenti di coding?",
+ "zen.faq.a8":
+ "Anche se Zen funziona alla grande con OpenCode, puoi usare Zen con qualsiasi agente. Segui le istruzioni di configurazione nel tuo agente di coding preferito.",
+
+ "zen.cta.start": "Inizia con Zen",
+ "zen.pricing.title": "Aggiungi $20 di saldo a consumo",
+ "zen.pricing.fee": "(+$1.23 commissione di elaborazione carta)",
+ "zen.pricing.body": "Usa con qualsiasi agente. Imposta limiti di spesa mensili. Annulla in qualsiasi momento.",
+ "zen.problem.title": "Quale problema risolve Zen?",
+ "zen.problem.body":
+ "Sono disponibili numerosi modelli, ma solo pochi funzionano bene con gli agenti di coding. La maggior parte dei provider li configura in modo diverso con risultati variabili.",
+ "zen.problem.subtitle": "Stiamo risolvendo questo problema per tutti, non solo per gli utenti OpenCode.",
+ "zen.problem.item1": "Testare modelli selezionati e consultare i loro team",
+ "zen.problem.item2": "Collaborare con i provider per garantire che vengano consegnati correttamente",
+ "zen.problem.item3": "Benchmark di tutte le combinazioni modello-provider che raccomandiamo",
+ "zen.how.title": "Come funziona Zen",
+ "zen.how.body": "Anche se ti consigliamo di utilizzare Zen con OpenCode, puoi utilizzare Zen con qualsiasi agente.",
+ "zen.how.step1.title": "Iscriviti e aggiungi un saldo di $20",
+ "zen.how.step1.beforeLink": "segui le",
+ "zen.how.step1.link": "istruzioni di configurazione",
+ "zen.how.step2.title": "Usa Zen con prezzi trasparenti",
+ "zen.how.step2.link": "paga per richiesta",
+ "zen.how.step2.afterLink": "senza ricarichi",
+ "zen.how.step3.title": "Ricarica automatica",
+ "zen.how.step3.body": "quando il tuo saldo raggiunge $5, aggiungeremo automaticamente $20",
+ "zen.privacy.title": "La tua privacy è importante per noi",
+ "zen.privacy.beforeExceptions":
+ "Tutti i modelli Zen sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
+ "zen.privacy.exceptionsLink": "seguenti eccezioni",
+
+ "go.title": "OpenCode Go | Modelli di coding a basso costo per tutti",
+ "go.meta.description":
+ "Go inizia a $5 per il primo mese, poi $10/mese, con generosi limiti di richiesta di 5 ore per GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash.",
+ "go.hero.title": "Modelli di coding a basso costo per tutti",
+ "go.hero.body":
+ "Go porta il coding agentico ai programmatori di tutto il mondo. Offrendo limiti generosi e un accesso affidabile ai modelli open source più capaci, in modo da poter costruire con agenti potenti senza preoccuparsi dei costi o della disponibilità.",
+
+ "go.cta.start": "Abbonati a Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Abbonati a Go",
+ "go.cta.price": "$10/mese",
+ "go.cta.promo": "$5 il primo mese",
+ "go.pricing.body":
+ "Usalo con qualsiasi agente. $5 il primo mese, poi $10/mese. Ricarica il credito se necessario. Annulla in qualsiasi momento.",
+ "go.graph.free": "Gratis",
+ "go.graph.freePill": "Big Pickle e modelli gratuiti",
+ "go.graph.go": "Go",
+ "go.graph.label": "Richieste ogni 5 ore",
+ "go.graph.usageLimits": "Limiti di utilizzo",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Richieste ogni 5h: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "ha cambiato la vita, è davvero una scelta ovvia.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, e ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 persone su 5 nel nostro team amano usare",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Non posso raccomandare",
+ "go.testimonials.adam.quoteAfter": "abbastanza. Seriamente, è davvero buono.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Con",
+ "go.testimonials.david.quoteAfter": "so che tutti i modelli sono testati e perfetti per gli agenti di coding.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 volte)",
+ "go.testimonials.frank.quote": "Vorrei essere ancora a Nvidia.",
+ "go.problem.title": "Quale problema risolve Go?",
+ "go.problem.body":
+ "Ci concentriamo nel portare l'esperienza OpenCode a quante più persone possibile. OpenCode Go è un abbonamento a basso costo: $5 il primo mese, poi $10/mese. Offre limiti generosi e accesso affidabile ai modelli open source più capaci.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Prezzo di abbonamento a basso costo",
+ "go.problem.item2": "Limiti generosi e accesso affidabile",
+ "go.problem.item3": "Costruito per il maggior numero possibile di programmatori",
+ "go.problem.item4":
+ "Include GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash",
+ "go.how.title": "Come funziona Go",
+ "go.how.body": "Go inizia a $5 per il primo mese, poi $10/mese. Puoi usarlo con OpenCode o qualsiasi agente.",
+ "go.how.step1.title": "Crea un account",
+ "go.how.step1.beforeLink": "segui le",
+ "go.how.step1.link": "istruzioni di configurazione",
+ "go.how.step2.title": "Abbonati a Go",
+ "go.how.step2.link": "$5 il primo mese",
+ "go.how.step2.afterLink": "poi $10/mese con limiti generosi",
+ "go.how.step3.title": "Inizia a programmare",
+ "go.how.step3.body": "con accesso affidabile ai modelli open source",
+ "go.privacy.title": "La tua privacy è importante per noi",
+ "go.privacy.body":
+ "Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati negli Stati Uniti, UE e Singapore per un accesso globale stabile.",
+ "go.privacy.contactAfter": "se hai domande.",
+ "go.privacy.beforeExceptions":
+ "I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
+ "go.privacy.exceptionsLink": "seguenti eccezioni",
+ "go.faq.q1": "Che cos'è OpenCode Go?",
+ "go.faq.a1":
+ "Go è un abbonamento a basso costo che ti dà un accesso affidabile a modelli open source capaci per il coding agentico.",
+ "go.faq.q2": "Quali modelli include Go?",
+ "go.faq.a2": "Go include i modelli elencati di seguito, con limiti generosi e accesso affidabile.",
+ "go.faq.q3": "Go è lo stesso di Zen?",
+ "go.faq.a3":
+ "No. Zen è a consumo, mentre Go inizia a $5 per il primo mese, poi $10/mese, con limiti generosi e accesso affidabile ai modelli open source GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash.",
+ "go.faq.q4": "Quanto costa Go?",
+ "go.faq.a4.p1.beforePricing": "Go costa",
+ "go.faq.a4.p1.pricingLink": "$5 il primo mese",
+ "go.faq.a4.p1.afterPricing": "poi $10/mese con limiti generosi.",
+ "go.faq.a4.p2.beforeAccount": "Puoi gestire il tuo abbonamento nel tuo",
+ "go.faq.a4.p2.accountLink": "account",
+ "go.faq.a4.p3": "Annulla in qualsiasi momento.",
+ "go.faq.q5": "E per quanto riguarda dati e privacy?",
+ "go.faq.a5.body":
+ "Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati negli Stati Uniti, UE e Singapore per un accesso globale stabile. I nostri provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli.",
+ "go.faq.a5.beforeExceptions":
+ "I modelli Go sono ospitati negli Stati Uniti. I provider seguono una policy di zero-retention e non usano i tuoi dati per l'addestramento dei modelli, con le",
+ "go.faq.a5.exceptionsLink": "seguenti eccezioni",
+ "go.faq.q6": "Posso ricaricare il credito?",
+ "go.faq.a6": "Se hai bisogno di più utilizzo, puoi ricaricare il credito nel tuo account.",
+ "go.faq.q7": "Posso annullare?",
+ "go.faq.a7": "Sì, puoi annullare in qualsiasi momento.",
+ "go.faq.q8": "Posso usare Go con altri agenti di coding?",
+ "go.faq.a8":
+ "Sì, puoi usare Go con qualsiasi agente. Segui le istruzioni di configurazione nel tuo agente di coding preferito.",
+
+ "go.faq.q9": "Qual è la differenza tra i modelli gratuiti e Go?",
+ "go.faq.a9":
+ "I modelli gratuiti includono Big Pickle più modelli promozionali disponibili al momento, con una quota di 200 richieste/giorno. Go include GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash con quote di richiesta più elevate applicate su finestre mobili (5 ore, settimanale e mensile), approssimativamente equivalenti a $12 ogni 5 ore, $30 a settimana e $60 al mese (il conteggio effettivo delle richieste varia in base al modello e all'utilizzo).",
+
+ "zen.api.error.rateLimitExceeded": "Limite di richieste superato. Riprova più tardi.",
+ "zen.api.error.modelNotSupported": "Modello {{model}} non supportato",
+ "zen.api.error.modelFormatNotSupported": "Modello {{model}} non supportato per il formato {{format}}",
+ "zen.api.error.noProviderAvailable": "Nessun provider disponibile",
+ "zen.api.error.providerNotSupported": "Provider {{provider}} non supportato",
+ "zen.api.error.missingApiKey": "Chiave API mancante.",
+ "zen.api.error.invalidApiKey": "Chiave API non valida.",
+ "zen.api.error.subscriptionQuotaExceeded": "Quota dell'abbonamento superata. Riprova tra {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Limite di utilizzo di 5 ore raggiunto. Si reimposta tra {{retryIn}}. Per continuare a usare questo modello ora, abilita l'utilizzo dal tuo saldo disponibile: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Limite di utilizzo settimanale raggiunto. Si reimposta tra {{retryIn}}. Per continuare a usare questo modello ora, abilita l'utilizzo dal tuo saldo disponibile: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Limite di utilizzo mensile raggiunto. Si reimposta tra {{retryIn}}. Per continuare a usare questo modello ora, abilita l'utilizzo dal tuo saldo disponibile: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Nessun metodo di pagamento. Aggiungi un metodo di pagamento qui: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Saldo insufficiente. Gestisci la tua fatturazione qui: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "La tua area di lavoro ha raggiunto il limite di spesa mensile di ${{amount}}. Gestisci i tuoi limiti qui: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Hai raggiunto il tuo limite di spesa mensile di ${{amount}}. Gestisci i tuoi limiti qui: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Il modello è disabilitato",
+ "zen.api.error.trialEnded":
+ "La promozione gratuita di {{model}} è terminata. Puoi continuare a usare il modello abbonandoti a OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Accedi ai migliori modelli di coding al mondo",
+ "black.meta.description":
+ "Ottieni l'accesso a Claude, GPT, Gemini e altri con i piani di abbonamento OpenCode Black.",
+ "black.hero.title": "Accedi ai migliori modelli di coding al mondo",
+ "black.hero.subtitle": "Inclusi Claude, GPT, Gemini e altri",
+ "black.title": "OpenCode Black | Prezzi",
+ "black.paused": "L'iscrizione al piano Black è temporaneamente sospesa.",
+ "black.plan.icon20": "Piano Black 20",
+ "black.plan.icon100": "Piano Black 100",
+ "black.plan.icon200": "Piano Black 200",
+ "black.plan.multiplier100": "5x più utilizzo rispetto a Black 20",
+ "black.plan.multiplier200": "20x più utilizzo rispetto a Black 20",
+ "black.price.perMonth": "al mese",
+ "black.price.perPersonBilledMonthly": "per persona fatturato mensilmente",
+ "black.terms.1": "Il tuo abbonamento non inizierà immediatamente",
+ "black.terms.2": "Verrai aggiunto alla lista d'attesa e attivato presto",
+ "black.terms.3": "La tua carta verrà addebitata solo quando il tuo abbonamento sarà attivato",
+ "black.terms.4":
+ "Si applicano limiti di utilizzo, un uso fortemente automatizzato potrebbe raggiungere i limiti prima",
+ "black.terms.5": "Gli abbonamenti sono per individui, contatta Enterprise per i team",
+ "black.terms.6": "I limiti potrebbero essere modificati e i piani potrebbero essere interrotti in futuro",
+ "black.terms.7": "Annulla il tuo abbonamento in qualsiasi momento",
+ "black.action.continue": "Continua",
+ "black.finePrint.beforeTerms": "I prezzi mostrati non includono le tasse applicabili",
+ "black.finePrint.terms": "Termini di servizio",
+ "black.workspace.title": "OpenCode Black | Seleziona Workspace",
+ "black.workspace.selectPlan": "Seleziona un workspace per questo piano",
+ "black.workspace.name": "Workspace {{n}}",
+ "black.subscribe.title": "Abbonati a OpenCode Black",
+ "black.subscribe.paymentMethod": "Metodo di pagamento",
+ "black.subscribe.loadingPaymentForm": "Caricamento modulo di pagamento...",
+ "black.subscribe.selectWorkspaceToContinue": "Seleziona un workspace per continuare",
+ "black.subscribe.failurePrefix": "Oh no!",
+ "black.subscribe.error.generic": "Si è verificato un errore",
+ "black.subscribe.error.invalidPlan": "Piano non valido",
+ "black.subscribe.error.workspaceRequired": "ID Workspace richiesto",
+ "black.subscribe.error.alreadySubscribed": "Questo workspace ha già un abbonamento",
+ "black.subscribe.processing": "Elaborazione...",
+ "black.subscribe.submit": "Abbonati ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Ti verrà addebitato solo quando il tuo abbonamento sarà attivato",
+ "black.subscribe.success.title": "Sei nella lista d'attesa di OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "Piano di abbonamento",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Importo",
+ "black.subscribe.success.amountValue": "${{plan}} al mese",
+ "black.subscribe.success.paymentMethod": "Metodo di pagamento",
+ "black.subscribe.success.dateJoined": "Data di adesione",
+ "black.subscribe.success.chargeNotice": "La tua carta verrà addebitata quando il tuo abbonamento sarà attivato",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Utilizzo",
+ "workspace.nav.apiKeys": "Chiavi API",
+ "workspace.nav.members": "Membri",
+ "workspace.nav.billing": "Fatturazione",
+ "workspace.nav.settings": "Impostazioni",
+
+ "workspace.home.banner.beforeLink": "Modelli ottimizzati e affidabili per agenti di coding.",
+ "workspace.lite.banner.beforeLink": "Modelli di coding a basso costo per tutti.",
+ "workspace.home.billing.loading": "Caricamento...",
+ "workspace.home.billing.enable": "Abilita fatturazione",
+ "workspace.home.billing.currentBalance": "Saldo attuale",
+
+ "workspace.newUser.feature.tested.title": "Modelli testati e verificati",
+ "workspace.newUser.feature.tested.body":
+ "Abbiamo benchmarkato e testato modelli specificamente per agenti di coding per garantire le migliori prestazioni.",
+ "workspace.newUser.feature.quality.title": "Massima qualità",
+ "workspace.newUser.feature.quality.body":
+ "Accedi a modelli configurati per prestazioni ottimali - nessun downgrade o instradamento verso provider più economici.",
+ "workspace.newUser.feature.lockin.title": "Nessun lock-in",
+ "workspace.newUser.feature.lockin.body":
+ "Usa Zen con qualsiasi agente di coding, e continua a usare altri provider con opencode quando vuoi.",
+ "workspace.newUser.copyApiKey": "Copia chiave API",
+ "workspace.newUser.copyKey": "Copia Chiave",
+ "workspace.newUser.copied": "Copiato!",
+ "workspace.newUser.step.enableBilling": "Abilita fatturazione",
+ "workspace.newUser.step.login.before": "Esegui",
+ "workspace.newUser.step.login.after": "e seleziona opencode",
+ "workspace.newUser.step.pasteKey": "Incolla la tua chiave API",
+ "workspace.newUser.step.models.before": "Avvia opencode ed esegui",
+ "workspace.newUser.step.models.after": "per selezionare un modello",
+
+ "workspace.models.title": "Modelli",
+ "workspace.models.subtitle.beforeLink": "Gestisci i modelli a cui possono accedere i membri del workspace.",
+ "workspace.models.table.model": "Modello",
+ "workspace.models.table.enabled": "Abilitato",
+
+ "workspace.providers.title": "Bring Your Own Key",
+ "workspace.providers.subtitle": "Configura le tue chiavi API dai provider di IA.",
+ "workspace.providers.placeholder": "Inserisci chiave API {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Configura",
+ "workspace.providers.edit": "Modifica",
+ "workspace.providers.delete": "Elimina",
+ "workspace.providers.saving": "Salvataggio...",
+ "workspace.providers.save": "Salva",
+ "workspace.providers.table.provider": "Provider",
+ "workspace.providers.table.apiKey": "Chiave API",
+
+ "workspace.usage.title": "Cronologia Utilizzo",
+ "workspace.usage.subtitle": "Utilizzo API recente e costi.",
+ "workspace.usage.empty": "Effettua la tua prima chiamata API per iniziare.",
+ "workspace.usage.table.date": "Data",
+ "workspace.usage.table.model": "Modello",
+ "workspace.usage.table.input": "Input",
+ "workspace.usage.table.output": "Output",
+ "workspace.usage.table.cost": "Costo",
+ "workspace.usage.table.session": "Sessione",
+ "workspace.usage.breakdown.input": "Input",
+ "workspace.usage.breakdown.cacheRead": "Lettura Cache",
+ "workspace.usage.breakdown.cacheWrite": "Scrittura Cache",
+ "workspace.usage.breakdown.output": "Output",
+ "workspace.usage.breakdown.reasoning": "Reasoning",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Costo",
+ "workspace.cost.subtitle": "Costi di utilizzo suddivisi per modello.",
+ "workspace.cost.allModels": "Tutti i Modelli",
+ "workspace.cost.allKeys": "Tutte le Chiavi",
+ "workspace.cost.deletedSuffix": "(eliminato)",
+ "workspace.cost.empty": "Nessun dato di utilizzo disponibile per il periodo selezionato.",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "Chiavi API",
+ "workspace.keys.subtitle": "Gestisci le tue chiavi API per accedere ai servizi opencode.",
+ "workspace.keys.create": "Crea Chiave API",
+ "workspace.keys.placeholder": "Inserisci nome chiave",
+ "workspace.keys.empty": "Crea una chiave API opencode Gateway",
+ "workspace.keys.table.name": "Nome",
+ "workspace.keys.table.key": "Chiave",
+ "workspace.keys.table.createdBy": "Creato da",
+ "workspace.keys.table.lastUsed": "Ultimo Utilizzo",
+ "workspace.keys.copyApiKey": "Copia chiave API",
+ "workspace.keys.delete": "Elimina",
+
+ "workspace.members.title": "Membri",
+ "workspace.members.subtitle": "Gestisci i membri del workspace e le loro autorizzazioni.",
+ "workspace.members.invite": "Invita Membro",
+ "workspace.members.inviting": "Invito in corso...",
+ "workspace.members.beta.beforeLink": "I workspace sono gratuiti per i team durante la beta.",
+ "workspace.members.form.invitee": "Invitato",
+ "workspace.members.form.emailPlaceholder": "Inserisci email",
+ "workspace.members.form.role": "Ruolo",
+ "workspace.members.form.monthlyLimit": "Limite di spesa mensile",
+ "workspace.members.noLimit": "Nessun limite",
+ "workspace.members.noLimitLowercase": "nessun limite",
+ "workspace.members.invited": "invitato",
+ "workspace.members.edit": "Modifica",
+ "workspace.members.delete": "Elimina",
+ "workspace.members.saving": "Salvataggio...",
+ "workspace.members.save": "Salva",
+ "workspace.members.table.email": "Email",
+ "workspace.members.table.role": "Ruolo",
+ "workspace.members.table.monthLimit": "Limite mensile",
+ "workspace.members.role.admin": "Admin",
+ "workspace.members.role.adminDescription": "Può gestire modelli, membri e fatturazione",
+ "workspace.members.role.member": "Membro",
+ "workspace.members.role.memberDescription": "Può generare chiavi API solo per sé",
+
+ "workspace.settings.title": "Impostazioni",
+ "workspace.settings.subtitle": "Aggiorna il nome e le preferenze del workspace.",
+ "workspace.settings.workspaceName": "Nome Workspace",
+ "workspace.settings.defaultName": "Predefinito",
+ "workspace.settings.updating": "Aggiornamento...",
+ "workspace.settings.save": "Salva",
+ "workspace.settings.edit": "Modifica",
+
+ "workspace.billing.title": "Fatturazione",
+ "workspace.billing.subtitle.beforeLink": "Gestisci i metodi di pagamento.",
+ "workspace.billing.contactUs": "Contattaci",
+ "workspace.billing.subtitle.afterLink": "se hai domande.",
+ "workspace.billing.currentBalance": "Saldo Attuale",
+ "workspace.billing.add": "Aggiungi $",
+ "workspace.billing.enterAmount": "Inserisci importo",
+ "workspace.billing.loading": "Caricamento...",
+ "workspace.billing.addAction": "Aggiungi",
+ "workspace.billing.addBalance": "Aggiungi Saldo",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Collegato a Stripe",
+ "workspace.billing.manage": "Gestisci",
+ "workspace.billing.enable": "Abilita Fatturazione",
+
+ "workspace.monthlyLimit.title": "Limite Mensile",
+ "workspace.monthlyLimit.subtitle": "Imposta un limite di utilizzo mensile per il tuo account.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Impostazione...",
+ "workspace.monthlyLimit.set": "Impostato",
+ "workspace.monthlyLimit.edit": "Modifica Limite",
+ "workspace.monthlyLimit.noLimit": "Nessun limite di utilizzo impostato.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Utilizzo attuale per",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "è $",
+
+ "workspace.redeem.title": "Riscatta Coupon",
+ "workspace.redeem.subtitle": "Riscatta un codice coupon per ottenere credito o vantaggi.",
+ "workspace.redeem.placeholder": "Inserisci il codice coupon",
+ "workspace.redeem.redeem": "Riscatta",
+ "workspace.redeem.redeeming": "Riscatto in corso...",
+ "workspace.redeem.success": "Coupon riscattato con successo.",
+
+ "workspace.reload.title": "Ricarica Auto",
+ "workspace.reload.disabled.before": "La ricarica auto è",
+ "workspace.reload.disabled.state": "disabilitata",
+ "workspace.reload.disabled.after": "Abilita per ricaricare automaticamente quando il saldo è basso.",
+ "workspace.reload.enabled.before": "La ricarica auto è",
+ "workspace.reload.enabled.state": "abilitata",
+ "workspace.reload.enabled.middle": "Ricaricheremo",
+ "workspace.reload.processingFee": "commissione",
+ "workspace.reload.enabled.after": "quando il saldo raggiunge",
+ "workspace.reload.edit": "Modifica",
+ "workspace.reload.enable": "Abilita",
+ "workspace.reload.enableAutoReload": "Abilita Ricarica Auto",
+ "workspace.reload.reloadAmount": "Ricarica $",
+ "workspace.reload.whenBalanceReaches": "Quando il saldo raggiunge $",
+ "workspace.reload.saving": "Salvataggio...",
+ "workspace.reload.save": "Salva",
+ "workspace.reload.failedAt": "Ricarica fallita il",
+ "workspace.reload.reason": "Motivo:",
+ "workspace.reload.updatePaymentMethod": "Aggiorna il tuo metodo di pagamento e riprova.",
+ "workspace.reload.retrying": "Riprovo...",
+ "workspace.reload.retry": "Riprova",
+ "workspace.reload.error.paymentFailed": "Pagamento fallito.",
+
+ "workspace.payments.title": "Cronologia Pagamenti",
+ "workspace.payments.subtitle": "Transazioni di pagamento recenti.",
+ "workspace.payments.table.date": "Data",
+ "workspace.payments.table.paymentId": "ID Pagamento",
+ "workspace.payments.table.amount": "Importo",
+ "workspace.payments.table.receipt": "Ricevuta",
+ "workspace.payments.type.credit": "credito",
+ "workspace.payments.type.subscription": "abbonamento",
+ "workspace.payments.view": "Visualizza",
+
+ "workspace.black.loading": "Caricamento...",
+ "workspace.black.time.day": "giorno",
+ "workspace.black.time.days": "giorni",
+ "workspace.black.time.hour": "ora",
+ "workspace.black.time.hours": "ore",
+ "workspace.black.time.minute": "minuto",
+ "workspace.black.time.minutes": "minuti",
+ "workspace.black.time.fewSeconds": "pochi secondi",
+ "workspace.black.subscription.title": "Abbonamento",
+ "workspace.black.subscription.message": "Sei abbonato a OpenCode Black per ${{plan}} al mese.",
+ "workspace.black.subscription.manage": "Gestisci Abbonamento",
+ "workspace.black.subscription.rollingUsage": "Utilizzo 5-ore",
+ "workspace.black.subscription.weeklyUsage": "Utilizzo Settimanale",
+ "workspace.black.subscription.resetsIn": "Si resetta tra",
+ "workspace.black.subscription.useBalance": "Usa il tuo saldo disponibile dopo aver raggiunto i limiti di utilizzo",
+ "workspace.black.waitlist.title": "Waitlist",
+ "workspace.black.waitlist.joined": "Sei nella waitlist per il piano OpenCode Black da ${{plan}} al mese.",
+ "workspace.black.waitlist.ready": "Siamo pronti per iscriverti al piano OpenCode Black da ${{plan}} al mese.",
+ "workspace.black.waitlist.leave": "Lascia Waitlist",
+ "workspace.black.waitlist.leaving": "Uscita...",
+ "workspace.black.waitlist.left": "Uscito",
+ "workspace.black.waitlist.enroll": "Iscriviti",
+ "workspace.black.waitlist.enrolling": "Iscrizione...",
+ "workspace.black.waitlist.enrolled": "Iscritto",
+ "workspace.black.waitlist.enrollNote":
+ "Quando clicchi su Iscriviti, il tuo abbonamento inizia immediatamente e la tua carta verrà addebitata.",
+
+ "workspace.lite.loading": "Caricamento...",
+ "workspace.lite.time.day": "giorno",
+ "workspace.lite.time.days": "giorni",
+ "workspace.lite.time.hour": "ora",
+ "workspace.lite.time.hours": "ore",
+ "workspace.lite.time.minute": "minuto",
+ "workspace.lite.time.minutes": "minuti",
+ "workspace.lite.time.fewSeconds": "pochi secondi",
+ "workspace.lite.subscription.message": "Sei abbonato a OpenCode Go.",
+ "workspace.lite.subscription.manage": "Gestisci Abbonamento",
+ "workspace.lite.subscription.rollingUsage": "Utilizzo Continuativo",
+ "workspace.lite.subscription.weeklyUsage": "Utilizzo Settimanale",
+ "workspace.lite.subscription.monthlyUsage": "Utilizzo Mensile",
+ "workspace.lite.subscription.resetsIn": "Si resetta tra",
+ "workspace.lite.subscription.useBalance": "Usa il tuo saldo disponibile dopo aver raggiunto i limiti di utilizzo",
+ "workspace.lite.subscription.selectProvider":
+ 'Seleziona "OpenCode Go" come provider nella tua configurazione opencode per utilizzare i modelli Go.',
+ "workspace.lite.black.message":
+ "Attualmente sei abbonato a OpenCode Black o sei in lista d'attesa. Annulla l'iscrizione prima se desideri passare a Go.",
+ "workspace.lite.other.message":
+ "Un altro membro in questo workspace è già abbonato a OpenCode Go. Solo un membro per workspace può abbonarsi.",
+ "workspace.lite.promo.description":
+ "OpenCode Go parte da {{price}}, poi $10/mese, e offre un accesso affidabile a popolari modelli di coding aperti con generosi limiti di utilizzo.",
+ "workspace.lite.promo.price": "$5 il primo mese",
+ "workspace.lite.promo.modelsTitle": "Cosa è incluso",
+ "workspace.lite.promo.footer":
+ "Il piano è progettato principalmente per gli utenti internazionali, con modelli ospitati in US, EU e Singapore per un accesso globale stabile. I prezzi e i limiti di utilizzo potrebbero cambiare man mano che impariamo dall'utilizzo iniziale e dal feedback.",
+ "workspace.lite.promo.subscribe": "Abbonati a Go",
+ "workspace.lite.promo.subscribing": "Reindirizzamento...",
+ "workspace.lite.promo.otherMethods": "Altri metodi di pagamento",
+ "workspace.lite.promo.selectMethod": "Seleziona metodo di pagamento",
+
+ "workspace.referral.copyLink": "Copia link",
+ "workspace.referral.copied": "Copiato",
+ "workspace.referral.overview.title": "Invita amici",
+ "workspace.referral.overview.subtitle": "Guadagna $5 quando un amico si abbona. Anche lui riceverà $5.",
+ "workspace.referral.instructions.share": "Condividi il tuo link di referral",
+ "workspace.referral.instructions.subscribe": "Il tuo amico si iscrive e si abbona a Go",
+ "workspace.referral.instructions.claim":
+ "Entrambi ricevete un credito di utilizzo di $5 da applicare ai vostri limiti di utilizzo Go",
+ "workspace.referral.rewards.title": "Premi referral",
+ "workspace.referral.rewards.description": "Applica i crediti referral disponibili al tuo utilizzo di Go.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} premi utilizzati.",
+ "workspace.referral.rewards.empty": "Nessun premio referral ancora.",
+ "workspace.referral.table.reward": "Premio",
+ "workspace.referral.table.referral": "Descrizione",
+ "workspace.referral.table.date": "Data",
+ "workspace.referral.reward.description.inviter": "Hai invitato {{email}}",
+ "workspace.referral.reward.description.invitee": "Invitato da {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Abbonati per sbloccare",
+ "workspace.referral.reward.action.view": "Vedi premio",
+ "workspace.referral.reward.action.applied": "Premio utilizzato",
+ "workspace.referral.reward.source.pendingInviter": "In attesa che si abboni",
+ "workspace.referral.reward.source.pendingInvitee": "Abbonati per sbloccare il premio",
+ "workspace.referral.reward.source.available": "Premio pronto da utilizzare",
+ "workspace.referral.reward.source.applied": "Premio utilizzato",
+ "workspace.referral.reward.status.applied": "Premio utilizzato",
+ "workspace.referral.reward.status.pendingInviter": "Abbonati per sbloccare",
+ "workspace.referral.reward.status.pendingInvitee": "Abbonati per sbloccare",
+ "workspace.referral.apply.noGo": "Abbonati per sbloccare",
+ "workspace.referral.apply.preview": "Vedi premio",
+ "workspace.referral.apply.action": "Utilizza",
+ "workspace.referral.apply.confirmTitle": "Utilizza premio",
+ "workspace.referral.apply.confirmBody": "Utilizza {{amount}} per ridurre l'utilizzo attuale di questo workspace.",
+ "workspace.referral.apply.confirmAction": "Utilizza",
+
+ "download.title": "OpenCode | Download",
+ "download.meta.description": "Scarica OpenCode per macOS, Windows e Linux",
+ "download.hero.title": "Scarica OpenCode",
+ "download.hero.subtitle": "Disponibile in Beta per macOS, Windows e Linux",
+ "download.hero.button": "Scarica per {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Extensions",
+ "download.section.integrations": "OpenCode Integrations",
+ "download.action.download": "Scarica",
+ "download.action.install": "Installa",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Non necessariamente, ma probabilmente. Avrai bisogno di un abbonamento IA se vuoi collegare OpenCode a un provider a pagamento, sebbene tu possa lavorare con",
+ "download.faq.a3.localLink": "modelli locali",
+ "download.faq.a3.afterLocal.beforeZen": "gratuitamente. Mentre incoraggiamo gli utenti a usare",
+ "download.faq.a3.afterZen": ", OpenCode funziona con tutti i provider popolari come OpenAI, Anthropic, xAI ecc.",
+
+ "download.faq.a5.p1": "OpenCode è gratuito al 100%.",
+ "download.faq.a5.p2.beforeZen":
+ "Eventuali costi aggiuntivi proverranno dal tuo abbonamento a un provider di modelli. Mentre OpenCode funziona con qualsiasi provider di modelli, raccomandiamo di usare",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "I tuoi dati e informazioni sono archiviati solo quando crei link condivisibili in OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Scopri di più sulle",
+ "download.faq.a6.shareLink": "pagine condivise",
+
+ "enterprise.title": "OpenCode | Soluzioni Enterprise per la tua organizzazione",
+ "enterprise.meta.description": "Contatta OpenCode per soluzioni enterprise",
+ "enterprise.hero.title": "Il tuo codice è tuo",
+ "enterprise.hero.body1":
+ "OpenCode opera in modo sicuro all'interno della tua organizzazione senza dati o contesto archiviati e senza restrizioni di licenza o rivendicazioni di proprietà. Inizia una prova con il tuo team, poi distribuisci attraverso la tua organizzazione integrandolo con il tuo SSO e gateway IA interno.",
+ "enterprise.hero.body2": "Facci sapere come possiamo aiutare.",
+ "enterprise.form.name.label": "Nome completo",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Ruolo",
+ "enterprise.form.role.placeholder": "Presidente Esecutivo",
+ "enterprise.form.company.label": "Azienda",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Email aziendale",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Numero di telefono",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Quale problema stai cercando di risolvere?",
+ "enterprise.form.message.placeholder": "Abbiamo bisogno di aiuto con...",
+ "enterprise.form.send": "Invia",
+ "enterprise.form.sending": "Invio...",
+ "enterprise.form.success": "Messaggio inviato, ti contatteremo presto.",
+ "enterprise.form.success.submitted": "Modulo inviato con successo.",
+ "enterprise.form.error.allFieldsRequired": "Tutti i campi sono obbligatori.",
+ "enterprise.form.error.invalidEmailFormat": "Formato email non valido.",
+ "enterprise.form.error.internalServer": "Errore interno del server.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Cos'è OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise è per le organizzazioni che vogliono garantire che il loro codice e dati non lascino mai la loro infrastruttura. Può farlo usando una configurazione centralizzata che si integra con il tuo SSO e gateway IA interno.",
+ "enterprise.faq.q2": "Come inizio con OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Inizia semplicemente con una prova interna con il tuo team. OpenCode per impostazione predefinita non archivia il tuo codice o dati di contesto, rendendo facile iniziare. Poi contattaci per discutere prezzi e opzioni di implementazione.",
+ "enterprise.faq.q3": "Come funziona il prezzo enterprise?",
+ "enterprise.faq.a3":
+ "Offriamo prezzi enterprise per postazione. Se hai il tuo gateway LLM, non addebitiamo per i token usati. Per ulteriori dettagli, contattaci per un preventivo personalizzato basato sulle esigenze della tua organizzazione.",
+ "enterprise.faq.q4": "I miei dati sono sicuri con OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Sì. OpenCode non archivia il tuo codice o dati di contesto. Tutto il trattamento avviene localmente o attraverso chiamate API dirette al tuo provider IA. Con configurazione centrale e integrazione SSO, i tuoi dati rimangono sicuri all'interno dell'infrastruttura della tua organizzazione.",
+
+ "brand.title": "OpenCode | Brand",
+ "brand.meta.description": "Linee guida del brand OpenCode",
+ "brand.heading": "Linee guida del brand",
+ "brand.subtitle": "Risorse e asset per aiutarti a lavorare con il brand OpenCode.",
+ "brand.downloadAll": "Scarica tutti gli asset",
+
+ "changelog.title": "OpenCode | Changelog",
+ "changelog.meta.description": "Note di rilascio e changelog OpenCode",
+ "changelog.hero.title": "Changelog",
+ "changelog.hero.subtitle": "Nuovi aggiornamenti e miglioramenti a OpenCode",
+ "changelog.empty": "Nessuna voce del changelog trovata.",
+ "changelog.viewJson": "Vedi JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmark",
+ "bench.list.table.agent": "Agente",
+ "bench.list.table.model": "Modello",
+ "bench.list.table.score": "Punteggio",
+ "bench.submission.error.allFieldsRequired": "Tutti i campi sono obbligatori.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Task non trovato",
+ "bench.detail.na": "N/D",
+ "bench.detail.labels.agent": "Agente",
+ "bench.detail.labels.model": "Modello",
+ "bench.detail.labels.task": "Task",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "Da",
+ "bench.detail.labels.to": "A",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Durata Media",
+ "bench.detail.labels.averageScore": "Punteggio Medio",
+ "bench.detail.labels.averageCost": "Costo Medio",
+ "bench.detail.labels.summary": "Riepilogo",
+ "bench.detail.labels.runs": "Esecuzioni",
+ "bench.detail.labels.score": "Punteggio",
+ "bench.detail.labels.base": "Base",
+ "bench.detail.labels.penalty": "Penalità",
+ "bench.detail.labels.weight": "peso",
+ "bench.detail.table.run": "Esecuzione",
+ "bench.detail.table.score": "Punteggio (Base - Penalità)",
+ "bench.detail.table.cost": "Costo",
+ "bench.detail.table.duration": "Durata",
+ "bench.detail.run.title": "Esecuzione {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/ja.ts b/packages/console/app/src/i18n/ja.ts
new file mode 100644
index 0000000..81e44d6
--- /dev/null
+++ b/packages/console/app/src/i18n/ja.ts
@@ -0,0 +1,823 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "ドキュメント",
+ "nav.changelog": "変更履歴",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "エンタープライズ",
+ "nav.zen": "Zen",
+ "nav.login": "ログイン",
+ "nav.free": "ダウンロード",
+ "nav.home": "ホーム",
+ "nav.openMenu": "メニューを開く",
+ "nav.getStartedFree": "無料ではじめる",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "ロゴをSVGでコピー",
+ "nav.context.copyWordmark": "ワードマークをSVGでコピー",
+ "nav.context.brandAssets": "ブランド素材",
+
+ "footer.github": "GitHub",
+ "footer.docs": "ドキュメント",
+ "footer.changelog": "変更履歴",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "ブランド",
+ "legal.privacy": "プライバシー",
+ "legal.terms": "利用規約",
+
+ "email.title": "新製品リリースの情報をいち早く受け取る",
+ "email.subtitle": "早期アクセスのためにウェイトリストに登録してください。",
+ "email.placeholder": "メールアドレス",
+ "email.subscribe": "登録",
+ "email.success": "ほぼ完了です。受信トレイを確認してメールアドレスを認証してください",
+
+ "notFound.title": "見つかりません | OpenCode",
+ "notFound.heading": "404 - ページが見つかりません",
+ "notFound.home": "ホーム",
+ "notFound.docs": "ドキュメント",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencodeのロゴ(ライト)",
+ "notFound.logoDarkAlt": "opencodeのロゴ(ダーク)",
+
+ "user.logout": "ログアウト",
+
+ "auth.callback.error.codeMissing": "認証コードが見つかりません。",
+
+ "workspace.select": "ワークスペースを選択",
+ "workspace.createNew": "+ 新しいワークスペースを作成",
+ "workspace.modal.title": "新しいワークスペースを作成",
+ "workspace.modal.placeholder": "ワークスペース名を入力",
+
+ "common.cancel": "キャンセル",
+ "common.creating": "作成中...",
+ "common.create": "作成",
+
+ "common.videoUnsupported": "お使いのブラウザは video タグをサポートしていません。",
+ "common.figure": "図 {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "詳しく見る",
+
+ "error.invalidPlan": "無効なプラン",
+ "error.workspaceRequired": "ワークスペースIDが必要です",
+ "error.alreadySubscribed": "このワークスペースは既にサブスクリプションを持っています",
+ "error.limitRequired": "制限値が必要です。",
+ "error.monthlyLimitInvalid": "有効な月間制限を設定してください。",
+ "error.workspaceNameRequired": "ワークスペース名が必要です。",
+ "error.nameTooLong": "名前は255文字以下である必要があります。",
+ "error.emailRequired": "メールアドレスが必要です",
+ "error.roleRequired": "ロールが必要です",
+ "error.idRequired": "IDが必要です",
+ "error.nameRequired": "名前が必要です",
+ "error.providerRequired": "プロバイダーが必要です",
+ "error.apiKeyRequired": "APIキーが必要です",
+ "error.modelRequired": "モデルが必要です",
+ "error.reloadAmountMin": "リロード額は少なくとも ${{amount}} である必要があります",
+ "error.reloadTriggerMin": "残高トリガーは少なくとも ${{amount}} である必要があります",
+
+ "app.meta.description": "OpenCode - オープンソースのコーディングエージェント。",
+
+ "home.title": "OpenCode | オープンソースのAIコーディングエージェント",
+
+ "temp.title": "OpenCode | ターミナル向けに構築されたAIコーディングエージェント",
+ "temp.hero.title": "ターミナル向けに構築されたAIコーディングエージェント",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "はじめる",
+ "temp.feature.native.title": "ネイティブ TUI",
+ "temp.feature.native.body": "レスポンシブでネイティブ、テーマ変更可能なターミナルUI",
+ "temp.feature.zen.beforeLink": "OpenCodeが提供する",
+ "temp.feature.zen.link": "厳選されたモデルリスト",
+ "temp.feature.zen.afterLink": "",
+ "temp.feature.models.beforeLink": "ローカルモデルを含む、",
+ "temp.feature.models.afterLink": "を通じて75以上のLLMプロバイダーをサポート",
+ "temp.screenshot.caption": "tokyonight テーマを使用した OpenCode TUI",
+ "temp.screenshot.alt": "tokyonight テーマの OpenCode TUI",
+ "temp.logoLightAlt": "opencodeのロゴ(ライト)",
+ "temp.logoDarkAlt": "opencodeのロゴ(ダーク)",
+
+ "home.banner.badge": "新着",
+ "home.banner.text": "デスクトップアプリのベータ版が利用可能",
+ "home.banner.platforms": "macOS、Windows、Linux で",
+ "home.banner.downloadNow": "今すぐダウンロード",
+ "home.banner.downloadBetaNow": "デスクトップベータ版を今すぐダウンロード",
+
+ "home.hero.title": "オープンソースのAIコーディングエージェント",
+ "home.hero.subtitle.a": "無料モデルが含まれています。また、任意のプロバイダーの任意のモデルに接続でき、",
+ "home.hero.subtitle.b": "Claude、GPT、Gemini などにも対応します。",
+
+ "home.install.ariaLabel": "インストールオプション",
+
+ "home.what.title": "OpenCodeとは?",
+ "home.what.body":
+ "OpenCodeは、ターミナル、IDE、またはデスクトップでのコード作成を支援するオープンソースのエージェントです。",
+ "home.what.lsp.title": "LSP対応",
+ "home.what.lsp.body": "LLMに適したLSPを自動的に読み込みます",
+ "home.what.multiSession.title": "マルチセッション",
+ "home.what.multiSession.body": "同じプロジェクトで複数のエージェントを並行実行できます",
+ "home.what.shareLinks.title": "共有リンク",
+ "home.what.shareLinks.body": "参照やデバッグのために、任意のセッションへのリンクを共有できます",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "GitHubでログインしてCopilotアカウントを利用できます",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "OpenAIでログインしてChatGPT PlusまたはProアカウントを利用できます",
+ "home.what.anyModel.title": "あらゆるモデル",
+ "home.what.anyModel.body": "Models.dev経由で75以上のLLMプロバイダーに対応(ローカルモデル含む)",
+ "home.what.anyEditor.title": "あらゆるエディタ",
+ "home.what.anyEditor.body": "ターミナルインターフェース、デスクトップアプリ、IDE拡張機能として利用できます",
+ "home.what.readDocs": "ドキュメントを読む",
+
+ "home.growth.title": "オープンソースのAIコーディングエージェント",
+ "home.growth.body":
+ "GitHubスター{{stars}} 以上、コントリビューター{{contributors}} 人、コミット{{commits}} 件以上。毎月{{monthlyUsers}} 人以上の開発者に利用・信頼されています。",
+ "home.growth.githubStars": "GitHubスター",
+ "home.growth.contributors": "コントリビューター",
+ "home.growth.monthlyDevs": "月間開発者数",
+
+ "home.privacy.title": "プライバシーを最優先に設計",
+ "home.privacy.body":
+ "OpenCodeはコードやコンテキストデータを一切保存しないため、プライバシーが重視される環境でも利用できます。",
+ "home.privacy.learnMore": "詳しくは",
+ "home.privacy.link": "プライバシー",
+
+ "home.faq.q1": "OpenCodeとは?",
+ "home.faq.a1":
+ "OpenCodeは、任意のAIモデルでコードの作成・実行を支援するオープンソースのエージェントです。ターミナルベースのインターフェース、デスクトップアプリ、IDE拡張として利用できます。",
+ "home.faq.q2": "OpenCodeの使い方は?",
+ "home.faq.a2.before": "最も簡単な始め方は",
+ "home.faq.a2.link": "イントロを読む",
+ "home.faq.q3": "OpenCodeには追加のAIサブスクリプションが必要ですか?",
+ "home.faq.a3.p1": "必ずしも必要ではありません。OpenCodeには、アカウント不要で使える無料モデルが含まれています。",
+ "home.faq.a3.p2.beforeZen": "これらに加えて、",
+ "home.faq.a3.p2.afterZen": " アカウントを作成することで、人気のコーディングモデルを利用できます。",
+ "home.faq.a3.p3":
+ "Zenの利用を推奨していますが、OpenCodeはOpenAI、Anthropic、xAIなどの主要プロバイダーにも対応しています。",
+ "home.faq.a3.p4.beforeLocal": "さらに、",
+ "home.faq.a3.p4.localLink": "ローカルモデル",
+ "home.faq.q4": "既存のAIサブスクリプションをOpenCodeで使えますか?",
+ "home.faq.a4.p1":
+ "はい、OpenCodeは主要プロバイダーのサブスクリプションプランに対応しています。Claude Pro/Max、ChatGPT Plus/Pro、GitHub Copilotのサブスクリプションを利用できます。",
+ "home.faq.q5": "ターミナルだけで使えますか?",
+ "home.faq.a5.beforeDesktop": "もう違います!OpenCodeは今は",
+ "home.faq.a5.desktop": "デスクトップ",
+ "home.faq.a5.and": "と",
+ "home.faq.a5.web": "ウェブ",
+ "home.faq.q6": "OpenCodeの価格は?",
+ "home.faq.a6":
+ "OpenCodeは100%無料で使えます。無料モデルも含まれています。他のプロバイダーに接続する場合は追加費用が発生することがあります。",
+ "home.faq.q7": "データとプライバシーは?",
+ "home.faq.a7.p1": "無料モデルを使う場合や共有リンクを作成する場合にのみ、データが保存されます。",
+ "home.faq.a7.p2.beforeModels": "詳しくは",
+ "home.faq.a7.p2.modelsLink": "モデルのプライバシー",
+ "home.faq.a7.p2.and": "と",
+ "home.faq.a7.p2.shareLink": "共有ページのプライバシー",
+ "home.faq.q8": "OpenCodeはオープンソースですか?",
+ "home.faq.a8.p1": "はい、OpenCodeは完全にオープンソースです。ソースコードは",
+ "home.faq.a8.p2": "の",
+ "home.faq.a8.mitLicense": "MITライセンス",
+ "home.faq.a8.p3":
+ "のもとで公開されており、誰でも使用、変更、開発への参加ができます。コミュニティの誰でもissueを起こしたり、pull requestを送ったり、機能を拡張できます。",
+
+ "home.zenCta.title": "コーディングエージェント向けの信頼できる最適化モデル",
+ "home.zenCta.body":
+ "Zenは、OpenCodeがコーディングエージェント向けにテスト・ベンチマーク済みのAIモデルを厳選して提供します。プロバイダー間の性能・品質のブレを気にせず、検証済みのモデルを利用できます。",
+ "home.zenCta.link": "Zenについて知る",
+
+ "zen.title": "OpenCode Zen | コーディングエージェント向けの信頼できる最適化モデル",
+ "zen.hero.title": "コーディングエージェント向けの信頼できる最適化モデル",
+ "zen.hero.body":
+ "Zenは、OpenCodeがコーディングエージェント向けにテスト・ベンチマーク済みのAIモデルを厳選して提供します。プロバイダー間の性能・品質のブレを気にせず、検証済みのモデルを利用できます。",
+
+ "zen.faq.q1": "OpenCode Zenとは?",
+ "zen.faq.a1":
+ "Zenは、OpenCodeのチームが作成した、コーディングエージェント向けにテスト・ベンチマークされたAIモデルの厳選セットです。",
+ "zen.faq.q2": "Zenはなぜ精度が高いのですか?",
+ "zen.faq.a2":
+ "Zenはコーディングエージェント向けにテスト・ベンチマークされたモデルだけを提供します。ステーキを切るのにバターナイフを使わないように、コーディングには品質の低いモデルを使わないでください。",
+ "zen.faq.q3": "Zenは安いですか?",
+ "zen.faq.a3":
+ "Zenは営利目的ではありません。Zenはモデル提供元のコストをそのままあなたに渡します。Zenの利用が増えるほど、OpenCodeはより良いレートを交渉し、その分をあなたに還元できます。",
+ "zen.faq.q4": "Zenの料金は?",
+ "zen.faq.a4.p1.beforePricing": "Zenは",
+ "zen.faq.a4.p1.pricingLink": "リクエスト単位で課金",
+ "zen.faq.a4.p1.afterPricing": "し、マークアップはありません。つまり、モデル提供元の請求額をそのまま支払います。",
+ "zen.faq.a4.p2.beforeAccount": "総コストは利用量に依存し、月次の支出上限を",
+ "zen.faq.a4.p2.accountLink": "アカウント",
+ "zen.faq.a4.p3": "コストを賄うために、OpenCodeは$20の残高チャージあたり$1.23の小さな決済手数料のみを追加します。",
+ "zen.faq.q5": "データとプライバシーは?",
+ "zen.faq.a5.beforeExceptions":
+ "Zenのモデルはすべて米国でホストされています。プロバイダーはゼロ保持ポリシーを守り、データをモデル学習に使用しません(",
+ "zen.faq.a5.exceptionsLink": "以下の例外",
+ "zen.faq.q6": "支出上限を設定できますか?",
+ "zen.faq.a6": "はい、アカウントで月次の支出上限を設定できます。",
+ "zen.faq.q7": "キャンセルできますか?",
+ "zen.faq.a7": "はい、いつでも請求を無効化し、残りの残高を利用できます。",
+ "zen.faq.q8": "他のコーディングエージェントでもZenを使えますか?",
+ "zen.faq.a8":
+ "ZenはOpenCodeとの相性が良いですが、どのエージェントでもZenを利用できます。お使いのコーディングエージェントのセットアップ手順に従ってください。",
+
+ "zen.cta.start": "Zenをはじめる",
+ "zen.pricing.title": "$20の従量課金制残高を追加",
+ "zen.pricing.fee": "(+$1.23 カード処理手数料)",
+ "zen.pricing.body":
+ "任意のエージェントと一緒に使用できます。毎月の支出制限を設定できます。いつでもキャンセルできます。",
+ "zen.problem.title": "Zenはどのような問題を解決していますか?",
+ "zen.problem.body":
+ "利用可能なモデルは非常に多くありますが、コーディングエージェントで適切に機能するモデルはほんのわずかです。ほとんどのプロバイダーは、それらを異なる設定で提供し、結果も異なります。",
+ "zen.problem.subtitle": "OpenCodeユーザーだけでなく、すべての人を対象にこの問題を修正しています。",
+ "zen.problem.item1": "選択したモデルをテストし、チームに相談する",
+ "zen.problem.item2": "プロバイダーと連携して適切に提供されるようにする",
+ "zen.problem.item3": "私たちが推奨するすべてのモデルとプロバイダーの組み合わせをベンチマークする",
+ "zen.how.title": "Zenの仕組み",
+ "zen.how.body": "ZenをOpenCodeとともに使用することをお勧めしますが、Zenはどのエージェントでも使用できます。",
+ "zen.how.step1.title": "サインアップして$20の残高を追加",
+ "zen.how.step1.beforeLink": "",
+ "zen.how.step1.link": "セットアップ手順",
+ "zen.how.step2.title": "透明性のある価格設定でZenを使用する",
+ "zen.how.step2.link": "リクエストごとに支払う",
+ "zen.how.step2.afterLink": "(マークアップなし)",
+ "zen.how.step3.title": "自動チャージ",
+ "zen.how.step3.body": "残高が$5に達すると、自動的に$20が追加されます",
+ "zen.privacy.title": "あなたのプライバシーは私たちにとって重要です",
+ "zen.privacy.beforeExceptions":
+ "すべてのZenモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(",
+ "zen.privacy.exceptionsLink": "以下の例外",
+
+ "go.title": "OpenCode Go | すべての人のための低価格なコーディングモデル",
+ "go.meta.description":
+ "Goは最初の月$5、その後$10/月で、GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flashに対して5時間のゆとりあるリクエスト上限があります。",
+ "go.hero.title": "すべての人のための低価格なコーディングモデル",
+ "go.hero.body":
+ "Goは、世界中のプログラマーにエージェント型コーディングをもたらします。最も高性能なオープンソースモデルへの十分な制限と安定したアクセスを提供し、コストや可用性を気にすることなく強力なエージェントで構築できます。",
+
+ "go.cta.start": "Goを購読する",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Goを購読する",
+ "go.cta.price": "$10/月",
+ "go.cta.promo": "初月 $5",
+ "go.pricing.body":
+ "どのエージェントでも使えます。最初の月$5、その後$10/月。必要に応じてクレジットを追加。いつでもキャンセルできます。",
+ "go.graph.free": "無料",
+ "go.graph.freePill": "Big Pickleと無料モデル",
+ "go.graph.go": "Go",
+ "go.graph.label": "5時間あたりのリクエスト数",
+ "go.graph.usageLimits": "利用制限",
+ "go.graph.tick": "{{n}}倍",
+ "go.graph.aria": "5時間あたりのリクエスト数: {{free}} 対 {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "元CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "は人生を変えるものでした。本当に迷う必要はありません。",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "元創業者, SEED, PM, Melt, Pop, Dapt, Cadmus, ViewPoint",
+ "go.testimonials.jay.quoteBefore": "チームの5人中4人が",
+ "go.testimonials.jay.quoteAfter": "の使用を気に入っています。",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "元Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "私は",
+ "go.testimonials.adam.quoteAfter": "をどれだけ推薦してもしきれません。真剣に、本当に良いです。",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "元デザイン責任者, Laravel",
+ "go.testimonials.david.quoteBefore": "",
+ "go.testimonials.david.quoteAfter":
+ "を使えば、すべてのモデルがテスト済みでコーディングエージェントに最適だと確信できます。",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "元インターン, Nvidia (4回)",
+ "go.testimonials.frank.quote": "まだNvidiaにいられたらよかったのに。",
+ "go.problem.title": "Goはどのような問題を解決していますか?",
+ "go.problem.body":
+ "私たちはOpenCodeの体験をできるだけ多くの人に届けることに注力しています。OpenCode Goは低価格のサブスクリプションで、最初の月は$5、その後は$10/月です。ゆとりある上限と、最も高性能なオープンソースモデルへの信頼できるアクセスを提供します。",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "低価格なサブスクリプション料金",
+ "go.problem.item2": "十分な制限と安定したアクセス",
+ "go.problem.item3": "できるだけ多くのプログラマーのために構築",
+ "go.problem.item4":
+ "GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flashを含む",
+ "go.how.title": "Goの仕組み",
+ "go.how.body": "Goは最初の月$5、その後$10/月で始まります。OpenCodeまたは任意のエージェントで使えます。",
+ "go.how.step1.title": "アカウントを作成",
+ "go.how.step1.beforeLink": "",
+ "go.how.step1.link": "セットアップ手順はこちら",
+ "go.how.step2.title": "Goを購読する",
+ "go.how.step2.link": "最初の月$5",
+ "go.how.step2.afterLink": "その後$10/月、ゆとりある上限付き",
+ "go.how.step3.title": "コーディングを開始",
+ "go.how.step3.body": "オープンソースモデルへの安定したアクセスで",
+ "go.privacy.title": "あなたのプライバシーは私たちにとって重要です",
+ "go.privacy.body":
+ "このプランは主に海外ユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。",
+ "go.privacy.contactAfter": "ご質問がございましたら。",
+ "go.privacy.beforeExceptions":
+ "Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(",
+ "go.privacy.exceptionsLink": "以下の例外",
+ "go.faq.q1": "OpenCode Goとは?",
+ "go.faq.a1":
+ "Goは、エージェント型コーディングのための有能なオープンソースモデルへの安定したアクセスを提供する低価格なサブスクリプションです。",
+ "go.faq.q2": "Goにはどのモデルが含まれますか?",
+ "go.faq.a2": "Go には、十分な利用上限と安定したアクセスを備えた、以下のモデルが含まれます。",
+ "go.faq.q3": "GoはZenと同じですか?",
+ "go.faq.a3":
+ "いいえ。Zenは従量課金制ですが、Goは最初の月$5、その後$10/月で始まり、GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flashのオープンソースモデルに対して、ゆとりある上限と信頼できるアクセスを提供します。",
+ "go.faq.q4": "Goの料金は?",
+ "go.faq.a4.p1.beforePricing": "Goは",
+ "go.faq.a4.p1.pricingLink": "最初の月$5",
+ "go.faq.a4.p1.afterPricing": "その後$10/月、ゆとりある上限付き。",
+ "go.faq.a4.p2.beforeAccount": "管理画面:",
+ "go.faq.a4.p2.accountLink": "アカウント",
+ "go.faq.a4.p3": "いつでもキャンセル可能です。",
+ "go.faq.q5": "データとプライバシーは?",
+ "go.faq.a5.body":
+ "このプランは主に海外ユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。プロバイダーはゼロ保持ポリシーに従い、お客様のデータをモデルのトレーニングに使用しません。",
+ "go.faq.a5.beforeExceptions":
+ "Goのモデルは米国でホストされています。プロバイダーはゼロ保持ポリシーに従い、モデルのトレーニングにデータを使用しません(",
+ "go.faq.a5.exceptionsLink": "以下の例外",
+ "go.faq.q6": "クレジットをチャージできますか?",
+ "go.faq.a6": "利用枠を追加したい場合は、アカウントでクレジットをチャージできます。",
+ "go.faq.q7": "キャンセルできますか?",
+ "go.faq.a7": "はい、いつでもキャンセル可能です。",
+ "go.faq.q8": "他のコーディングエージェントでGoを使えますか?",
+ "go.faq.a8":
+ "はい、Goは任意のエージェントで使用できます。お使いのコーディングエージェントのセットアップ手順に従ってください。",
+
+ "go.faq.q9": "無料モデルとGoの違いは何ですか?",
+ "go.faq.a9":
+ "無料モデルにはBig Pickleと、その時点で利用可能なプロモーションモデルが含まれ、1日200リクエストの制限があります。GoにはGLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro、DeepSeek V4 Flashが含まれ、ローリングウィンドウ(5時間、週間、月間)全体でより高いリクエスト制限が適用されます。これは概算で5時間あたり$12、週間$30、月間$60相当です(実際のリクエスト数はモデルと使用状況により異なります)。",
+
+ "zen.api.error.rateLimitExceeded": "レート制限を超えました。後でもう一度お試しください。",
+ "zen.api.error.modelNotSupported": "モデル {{model}} はサポートされていません",
+ "zen.api.error.modelFormatNotSupported": "フォーマット {{format}} ではモデル {{model}} はサポートされていません",
+ "zen.api.error.noProviderAvailable": "利用可能なプロバイダーがありません",
+ "zen.api.error.providerNotSupported": "プロバイダー {{provider}} はサポートされていません",
+ "zen.api.error.missingApiKey": "APIキーがありません。",
+ "zen.api.error.invalidApiKey": "無効なAPIキーです。",
+ "zen.api.error.subscriptionQuotaExceeded":
+ "サブスクリプションの制限を超えました。{{retryIn}} 後に再試行してください。",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "5時間の利用上限に達しました。{{retryIn}} 後にリセットされます。今すぐこのモデルの利用を続けるには、利用可能な残高からの利用を有効化してください: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "週間の利用上限に達しました。{{retryIn}} 後にリセットされます。今すぐこのモデルの利用を続けるには、利用可能な残高からの利用を有効化してください: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "月間の利用上限に達しました。{{retryIn}} 後にリセットされます。今すぐこのモデルの利用を続けるには、利用可能な残高からの利用を有効化してください: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "お支払い方法がありません。こちらからお支払い方法を追加してください: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "残高が不足しています。こちらから請求を管理してください: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "ワークスペースが月額の利用上限 ${{amount}} に達しました。こちらから上限を管理してください: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "月額の利用上限 ${{amount}} に達しました。こちらから上限を管理してください: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "モデルが無効です",
+ "zen.api.error.trialEnded":
+ "{{model}} の無料プロモーションは終了しました。OpenCode Go を購読するとモデルを引き続き使用できます - {{link}}",
+
+ "black.meta.title": "OpenCode Black | 世界最高峰のコーディングモデルすべてにアクセス",
+ "black.meta.description": "OpenCode Black サブスクリプションプランで、Claude、GPT、Gemini などにアクセス。",
+ "black.hero.title": "世界最高峰のコーディングモデルすべてにアクセス",
+ "black.hero.subtitle": "Claude、GPT、Gemini などを含む",
+ "black.title": "OpenCode Black | 料金",
+ "black.paused": "Blackプランの登録は一時的に停止しています。",
+ "black.plan.icon20": "Black 20 プラン",
+ "black.plan.icon100": "Black 100 プラン",
+ "black.plan.icon200": "Black 200 プラン",
+ "black.plan.multiplier100": "Black 20 の5倍の利用量",
+ "black.plan.multiplier200": "Black 20 の20倍の利用量",
+ "black.price.perMonth": "/月",
+ "black.price.perPersonBilledMonthly": "1人あたり / 月額請求",
+ "black.terms.1": "サブスクリプションはすぐには開始されません",
+ "black.terms.2": "ウェイトリストに追加され、まもなく有効化されます",
+ "black.terms.3": "サブスクリプションが有効化された時点でのみカードに請求されます",
+ "black.terms.4": "利用制限が適用されます。過度な自動化利用は早く制限に達する可能性があります",
+ "black.terms.5": "サブスクリプションは個人向けです。チーム利用はエンタープライズにお問い合わせください",
+ "black.terms.6": "将来的に制限が調整されたり、プランが廃止される可能性があります",
+ "black.terms.7": "サブスクリプションはいつでもキャンセル可能です",
+ "black.action.continue": "続ける",
+ "black.finePrint.beforeTerms": "表示価格には適用される税金は含まれていません",
+ "black.finePrint.terms": "利用規約",
+ "black.workspace.title": "OpenCode Black | ワークスペースの選択",
+ "black.workspace.selectPlan": "このプランのワークスペースを選択してください",
+ "black.workspace.name": "ワークスペース {{n}}",
+ "black.subscribe.title": "OpenCode Black を購読する",
+ "black.subscribe.paymentMethod": "支払い方法",
+ "black.subscribe.loadingPaymentForm": "支払いフォームを読み込み中...",
+ "black.subscribe.selectWorkspaceToContinue": "続けるにはワークスペースを選択してください",
+ "black.subscribe.failurePrefix": "おっと!",
+ "black.subscribe.error.generic": "エラーが発生しました",
+ "black.subscribe.error.invalidPlan": "無効なプランです",
+ "black.subscribe.error.workspaceRequired": "ワークスペースIDが必要です",
+ "black.subscribe.error.alreadySubscribed": "このワークスペースは既にサブスクリプションを持っています",
+ "black.subscribe.processing": "処理中...",
+ "black.subscribe.submit": "購読する ${{plan}}",
+ "black.subscribe.form.chargeNotice": "サブスクリプションが有効化された時点でのみ請求されます",
+ "black.subscribe.success.title": "OpenCode Black ウェイトリストに登録されました",
+ "black.subscribe.success.subscriptionPlan": "サブスクリプションプラン",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "金額",
+ "black.subscribe.success.amountValue": "${{plan}} / 月",
+ "black.subscribe.success.paymentMethod": "支払い方法",
+ "black.subscribe.success.dateJoined": "登録日",
+ "black.subscribe.success.chargeNotice": "サブスクリプションが有効化された時点でカードに請求されます",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "利用",
+ "workspace.nav.apiKeys": "APIキー",
+ "workspace.nav.members": "メンバー",
+ "workspace.nav.billing": "請求",
+ "workspace.nav.settings": "設定",
+
+ "workspace.home.banner.beforeLink": "コーディングエージェント向けに信頼性の高い最適化されたモデル。",
+ "workspace.lite.banner.beforeLink": "誰でも使える低コストコーディングモデル。",
+ "workspace.home.billing.loading": "読み込み中...",
+ "workspace.home.billing.enable": "課金を有効にする",
+ "workspace.home.billing.currentBalance": "現在の残高",
+
+ "workspace.newUser.feature.tested.title": "テスト・検証済みモデル",
+ "workspace.newUser.feature.tested.body":
+ "最高のパフォーマンスを保証するために、コーディングエージェントに特化したモデルのベンチマークとテストを行いました。",
+ "workspace.newUser.feature.quality.title": "最高品質",
+ "workspace.newUser.feature.quality.body":
+ "最適なパフォーマンスを実現するように構成されたモデルにアクセスします。ダウングレードや安価なプロバイダーへのルーティングはありません。",
+ "workspace.newUser.feature.lockin.title": "ロックインなし",
+ "workspace.newUser.feature.lockin.body":
+ "任意のコーディングエージェントでZenを使用でき、必要に応じていつでもOpenCodeを備えた他のプロバイダーを使用し続けることができます。",
+ "workspace.newUser.copyApiKey": "APIキーをコピー",
+ "workspace.newUser.copyKey": "キーをコピー",
+ "workspace.newUser.copied": "コピーしました!",
+ "workspace.newUser.step.enableBilling": "課金を有効にする",
+ "workspace.newUser.step.login.before": "実行",
+ "workspace.newUser.step.login.after": "してOpenCodeを選択",
+ "workspace.newUser.step.pasteKey": "APIキーを貼り付け",
+ "workspace.newUser.step.models.before": "OpenCodeを起動し実行",
+ "workspace.newUser.step.models.after": "してモデルを選択",
+
+ "workspace.models.title": "モデル",
+ "workspace.models.subtitle.beforeLink": "ワークスペースのメンバーがアクセスできるモデルを管理します。",
+ "workspace.models.table.model": "モデル",
+ "workspace.models.table.enabled": "有効",
+
+ "workspace.providers.title": "APIキーの設定",
+ "workspace.providers.subtitle": "AIプロバイダーの独自のAPIキーを設定します。",
+ "workspace.providers.placeholder": "{{provider}} APIキーを入力 ({{prefix}}...)",
+ "workspace.providers.configure": "設定",
+ "workspace.providers.edit": "編集",
+ "workspace.providers.delete": "削除",
+ "workspace.providers.saving": "保存中...",
+ "workspace.providers.save": "保存",
+ "workspace.providers.table.provider": "プロバイダー",
+ "workspace.providers.table.apiKey": "APIキー",
+
+ "workspace.usage.title": "利用履歴",
+ "workspace.usage.subtitle": "最近のAPIの使用状況とコスト。",
+ "workspace.usage.empty": "開始するには、最初のAPI呼び出しを行ってください。",
+ "workspace.usage.table.date": "日付",
+ "workspace.usage.table.model": "モデル",
+ "workspace.usage.table.input": "入力",
+ "workspace.usage.table.output": "出力",
+ "workspace.usage.table.cost": "コスト",
+ "workspace.usage.table.session": "セッション",
+ "workspace.usage.breakdown.input": "入力",
+ "workspace.usage.breakdown.cacheRead": "キャッシュ読み取り",
+ "workspace.usage.breakdown.cacheWrite": "キャッシュ書き込み",
+ "workspace.usage.breakdown.output": "出力",
+ "workspace.usage.breakdown.reasoning": "推論",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "コスト",
+ "workspace.cost.subtitle": "モデルごとの使用料金の内訳。",
+ "workspace.cost.allModels": "全モデル",
+ "workspace.cost.allKeys": "すべてのキー",
+ "workspace.cost.deletedSuffix": "(削除済み)",
+ "workspace.cost.empty": "選択した期間の使用状況データはありません。",
+ "workspace.cost.subscriptionShort": "サブ",
+
+ "workspace.keys.title": "APIキー",
+ "workspace.keys.subtitle": "OpenCodeサービスにアクセスするためのAPIキーを管理します。",
+ "workspace.keys.create": "APIキーの作成",
+ "workspace.keys.placeholder": "キー名を入力してください",
+ "workspace.keys.empty": "OpenCodeゲートウェイAPIキーを作成する",
+ "workspace.keys.table.name": "名前",
+ "workspace.keys.table.key": "キー",
+ "workspace.keys.table.createdBy": "作成者",
+ "workspace.keys.table.lastUsed": "最終利用",
+ "workspace.keys.copyApiKey": "APIキーをコピー",
+ "workspace.keys.delete": "削除",
+
+ "workspace.members.title": "メンバー",
+ "workspace.members.subtitle": "ワークスペースのメンバーとその権限を管理します。",
+ "workspace.members.invite": "メンバーを招待",
+ "workspace.members.inviting": "招待中...",
+ "workspace.members.beta.beforeLink": "ベータ期間中、チームはワークスペースを無料で利用できます。",
+ "workspace.members.form.invitee": "招待する人",
+ "workspace.members.form.emailPlaceholder": "メールアドレスを入力",
+ "workspace.members.form.role": "ロール",
+ "workspace.members.form.monthlyLimit": "月間支出上限",
+ "workspace.members.noLimit": "制限なし",
+ "workspace.members.noLimitLowercase": "制限なし",
+ "workspace.members.invited": "招待済み",
+ "workspace.members.edit": "編集",
+ "workspace.members.delete": "削除",
+ "workspace.members.saving": "保存中...",
+ "workspace.members.save": "保存",
+ "workspace.members.table.email": "メールアドレス",
+ "workspace.members.table.role": "ロール",
+ "workspace.members.table.monthLimit": "月間上限",
+ "workspace.members.role.admin": "管理者",
+ "workspace.members.role.adminDescription": "モデル、メンバー、請求を管理できます",
+ "workspace.members.role.member": "メンバー",
+ "workspace.members.role.memberDescription": "自分自身のAPIキーのみを生成できます",
+
+ "workspace.settings.title": "設定",
+ "workspace.settings.subtitle": "ワークスペース名と設定を更新します。",
+ "workspace.settings.workspaceName": "ワークスペース名",
+ "workspace.settings.defaultName": "デフォルト",
+ "workspace.settings.updating": "更新中...",
+ "workspace.settings.save": "保存",
+ "workspace.settings.edit": "編集",
+
+ "workspace.billing.title": "請求",
+ "workspace.billing.subtitle.beforeLink": "支払い方法を管理します。",
+ "workspace.billing.contactUs": "お問い合わせ",
+ "workspace.billing.subtitle.afterLink": "ご質問がございましたら。",
+ "workspace.billing.currentBalance": "現在の残高",
+ "workspace.billing.add": "$を追加",
+ "workspace.billing.enterAmount": "金額を入力",
+ "workspace.billing.loading": "読み込み中...",
+ "workspace.billing.addAction": "追加",
+ "workspace.billing.addBalance": "残高を追加",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Stripeと連携済み",
+ "workspace.billing.manage": "管理",
+ "workspace.billing.enable": "課金を有効にする",
+
+ "workspace.monthlyLimit.title": "月間上限",
+ "workspace.monthlyLimit.subtitle": "アカウントの月間使用制限を設定します。",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "設定中...",
+ "workspace.monthlyLimit.set": "設定",
+ "workspace.monthlyLimit.edit": "上限を編集",
+ "workspace.monthlyLimit.noLimit": "使用制限は設定されていません。",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "現在の使用状況(",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": ")は $",
+
+ "workspace.redeem.title": "クーポンを利用",
+ "workspace.redeem.subtitle": "クーポンコードを利用して、クレジットや特典を受け取ります。",
+ "workspace.redeem.placeholder": "クーポンコードを入力",
+ "workspace.redeem.redeem": "利用する",
+ "workspace.redeem.redeeming": "利用中...",
+ "workspace.redeem.success": "クーポンを利用しました。",
+
+ "workspace.reload.title": "自動チャージ",
+ "workspace.reload.disabled.before": "自動チャージは",
+ "workspace.reload.disabled.state": "無効",
+ "workspace.reload.disabled.after": "です。残高が少なくなったときに自動的にチャージするには有効にしてください。",
+ "workspace.reload.enabled.before": "自動チャージは",
+ "workspace.reload.enabled.state": "有効",
+ "workspace.reload.enabled.middle": "チャージします(",
+ "workspace.reload.processingFee": "手数料",
+ "workspace.reload.enabled.after": ")。残高が以下に達したとき:",
+ "workspace.reload.edit": "編集",
+ "workspace.reload.enable": "有効にする",
+ "workspace.reload.enableAutoReload": "自動チャージを有効にする",
+ "workspace.reload.reloadAmount": "チャージ額 $",
+ "workspace.reload.whenBalanceReaches": "残高が $ に達したとき",
+ "workspace.reload.saving": "保存中...",
+ "workspace.reload.save": "保存",
+ "workspace.reload.failedAt": "チャージ失敗:",
+ "workspace.reload.reason": "理由:",
+ "workspace.reload.updatePaymentMethod": "支払い方法を更新して、もう一度お試しください。",
+ "workspace.reload.retrying": "再試行中...",
+ "workspace.reload.retry": "再試行",
+ "workspace.reload.error.paymentFailed": "支払いに失敗しました。",
+
+ "workspace.payments.title": "支払い履歴",
+ "workspace.payments.subtitle": "最近の支払い取引。",
+ "workspace.payments.table.date": "日付",
+ "workspace.payments.table.paymentId": "支払いID",
+ "workspace.payments.table.amount": "金額",
+ "workspace.payments.table.receipt": "領収書",
+ "workspace.payments.type.credit": "クレジット",
+ "workspace.payments.type.subscription": "サブスクリプション",
+ "workspace.payments.view": "表示",
+
+ "workspace.black.loading": "読み込み中...",
+ "workspace.black.time.day": "日",
+ "workspace.black.time.days": "日",
+ "workspace.black.time.hour": "時間",
+ "workspace.black.time.hours": "時間",
+ "workspace.black.time.minute": "分",
+ "workspace.black.time.minutes": "分",
+ "workspace.black.time.fewSeconds": "数秒",
+ "workspace.black.subscription.title": "サブスクリプション",
+ "workspace.black.subscription.message": "あなたは OpenCode Black を月額 ${{plan}} で購読しています。",
+ "workspace.black.subscription.manage": "サブスクリプションの管理",
+ "workspace.black.subscription.rollingUsage": "5時間利用",
+ "workspace.black.subscription.weeklyUsage": "週間利用量",
+ "workspace.black.subscription.resetsIn": "リセットまで",
+ "workspace.black.subscription.useBalance": "利用限度額に達したら利用可能な残高を使用する",
+ "workspace.black.waitlist.title": "ウェイトリスト",
+ "workspace.black.waitlist.joined":
+ "あなたは月額 ${{plan}} の OpenCode Black プランのウェイトリストに登録されています。",
+ "workspace.black.waitlist.ready": "月額 ${{plan}} の OpenCode Black プランに登録する準備ができました。",
+ "workspace.black.waitlist.leave": "ウェイトリストから抜ける",
+ "workspace.black.waitlist.leaving": "処理中...",
+ "workspace.black.waitlist.left": "退会済み",
+ "workspace.black.waitlist.enroll": "登録する",
+ "workspace.black.waitlist.enrolling": "登録中...",
+ "workspace.black.waitlist.enrolled": "登録済み",
+ "workspace.black.waitlist.enrollNote":
+ "「登録する」をクリックすると、サブスクリプションがすぐに開始され、カードに請求されます。",
+
+ "workspace.lite.loading": "読み込み中...",
+ "workspace.lite.time.day": "日",
+ "workspace.lite.time.days": "日",
+ "workspace.lite.time.hour": "時間",
+ "workspace.lite.time.hours": "時間",
+ "workspace.lite.time.minute": "分",
+ "workspace.lite.time.minutes": "分",
+ "workspace.lite.time.fewSeconds": "数秒",
+ "workspace.lite.subscription.message": "あなたは OpenCode Go を購読しています。",
+ "workspace.lite.subscription.manage": "サブスクリプションの管理",
+ "workspace.lite.subscription.rollingUsage": "ローリング利用量",
+ "workspace.lite.subscription.weeklyUsage": "週間利用量",
+ "workspace.lite.subscription.monthlyUsage": "月間利用量",
+ "workspace.lite.subscription.resetsIn": "リセットまで",
+ "workspace.lite.subscription.useBalance": "利用限度額に達したら利用可能な残高を使用する",
+ "workspace.lite.subscription.selectProvider":
+ "Go モデルを使用するには、opencode の設定で「OpenCode Go」をプロバイダーとして選択してください。",
+ "workspace.lite.black.message":
+ "現在 OpenCode Black を購読中、またはウェイティングリストに登録されています。Go に切り替える場合は、先に登録を解除してください。",
+ "workspace.lite.other.message":
+ "このワークスペースの別のメンバーが既に OpenCode Go を購読しています。ワークスペースにつき1人のメンバーのみが購読できます。",
+ "workspace.lite.promo.description":
+ "OpenCode Goは{{price}}で始まり、その後は$10/月で、人気の高いオープンコーディングモデルへの安定したアクセスと余裕のある利用枠を提供します。",
+ "workspace.lite.promo.price": "初月$5",
+ "workspace.lite.promo.modelsTitle": "含まれるもの",
+ "workspace.lite.promo.footer":
+ "このプランは主にグローバルユーザー向けに設計されており、米国、EU、シンガポールでホストされたモデルにより安定したグローバルアクセスを提供します。料金と利用制限は、初期の利用状況やフィードバックに基づいて変更される可能性があります。",
+ "workspace.lite.promo.subscribe": "Goを購読する",
+ "workspace.lite.promo.subscribing": "リダイレクト中...",
+ "workspace.lite.promo.otherMethods": "その他の支払い方法",
+ "workspace.lite.promo.selectMethod": "支払い方法を選択",
+
+ "workspace.referral.copyLink": "リンクをコピー",
+ "workspace.referral.copied": "コピーしました",
+ "workspace.referral.overview.title": "友達を招待",
+ "workspace.referral.overview.subtitle": "友達がサブスクライブすると $5 を獲得。友達にも $5 が付与されます。",
+ "workspace.referral.instructions.share": "リファラルリンクをシェア",
+ "workspace.referral.instructions.subscribe": "友達が参加して Go にサブスクライブ",
+ "workspace.referral.instructions.claim": "二人とも $5 の利用クレジットを獲得し、Go の利用上限に充当できます",
+ "workspace.referral.rewards.title": "リファラル特典",
+ "workspace.referral.rewards.description": "利用可能なリファラルクレジットを Go の利用に適用します。",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} 件の特典を適用済み。",
+ "workspace.referral.rewards.empty": "リファラル特典はまだありません。",
+ "workspace.referral.table.reward": "特典",
+ "workspace.referral.table.referral": "説明",
+ "workspace.referral.table.date": "日付",
+ "workspace.referral.reward.description.inviter": "{{email}} を招待しました",
+ "workspace.referral.reward.description.invitee": "{{email}} に招待されました",
+ "workspace.referral.reward.action.subscribeUnlock": "サブスクライブしてアンロック",
+ "workspace.referral.reward.action.view": "特典を表示",
+ "workspace.referral.reward.action.applied": "特典を適用済み",
+ "workspace.referral.reward.source.pendingInviter": "友達のサブスクライブ待ち",
+ "workspace.referral.reward.source.pendingInvitee": "サブスクライブして特典をアンロック",
+ "workspace.referral.reward.source.available": "特典は適用可能です",
+ "workspace.referral.reward.source.applied": "特典を適用済み",
+ "workspace.referral.reward.status.applied": "特典を適用済み",
+ "workspace.referral.reward.status.pendingInviter": "サブスクライブしてアンロック",
+ "workspace.referral.reward.status.pendingInvitee": "サブスクライブしてアンロック",
+ "workspace.referral.apply.noGo": "サブスクライブしてアンロック",
+ "workspace.referral.apply.preview": "特典を表示",
+ "workspace.referral.apply.action": "適用",
+ "workspace.referral.apply.confirmTitle": "特典を適用",
+ "workspace.referral.apply.confirmBody": "{{amount}} を適用して、このワークスペースの現在の使用量を減らします。",
+ "workspace.referral.apply.confirmAction": "適用",
+
+ "download.title": "OpenCode | ダウンロード",
+ "download.meta.description": "OpenCode を macOS、Windows、Linux 向けにダウンロード",
+ "download.hero.title": "OpenCode をダウンロード",
+ "download.hero.subtitle": "macOS、Windows、Linux 向けベータ版を利用可能",
+ "download.hero.button": "{{os}} 向けダウンロード",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Extensions",
+ "download.section.integrations": "OpenCode Integrations",
+ "download.action.download": "ダウンロード",
+ "download.action.install": "インストール",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "必ずしもそうではありませんが、おそらく必要です。OpenCodeを有料プロバイダーに接続したい場合はAIサブスクリプションが必要ですが、",
+ "download.faq.a3.localLink": "ローカルモデル",
+ "download.faq.a3.afterLocal.beforeZen": "であれば無料で利用できます。ユーザーには",
+ "download.faq.a3.afterZen":
+ "の利用をお勧めしていますが、OpenCodeはOpenAI、Anthropic、xAIなどの主要なプロバイダーに対応しています。",
+
+ "download.faq.a5.p1": "OpenCodeは100%無料で利用できます。",
+ "download.faq.a5.p2.beforeZen":
+ "追加コストはモデルプロバイダーのサブスクリプションから発生します。OpenCodeはどのモデルプロバイダーでも利用できますが、",
+ "download.faq.a5.p2.afterZen": "の利用をおすすめします。",
+
+ "download.faq.a6.p1": "あなたのデータと情報は、OpenCodeで共有リンクを作成したときにのみ保存されます。",
+ "download.faq.a6.p2.beforeShare": "詳しくは",
+ "download.faq.a6.shareLink": "共有ページ",
+
+ "enterprise.title": "OpenCode | 組織向けエンタープライズソリューション",
+ "enterprise.meta.description": "エンタープライズソリューションについてOpenCodeに問い合わせる",
+ "enterprise.hero.title": "あなたのコードはあなたのもの",
+ "enterprise.hero.body1":
+ "OpenCodeは、データやコンテキストを一切保存せず、ライセンス制限や所有権の主張もなく、組織内で安全に動作します。チームでのトライアルから始め、SSOや社内AIゲートウェイと統合して組織全体に展開できます。",
+ "enterprise.hero.body2": "どのような支援ができるか、お聞かせください。",
+ "enterprise.form.name.label": "氏名",
+ "enterprise.form.name.placeholder": "ジェフ・ベゾス",
+ "enterprise.form.role.label": "役職",
+ "enterprise.form.role.placeholder": "会長",
+ "enterprise.form.company.label": "会社名",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "会社メールアドレス",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "電話番号",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "どのような課題を解決したいですか?",
+ "enterprise.form.message.placeholder": "これについて支援が必要です...",
+ "enterprise.form.send": "送信",
+ "enterprise.form.sending": "送信中...",
+ "enterprise.form.success": "送信しました。まもなくご連絡いたします。",
+ "enterprise.form.success.submitted": "フォームが正常に送信されました。",
+ "enterprise.form.error.allFieldsRequired": "すべての項目は必須です。",
+ "enterprise.form.error.invalidEmailFormat": "無効なメール形式です。",
+ "enterprise.form.error.internalServer": "内部サーバーエラー。",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "OpenCode Enterpriseとは?",
+ "enterprise.faq.a1":
+ "OpenCode Enterpriseは、コードとデータが決してインフラの外に出ないことを保証したい組織向けです。SSOや社内AIゲートウェイと統合する集中設定を使用することでこれを実現します。",
+ "enterprise.faq.q2": "OpenCode Enterpriseを始めるには?",
+ "enterprise.faq.a2":
+ "まずはチームでの社内トライアルから始めてください。OpenCodeはデフォルトでコードやコンテキストデータを保存しないため、簡単に始められます。その後、価格や導入オプションについてお問い合わせください。",
+ "enterprise.faq.q3": "エンタープライズ価格の仕組みは?",
+ "enterprise.faq.a3":
+ "シート単位(ユーザー数)でのエンタープライズ価格を提供します。独自のLLMゲートウェイをお持ちの場合、使用トークンに対する課金はありません。詳細は、組織の要件に基づいた見積もりのためにお問い合わせください。",
+ "enterprise.faq.q4": "OpenCode Enterpriseでデータは安全ですか?",
+ "enterprise.faq.a4":
+ "はい。OpenCodeはコードやコンテキストデータを保存しません。すべての処理はローカル、またはAIプロバイダーへの直接API呼び出しを通じて行われます。集中設定とSSO統合により、データは組織のインフラ内で安全に保たれます。",
+
+ "brand.title": "OpenCode | ブランド",
+ "brand.meta.description": "OpenCode ブランドガイドライン",
+ "brand.heading": "ブランドガイドライン",
+ "brand.subtitle": "OpenCodeブランドを扱うためのリソースと素材です。",
+ "brand.downloadAll": "すべての素材をダウンロード",
+
+ "changelog.title": "OpenCode | 変更履歴",
+ "changelog.meta.description": "OpenCode リリースノートと変更履歴",
+ "changelog.hero.title": "変更履歴",
+ "changelog.hero.subtitle": "OpenCodeの新しいアップデートと改善",
+ "changelog.empty": "変更履歴が見つかりませんでした。",
+ "changelog.viewJson": "JSONを表示",
+
+ "bench.list.title": "ベンチマーク",
+ "bench.list.heading": "ベンチマーク",
+ "bench.list.table.agent": "エージェント",
+ "bench.list.table.model": "モデル",
+ "bench.list.table.score": "スコア",
+ "bench.submission.error.allFieldsRequired": "すべての項目は必須です。",
+
+ "bench.detail.title": "ベンチマーク - {{task}}",
+ "bench.detail.notFound": "タスクが見つかりません",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "エージェント",
+ "bench.detail.labels.model": "モデル",
+ "bench.detail.labels.task": "タスク",
+ "bench.detail.labels.repo": "リポジトリ",
+ "bench.detail.labels.from": "From",
+ "bench.detail.labels.to": "To",
+ "bench.detail.labels.prompt": "プロンプト",
+ "bench.detail.labels.commit": "コミット",
+ "bench.detail.labels.averageDuration": "平均所要時間",
+ "bench.detail.labels.averageScore": "平均スコア",
+ "bench.detail.labels.averageCost": "平均コスト",
+ "bench.detail.labels.summary": "概要",
+ "bench.detail.labels.runs": "実行回数",
+ "bench.detail.labels.score": "スコア",
+ "bench.detail.labels.base": "ベース",
+ "bench.detail.labels.penalty": "ペナルティ",
+ "bench.detail.labels.weight": "重み",
+ "bench.detail.table.run": "実行",
+ "bench.detail.table.score": "スコア (ベース - ペナルティ)",
+ "bench.detail.table.cost": "コスト",
+ "bench.detail.table.duration": "所要時間",
+ "bench.detail.run.title": "実行 {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/ko.ts b/packages/console/app/src/i18n/ko.ts
new file mode 100644
index 0000000..542243c
--- /dev/null
+++ b/packages/console/app/src/i18n/ko.ts
@@ -0,0 +1,814 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "문서",
+ "nav.changelog": "변경 내역",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "엔터프라이즈",
+ "nav.zen": "Zen",
+ "nav.login": "로그인",
+ "nav.free": "다운로드",
+ "nav.home": "홈",
+ "nav.openMenu": "메뉴 열기",
+ "nav.getStartedFree": "무료로 시작하기",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "로고를 SVG로 복사",
+ "nav.context.copyWordmark": "워드마크를 SVG로 복사",
+ "nav.context.brandAssets": "브랜드 자산",
+
+ "footer.github": "GitHub",
+ "footer.docs": "문서",
+ "footer.changelog": "변경 내역",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "브랜드",
+ "legal.privacy": "개인정보처리방침",
+ "legal.terms": "이용약관",
+
+ "email.title": "새로운 제품 출시 소식을 가장 먼저 받아보세요",
+ "email.subtitle": "대기 명단에 등록하여 조기 이용 권한을 받으세요.",
+ "email.placeholder": "이메일 주소",
+ "email.subscribe": "구독",
+ "email.success": "거의 완료되었습니다. 이메일 수신함을 확인하고 주소를 인증해주세요.",
+
+ "notFound.title": "페이지를 찾을 수 없음 | OpenCode",
+ "notFound.heading": "404 - 페이지를 찾을 수 없음",
+ "notFound.home": "홈",
+ "notFound.docs": "문서",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode 밝은 로고",
+ "notFound.logoDarkAlt": "opencode 어두운 로고",
+
+ "user.logout": "로그아웃",
+
+ "auth.callback.error.codeMissing": "인증 코드를 찾을 수 없습니다.",
+
+ "workspace.select": "워크스페이스 선택",
+ "workspace.createNew": "+ 새 워크스페이스 만들기",
+ "workspace.modal.title": "새 워크스페이스 만들기",
+ "workspace.modal.placeholder": "워크스페이스 이름 입력",
+
+ "common.cancel": "취소",
+ "common.creating": "생성 중...",
+ "common.create": "만들기",
+
+ "common.videoUnsupported": "브라우저가 비디오 태그를 지원하지 않습니다.",
+ "common.figure": "그림 {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "더 알아보기",
+
+ "error.invalidPlan": "유효하지 않은 플랜",
+ "error.workspaceRequired": "워크스페이스 ID가 필요합니다",
+ "error.alreadySubscribed": "이 워크스페이스는 이미 구독 중입니다",
+ "error.limitRequired": "한도가 필요합니다.",
+ "error.monthlyLimitInvalid": "유효한 월 한도를 설정하세요.",
+ "error.workspaceNameRequired": "워크스페이스 이름이 필요합니다.",
+ "error.nameTooLong": "이름은 255자 이하여야 합니다.",
+ "error.emailRequired": "이메일이 필요합니다",
+ "error.roleRequired": "역할이 필요합니다",
+ "error.idRequired": "ID가 필요합니다",
+ "error.nameRequired": "이름이 필요합니다",
+ "error.providerRequired": "제공자가 필요합니다",
+ "error.apiKeyRequired": "API 키가 필요합니다",
+ "error.modelRequired": "모델이 필요합니다",
+ "error.reloadAmountMin": "충전 금액은 최소 ${{amount}}이어야 합니다",
+ "error.reloadTriggerMin": "잔액 트리거는 최소 ${{amount}}이어야 합니다",
+
+ "app.meta.description": "OpenCode - 오픈 소스 코딩 에이전트.",
+
+ "home.title": "OpenCode | 오픈 소스 AI 코딩 에이전트",
+
+ "temp.title": "OpenCode | 터미널을 위해 만들어진 AI 코딩 에이전트",
+ "temp.hero.title": "터미널을 위해 만들어진 AI 코딩 에이전트",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "시작하기",
+ "temp.feature.native.title": "네이티브 TUI",
+ "temp.feature.native.body": "반응형, 네이티브, 테마 적용 가능한 터미널 UI",
+ "temp.feature.zen.beforeLink": "OpenCode가 제공하는",
+ "temp.feature.zen.link": "엄선된 모델 목록",
+ "temp.feature.zen.afterLink": "",
+ "temp.feature.models.beforeLink": "로컬 모델을 포함하여",
+ "temp.feature.models.afterLink": "를 통해 75개 이상의 LLM 제공자 지원",
+ "temp.screenshot.caption": "tokyonight 테마가 적용된 OpenCode TUI",
+ "temp.screenshot.alt": "tokyonight 테마가 적용된 OpenCode TUI",
+ "temp.logoLightAlt": "opencode 밝은 로고",
+ "temp.logoDarkAlt": "opencode 어두운 로고",
+
+ "home.banner.badge": "신규",
+ "home.banner.text": "데스크톱 앱 베타 버전 출시",
+ "home.banner.platforms": "macOS, Windows, Linux 지원",
+ "home.banner.downloadNow": "지금 다운로드",
+ "home.banner.downloadBetaNow": "데스크톱 베타 다운로드",
+
+ "home.hero.title": "오픈 소스 AI 코딩 에이전트",
+ "home.hero.subtitle.a": "무료 모델이 포함되어 있으며, 어떤 제공자의 모델이든 연결 가능합니다.",
+ "home.hero.subtitle.b": "Claude, GPT, Gemini 등을 포함합니다.",
+
+ "home.install.ariaLabel": "설치 옵션",
+
+ "home.what.title": "OpenCode란 무엇인가요?",
+ "home.what.body":
+ "OpenCode는 터미널, IDE, 또는 데스크톱에서 코드를 작성할 수 있도록 도와주는 오픈 소스 에이전트입니다.",
+ "home.what.lsp.title": "LSP 지원",
+ "home.what.lsp.body": "LLM에 적합한 LSP를 자동으로 로드합니다",
+ "home.what.multiSession.title": "멀티 세션",
+ "home.what.multiSession.body": "동일한 프로젝트에서 여러 에이전트를 병렬로 실행하세요",
+ "home.what.shareLinks.title": "링크 공유",
+ "home.what.shareLinks.body": "참조나 디버깅을 위해 세션 링크를 공유하세요",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "GitHub로 로그인하여 Copilot 계정을 사용하세요",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "OpenAI로 로그인하여 ChatGPT Plus 또는 Pro 계정을 사용하세요",
+ "home.what.anyModel.title": "모든 모델",
+ "home.what.anyModel.body": "Models.dev를 통해 로컬 모델 포함 75개 이상의 LLM 제공자 지원",
+ "home.what.anyEditor.title": "모든 에디터",
+ "home.what.anyEditor.body": "터미널 인터페이스, 데스크톱 앱, IDE 확장 프로그램으로 사용 가능",
+ "home.what.readDocs": "문서 읽기",
+
+ "home.growth.title": "오픈 소스 AI 코딩 에이전트",
+ "home.growth.body":
+ "{{stars}} 개 이상의 GitHub 스타, {{contributors}} 명의 기여자, {{commits}} 개 이상의 커밋과 함께, OpenCode는 매달 {{monthlyUsers}} 명 이상의 개발자가 사용하고 신뢰합니다.",
+ "home.growth.githubStars": "GitHub 스타",
+ "home.growth.contributors": "기여자",
+ "home.growth.monthlyDevs": "월간 사용자",
+
+ "home.privacy.title": "프라이버시를 최우선으로 설계",
+ "home.privacy.body":
+ "OpenCode는 코드나 컨텍스트 데이터를 저장하지 않으므로, 프라이버시에 민감한 환경에서도 안전하게 작동합니다.",
+ "home.privacy.learnMore": "더 알아보기:",
+ "home.privacy.link": "프라이버시",
+
+ "home.faq.q1": "OpenCode란 무엇인가요?",
+ "home.faq.a1":
+ "OpenCode는 어떤 AI 모델로든 코드를 작성하고 실행할 수 있도록 도와주는 오픈 소스 에이전트입니다. 터미널 기반 인터페이스, 데스크톱 앱, 또는 IDE 확장 프로그램으로 사용할 수 있습니다.",
+ "home.faq.q2": "OpenCode는 어떻게 사용하나요?",
+ "home.faq.a2.before": "가장 쉬운 시작 방법은",
+ "home.faq.a2.link": "소개",
+ "home.faq.q3": "OpenCode를 사용하려면 별도의 AI 구독이 필요한가요?",
+ "home.faq.a3.p1": "꼭 그렇지는 않습니다. OpenCode에는 계정 없이도 사용할 수 있는 무료 모델 세트가 포함되어 있습니다.",
+ "home.faq.a3.p2.beforeZen": "이 외에도,",
+ "home.faq.a3.p2.afterZen": " 계정을 생성하여 인기 있는 코딩 모델들을 사용할 수 있습니다.",
+ "home.faq.a3.p3": "Zen 사용을 권장하지만, OpenCode는 OpenAI, Anthropic, xAI 등 모든 인기 제공자와도 작동합니다.",
+ "home.faq.a3.p4.beforeLocal": "또한",
+ "home.faq.a3.p4.localLink": "로컬 모델",
+ "home.faq.q4": "기존 AI 구독을 OpenCode에서 사용할 수 있나요?",
+ "home.faq.a4.p1":
+ "네, OpenCode는 모든 주요 제공자의 구독 플랜을 지원합니다. Claude Pro/Max, ChatGPT Plus/Pro, 또는 GitHub Copilot 구독을 사용할 수 있습니다.",
+ "home.faq.q5": "OpenCode는 터미널에서만 사용할 수 있나요?",
+ "home.faq.a5.beforeDesktop": "이제 아닙니다! OpenCode는 이제",
+ "home.faq.a5.desktop": "데스크톱",
+ "home.faq.a5.and": "및",
+ "home.faq.a5.web": "웹",
+ "home.faq.q6": "OpenCode 비용은 얼마인가요?",
+ "home.faq.a6":
+ "OpenCode는 100% 무료로 사용할 수 있습니다. 무료 모델 세트도 포함되어 있습니다. 다른 제공자를 연결할 경우 추가 비용이 발생할 수 있습니다.",
+ "home.faq.q7": "데이터와 프라이버시는 어떤가요?",
+ "home.faq.a7.p1": "데이터와 정보는 무료 모델을 사용하거나 공유 링크를 생성할 때만 저장됩니다.",
+ "home.faq.a7.p2.beforeModels": "더 알아보기:",
+ "home.faq.a7.p2.modelsLink": "모델",
+ "home.faq.a7.p2.and": "및",
+ "home.faq.a7.p2.shareLink": "공유 페이지",
+ "home.faq.q8": "OpenCode는 오픈 소스인가요?",
+ "home.faq.a8.p1": "네, OpenCode는 완전히 오픈 소스입니다. 소스 코드는",
+ "home.faq.a8.p2": "에 공개되어 있으며,",
+ "home.faq.a8.mitLicense": "MIT 라이선스",
+ "home.faq.a8.p3":
+ "를 따릅니다. 즉, 누구나 사용, 수정 또는 개발에 기여할 수 있습니다. 커뮤니티의 누구든지 이슈를 등록하고, 풀 리퀘스트를 제출하고, 기능을 확장할 수 있습니다.",
+
+ "home.zenCta.title": "코딩 에이전트를 위한 신뢰할 수 있고 최적화된 모델",
+ "home.zenCta.body":
+ "Zen은 OpenCode가 코딩 에이전트를 위해 특별히 테스트하고 벤치마킹한 엄선된 AI 모델 세트에 대한 액세스를 제공합니다. 제공자 간의 일관되지 않은 성능과 품질에 대해 걱정할 필요 없이, 검증된 모델을 사용하세요.",
+ "home.zenCta.link": "Zen 알아보기",
+
+ "zen.title": "OpenCode Zen | 코딩 에이전트를 위한 신뢰할 수 있고 최적화된 모델 세트",
+ "zen.hero.title": "코딩 에이전트를 위한 신뢰할 수 있고 최적화된 모델",
+ "zen.hero.body":
+ "Zen은 OpenCode가 코딩 에이전트를 위해 특별히 테스트하고 벤치마킹한 엄선된 AI 모델 세트에 대한 액세스를 제공합니다. 일관되지 않은 성능과 품질에 대해 걱정할 필요 없이, 검증된 모델을 사용하세요.",
+
+ "zen.faq.q1": "OpenCode Zen이란 무엇인가요?",
+ "zen.faq.a1": "Zen은 OpenCode 팀이 코딩 에이전트를 위해 테스트하고 벤치마킹한 엄선된 AI 모델 세트입니다.",
+ "zen.faq.q2": "Zen은 왜 더 정확한가요?",
+ "zen.faq.a2":
+ "Zen은 코딩 에이전트를 위해 특별히 테스트되고 벤치마킹된 모델만 제공합니다. 스테이크를 버터 나이프로 자르지 않듯이, 코딩에 품질이 낮은 모델을 사용하지 마세요.",
+ "zen.faq.q3": "Zen이 더 저렴한가요?",
+ "zen.faq.a3":
+ "Zen은 영리를 목적으로 하지 않습니다. Zen은 모델 제공자의 비용을 사용자에게 그대로 전달합니다. Zen 사용량이 늘어날수록 OpenCode는 더 좋은 요율을 협상하여 그 혜택을 사용자에게 돌려드릴 수 있습니다.",
+ "zen.faq.q4": "Zen 비용은 얼마인가요?",
+ "zen.faq.a4.p1.beforePricing": "Zen은",
+ "zen.faq.a4.p1.pricingLink": "요청당 비용을 청구하며",
+ "zen.faq.a4.p1.afterPricing": ", 마크업이 0이므로 모델 제공자가 청구하는 금액 그대로 지불하게 됩니다.",
+ "zen.faq.a4.p2.beforeAccount": "총 비용은 사용량에 따라 달라지며, 월간 지출 한도를",
+ "zen.faq.a4.p2.accountLink": "계정",
+ "zen.faq.a4.p3": "비용을 충당하기 위해 OpenCode는 $20 잔액 충전 시 $1.23의 소액 결제 처리 수수료만 추가합니다.",
+ "zen.faq.q5": "데이터와 프라이버시는 어떤가요?",
+ "zen.faq.a5.beforeExceptions":
+ "모든 Zen 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지(zero-retention) 정책을 따르며, 모델 학습에 귀하의 데이터를 사용하지 않습니다. 단,",
+ "zen.faq.a5.exceptionsLink": "다음 예외",
+ "zen.faq.q6": "지출 한도를 설정할 수 있나요?",
+ "zen.faq.a6": "네, 계정에서 월간 지출 한도를 설정할 수 있습니다.",
+ "zen.faq.q7": "취소할 수 있나요?",
+ "zen.faq.a7": "네, 언제든지 결제를 비활성화하고 남은 잔액을 사용할 수 있습니다.",
+ "zen.faq.q8": "다른 코딩 에이전트와 Zen을 사용할 수 있나요?",
+ "zen.faq.a8":
+ "Zen은 OpenCode와 훌륭하게 작동하지만, 어떤 에이전트와도 Zen을 사용할 수 있습니다. 선호하는 코딩 에이전트의 설정 지침을 따르세요.",
+
+ "zen.cta.start": "Zen 시작하기",
+ "zen.pricing.title": "$20 선불 잔액 추가",
+ "zen.pricing.fee": "(+$1.23 카드 처리 수수료)",
+ "zen.pricing.body": "모든 에이전트와 함께 사용하세요. 월간 지출 한도 설정 가능. 언제든지 취소 가능.",
+ "zen.problem.title": "Zen은 어떤 문제를 해결하나요?",
+ "zen.problem.body":
+ "사용 가능한 모델은 매우 많지만, 코딩 에이전트와 잘 작동하는 모델은 소수에 불과합니다. 대부분의 제공자들은 모델을 다르게 구성하여 결과가 제각각입니다.",
+ "zen.problem.subtitle": "우리는 OpenCode 사용자뿐만 아니라 모든 분들을 위해 이 문제를 해결하고 있습니다.",
+ "zen.problem.item1": "선별된 모델 테스트 및 팀 자문",
+ "zen.problem.item2": "제공자와 협력하여 올바른 모델 전달 보장",
+ "zen.problem.item3": "권장하는 모든 모델-제공자 조합 벤치마킹",
+ "zen.how.title": "Zen 작동 방식",
+ "zen.how.body": "OpenCode와 함께 사용하는 것을 권장하지만, Zen은 어떤 에이전트와도 사용할 수 있습니다.",
+ "zen.how.step1.title": "가입 및 $20 잔액 추가",
+ "zen.how.step1.beforeLink": "",
+ "zen.how.step1.link": "설정 지침",
+ "zen.how.step2.title": "투명한 가격으로 Zen 사용",
+ "zen.how.step2.link": "요청당 지불",
+ "zen.how.step2.afterLink": "(마크업 0)",
+ "zen.how.step3.title": "자동 충전",
+ "zen.how.step3.body": "잔액이 $5에 도달하면 자동으로 $20가 충전됩니다",
+ "zen.privacy.title": "귀하의 프라이버시는 우리에게 중요합니다",
+ "zen.privacy.beforeExceptions":
+ "모든 Zen 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,",
+ "zen.privacy.exceptionsLink": "다음 예외",
+
+ "go.title": "OpenCode Go | 모두를 위한 저비용 코딩 모델",
+ "go.meta.description":
+ "Go는 첫 달 $5, 이후 $10/월로 시작하며, GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash에 대해 넉넉한 5시간 요청 한도를 제공합니다.",
+ "go.hero.title": "모두를 위한 저비용 코딩 모델",
+ "go.hero.body":
+ "Go는 전 세계 프로그래머들에게 에이전트 코딩을 제공합니다. 가장 유능한 오픈 소스 모델에 대한 넉넉한 한도와 안정적인 액세스를 제공하므로, 비용이나 가용성 걱정 없이 강력한 에이전트로 빌드할 수 있습니다.",
+
+ "go.cta.start": "Go 구독하기",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Go 구독하기",
+ "go.cta.price": "$10/월",
+ "go.cta.promo": "첫 달 $5",
+ "go.pricing.body":
+ "어떤 에이전트와도 사용할 수 있습니다. 첫 달 $5, 이후 $10/월. 필요하면 크레딧을 충전하세요. 언제든지 취소할 수 있습니다.",
+ "go.graph.free": "무료",
+ "go.graph.freePill": "Big Pickle 및 무료 모델",
+ "go.graph.go": "Go",
+ "go.graph.label": "5시간당 요청 수",
+ "go.graph.usageLimits": "사용 한도",
+ "go.graph.tick": "{{n}}배",
+ "go.graph.aria": "5시간당 요청 수: {{free}} 대 {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "전 Terminal Products CEO",
+ "go.testimonials.dax.quoteAfter": "(은)는 삶을 변화시켰습니다. 정말 당연한 선택입니다.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "전 Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, ViewPoint",
+ "go.testimonials.jay.quoteBefore": "우리 팀 5명 중 4명이",
+ "go.testimonials.jay.quoteAfter": " 사용을 정말 좋아합니다.",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "전 AWS Hero",
+ "go.testimonials.adam.quoteBefore": "저는",
+ "go.testimonials.adam.quoteAfter": "를(을) 아무리 추천해도 부족합니다. 진심으로 정말 좋습니다.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "전 Laravel 디자인 총괄",
+ "go.testimonials.david.quoteBefore": "",
+ "go.testimonials.david.quoteAfter":
+ "와(과) 함께라면 모든 모델이 테스트를 거쳤고 코딩 에이전트에 완벽하다는 것을 알 수 있습니다.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "전 Nvidia 인턴 (4회)",
+ "go.testimonials.frank.quote": "아직 Nvidia에 있었으면 좋았을 텐데요.",
+ "go.problem.title": "Go는 어떤 문제를 해결하나요?",
+ "go.problem.body":
+ "우리는 가능한 많은 사람들에게 OpenCode 경험을 제공하는 데 집중하고 있습니다. OpenCode Go는 저렴한 구독 서비스로, 첫 달 $5, 이후 $10/월입니다. 넉넉한 한도와 가장 뛰어난 오픈 소스 모델에 대한 안정적인 액세스를 제공합니다.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "저렴한 구독 가격",
+ "go.problem.item2": "넉넉한 한도와 안정적인 액세스",
+ "go.problem.item3": "가능한 한 많은 프로그래머를 위해 제작됨",
+ "go.problem.item4":
+ "GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash 포함",
+ "go.how.title": "Go 작동 방식",
+ "go.how.body": "Go는 첫 달 $5, 이후 $10/월로 시작합니다. OpenCode 또는 어떤 에이전트와도 함께 사용할 수 있습니다.",
+ "go.how.step1.title": "계정 생성",
+ "go.how.step1.beforeLink": "",
+ "go.how.step1.link": "설정 지침을 따르세요",
+ "go.how.step2.title": "Go 구독",
+ "go.how.step2.link": "첫 달 $5",
+ "go.how.step2.afterLink": "이후 $10/월, 넉넉한 한도 포함",
+ "go.how.step3.title": "코딩 시작",
+ "go.how.step3.body": "오픈 소스 모델에 대한 안정적인 액세스와 함께",
+ "go.privacy.title": "귀하의 프라이버시는 우리에게 중요합니다",
+ "go.privacy.body":
+ "이 플랜은 주로 글로벌 사용자를 위해 설계되었으며, 안정적인 글로벌 액세스를 위해 미국, EU, 싱가포르에 모델이 호스팅되어 있습니다.",
+ "go.privacy.contactAfter": "질문이 있으시면 언제든지 문의해 주세요.",
+ "go.privacy.beforeExceptions":
+ "Go 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,",
+ "go.privacy.exceptionsLink": "다음 예외",
+ "go.faq.q1": "OpenCode Go란 무엇인가요?",
+ "go.faq.a1": "Go는 에이전트 코딩을 위한 유능한 오픈 소스 모델에 대해 안정적인 액세스를 제공하는 저비용 구독입니다.",
+ "go.faq.q2": "Go에는 어떤 모델이 포함되나요?",
+ "go.faq.a2": "Go에는 넉넉한 한도와 안정적인 액세스를 제공하는 아래 모델이 포함됩니다.",
+ "go.faq.q3": "Go는 Zen과 같은가요?",
+ "go.faq.a3":
+ "아니요. Zen은 종량제인 반면, Go는 첫 달 $5, 이후 $10/월로 시작하며, GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash 오픈 소스 모델에 대한 넉넉한 한도와 안정적인 액세스를 제공합니다.",
+ "go.faq.q4": "Go 비용은 얼마인가요?",
+ "go.faq.a4.p1.beforePricing": "Go 비용은",
+ "go.faq.a4.p1.pricingLink": "첫 달 $5",
+ "go.faq.a4.p1.afterPricing": "이후 $10/월, 넉넉한 한도 포함.",
+ "go.faq.a4.p2.beforeAccount": "구독 관리는 다음에서 가능합니다:",
+ "go.faq.a4.p2.accountLink": "계정",
+ "go.faq.a4.p3": "언제든지 취소할 수 있습니다.",
+ "go.faq.q5": "데이터와 프라이버시는 어떤가요?",
+ "go.faq.a5.body":
+ "이 플랜은 주로 글로벌 사용자를 위해 설계되었으며, 안정적인 글로벌 액세스를 위해 미국, EU, 싱가포르에 모델이 호스팅되어 있습니다. 당사의 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다.",
+ "go.faq.a5.beforeExceptions":
+ "Go 모델은 미국에서 호스팅됩니다. 제공자들은 데이터 보존 금지 정책을 따르며 모델 학습에 데이터를 사용하지 않습니다. 단,",
+ "go.faq.a5.exceptionsLink": "다음 예외",
+ "go.faq.q6": "크레딧을 충전할 수 있나요?",
+ "go.faq.a6": "사용량이 더 필요한 경우 계정에서 크레딧을 충전할 수 있습니다.",
+ "go.faq.q7": "취소할 수 있나요?",
+ "go.faq.a7": "네, 언제든지 취소할 수 있습니다.",
+ "go.faq.q8": "다른 코딩 에이전트와 Go를 사용할 수 있나요?",
+ "go.faq.a8": "네, Go는 어떤 에이전트와도 사용할 수 있습니다. 선호하는 코딩 에이전트의 설정 지침을 따르세요.",
+
+ "go.faq.q9": "무료 모델과 Go의 차이점은 무엇인가요?",
+ "go.faq.a9":
+ "무료 모델에는 Big Pickle과 당시 사용 가능한 프로모션 모델이 포함되며, 하루 200회 요청 할당량이 적용됩니다. Go는 GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, DeepSeek V4 Flash를 포함하며, 롤링 윈도우(5시간, 주간, 월간)에 걸쳐 더 높은 요청 할당량을 적용합니다. 이는 대략 5시간당 $12, 주당 $30, 월 $60에 해당합니다(실제 요청 수는 모델 및 사용량에 따라 다름).",
+
+ "zen.api.error.rateLimitExceeded": "속도 제한을 초과했습니다. 나중에 다시 시도해 주세요.",
+ "zen.api.error.modelNotSupported": "{{model}} 모델은 지원되지 않습니다",
+ "zen.api.error.modelFormatNotSupported": "{{model}} 모델은 {{format}} 형식에 대해 지원되지 않습니다",
+ "zen.api.error.noProviderAvailable": "사용 가능한 제공자가 없습니다",
+ "zen.api.error.providerNotSupported": "{{provider}} 제공자는 지원되지 않습니다",
+ "zen.api.error.missingApiKey": "API 키가 누락되었습니다.",
+ "zen.api.error.invalidApiKey": "유효하지 않은 API 키입니다.",
+ "zen.api.error.subscriptionQuotaExceeded": "구독 할당량을 초과했습니다. {{retryIn}} 후 다시 시도해 주세요.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "5시간 사용 한도에 도달했습니다. {{retryIn}} 후 초기화됩니다. 이 모델을 지금 계속 사용하려면 사용 가능한 잔액에서 사용을 활성화하세요: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "주간 사용 한도에 도달했습니다. {{retryIn}} 후 초기화됩니다. 이 모델을 지금 계속 사용하려면 사용 가능한 잔액에서 사용을 활성화하세요: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "월간 사용 한도에 도달했습니다. {{retryIn}} 후 초기화됩니다. 이 모델을 지금 계속 사용하려면 사용 가능한 잔액에서 사용을 활성화하세요: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "결제 수단이 없습니다. 결제 수단을 추가하세요: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "잔액이 부족합니다. 결제 관리를 여기서 하세요: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "워크스페이스의 월간 지출 한도인 ${{amount}}에 도달했습니다. 한도 관리를 여기서 하세요: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "월간 지출 한도인 ${{amount}}에 도달했습니다. 한도 관리를 여기서 하세요: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "모델이 비활성화되었습니다",
+ "zen.api.error.trialEnded":
+ "{{model}}의 무료 프로모션이 종료되었습니다. OpenCode Go를 구독하면 모델을 계속 사용할 수 있습니다 - {{link}}",
+
+ "black.meta.title": "OpenCode Black | 세계 최고의 코딩 모델에 액세스하세요",
+ "black.meta.description": "OpenCode Black 구독 플랜으로 Claude, GPT, Gemini 등에 액세스하세요.",
+ "black.hero.title": "세계 최고의 코딩 모델에 액세스하세요",
+ "black.hero.subtitle": "Claude, GPT, Gemini 등 포함",
+ "black.title": "OpenCode Black | 가격",
+ "black.paused": "Black 플랜 등록이 일시적으로 중단되었습니다.",
+ "black.plan.icon20": "Black 20 플랜",
+ "black.plan.icon100": "Black 100 플랜",
+ "black.plan.icon200": "Black 200 플랜",
+ "black.plan.multiplier100": "Black 20보다 5배 더 많은 사용량",
+ "black.plan.multiplier200": "Black 20보다 20배 더 많은 사용량",
+ "black.price.perMonth": "월",
+ "black.price.perPersonBilledMonthly": "인당 / 월 청구",
+ "black.terms.1": "구독이 즉시 시작되지 않습니다",
+ "black.terms.2": "대기 명단에 추가되며 곧 활성화됩니다",
+ "black.terms.3": "구독이 활성화될 때만 카드가 청구됩니다",
+ "black.terms.4": "사용량 제한이 적용되며, 과도한 자동화 사용 시 제한에 더 빨리 도달할 수 있습니다",
+ "black.terms.5": "구독은 개인용이며, 팀용은 엔터프라이즈에 문의하세요",
+ "black.terms.6": "향후 제한이 조정되거나 플랜이 중단될 수 있습니다",
+ "black.terms.7": "언제든지 구독을 취소할 수 있습니다",
+ "black.action.continue": "계속",
+ "black.finePrint.beforeTerms": "표시된 가격에는 해당 세금이 포함되어 있지 않습니다",
+ "black.finePrint.terms": "서비스 약관",
+ "black.workspace.title": "OpenCode Black | 워크스페이스 선택",
+ "black.workspace.selectPlan": "이 플랜을 사용할 워크스페이스를 선택하세요",
+ "black.workspace.name": "워크스페이스 {{n}}",
+ "black.subscribe.title": "OpenCode Black 구독하기",
+ "black.subscribe.paymentMethod": "결제 수단",
+ "black.subscribe.loadingPaymentForm": "결제 양식 로드 중...",
+ "black.subscribe.selectWorkspaceToContinue": "계속하려면 워크스페이스를 선택하세요",
+ "black.subscribe.failurePrefix": "이런!",
+ "black.subscribe.error.generic": "오류가 발생했습니다",
+ "black.subscribe.error.invalidPlan": "유효하지 않은 플랜",
+ "black.subscribe.error.workspaceRequired": "워크스페이스 ID가 필요합니다",
+ "black.subscribe.error.alreadySubscribed": "이 워크스페이스는 이미 구독 중입니다",
+ "black.subscribe.processing": "처리 중...",
+ "black.subscribe.submit": "${{plan}} 구독하기",
+ "black.subscribe.form.chargeNotice": "구독이 활성화될 때만 청구됩니다",
+ "black.subscribe.success.title": "OpenCode Black 대기 명단에 등록되었습니다",
+ "black.subscribe.success.subscriptionPlan": "구독 플랜",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "금액",
+ "black.subscribe.success.amountValue": "월 ${{plan}}",
+ "black.subscribe.success.paymentMethod": "결제 수단",
+ "black.subscribe.success.dateJoined": "가입일",
+ "black.subscribe.success.chargeNotice": "구독이 활성화되면 카드에 청구됩니다",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "사용량",
+ "workspace.nav.apiKeys": "API 키",
+ "workspace.nav.members": "멤버",
+ "workspace.nav.billing": "결제",
+ "workspace.nav.settings": "설정",
+
+ "workspace.home.banner.beforeLink": "코딩 에이전트를 위한 신뢰할 수 있고 최적화된 모델.",
+ "workspace.lite.banner.beforeLink": "모두를 위한 저비용 코딩 모델.",
+ "workspace.home.billing.loading": "로드 중...",
+ "workspace.home.billing.enable": "결제 활성화",
+ "workspace.home.billing.currentBalance": "현재 잔액",
+
+ "workspace.newUser.feature.tested.title": "테스트 및 검증된 모델",
+ "workspace.newUser.feature.tested.body":
+ "최고의 성능을 보장하기 위해 코딩 에이전트용 모델을 구체적으로 벤치마킹하고 테스트했습니다.",
+ "workspace.newUser.feature.quality.title": "최고 품질",
+ "workspace.newUser.feature.quality.body":
+ "최적의 성능을 위해 구성된 모델에 액세스하세요 - 다운그레이드나 저렴한 제공자로 라우팅되지 않습니다.",
+ "workspace.newUser.feature.lockin.title": "락인(Lock-in) 없음",
+ "workspace.newUser.feature.lockin.body":
+ "Zen을 어떤 코딩 에이전트와도 함께 사용할 수 있으며, 원할 때 언제든지 OpenCode와 함께 다른 제공자를 계속 사용할 수 있습니다.",
+ "workspace.newUser.copyApiKey": "API 키 복사",
+ "workspace.newUser.copyKey": "키 복사",
+ "workspace.newUser.copied": "복사됨!",
+ "workspace.newUser.step.enableBilling": "결제 활성화",
+ "workspace.newUser.step.login.before": "실행",
+ "workspace.newUser.step.login.after": "후 OpenCode 선택",
+ "workspace.newUser.step.pasteKey": "API 키 붙여넣기",
+ "workspace.newUser.step.models.before": "OpenCode를 시작하고 실행",
+ "workspace.newUser.step.models.after": "하여 모델 선택",
+
+ "workspace.models.title": "모델",
+ "workspace.models.subtitle.beforeLink": "워크스페이스 멤버가 액세스할 수 있는 모델을 관리합니다.",
+ "workspace.models.table.model": "모델",
+ "workspace.models.table.enabled": "활성화됨",
+
+ "workspace.providers.title": "나만의 키 가져오기 (BYOK)",
+ "workspace.providers.subtitle": "AI 제공자의 자체 API 키를 구성하세요.",
+ "workspace.providers.placeholder": "{{provider}} API 키 입력 ({{prefix}}...)",
+ "workspace.providers.configure": "구성",
+ "workspace.providers.edit": "편집",
+ "workspace.providers.delete": "삭제",
+ "workspace.providers.saving": "저장 중...",
+ "workspace.providers.save": "저장",
+ "workspace.providers.table.provider": "제공자",
+ "workspace.providers.table.apiKey": "API 키",
+
+ "workspace.usage.title": "사용 내역",
+ "workspace.usage.subtitle": "최근 API 사용량 및 비용.",
+ "workspace.usage.empty": "시작하려면 첫 API 호출을 해보세요.",
+ "workspace.usage.table.date": "날짜",
+ "workspace.usage.table.model": "모델",
+ "workspace.usage.table.input": "입력",
+ "workspace.usage.table.output": "출력",
+ "workspace.usage.table.cost": "비용",
+ "workspace.usage.table.session": "세션",
+ "workspace.usage.breakdown.input": "입력",
+ "workspace.usage.breakdown.cacheRead": "캐시 읽기",
+ "workspace.usage.breakdown.cacheWrite": "캐시 쓰기",
+ "workspace.usage.breakdown.output": "출력",
+ "workspace.usage.breakdown.reasoning": "추론",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "비용",
+ "workspace.cost.subtitle": "모델별 사용 비용 내역.",
+ "workspace.cost.allModels": "모든 모델",
+ "workspace.cost.allKeys": "모든 키",
+ "workspace.cost.deletedSuffix": "(삭제됨)",
+ "workspace.cost.empty": "선택한 기간에 사용 데이터가 없습니다.",
+ "workspace.cost.subscriptionShort": "구독",
+
+ "workspace.keys.title": "API 키",
+ "workspace.keys.subtitle": "OpenCode 서비스 액세스를 위한 API 키를 관리하세요.",
+ "workspace.keys.create": "API 키 생성",
+ "workspace.keys.placeholder": "키 이름 입력",
+ "workspace.keys.empty": "OpenCode 게이트웨이 API 키 생성",
+ "workspace.keys.table.name": "이름",
+ "workspace.keys.table.key": "키",
+ "workspace.keys.table.createdBy": "생성자",
+ "workspace.keys.table.lastUsed": "마지막 사용",
+ "workspace.keys.copyApiKey": "API 키 복사",
+ "workspace.keys.delete": "삭제",
+
+ "workspace.members.title": "멤버",
+ "workspace.members.subtitle": "워크스페이스 멤버 및 권한을 관리합니다.",
+ "workspace.members.invite": "멤버 초대",
+ "workspace.members.inviting": "초대 중...",
+ "workspace.members.beta.beforeLink": "베타 기간 동안 팀 워크스페이스는 무료입니다.",
+ "workspace.members.form.invitee": "초대받는 사람",
+ "workspace.members.form.emailPlaceholder": "이메일 입력",
+ "workspace.members.form.role": "역할",
+ "workspace.members.form.monthlyLimit": "월간 지출 한도",
+ "workspace.members.noLimit": "제한 없음",
+ "workspace.members.noLimitLowercase": "제한 없음",
+ "workspace.members.invited": "초대됨",
+ "workspace.members.edit": "편집",
+ "workspace.members.delete": "삭제",
+ "workspace.members.saving": "저장 중...",
+ "workspace.members.save": "저장",
+ "workspace.members.table.email": "이메일",
+ "workspace.members.table.role": "역할",
+ "workspace.members.table.monthLimit": "월 한도",
+ "workspace.members.role.admin": "관리자",
+ "workspace.members.role.adminDescription": "모델, 멤버, 결제 관리 가능",
+ "workspace.members.role.member": "멤버",
+ "workspace.members.role.memberDescription": "자신의 API 키만 생성 가능",
+
+ "workspace.settings.title": "설정",
+ "workspace.settings.subtitle": "워크스페이스 이름과 환경설정을 업데이트하세요.",
+ "workspace.settings.workspaceName": "워크스페이스 이름",
+ "workspace.settings.defaultName": "기본",
+ "workspace.settings.updating": "업데이트 중...",
+ "workspace.settings.save": "저장",
+ "workspace.settings.edit": "편집",
+
+ "workspace.billing.title": "결제",
+ "workspace.billing.subtitle.beforeLink": "결제 수단을 관리하세요.",
+ "workspace.billing.contactUs": "문의하기",
+ "workspace.billing.subtitle.afterLink": "질문이 있으시면 언제든 연락주세요.",
+ "workspace.billing.currentBalance": "현재 잔액",
+ "workspace.billing.add": "추가 $",
+ "workspace.billing.enterAmount": "금액 입력",
+ "workspace.billing.loading": "로드 중...",
+ "workspace.billing.addAction": "추가",
+ "workspace.billing.addBalance": "잔액 추가",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Stripe에 연결됨",
+ "workspace.billing.manage": "관리",
+ "workspace.billing.enable": "결제 활성화",
+
+ "workspace.monthlyLimit.title": "월 한도",
+ "workspace.monthlyLimit.subtitle": "계정의 월간 사용 한도를 설정하세요.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "설정 중...",
+ "workspace.monthlyLimit.set": "설정",
+ "workspace.monthlyLimit.edit": "한도 편집",
+ "workspace.monthlyLimit.noLimit": "사용 한도가 설정되지 않았습니다.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "현재",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "사용량: $",
+
+ "workspace.redeem.title": "쿠폰 사용",
+ "workspace.redeem.subtitle": "쿠폰 코드를 사용해 크레딧이나 혜택을 받으세요.",
+ "workspace.redeem.placeholder": "쿠폰 코드를 입력하세요",
+ "workspace.redeem.redeem": "사용",
+ "workspace.redeem.redeeming": "사용 중...",
+ "workspace.redeem.success": "쿠폰을 성공적으로 사용했습니다.",
+
+ "workspace.reload.title": "자동 충전",
+ "workspace.reload.disabled.before": "자동 충전이",
+ "workspace.reload.disabled.state": "비활성화",
+ "workspace.reload.disabled.after": "되었습니다. 잔액이 부족할 때 자동으로 충전하려면 활성화하세요.",
+ "workspace.reload.enabled.before": "자동 충전이",
+ "workspace.reload.enabled.state": "활성화",
+ "workspace.reload.enabled.middle": "되었습니다. 잔액이",
+ "workspace.reload.processingFee": "처리 수수료",
+ "workspace.reload.enabled.after": "에 도달하면 충전합니다.",
+ "workspace.reload.edit": "편집",
+ "workspace.reload.enable": "활성화",
+ "workspace.reload.enableAutoReload": "자동 충전 활성화",
+ "workspace.reload.reloadAmount": "충전 금액 $",
+ "workspace.reload.whenBalanceReaches": "잔액이 다음 금액에 도달할 때 $",
+ "workspace.reload.saving": "저장 중...",
+ "workspace.reload.save": "저장",
+ "workspace.reload.failedAt": "충전 실패 시간:",
+ "workspace.reload.reason": "사유:",
+ "workspace.reload.updatePaymentMethod": "결제 수단을 업데이트하고 다시 시도해 주세요.",
+ "workspace.reload.retrying": "재시도 중...",
+ "workspace.reload.retry": "재시도",
+ "workspace.reload.error.paymentFailed": "결제에 실패했습니다.",
+
+ "workspace.payments.title": "결제 내역",
+ "workspace.payments.subtitle": "최근 결제 거래 내역입니다.",
+ "workspace.payments.table.date": "날짜",
+ "workspace.payments.table.paymentId": "결제 ID",
+ "workspace.payments.table.amount": "금액",
+ "workspace.payments.table.receipt": "영수증",
+ "workspace.payments.type.credit": "크레딧",
+ "workspace.payments.type.subscription": "구독",
+ "workspace.payments.view": "보기",
+
+ "workspace.black.loading": "로드 중...",
+ "workspace.black.time.day": "일",
+ "workspace.black.time.days": "일",
+ "workspace.black.time.hour": "시간",
+ "workspace.black.time.hours": "시간",
+ "workspace.black.time.minute": "분",
+ "workspace.black.time.minutes": "분",
+ "workspace.black.time.fewSeconds": "몇 초",
+ "workspace.black.subscription.title": "구독",
+ "workspace.black.subscription.message": "현재 월 ${{plan}} OpenCode Black 플랜을 구독 중입니다.",
+ "workspace.black.subscription.manage": "구독 관리",
+ "workspace.black.subscription.rollingUsage": "5시간 사용량",
+ "workspace.black.subscription.weeklyUsage": "주간 사용량",
+ "workspace.black.subscription.resetsIn": "초기화까지 남은 시간:",
+ "workspace.black.subscription.useBalance": "사용 한도 도달 후에는 보유 잔액 사용",
+ "workspace.black.waitlist.title": "대기 명단",
+ "workspace.black.waitlist.joined": "월 ${{plan}} OpenCode Black 플랜 대기 명단에 등록되었습니다.",
+ "workspace.black.waitlist.ready": "월 ${{plan}} OpenCode Black 플랜에 등록할 준비가 되었습니다.",
+ "workspace.black.waitlist.leave": "대기 명단에서 나가기",
+ "workspace.black.waitlist.leaving": "나가는 중...",
+ "workspace.black.waitlist.left": "나감",
+ "workspace.black.waitlist.enroll": "등록",
+ "workspace.black.waitlist.enrolling": "등록 중...",
+ "workspace.black.waitlist.enrolled": "등록됨",
+ "workspace.black.waitlist.enrollNote": "등록을 클릭하면 구독이 즉시 시작되며 카드에 요금이 청구됩니다.",
+
+ "workspace.lite.loading": "로드 중...",
+ "workspace.lite.time.day": "일",
+ "workspace.lite.time.days": "일",
+ "workspace.lite.time.hour": "시간",
+ "workspace.lite.time.hours": "시간",
+ "workspace.lite.time.minute": "분",
+ "workspace.lite.time.minutes": "분",
+ "workspace.lite.time.fewSeconds": "몇 초",
+ "workspace.lite.subscription.message": "현재 OpenCode Go를 구독 중입니다.",
+ "workspace.lite.subscription.manage": "구독 관리",
+ "workspace.lite.subscription.rollingUsage": "롤링 사용량",
+ "workspace.lite.subscription.weeklyUsage": "주간 사용량",
+ "workspace.lite.subscription.monthlyUsage": "월간 사용량",
+ "workspace.lite.subscription.resetsIn": "초기화까지 남은 시간:",
+ "workspace.lite.subscription.useBalance": "사용 한도 도달 후에는 보유 잔액 사용",
+ "workspace.lite.subscription.selectProvider":
+ 'Go 모델을 사용하려면 opencode 설정에서 "OpenCode Go"를 공급자로 선택하세요.',
+ "workspace.lite.black.message":
+ "현재 OpenCode Black을 구독 중이거나 대기 명단에 등록되어 있습니다. Go로 전환하려면 먼저 구독을 취소해 주세요.",
+ "workspace.lite.other.message":
+ "이 워크스페이스의 다른 멤버가 이미 OpenCode Go를 구독 중입니다. 워크스페이스당 한 명의 멤버만 구독할 수 있습니다.",
+ "workspace.lite.promo.description":
+ "OpenCode Go는 {{price}}부터 시작하며, 이후 $10/월로 넉넉한 사용량 한도와 함께 인기 있는 오픈 코딩 모델에 대한 안정적인 액세스를 제공합니다.",
+ "workspace.lite.promo.price": "첫 달 $5",
+ "workspace.lite.promo.modelsTitle": "포함 내역",
+ "workspace.lite.promo.footer":
+ "이 플랜은 주로 글로벌 사용자를 위해 설계되었으며, 안정적인 글로벌 액세스를 위해 미국, EU 및 싱가포르에 모델이 호스팅되어 있습니다. 가격 및 사용 한도는 초기 사용을 통해 학습하고 피드백을 수집함에 따라 변경될 수 있습니다.",
+ "workspace.lite.promo.subscribe": "Go 구독하기",
+ "workspace.lite.promo.subscribing": "리디렉션 중...",
+ "workspace.lite.promo.otherMethods": "기타 결제 수단",
+ "workspace.lite.promo.selectMethod": "결제 수단 선택",
+
+ "workspace.referral.copyLink": "링크 복사",
+ "workspace.referral.copied": "복사됨",
+ "workspace.referral.overview.title": "친구 초대",
+ "workspace.referral.overview.subtitle": "친구가 구독하면 $5를 받으세요. 친구도 $5를 받습니다.",
+ "workspace.referral.instructions.share": "추천 링크 공유",
+ "workspace.referral.instructions.subscribe": "친구가 가입하고 Go를 구독",
+ "workspace.referral.instructions.claim": "두 분 모두 $5 사용 크레딧을 받아 Go 사용 한도에 적용할 수 있습니다",
+ "workspace.referral.rewards.title": "추천 보상",
+ "workspace.referral.rewards.description": "사용 가능한 추천 크레딧을 Go 사용량에 적용합니다.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}}개 보상 사용됨.",
+ "workspace.referral.rewards.empty": "아직 추천 보상이 없습니다.",
+ "workspace.referral.table.reward": "보상",
+ "workspace.referral.table.referral": "설명",
+ "workspace.referral.table.date": "날짜",
+ "workspace.referral.reward.description.inviter": "{{email}} 초대됨",
+ "workspace.referral.reward.description.invitee": "{{email}}님이 초대",
+ "workspace.referral.reward.action.subscribeUnlock": "구독하여 잠금 해제",
+ "workspace.referral.reward.action.view": "보상 보기",
+ "workspace.referral.reward.action.applied": "보상 사용됨",
+ "workspace.referral.reward.source.pendingInviter": "친구의 구독을 기다리는 중",
+ "workspace.referral.reward.source.pendingInvitee": "구독하여 보상 잠금 해제",
+ "workspace.referral.reward.source.available": "보상 사용 가능",
+ "workspace.referral.reward.source.applied": "보상 사용됨",
+ "workspace.referral.reward.status.applied": "보상 사용됨",
+ "workspace.referral.reward.status.pendingInviter": "구독하여 잠금 해제",
+ "workspace.referral.reward.status.pendingInvitee": "구독하여 잠금 해제",
+ "workspace.referral.apply.noGo": "구독하여 잠금 해제",
+ "workspace.referral.apply.preview": "보상 보기",
+ "workspace.referral.apply.action": "사용",
+ "workspace.referral.apply.confirmTitle": "보상 사용",
+ "workspace.referral.apply.confirmBody": "{{amount}}를 사용하여 이 워크스페이스의 현재 사용량을 줄입니다.",
+ "workspace.referral.apply.confirmAction": "사용",
+
+ "download.title": "OpenCode | 다운로드",
+ "download.meta.description": "macOS, Windows, Linux용 OpenCode 다운로드",
+ "download.hero.title": "OpenCode 다운로드",
+ "download.hero.subtitle": "macOS, Windows, Linux용 베타 버전 사용 가능",
+ "download.hero.button": "{{os}}용 다운로드",
+ "download.section.terminal": "OpenCode 터미널",
+ "download.section.desktop": "OpenCode 데스크톱 (베타)",
+ "download.section.extensions": "OpenCode 확장 프로그램",
+ "download.section.integrations": "OpenCode 통합",
+ "download.action.download": "다운로드",
+ "download.action.install": "설치",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "꼭 그렇지는 않지만, 아마도 필요할 것입니다. OpenCode를 유료 제공자에 연결하려면 AI 구독이 필요할 수 있습니다. 하지만",
+ "download.faq.a3.localLink": "로컬 모델",
+ "download.faq.a3.afterLocal.beforeZen": "은 무료로 사용할 수 있습니다. 우리는",
+ "download.faq.a3.afterZen": " 사용을 권장하지만, OpenCode는 OpenAI, Anthropic, xAI 등 모든 인기 제공자와 작동합니다.",
+
+ "download.faq.a5.p1": "OpenCode는 100% 무료로 사용할 수 있습니다.",
+ "download.faq.a5.p2.beforeZen":
+ "추가 비용은 모델 제공자 구독에서 발생합니다. OpenCode는 모든 모델 제공자와 작동하지만, 우리는",
+ "download.faq.a5.p2.afterZen": " 사용을 권장합니다.",
+
+ "download.faq.a6.p1": "데이터와 정보는 OpenCode에서 공유 링크를 생성할 때만 저장됩니다.",
+ "download.faq.a6.p2.beforeShare": "더 알아보기:",
+ "download.faq.a6.shareLink": "공유 페이지",
+
+ "enterprise.title": "OpenCode | 조직을 위한 엔터프라이즈 솔루션",
+ "enterprise.meta.description": "OpenCode 엔터프라이즈 솔루션 문의",
+ "enterprise.hero.title": "여러분의 코드는 여러분의 것입니다",
+ "enterprise.hero.body1":
+ "OpenCode는 조직 내부에서 안전하게 작동하며, 데이터나 컨텍스트를 저장하지 않고 라이선스 제한이나 소유권 주장도 없습니다. 팀과 함께 트라이얼을 시작한 후, SSO 및 내부 AI 게이트웨이와 통합하여 조직 전체에 배포하세요.",
+ "enterprise.hero.body2": "어떻게 도와드릴 수 있는지 알려주세요.",
+ "enterprise.form.name.label": "이름",
+ "enterprise.form.name.placeholder": "홍길동",
+ "enterprise.form.role.label": "직책",
+ "enterprise.form.role.placeholder": "CTO / 개발 팀장",
+ "enterprise.form.company.label": "회사",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "회사 이메일",
+ "enterprise.form.email.placeholder": "name@company.com",
+ "enterprise.form.phone.label": "전화번호",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "어떤 문제를 해결하고 싶으신가요?",
+ "enterprise.form.message.placeholder": "도움이 필요한 부분은...",
+ "enterprise.form.send": "전송",
+ "enterprise.form.sending": "전송 중...",
+ "enterprise.form.success": "메시지가 전송되었습니다. 곧 연락드리겠습니다.",
+ "enterprise.form.success.submitted": "양식이 성공적으로 제출되었습니다.",
+ "enterprise.form.error.allFieldsRequired": "모든 필드는 필수 항목입니다.",
+ "enterprise.form.error.invalidEmailFormat": "유효하지 않은 이메일 형식입니다.",
+ "enterprise.form.error.internalServer": "내부 서버 오류입니다.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "OpenCode 엔터프라이즈란 무엇인가요?",
+ "enterprise.faq.a1":
+ "OpenCode 엔터프라이즈는 코드와 데이터가 인프라 외부로 유출되지 않도록 보장하려는 조직을 위한 솔루션입니다. SSO 및 내부 AI 게이트웨이와 통합되는 중앙 집중식 설정을 통해 이를 구현합니다.",
+ "enterprise.faq.q2": "OpenCode 엔터프라이즈는 어떻게 시작하나요?",
+ "enterprise.faq.a2":
+ "팀과 함께 내부 트라이얼로 간단히 시작해보세요. OpenCode는 기본적으로 코드나 컨텍스트 데이터를 저장하지 않아 시작하기 쉽습니다. 그 후 가격 및 구현 옵션에 대해 문의해주세요.",
+ "enterprise.faq.q3": "엔터프라이즈 가격은 어떻게 되나요?",
+ "enterprise.faq.a3":
+ "좌석(seat) 당 엔터프라이즈 가격을 제공합니다. 자체 LLM 게이트웨이를 보유한 경우, 사용된 토큰에 대해 비용을 청구하지 않습니다. 자세한 내용은 조직의 요구사항에 따른 맞춤 견적을 위해 문의해주세요.",
+ "enterprise.faq.q4": "OpenCode 엔터프라이즈에서 데이터는 안전한가요?",
+ "enterprise.faq.a4":
+ "네. OpenCode는 코드나 컨텍스트 데이터를 저장하지 않습니다. 모든 처리는 로컬에서 이루어지거나 AI 제공자에 대한 직접 API 호출을 통해 이루어집니다. 중앙 설정 및 SSO 통합을 통해 데이터는 조직의 인프라 내에서 안전하게 유지됩니다.",
+
+ "brand.title": "OpenCode | 브랜드",
+ "brand.meta.description": "OpenCode 브랜드 가이드라인",
+ "brand.heading": "브랜드 가이드라인",
+ "brand.subtitle": "OpenCode 브랜드를 활용하는 데 도움이 되는 리소스와 자산입니다.",
+ "brand.downloadAll": "모든 자산 다운로드",
+
+ "changelog.title": "OpenCode | 변경 내역",
+ "changelog.meta.description": "OpenCode 릴리스 노트 및 변경 내역",
+ "changelog.hero.title": "변경 내역",
+ "changelog.hero.subtitle": "OpenCode의 새로운 업데이트 및 개선 사항",
+ "changelog.empty": "변경 내역 항목을 찾을 수 없습니다.",
+ "changelog.viewJson": "JSON 보기",
+
+ "bench.list.title": "벤치마크",
+ "bench.list.heading": "벤치마크",
+ "bench.list.table.agent": "에이전트",
+ "bench.list.table.model": "모델",
+ "bench.list.table.score": "점수",
+ "bench.submission.error.allFieldsRequired": "모든 필드는 필수 항목입니다.",
+
+ "bench.detail.title": "벤치마크 - {{task}}",
+ "bench.detail.notFound": "태스크를 찾을 수 없음",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "에이전트",
+ "bench.detail.labels.model": "모델",
+ "bench.detail.labels.task": "태스크",
+ "bench.detail.labels.repo": "저장소",
+ "bench.detail.labels.from": "From",
+ "bench.detail.labels.to": "To",
+ "bench.detail.labels.prompt": "프롬프트",
+ "bench.detail.labels.commit": "커밋",
+ "bench.detail.labels.averageDuration": "평균 소요 시간",
+ "bench.detail.labels.averageScore": "평균 점수",
+ "bench.detail.labels.averageCost": "평균 비용",
+ "bench.detail.labels.summary": "요약",
+ "bench.detail.labels.runs": "실행 횟수",
+ "bench.detail.labels.score": "점수",
+ "bench.detail.labels.base": "기본",
+ "bench.detail.labels.penalty": "페널티",
+ "bench.detail.labels.weight": "가중치",
+ "bench.detail.table.run": "실행",
+ "bench.detail.table.score": "점수 (기본 - 페널티)",
+ "bench.detail.table.cost": "비용",
+ "bench.detail.table.duration": "소요 시간",
+ "bench.detail.run.title": "실행 {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/no.ts b/packages/console/app/src/i18n/no.ts
new file mode 100644
index 0000000..e5b52ae
--- /dev/null
+++ b/packages/console/app/src/i18n/no.ts
@@ -0,0 +1,821 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Dokumentasjon",
+ "nav.changelog": "Endringslogg",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Logg inn",
+ "nav.free": "Last ned",
+ "nav.home": "Hjem",
+ "nav.openMenu": "Åpne meny",
+ "nav.getStartedFree": "Kom i gang gratis",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Kopier logo som SVG",
+ "nav.context.copyWordmark": "Kopier wordmark som SVG",
+ "nav.context.brandAssets": "Merkevareressurser",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Dokumentasjon",
+ "footer.changelog": "Endringslogg",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Merkevare",
+ "legal.privacy": "Personvern",
+ "legal.terms": "Vilkår",
+
+ "email.title": "Få beskjed først når vi lanserer nye produkter",
+ "email.subtitle": "Meld deg på ventelisten for tidlig tilgang.",
+ "email.placeholder": "E-postadresse",
+ "email.subscribe": "Abonner",
+ "email.success": "Nesten ferdig - sjekk innboksen din og bekreft e-postadressen",
+
+ "notFound.title": "Ikke funnet | opencode",
+ "notFound.heading": "404 - Side ikke funnet",
+ "notFound.home": "Hjem",
+ "notFound.docs": "Dokumentasjon",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode logo lys",
+ "notFound.logoDarkAlt": "opencode logo mørk",
+
+ "user.logout": "Logg ut",
+
+ "auth.callback.error.codeMissing": "Ingen autorisasjonskode funnet.",
+
+ "workspace.select": "Velg arbeidsområde",
+ "workspace.createNew": "+ Opprett nytt arbeidsområde",
+ "workspace.modal.title": "Opprett nytt arbeidsområde",
+ "workspace.modal.placeholder": "Skriv inn navn på arbeidsområde",
+
+ "common.cancel": "Avbryt",
+ "common.creating": "Oppretter...",
+ "common.create": "Opprett",
+
+ "common.videoUnsupported": "Nettleseren din støtter ikke video-taggen.",
+ "common.figure": "Fig {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Les mer",
+
+ "error.invalidPlan": "Ugyldig plan",
+ "error.workspaceRequired": "Arbeidsområde-ID er påkrevd",
+ "error.alreadySubscribed": "Dette arbeidsområdet har allerede et abonnement",
+ "error.limitRequired": "Grense er påkrevd.",
+ "error.monthlyLimitInvalid": "Angi en gyldig månedlig grense.",
+ "error.workspaceNameRequired": "Navn på arbeidsområde er påkrevd.",
+ "error.nameTooLong": "Navnet må være 255 tegn eller mindre.",
+ "error.emailRequired": "E-post er påkrevd",
+ "error.roleRequired": "Rolle er påkrevd",
+ "error.idRequired": "ID er påkrevd",
+ "error.nameRequired": "Navn er påkrevd",
+ "error.providerRequired": "Leverandør er påkrevd",
+ "error.apiKeyRequired": "API-nøkkel er påkrevd",
+ "error.modelRequired": "Modell er påkrevd",
+ "error.reloadAmountMin": "Påfyllingsbeløp må være minst ${{amount}}",
+ "error.reloadTriggerMin": "Saldo-trigger må være minst ${{amount}}",
+
+ "app.meta.description": "OpenCode - Den åpne kildekode kodingsagenten.",
+
+ "home.title": "OpenCode | Den åpne kildekode AI-kodingsagenten",
+
+ "temp.title": "opencode | AI-kodingsagent bygget for terminalen",
+ "temp.hero.title": "AI-kodingsagenten bygget for terminalen",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Kom i gang",
+ "temp.feature.native.title": "Native TUI",
+ "temp.feature.native.body": "Et responsivt, native terminal-brukergrensesnitt som kan temes",
+ "temp.feature.zen.beforeLink": "En",
+ "temp.feature.zen.link": "kuratert liste over modeller",
+ "temp.feature.zen.afterLink": "levert av opencode",
+ "temp.feature.models.beforeLink": "Støtter 75+ LLM-leverandører gjennom",
+ "temp.feature.models.afterLink": ", inkludert lokale modeller",
+ "temp.screenshot.caption": "opencode TUI med tokyonight-tema",
+ "temp.screenshot.alt": "opencode TUI med tokyonight-tema",
+ "temp.logoLightAlt": "opencode logo lys",
+ "temp.logoDarkAlt": "opencode logo mørk",
+
+ "home.banner.badge": "Ny",
+ "home.banner.text": "Desktop-app tilgjengelig i beta",
+ "home.banner.platforms": "på macOS, Windows og Linux",
+ "home.banner.downloadNow": "Last ned nå",
+ "home.banner.downloadBetaNow": "Last ned desktop-betaen nå",
+
+ "home.hero.title": "Den åpne kildekode AI-kodingsagenten",
+ "home.hero.subtitle.a":
+ "Gratis modeller inkludert, eller koble til hvilken som helst modell fra hvilken som helst leverandør,",
+ "home.hero.subtitle.b": "inkludert Claude, GPT, Gemini og mer.",
+
+ "home.install.ariaLabel": "Installeringsalternativer",
+
+ "home.what.title": "Hva er OpenCode?",
+ "home.what.body": "OpenCode er en åpen kildekode-agent som hjelper deg å skrive kode i terminal, IDE eller desktop.",
+ "home.what.lsp.title": "LSP aktivert",
+ "home.what.lsp.body": "Laster automatisk de riktige LSP-ene for LLM-en",
+ "home.what.multiSession.title": "Multi-sesjon",
+ "home.what.multiSession.body": "Start flere agenter parallelt på samme prosjekt",
+ "home.what.shareLinks.title": "Del lenker",
+ "home.what.shareLinks.body": "Del en lenke til en sesjon for referanse eller feilsøking",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Logg inn med GitHub for å bruke Copilot-kontoen din",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Logg inn med OpenAI for å bruke ChatGPT Plus- eller Pro-kontoen din",
+ "home.what.anyModel.title": "Hvilken som helst modell",
+ "home.what.anyModel.body": "75+ LLM-leverandører via Models.dev, inkludert lokale modeller",
+ "home.what.anyEditor.title": "Hvilken som helst editor",
+ "home.what.anyEditor.body": "Tilgjengelig som terminalgrensesnitt, desktop-app og IDE-utvidelse",
+ "home.what.readDocs": "Les dokumentasjonen",
+
+ "home.growth.title": "Den åpne kildekode AI-kodingsagenten",
+ "home.growth.body":
+ "Med over {{stars}} GitHub-stjerner, {{contributors}} bidragsytere og over {{commits}} commits, brukes OpenCode av over {{monthlyUsers}} utviklere hver måned.",
+ "home.growth.githubStars": "GitHub-stjerner",
+ "home.growth.contributors": "Bidragsytere",
+ "home.growth.monthlyDevs": "Månedlige utviklere",
+
+ "home.privacy.title": "Bygget med personvern først",
+ "home.privacy.body":
+ "OpenCode lagrer ikke koden din eller kontekstdata, slik at den kan fungere i personvernsensitive miljøer.",
+ "home.privacy.learnMore": "Les mer om",
+ "home.privacy.link": "personvern",
+
+ "home.faq.q1": "Hva er OpenCode?",
+ "home.faq.a1":
+ "OpenCode er en åpen kildekode-agent som hjelper deg å skrive og kjøre kode med hvilken som helst AI-modell. Den er tilgjengelig som terminalgrensesnitt, desktop-app eller IDE-utvidelse.",
+ "home.faq.q2": "Hvordan bruker jeg OpenCode?",
+ "home.faq.a2.before": "Den enkleste måten å komme i gang på er å lese",
+ "home.faq.a2.link": "introen",
+ "home.faq.q3": "Trenger jeg ekstra AI-abonnementer for å bruke OpenCode?",
+ "home.faq.a3.p1":
+ "Ikke nødvendigvis. OpenCode kommer med et sett gratis modeller du kan bruke uten å opprette en konto.",
+ "home.faq.a3.p2.beforeZen": "I tillegg kan du bruke populære kodemodeller ved å opprette en",
+ "home.faq.a3.p2.afterZen": " konto.",
+ "home.faq.a3.p3":
+ "Vi oppfordrer til å bruke Zen, men OpenCode fungerer også med populære leverandører som OpenAI, Anthropic, xAI osv.",
+ "home.faq.a3.p4.beforeLocal": "Du kan til og med koble til dine",
+ "home.faq.a3.p4.localLink": "lokale modeller",
+ "home.faq.q4": "Kan jeg bruke mine eksisterende AI-abonnementer med OpenCode?",
+ "home.faq.a4.p1":
+ "Ja, OpenCode støtter abonnementer fra alle store leverandører. Du kan bruke Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot-abonnementer.",
+ "home.faq.q5": "Kan jeg bare bruke OpenCode i terminalen?",
+ "home.faq.a5.beforeDesktop": "Ikke lenger! OpenCode er nå tilgjengelig som en app for",
+ "home.faq.a5.desktop": "desktop",
+ "home.faq.a5.and": "og",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "Hva koster OpenCode?",
+ "home.faq.a6":
+ "OpenCode er 100% gratis å bruke. Det kommer også med et sett gratis modeller. Det kan være ekstra kostnader hvis du kobler til en annen leverandør.",
+ "home.faq.q7": "Hva med data og personvern?",
+ "home.faq.a7.p1": "Dataene dine lagres kun når du bruker våre gratis modeller eller lager delbare lenker.",
+ "home.faq.a7.p2.beforeModels": "Les mer om",
+ "home.faq.a7.p2.modelsLink": "våre modeller",
+ "home.faq.a7.p2.and": "og",
+ "home.faq.a7.p2.shareLink": "delingssider",
+ "home.faq.q8": "Er OpenCode åpen kildekode?",
+ "home.faq.a8.p1": "Ja, OpenCode er fullt open source. Kildekoden er offentlig på",
+ "home.faq.a8.p2": "under",
+ "home.faq.a8.mitLicense": "MIT-lisensen",
+ "home.faq.a8.p3":
+ ", som betyr at hvem som helst kan bruke, endre eller bidra til utviklingen. Alle i communityet kan opprette issues, sende inn pull requests og utvide funksjonalitet.",
+
+ "home.zenCta.title": "Få tilgang til pålitelige, optimaliserte modeller for kodeagenter",
+ "home.zenCta.body":
+ "Zen gir deg tilgang til et håndplukket sett med AI-modeller som OpenCode har testet og benchmarked spesielt for kodeagenter. Du slipper å bekymre deg for ujevn ytelse og kvalitet på tvers av leverandører; bruk validerte modeller som fungerer.",
+ "home.zenCta.link": "Les om Zen",
+
+ "zen.title": "OpenCode Zen | Et kuratert sett med pålitelige, optimaliserte modeller for kodeagenter",
+ "zen.hero.title": "Pålitelige optimaliserte modeller for kodeagenter",
+ "zen.hero.body":
+ "Zen gir deg tilgang til et kuratert sett med AI-modeller som OpenCode har testet og benchmarked spesielt for kodeagenter. Du slipper å bekymre deg for ujevn ytelse og kvalitet; bruk validerte modeller som fungerer.",
+
+ "zen.faq.q1": "Hva er OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen er et kuratert sett med AI-modeller testet og benchmarked for kodeagenter, laget av teamet bak OpenCode.",
+ "zen.faq.q2": "Hva gjør Zen mer presis?",
+ "zen.faq.a2":
+ "Zen tilbyr bare modeller som er testet og benchmarked spesifikt for kodeagenter. Du ville ikke brukt en smørkniv til å skjære biff; ikke bruk dårlige modeller til koding.",
+ "zen.faq.q3": "Er Zen billigere?",
+ "zen.faq.a3":
+ "Zen er ikke for profitt. Zen videreformidler kostnadene fra modellleverandørene direkte til deg. Jo mer Zen brukes, desto bedre priser kan OpenCode forhandle og gi videre til deg.",
+ "zen.faq.q4": "Hva koster Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "tar betalt per forespørsel",
+ "zen.faq.a4.p1.afterPricing": "uten påslag, så du betaler akkurat det modellleverandøren tar betalt.",
+ "zen.faq.a4.p2.beforeAccount": "Totalprisen avhenger av bruk, og du kan sette månedlige utgiftsgrenser i din",
+ "zen.faq.a4.p2.accountLink": "konto",
+ "zen.faq.a4.p3":
+ "For å dekke kostnader legger OpenCode til bare et lite betalingsbehandlingsgebyr på $1.23 per $20 saldo-påfyll.",
+ "zen.faq.q5": "Hva med data og personvern?",
+ "zen.faq.a5.beforeExceptions":
+ "Alle Zen-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med de",
+ "zen.faq.a5.exceptionsLink": "følgende unntakene",
+ "zen.faq.q6": "Kan jeg sette utgiftsgrenser?",
+ "zen.faq.a6": "Ja, du kan sette månedlige utgiftsgrenser i kontoen din.",
+ "zen.faq.q7": "Kan jeg avslutte?",
+ "zen.faq.a7": "Ja, du kan deaktivere fakturering når som helst og bruke gjenværende saldo.",
+ "zen.faq.q8": "Kan jeg bruke Zen med andre kodeagenter?",
+ "zen.faq.a8":
+ "Selv om Zen fungerer veldig bra med OpenCode, kan du bruke Zen med hvilken som helst agent. Følg oppsettinstruksjonene i din foretrukne kodeagent.",
+
+ "zen.cta.start": "Kom i gang med Zen",
+ "zen.pricing.title": "Legg til $20 Pay as you go-saldo",
+ "zen.pricing.fee": "(+$1.23 kortbehandlingsgebyr)",
+ "zen.pricing.body": "Bruk med hvilken som helst agent. Angi månedlige forbruksgrenser. Avslutt når som helst.",
+ "zen.problem.title": "Hvilket problem løser Zen?",
+ "zen.problem.body":
+ "Det er så mange modeller tilgjengelig, men bare noen få fungerer bra med kodeagenter. De fleste leverandører konfigurerer dem annerledes med varierende resultater.",
+ "zen.problem.subtitle": "Vi fikser dette for alle, ikke bare OpenCode-brukere.",
+ "zen.problem.item1": "Tester utvalgte modeller og konsulterer teamene deres",
+ "zen.problem.item2": "Samarbeider med leverandører for å sikre at de blir levert riktig",
+ "zen.problem.item3": "Benchmarker alle modell-leverandør-kombinasjoner vi anbefaler",
+ "zen.how.title": "Hvordan Zen fungerer",
+ "zen.how.body": "Selv om vi foreslår at du bruker Zen med OpenCode, kan du bruke Zen med hvilken som helst agent.",
+ "zen.how.step1.title": "Registrer deg og legg til $20 saldo",
+ "zen.how.step1.beforeLink": "følg",
+ "zen.how.step1.link": "oppsettsinstruksjonene",
+ "zen.how.step2.title": "Bruk Zen med transparente priser",
+ "zen.how.step2.link": "betal per forespørsel",
+ "zen.how.step2.afterLink": "uten påslag",
+ "zen.how.step3.title": "Auto-påfyll",
+ "zen.how.step3.body": "når saldoen din når $5, fyller vi automatisk på $20",
+ "zen.privacy.title": "Personvernet ditt er viktig for oss",
+ "zen.privacy.beforeExceptions":
+ "Alle Zen-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med",
+ "zen.privacy.exceptionsLink": "følgende unntak",
+
+ "go.title": "OpenCode Go | Rimelige kodemodeller for alle",
+ "go.meta.description":
+ "Go starter på $5 for den første måneden, deretter $10/måned, med sjenerøse 5-timers forespørselsgrenser for GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash.",
+ "go.hero.title": "Rimelige kodemodeller for alle",
+ "go.hero.body":
+ "Go bringer agent-koding til programmerere over hele verden. Med rause grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene, kan du bygge med kraftige agenter uten å bekymre deg for kostnader eller tilgjengelighet.",
+
+ "go.cta.start": "Abonner på Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Abonner på Go",
+ "go.cta.price": "$10/måned",
+ "go.cta.promo": "$5 første måned",
+ "go.pricing.body":
+ "Bruk med hvilken som helst agent. $5 første måned, deretter $10/måned. Fyll på kreditt ved behov. Avslutt når som helst.",
+ "go.graph.free": "Gratis",
+ "go.graph.freePill": "Big Pickle og gratis modeller",
+ "go.graph.go": "Go",
+ "go.graph.label": "Forespørsler per 5 timer",
+ "go.graph.usageLimits": "Bruksgrenser",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Forespørsler per 5t: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "tidligere CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "har endret livet mitt, det er virkelig en no-brainer.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "tidligere grunnlegger, SEED, PM, Melt, Pop, Dapt, Cadmus og ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 av 5 personer på teamet vårt elsker å bruke",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "tidligere Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Jeg kan ikke anbefale",
+ "go.testimonials.adam.quoteAfter": "nok. Seriøst, det er virkelig bra.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "tidligere Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Med",
+ "go.testimonials.david.quoteAfter": "vet jeg at alle modellene er testet og perfekte for kodeagenter.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "tidligere intern, Nvidia (4 ganger)",
+ "go.testimonials.frank.quote": "Jeg skulle ønske jeg fortsatt var hos Nvidia.",
+ "go.problem.title": "Hvilket problem løser Go?",
+ "go.problem.body":
+ "Vi fokuserer på å bringe OpenCode-opplevelsen til så mange som mulig. OpenCode Go er et rimelig abonnement: $5 for den første måneden, deretter $10/måned. Det gir sjenerøse grenser og pålitelig tilgang til de mest kapable åpen kildekode-modellene.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Rimelig abonnementspris",
+ "go.problem.item2": "Rause grenser og pålitelig tilgang",
+ "go.problem.item3": "Bygget for så mange programmerere som mulig",
+ "go.problem.item4":
+ "Inkluderer GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash",
+ "go.how.title": "Hvordan Go fungerer",
+ "go.how.body":
+ "Go starter på $5 for den første måneden, deretter $10/måned. Du kan bruke det med OpenCode eller hvilken som helst agent.",
+ "go.how.step1.title": "Opprett en konto",
+ "go.how.step1.beforeLink": "følg",
+ "go.how.step1.link": "oppsettsinstruksjonene",
+ "go.how.step2.title": "Abonner på Go",
+ "go.how.step2.link": "$5 første måned",
+ "go.how.step2.afterLink": "deretter $10/måned med sjenerøse grenser",
+ "go.how.step3.title": "Begynn å kode",
+ "go.how.step3.body": "med pålitelig tilgang til åpen kildekode-modeller",
+ "go.privacy.title": "Personvernet ditt er viktig for oss",
+ "go.privacy.body":
+ "Planen er primært designet for internasjonale brukere, med modeller driftet i USA, EU og Singapore for stabil global tilgang.",
+ "go.privacy.contactAfter": "hvis du har spørsmål.",
+ "go.privacy.beforeExceptions":
+ "Go-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med",
+ "go.privacy.exceptionsLink": "følgende unntak",
+ "go.faq.q1": "Hva er OpenCode Go?",
+ "go.faq.a1":
+ "Go er et rimelig abonnement som gir deg pålitelig tilgang til kapable åpen kildekode-modeller for agent-koding.",
+ "go.faq.q2": "Hvilke modeller inkluderer Go?",
+ "go.faq.a2": "Go inkluderer modellene nedenfor, med høye grenser og pålitelig tilgang.",
+ "go.faq.q3": "Er Go det samme som Zen?",
+ "go.faq.a3":
+ "Nei. Zen er betaling etter bruk, mens Go starter på $5 for den første måneden, deretter $10/måned, med sjenerøse grenser og pålitelig tilgang til åpen kildekode-modellene GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash.",
+ "go.faq.q4": "Hva koster Go?",
+ "go.faq.a4.p1.beforePricing": "Go koster",
+ "go.faq.a4.p1.pricingLink": "$5 første måned",
+ "go.faq.a4.p1.afterPricing": "deretter $10/måned med sjenerøse grenser.",
+ "go.faq.a4.p2.beforeAccount": "Du kan administrere abonnementet ditt i din",
+ "go.faq.a4.p2.accountLink": "konto",
+ "go.faq.a4.p3": "Avslutt når som helst.",
+ "go.faq.q5": "Hva med data og personvern?",
+ "go.faq.a5.body":
+ "Planen er primært designet for internasjonale brukere, med modeller driftet i USA, EU og Singapore for stabil global tilgang. Våre leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening.",
+ "go.faq.a5.beforeExceptions":
+ "Go-modeller hostes i USA. Leverandører følger en policy om null oppbevaring og bruker ikke dataene dine til modelltrening, med",
+ "go.faq.a5.exceptionsLink": "følgende unntak",
+ "go.faq.q6": "Kan jeg fylle på kreditt?",
+ "go.faq.a6": "Hvis du trenger mer bruk, kan du fylle på kreditt i kontoen din.",
+ "go.faq.q7": "Kan jeg avslutte?",
+ "go.faq.a7": "Ja, du kan avslutte når som helst.",
+ "go.faq.q8": "Kan jeg bruke Go med andre kodeagenter?",
+ "go.faq.a8":
+ "Ja, du kan bruke Go med hvilken som helst agent. Følg oppsettinstruksjonene i din foretrukne kodeagent.",
+
+ "go.faq.q9": "Hva er forskjellen mellom gratis modeller og Go?",
+ "go.faq.a9":
+ "Gratis modeller inkluderer Big Pickle pluss kampanjemodeller tilgjengelig på det tidspunktet, med en kvote på 200 forespørsler/dag. Go inkluderer GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash med høyere kvoter håndhevet over rullerende vinduer (5 timer, ukentlig og månedlig), omtrent tilsvarende $12 per 5 timer, $30 per uke og $60 per måned (faktiske forespørselsantall varierer etter modell og bruk).",
+
+ "zen.api.error.rateLimitExceeded": "Rate limit overskredet. Vennligst prøv igjen senere.",
+ "zen.api.error.modelNotSupported": "Modell {{model}} støttes ikke",
+ "zen.api.error.modelFormatNotSupported": "Modell {{model}} støttes ikke for format {{format}}",
+ "zen.api.error.noProviderAvailable": "Ingen leverandør tilgjengelig",
+ "zen.api.error.providerNotSupported": "Leverandør {{provider}} støttes ikke",
+ "zen.api.error.missingApiKey": "Mangler API-nøkkel.",
+ "zen.api.error.invalidApiKey": "Ugyldig API-nøkkel.",
+ "zen.api.error.subscriptionQuotaExceeded": "Abonnementskvote overskredet. Prøv igjen om {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "5-timers bruksgrense nådd. Tilbakestilles om {{retryIn}}. For å fortsette å bruke denne modellen nå, aktiver bruk fra din tilgjengelige saldo: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Ukentlig bruksgrense nådd. Tilbakestilles om {{retryIn}}. For å fortsette å bruke denne modellen nå, aktiver bruk fra din tilgjengelige saldo: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Månedlig bruksgrense nådd. Tilbakestilles om {{retryIn}}. For å fortsette å bruke denne modellen nå, aktiver bruk fra din tilgjengelige saldo: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Ingen betalingsmetode. Legg til en betalingsmetode her: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Utilstrekkelig saldo. Administrer faktureringen din her: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Arbeidsområdet ditt har nådd sin månedlige utgiftsgrense på ${{amount}}. Administrer grensene dine her: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Du har nådd din månedlige utgiftsgrense på ${{amount}}. Administrer grensene dine her: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Modellen er deaktivert",
+ "zen.api.error.trialEnded":
+ "Den gratis kampanjen for {{model}} er avsluttet. Du kan fortsette å bruke modellen ved å abonnere på OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Få tilgang til verdens beste kodemodeller",
+ "black.meta.description": "Få tilgang til Claude, GPT, Gemini og mer med OpenCode Black-abonnementer.",
+ "black.hero.title": "Få tilgang til verdens beste kodemodeller",
+ "black.hero.subtitle": "Inkludert Claude, GPT, Gemini og mer",
+ "black.title": "OpenCode Black | Priser",
+ "black.paused": "Black-planregistrering er midlertidig satt på pause.",
+ "black.plan.icon20": "Black 20-plan",
+ "black.plan.icon100": "Black 100-plan",
+ "black.plan.icon200": "Black 200-plan",
+ "black.plan.multiplier100": "5x mer bruk enn Black 20",
+ "black.plan.multiplier200": "20x mer bruk enn Black 20",
+ "black.price.perMonth": "per måned",
+ "black.price.perPersonBilledMonthly": "per person fakturert månedlig",
+ "black.terms.1": "Abonnementet ditt starter ikke umiddelbart",
+ "black.terms.2": "Du blir lagt til i ventelisten og aktivert snart",
+ "black.terms.3": "Kortet ditt belastes kun når abonnementet aktiveres",
+ "black.terms.4": "Bruksgrenser gjelder, tung automatisert bruk kan nå grensene raskere",
+ "black.terms.5": "Abonnementer er for enkeltpersoner, kontakt Enterprise for team",
+ "black.terms.6": "Grenser kan justeres og planer kan avvikles i fremtiden",
+ "black.terms.7": "Avslutt abonnementet når som helst",
+ "black.action.continue": "Fortsett",
+ "black.finePrint.beforeTerms": "Priser vist inkluderer ikke gjeldende skatt",
+ "black.finePrint.terms": "Vilkår for bruk",
+ "black.workspace.title": "OpenCode Black | Velg arbeidsområde",
+ "black.workspace.selectPlan": "Velg et arbeidsområde for denne planen",
+ "black.workspace.name": "Arbeidsområde {{n}}",
+ "black.subscribe.title": "Abonner på OpenCode Black",
+ "black.subscribe.paymentMethod": "Betalingsmetode",
+ "black.subscribe.loadingPaymentForm": "Laster betalingsskjema...",
+ "black.subscribe.selectWorkspaceToContinue": "Velg et arbeidsområde for å fortsette",
+ "black.subscribe.failurePrefix": "Å nei!",
+ "black.subscribe.error.generic": "Det oppstod en feil",
+ "black.subscribe.error.invalidPlan": "Ugyldig plan",
+ "black.subscribe.error.workspaceRequired": "Arbeidsområde-ID er påkrevd",
+ "black.subscribe.error.alreadySubscribed": "Dette arbeidsområdet har allerede et abonnement",
+ "black.subscribe.processing": "Behandler...",
+ "black.subscribe.submit": "Abonner ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Du blir kun belastet når abonnementet ditt aktiveres",
+ "black.subscribe.success.title": "Du er på ventelisten for OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "Abonnementsplan",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Beløp",
+ "black.subscribe.success.amountValue": "${{plan}} per måned",
+ "black.subscribe.success.paymentMethod": "Betalingsmetode",
+ "black.subscribe.success.dateJoined": "Dato meldt på",
+ "black.subscribe.success.chargeNotice": "Kortet ditt vil bli belastet når abonnementet aktiveres",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Bruk",
+ "workspace.nav.apiKeys": "API-nøkler",
+ "workspace.nav.members": "Medlemmer",
+ "workspace.nav.billing": "Fakturering",
+ "workspace.nav.settings": "Innstillinger",
+
+ "workspace.home.banner.beforeLink": "Pålitelige optimaliserte modeller for kodeagenter.",
+ "workspace.lite.banner.beforeLink": "Lavkost kodemodeller for alle.",
+ "workspace.home.billing.loading": "Laster...",
+ "workspace.home.billing.enable": "Aktiver fakturering",
+ "workspace.home.billing.currentBalance": "Gjeldende saldo",
+
+ "workspace.newUser.feature.tested.title": "Testede og verifiserte modeller",
+ "workspace.newUser.feature.tested.body":
+ "Vi har benchmarked og testet modeller spesifikt for kodeagenter for å sikre best mulig ytelse.",
+ "workspace.newUser.feature.quality.title": "Høyeste kvalitet",
+ "workspace.newUser.feature.quality.body":
+ "Få tilgang til modeller konfigurert for optimal ytelse – ingen nedgraderinger eller ruting til billigere leverandører.",
+ "workspace.newUser.feature.lockin.title": "Ingen innlåsing",
+ "workspace.newUser.feature.lockin.body":
+ "Bruk Zen med hvilken som helst kodeagent, og fortsett å bruke andre leverandører med opencode når du vil.",
+ "workspace.newUser.copyApiKey": "Kopier API-nøkkel",
+ "workspace.newUser.copyKey": "Kopier nøkkel",
+ "workspace.newUser.copied": "Kopiert!",
+ "workspace.newUser.step.enableBilling": "Aktiver fakturering",
+ "workspace.newUser.step.login.before": "Kjør",
+ "workspace.newUser.step.login.after": "og velg opencode",
+ "workspace.newUser.step.pasteKey": "Lim inn API-nøkkelen",
+ "workspace.newUser.step.models.before": "Start opencode og kjør",
+ "workspace.newUser.step.models.after": "for å velge en modell",
+
+ "workspace.models.title": "Modeller",
+ "workspace.models.subtitle.beforeLink": "Administrer hvilke modeller medlemmene i arbeidsområdet har tilgang til.",
+ "workspace.models.table.model": "Modell",
+ "workspace.models.table.enabled": "Aktivert",
+
+ "workspace.providers.title": "Ta med din egen nøkkel",
+ "workspace.providers.subtitle": "Konfigurer dine egne API-nøkler fra AI-leverandører.",
+ "workspace.providers.placeholder": "Skriv inn {{provider}} API-nøkkel ({{prefix}}...)",
+ "workspace.providers.configure": "Konfigurer",
+ "workspace.providers.edit": "Rediger",
+ "workspace.providers.delete": "Slett",
+ "workspace.providers.saving": "Lagrer...",
+ "workspace.providers.save": "Lagre",
+ "workspace.providers.table.provider": "Leverandør",
+ "workspace.providers.table.apiKey": "API-nøkkel",
+
+ "workspace.usage.title": "Brukshistorikk",
+ "workspace.usage.subtitle": "Nylig API-bruk og kostnader.",
+ "workspace.usage.empty": "Gjør ditt første API-kall for å komme i gang.",
+ "workspace.usage.table.date": "Dato",
+ "workspace.usage.table.model": "Modell",
+ "workspace.usage.table.input": "Input",
+ "workspace.usage.table.output": "Output",
+ "workspace.usage.table.cost": "Kostnad",
+ "workspace.usage.table.session": "Økt",
+ "workspace.usage.breakdown.input": "Input",
+ "workspace.usage.breakdown.cacheRead": "Cache Lest",
+ "workspace.usage.breakdown.cacheWrite": "Cache Skrevet",
+ "workspace.usage.breakdown.output": "Output",
+ "workspace.usage.breakdown.reasoning": "Resonnering",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Kostnad",
+ "workspace.cost.subtitle": "Brukskostnader fordelt på modell.",
+ "workspace.cost.allModels": "Alle modeller",
+ "workspace.cost.allKeys": "Alle nøkler",
+ "workspace.cost.deletedSuffix": "(slettet)",
+ "workspace.cost.empty": "Ingen bruksdata tilgjengelig for den valgte perioden.",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "API-nøkler",
+ "workspace.keys.subtitle": "Administrer API-nøklene dine for å få tilgang til opencode-tjenester.",
+ "workspace.keys.create": "Opprett API-nøkkel",
+ "workspace.keys.placeholder": "Skriv inn navn på nøkkel",
+ "workspace.keys.empty": "Opprett en opencode Gateway API-nøkkel",
+ "workspace.keys.table.name": "Navn",
+ "workspace.keys.table.key": "Nøkkel",
+ "workspace.keys.table.createdBy": "Opprettet av",
+ "workspace.keys.table.lastUsed": "Sist brukt",
+ "workspace.keys.copyApiKey": "Kopier API-nøkkel",
+ "workspace.keys.delete": "Slett",
+
+ "workspace.members.title": "Medlemmer",
+ "workspace.members.subtitle": "Administrer medlemmer i arbeidsområdet og deres tillatelser.",
+ "workspace.members.invite": "Inviter medlem",
+ "workspace.members.inviting": "Inviterer...",
+ "workspace.members.beta.beforeLink": "Arbeidsområder er gratis for team i beta-perioden.",
+ "workspace.members.form.invitee": "Invitert",
+ "workspace.members.form.emailPlaceholder": "Skriv inn e-post",
+ "workspace.members.form.role": "Rolle",
+ "workspace.members.form.monthlyLimit": "Månedlig utgiftsgrense",
+ "workspace.members.noLimit": "Ingen grense",
+ "workspace.members.noLimitLowercase": "ingen grense",
+ "workspace.members.invited": "invitert",
+ "workspace.members.edit": "Rediger",
+ "workspace.members.delete": "Slett",
+ "workspace.members.saving": "Lagrer...",
+ "workspace.members.save": "Lagre",
+ "workspace.members.table.email": "E-post",
+ "workspace.members.table.role": "Rolle",
+ "workspace.members.table.monthLimit": "Månedsgrense",
+ "workspace.members.role.admin": "Admin",
+ "workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
+ "workspace.members.role.member": "Medlem",
+ "workspace.members.role.memberDescription": "Kan kun generere API-nøkler for seg selv",
+
+ "workspace.settings.title": "Innstillinger",
+ "workspace.settings.subtitle": "Oppdater arbeidsområdets navn og preferanser.",
+ "workspace.settings.workspaceName": "Navn på arbeidsområde",
+ "workspace.settings.defaultName": "Standard",
+ "workspace.settings.updating": "Oppdaterer...",
+ "workspace.settings.save": "Lagre",
+ "workspace.settings.edit": "Rediger",
+
+ "workspace.billing.title": "Fakturering",
+ "workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.",
+ "workspace.billing.contactUs": "Kontakt oss",
+ "workspace.billing.subtitle.afterLink": "hvis du har spørsmål.",
+ "workspace.billing.currentBalance": "Gjeldende saldo",
+ "workspace.billing.add": "Legg til $",
+ "workspace.billing.enterAmount": "Angi beløp",
+ "workspace.billing.loading": "Laster...",
+ "workspace.billing.addAction": "Legg til",
+ "workspace.billing.addBalance": "Legg til saldo",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Koblet til Stripe",
+ "workspace.billing.manage": "Administrer",
+ "workspace.billing.enable": "Aktiver fakturering",
+
+ "workspace.monthlyLimit.title": "Månedlig grense",
+ "workspace.monthlyLimit.subtitle": "Angi en månedlig bruksgrense for kontoen din.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Angir...",
+ "workspace.monthlyLimit.set": "Sett",
+ "workspace.monthlyLimit.edit": "Rediger grense",
+ "workspace.monthlyLimit.noLimit": "Ingen bruksgrense satt.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Gjeldende forbruk for",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
+
+ "workspace.redeem.title": "Løs inn kupong",
+ "workspace.redeem.subtitle": "Løs inn en kupongkode for å få kreditt eller fordeler.",
+ "workspace.redeem.placeholder": "Skriv inn kupongkode",
+ "workspace.redeem.redeem": "Løs inn",
+ "workspace.redeem.redeeming": "Løser inn...",
+ "workspace.redeem.success": "Kupongen ble løst inn.",
+
+ "workspace.reload.title": "Auto-påfyll",
+ "workspace.reload.disabled.before": "Auto-påfyll er",
+ "workspace.reload.disabled.state": "deaktivert",
+ "workspace.reload.disabled.after": "Aktiver for å fylle på automatisk når saldoen er lav.",
+ "workspace.reload.enabled.before": "Auto-påfyll er",
+ "workspace.reload.enabled.state": "aktivert",
+ "workspace.reload.enabled.middle": "Vi fyller på",
+ "workspace.reload.processingFee": "behandlingsgebyr",
+ "workspace.reload.enabled.after": "når saldoen når",
+ "workspace.reload.edit": "Rediger",
+ "workspace.reload.enable": "Aktiver",
+ "workspace.reload.enableAutoReload": "Aktiver Auto-påfyll",
+ "workspace.reload.reloadAmount": "Fyll på $",
+ "workspace.reload.whenBalanceReaches": "Når saldoen når $",
+ "workspace.reload.saving": "Lagrer...",
+ "workspace.reload.save": "Lagre",
+ "workspace.reload.failedAt": "Påfylling mislyktes kl",
+ "workspace.reload.reason": "Årsak:",
+ "workspace.reload.updatePaymentMethod": "Vennligst oppdater betalingsmetoden din og prøv på nytt.",
+ "workspace.reload.retrying": "Prøver på nytt...",
+ "workspace.reload.retry": "Prøv på nytt",
+ "workspace.reload.error.paymentFailed": "Betaling mislyktes.",
+
+ "workspace.payments.title": "Betalingshistorikk",
+ "workspace.payments.subtitle": "Nylige betalingstransaksjoner.",
+ "workspace.payments.table.date": "Dato",
+ "workspace.payments.table.paymentId": "Betalings-ID",
+ "workspace.payments.table.amount": "Beløp",
+ "workspace.payments.table.receipt": "Kvittering",
+ "workspace.payments.type.credit": "kreditt",
+ "workspace.payments.type.subscription": "abonnement",
+ "workspace.payments.view": "Vis",
+
+ "workspace.black.loading": "Laster...",
+ "workspace.black.time.day": "dag",
+ "workspace.black.time.days": "dager",
+ "workspace.black.time.hour": "time",
+ "workspace.black.time.hours": "timer",
+ "workspace.black.time.minute": "minutt",
+ "workspace.black.time.minutes": "minutter",
+ "workspace.black.time.fewSeconds": "noen få sekunder",
+ "workspace.black.subscription.title": "Abonnement",
+ "workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} per måned.",
+ "workspace.black.subscription.manage": "Administrer abonnement",
+ "workspace.black.subscription.rollingUsage": "5-timers bruk",
+ "workspace.black.subscription.weeklyUsage": "Ukentlig bruk",
+ "workspace.black.subscription.resetsIn": "Nullstilles om",
+ "workspace.black.subscription.useBalance": "Bruk din tilgjengelige saldo etter å ha nådd bruksgrensene",
+ "workspace.black.waitlist.title": "Venteliste",
+ "workspace.black.waitlist.joined": "Du står på venteliste for OpenCode Black-planen til ${{plan}} per måned.",
+ "workspace.black.waitlist.ready": "Vi er klare til å melde deg på OpenCode Black-planen til ${{plan}} per måned.",
+ "workspace.black.waitlist.leave": "Forlat venteliste",
+ "workspace.black.waitlist.leaving": "Forlater...",
+ "workspace.black.waitlist.left": "Forlot",
+ "workspace.black.waitlist.enroll": "Meld på",
+ "workspace.black.waitlist.enrolling": "Melder på...",
+ "workspace.black.waitlist.enrolled": "Påmeldt",
+ "workspace.black.waitlist.enrollNote":
+ "Når du klikker på Meld på, starter abonnementet umiddelbart og kortet ditt belastes.",
+
+ "workspace.lite.loading": "Laster...",
+ "workspace.lite.time.day": "dag",
+ "workspace.lite.time.days": "dager",
+ "workspace.lite.time.hour": "time",
+ "workspace.lite.time.hours": "timer",
+ "workspace.lite.time.minute": "minutt",
+ "workspace.lite.time.minutes": "minutter",
+ "workspace.lite.time.fewSeconds": "noen få sekunder",
+ "workspace.lite.subscription.message": "Du abonnerer på OpenCode Go.",
+ "workspace.lite.subscription.manage": "Administrer abonnement",
+ "workspace.lite.subscription.rollingUsage": "Løpende bruk",
+ "workspace.lite.subscription.weeklyUsage": "Ukentlig bruk",
+ "workspace.lite.subscription.monthlyUsage": "Månedlig bruk",
+ "workspace.lite.subscription.resetsIn": "Nullstilles om",
+ "workspace.lite.subscription.useBalance": "Bruk din tilgjengelige saldo etter å ha nådd bruksgrensene",
+ "workspace.lite.subscription.selectProvider":
+ 'Velg "OpenCode Go" som leverandør i opencode-konfigurasjonen din for å bruke Go-modeller.',
+ "workspace.lite.black.message":
+ "Du abonnerer for øyeblikket på OpenCode Black eller står på venteliste. Vennligst avslutt abonnementet først hvis du vil bytte til Go.",
+ "workspace.lite.other.message":
+ "Et annet medlem i dette arbeidsområdet abonnerer allerede på OpenCode Go. Kun ett medlem per arbeidsområde kan abonnere.",
+ "workspace.lite.promo.description":
+ "OpenCode Go starter på {{price}}, deretter $10/måned, og gir pålitelig tilgang til populære åpne kodingsmodeller med sjenerøse bruksgrenser.",
+ "workspace.lite.promo.price": "$5 for den første måneden",
+ "workspace.lite.promo.modelsTitle": "Hva som er inkludert",
+ "workspace.lite.promo.footer":
+ "Planen er primært designet for internasjonale brukere, med modeller driftet i USA, EU og Singapore for stabil global tilgang. Priser og bruksgrenser kan endres etter hvert som vi lærer fra tidlig bruk og tilbakemeldinger.",
+ "workspace.lite.promo.subscribe": "Abonner på Go",
+ "workspace.lite.promo.subscribing": "Omdirigerer...",
+ "workspace.lite.promo.otherMethods": "Andre betalingsmetoder",
+ "workspace.lite.promo.selectMethod": "Velg betalingsmetode",
+
+ "workspace.referral.copyLink": "Kopier lenke",
+ "workspace.referral.copied": "Kopiert",
+ "workspace.referral.overview.title": "Inviter venner",
+ "workspace.referral.overview.subtitle": "Få $5 når en venn abonnerer. De får også $5.",
+ "workspace.referral.instructions.share": "Del henvisningslenken din",
+ "workspace.referral.instructions.subscribe": "Vennen din blir med og abonnerer på Go",
+ "workspace.referral.instructions.claim": "Dere får begge $5 i brukskreditt å bruke på Go-bruksgrensene deres",
+ "workspace.referral.rewards.title": "Henvisningsbelønninger",
+ "workspace.referral.rewards.description": "Bruk tilgjengelige henvisningskreditter på Go-bruken din.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} belønninger brukt.",
+ "workspace.referral.rewards.empty": "Ingen henvisningsbelønninger ennå.",
+ "workspace.referral.table.reward": "Belønning",
+ "workspace.referral.table.referral": "Beskrivelse",
+ "workspace.referral.table.date": "Dato",
+ "workspace.referral.reward.description.inviter": "Inviterte {{email}}",
+ "workspace.referral.reward.description.invitee": "Invitert av {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Abonner for å låse opp",
+ "workspace.referral.reward.action.view": "Vis belønning",
+ "workspace.referral.reward.action.applied": "Belønning brukt",
+ "workspace.referral.reward.source.pendingInviter": "Venter på at de abonnerer",
+ "workspace.referral.reward.source.pendingInvitee": "Abonner for å låse opp belønningen",
+ "workspace.referral.reward.source.available": "Belønning klar til bruk",
+ "workspace.referral.reward.source.applied": "Belønning brukt",
+ "workspace.referral.reward.status.applied": "Belønning brukt",
+ "workspace.referral.reward.status.pendingInviter": "Abonner for å låse opp",
+ "workspace.referral.reward.status.pendingInvitee": "Abonner for å låse opp",
+ "workspace.referral.apply.noGo": "Abonner for å låse opp",
+ "workspace.referral.apply.preview": "Vis belønning",
+ "workspace.referral.apply.action": "Bruk",
+ "workspace.referral.apply.confirmTitle": "Bruk belønning",
+ "workspace.referral.apply.confirmBody": "Bruk {{amount}} for å redusere dette workspacets nåværende forbruk.",
+ "workspace.referral.apply.confirmAction": "Bruk",
+
+ "download.title": "OpenCode | Last ned",
+ "download.meta.description": "Last ned OpenCode for macOS, Windows og Linux",
+ "download.hero.title": "Last ned OpenCode",
+ "download.hero.subtitle": "Tilgjengelig i beta for macOS, Windows og Linux",
+ "download.hero.button": "Last ned for {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Extensions",
+ "download.section.integrations": "OpenCode Integrations",
+ "download.action.download": "Last ned",
+ "download.action.install": "Installer",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Ikke nødvendigvis, men sannsynligvis. Du trenger et AI-abonnement hvis du vil koble OpenCode til en betalt leverandør, selv om du kan jobbe med",
+ "download.faq.a3.localLink": "lokale modeller",
+ "download.faq.a3.afterLocal.beforeZen": "gratis. Selv om vi oppfordrer brukere til å bruke",
+ "download.faq.a3.afterZen": ", fungerer OpenCode med alle populære leverandører som OpenAI, Anthropic, xAI osv.",
+
+ "download.faq.a5.p1": "OpenCode er 100% gratis å bruke.",
+ "download.faq.a5.p2.beforeZen":
+ "Eventuelle ekstra kostnader kommer fra abonnementet ditt hos en modellleverandør. Selv om OpenCode fungerer med enhver modellleverandør, anbefaler vi å bruke",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "Dataene og informasjonen din lagres bare når du oppretter delbare lenker i OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Les mer om",
+ "download.faq.a6.shareLink": "delingssider",
+
+ "enterprise.title": "OpenCode | Enterprise-løsninger for din organisasjon",
+ "enterprise.meta.description": "Kontakt OpenCode for enterprise-løsninger",
+ "enterprise.hero.title": "Koden din er din",
+ "enterprise.hero.body1":
+ "OpenCode opererer sikkert inne i organisasjonen din uten at data eller kontekst lagres, og uten lisensbegrensninger eller eierskapskrav. Start en prøveperiode med teamet ditt, og rull den deretter ut i hele organisasjonen ved å integrere den med SSO og din interne AI-gateway.",
+ "enterprise.hero.body2": "Fortell oss hvordan vi kan hjelpe.",
+ "enterprise.form.name.label": "Fullt navn",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Rolle",
+ "enterprise.form.role.placeholder": "Styreleder",
+ "enterprise.form.company.label": "Selskap",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Bedrifts-e-post",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Telefonnummer",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Hvilket problem prøver dere å løse?",
+ "enterprise.form.message.placeholder": "Vi trenger hjelp med...",
+ "enterprise.form.send": "Send",
+ "enterprise.form.sending": "Sender...",
+ "enterprise.form.success": "Melding sendt, vi tar kontakt snart.",
+ "enterprise.form.success.submitted": "Skjemaet ble sendt inn.",
+ "enterprise.form.error.allFieldsRequired": "Alle felt er obligatoriske.",
+ "enterprise.form.error.invalidEmailFormat": "Ugyldig e-postformat.",
+ "enterprise.form.error.internalServer": "Intern serverfeil.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Hva er OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise er for organisasjoner som vil sikre at koden og dataene deres aldri forlater infrastrukturen. Dette kan gjøres med en sentral konfigurasjon som integreres med SSO og intern AI-gateway.",
+ "enterprise.faq.q2": "Hvordan kommer jeg i gang med OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Start enkelt med en intern prøveperiode med teamet ditt. OpenCode lagrer som standard ikke koden din eller kontekstdata, noe som gjør det enkelt å komme i gang. Kontakt oss deretter for å diskutere priser og implementeringsalternativer.",
+ "enterprise.faq.q3": "Hvordan fungerer enterprise-prising?",
+ "enterprise.faq.a3":
+ "Vi tilbyr enterprise-prising per sete. Har du din egen LLM-gateway, tar vi ikke betalt for brukte tokens. Kontakt oss for flere detaljer og et tilpasset tilbud basert på organisasjonens behov.",
+ "enterprise.faq.q4": "Er dataene mine sikre med OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Ja. OpenCode lagrer ikke koden din eller kontekstdata. All behandling skjer lokalt eller gjennom direkte API-kall til AI-leverandøren din. Med sentral konfigurasjon og SSO-integrasjon forblir dataene dine sikre innenfor organisasjonens infrastruktur.",
+
+ "brand.title": "OpenCode | Merkevare",
+ "brand.meta.description": "OpenCode retningslinjer for merkevare",
+ "brand.heading": "Retningslinjer for merkevare",
+ "brand.subtitle": "Ressurser og assets som hjelper deg å jobbe med OpenCode-brandet.",
+ "brand.downloadAll": "Last ned alle assets",
+
+ "changelog.title": "OpenCode | Endringslogg",
+ "changelog.meta.description": "Utgivelsesnotater og endringslogg for OpenCode",
+ "changelog.hero.title": "Endringslogg",
+ "changelog.hero.subtitle": "Nye oppdateringer og forbedringer for OpenCode",
+ "changelog.empty": "Ingen endringsloggoppføringer funnet.",
+ "changelog.viewJson": "Vis JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "Agent",
+ "bench.list.table.model": "Modell",
+ "bench.list.table.score": "Poengsum",
+ "bench.submission.error.allFieldsRequired": "Alle felt er obligatoriske.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Oppgave ikke funnet",
+ "bench.detail.na": "I/T",
+ "bench.detail.labels.agent": "Agent",
+ "bench.detail.labels.model": "Modell",
+ "bench.detail.labels.task": "Oppgave",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "Fra",
+ "bench.detail.labels.to": "Til",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Gjennomsnittlig varighet",
+ "bench.detail.labels.averageScore": "Gjennomsnittlig poengsum",
+ "bench.detail.labels.averageCost": "Gjennomsnittlig kostnad",
+ "bench.detail.labels.summary": "Sammendrag",
+ "bench.detail.labels.runs": "Kjøringer",
+ "bench.detail.labels.score": "Poengsum",
+ "bench.detail.labels.base": "Basis",
+ "bench.detail.labels.penalty": "Straff",
+ "bench.detail.labels.weight": "vekt",
+ "bench.detail.table.run": "Kjøring",
+ "bench.detail.table.score": "Poengsum (Basis - Straff)",
+ "bench.detail.table.cost": "Kostnad",
+ "bench.detail.table.duration": "Varighet",
+ "bench.detail.run.title": "Kjøring {{n}}",
+ "bench.detail.rawJson": "Rå JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/pl.ts b/packages/console/app/src/i18n/pl.ts
new file mode 100644
index 0000000..9eac4a8
--- /dev/null
+++ b/packages/console/app/src/i18n/pl.ts
@@ -0,0 +1,827 @@
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Dokumentacja",
+ "nav.changelog": "Dziennik zmian",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Zaloguj się",
+ "nav.free": "Pobierz",
+ "nav.home": "Strona główna",
+ "nav.openMenu": "Otwórz menu",
+ "nav.getStartedFree": "Zacznij za darmo",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Skopiuj logo jako SVG",
+ "nav.context.copyWordmark": "Skopiuj logotyp jako SVG",
+ "nav.context.brandAssets": "Zasoby marki",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Dokumentacja",
+ "footer.changelog": "Dziennik zmian",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Marka",
+ "legal.privacy": "Prywatność",
+ "legal.terms": "Warunki",
+
+ "email.title": "Bądź pierwszym, który dowie się o nowych produktach",
+ "email.subtitle": "Dołącz do listy oczekujących na wczesny dostęp.",
+ "email.placeholder": "Adres e-mail",
+ "email.subscribe": "Subskrybuj",
+ "email.success": "Prawie gotowe, sprawdź skrzynkę i potwierdź swój adres e-mail",
+
+ "notFound.title": "Nie znaleziono | opencode",
+ "notFound.heading": "404 - Nie znaleziono strony",
+ "notFound.home": "Strona główna",
+ "notFound.docs": "Dokumentacja",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "jasne logo opencode",
+ "notFound.logoDarkAlt": "ciemne logo opencode",
+
+ "user.logout": "Wyloguj się",
+
+ "auth.callback.error.codeMissing": "Nie znaleziono kodu autoryzacji.",
+
+ "workspace.select": "Wybierz obszar roboczy",
+ "workspace.createNew": "+ Utwórz nowy obszar roboczy",
+ "workspace.modal.title": "Utwórz nowy obszar roboczy",
+ "workspace.modal.placeholder": "Wpisz nazwę obszaru roboczego",
+
+ "common.cancel": "Anuluj",
+ "common.creating": "Tworzenie...",
+ "common.create": "Utwórz",
+
+ "common.videoUnsupported": "Twoja przeglądarka nie obsługuje znacznika wideo.",
+ "common.figure": "Rys. {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Dowiedz się więcej",
+
+ "error.invalidPlan": "Nieprawidłowy plan",
+ "error.workspaceRequired": "ID obszaru roboczego jest wymagane",
+ "error.alreadySubscribed": "Ten obszar roboczy ma już subskrypcję",
+ "error.limitRequired": "Limit jest wymagany.",
+ "error.monthlyLimitInvalid": "Ustaw prawidłowy limit miesięczny.",
+ "error.workspaceNameRequired": "Nazwa obszaru roboczego jest wymagana.",
+ "error.nameTooLong": "Nazwa musi mieć 255 znaków lub mniej.",
+ "error.emailRequired": "E-mail jest wymagany",
+ "error.roleRequired": "Rola jest wymagana",
+ "error.idRequired": "ID jest wymagane",
+ "error.nameRequired": "Nazwa jest wymagana",
+ "error.providerRequired": "Dostawca jest wymagany",
+ "error.apiKeyRequired": "Klucz API jest wymagany",
+ "error.modelRequired": "Model jest wymagany",
+ "error.reloadAmountMin": "Kwota doładowania musi wynosić co najmniej ${{amount}}",
+ "error.reloadTriggerMin": "Próg salda musi wynosić co najmniej ${{amount}}",
+
+ "app.meta.description": "OpenCode - Otwartoźródłowy agent programistyczny.",
+
+ "home.title": "OpenCode | Open source'owy agent AI do kodowania",
+
+ "temp.title": "opencode | Agent AI do kodowania zbudowany dla terminala",
+ "temp.hero.title": "Agent AI do kodowania zbudowany dla terminala",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Rozpocznij",
+ "temp.feature.native.title": "Natywny TUI",
+ "temp.feature.native.body": "Responsywny, natywny, tematyczny interfejs terminala",
+ "temp.feature.zen.beforeLink": "A",
+ "temp.feature.zen.link": "wyselekcjonowana lista modeli",
+ "temp.feature.zen.afterLink": "dostarczana przez opencode",
+ "temp.feature.models.beforeLink": "Obsługuje 75+ dostawców LLM przez",
+ "temp.feature.models.afterLink": ", w tym modele lokalne",
+ "temp.screenshot.caption": "OpenCode TUI z motywem tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI z motywem tokyonight",
+ "temp.logoLightAlt": "jasne logo opencode",
+ "temp.logoDarkAlt": "ciemne logo opencode",
+
+ "home.banner.badge": "Nowość",
+ "home.banner.text": "Aplikacja desktopowa dostępna w wersji beta",
+ "home.banner.platforms": "na macOS, Windows i Linux",
+ "home.banner.downloadNow": "Pobierz teraz",
+ "home.banner.downloadBetaNow": "Pobierz betę wersji desktopowej",
+
+ "home.hero.title": "Open source'owy agent AI do kodowania",
+ "home.hero.subtitle.a": "Darmowe modele w zestawie lub podłącz dowolny model od dowolnego dostawcy,",
+ "home.hero.subtitle.b": "w tym Claude, GPT, Gemini i inne.",
+
+ "home.install.ariaLabel": "Opcje instalacji",
+
+ "home.what.title": "Czym jest OpenCode?",
+ "home.what.body":
+ "OpenCode to open source'owy agent, który pomaga pisać kod w terminalu, IDE lub aplikacji desktopowej.",
+ "home.what.lsp.title": "LSP włączone",
+ "home.what.lsp.body": "Automatycznie ładuje odpowiednie LSP dla LLM",
+ "home.what.multiSession.title": "Wielosesyjność",
+ "home.what.multiSession.body": "Uruchom wiele agentów równolegle w tym samym projekcie",
+ "home.what.shareLinks.title": "Udostępnianie linków",
+ "home.what.shareLinks.body": "Udostępnij link do dowolnej sesji w celach referencyjnych lub do debugowania",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Zaloguj się przez GitHub, aby używać swojego konta Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Zaloguj się przez OpenAI, aby używać swojego konta ChatGPT Plus lub Pro",
+ "home.what.anyModel.title": "Dowolny model",
+ "home.what.anyModel.body": "75+ dostawców LLM przez Models.dev, w tym modele lokalne",
+ "home.what.anyEditor.title": "Dowolny edytor",
+ "home.what.anyEditor.body": "Dostępny jako interfejs terminalowy, aplikacja desktopowa i rozszerzenie IDE",
+ "home.what.readDocs": "Czytaj dokumentację",
+
+ "home.growth.title": "Open source'owy agent AI do kodowania",
+ "home.growth.body":
+ "Z ponad {{stars}} gwiazdkami na GitHubie, {{contributors}} współtwórcami i ponad {{commits}} commitami, OpenCode jest używany i ceniony przez ponad {{monthlyUsers}} deweloperów każdego miesiąca.",
+ "home.growth.githubStars": "Gwiazdki GitHub",
+ "home.growth.contributors": "Współtwórcy",
+ "home.growth.monthlyDevs": "Miesięczni użytkownicy",
+
+ "home.privacy.title": "Zbudowany z myślą o prywatności",
+ "home.privacy.body":
+ "OpenCode nie przechowuje Twojego kodu ani danych kontekstowych, dzięki czemu może działać w środowiskach wrażliwych na prywatność.",
+ "home.privacy.learnMore": "Dowiedz się więcej o",
+ "home.privacy.link": "prywatności",
+
+ "home.faq.q1": "Czym jest OpenCode?",
+ "home.faq.a1":
+ "OpenCode to open source'owy agent, który pomaga pisać i uruchamiać kod z dowolnym modelem AI. Jest dostępny jako interfejs terminalowy, aplikacja desktopowa lub rozszerzenie IDE.",
+ "home.faq.q2": "Jak korzystać z OpenCode?",
+ "home.faq.a2.before": "Najłatwiej zacząć od przeczytania",
+ "home.faq.a2.link": "wprowadzenia",
+ "home.faq.q3": "Czy potrzebuję dodatkowych subskrypcji AI, aby używać OpenCode?",
+ "home.faq.a3.p1":
+ "Niekoniecznie. OpenCode posiada zestaw darmowych modeli, z których możesz korzystać bez zakładania konta.",
+ "home.faq.a3.p2.beforeZen": "Poza tym możesz używać dowolnych popularnych modeli do kodowania, tworząc konto",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Chociaż zachęcamy do korzystania z Zen, OpenCode działa również ze wszystkimi popularnymi dostawcami, takimi jak OpenAI, Anthropic, xAI itp.",
+ "home.faq.a3.p4.beforeLocal": "Możesz nawet podłączyć swoje",
+ "home.faq.a3.p4.localLink": "lokalne modele",
+ "home.faq.q4": "Czy mogę używać moich istniejących subskrypcji AI z OpenCode?",
+ "home.faq.a4.p1":
+ "Tak, OpenCode obsługuje plany subskrypcyjne od wszystkich głównych dostawców. Możesz używać swoich subskrypcji Claude Pro/Max, ChatGPT Plus/Pro lub GitHub Copilot.",
+ "home.faq.q5": "Czy mogę używać OpenCode tylko w terminalu?",
+ "home.faq.a5.beforeDesktop": "Już nie! OpenCode jest teraz dostępny jako aplikacja na",
+ "home.faq.a5.desktop": "pulpit (desktop)",
+ "home.faq.a5.and": "i",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "Ile kosztuje OpenCode?",
+ "home.faq.a6":
+ "OpenCode jest w 100% darmowy. Zawiera również zestaw darmowych modeli. Mogą pojawić się dodatkowe koszty, jeśli podłączysz innego dostawcę.",
+ "home.faq.q7": "A co z danymi i prywatnością?",
+ "home.faq.a7.p1":
+ "Twoje dane i informacje są przechowywane tylko wtedy, gdy używasz naszych darmowych modeli lub tworzysz linki do udostępniania.",
+ "home.faq.a7.p2.beforeModels": "Dowiedz się więcej o",
+ "home.faq.a7.p2.modelsLink": "naszych modelach",
+ "home.faq.a7.p2.and": "i",
+ "home.faq.a7.p2.shareLink": "stronach udostępniania",
+ "home.faq.q8": "Czy OpenCode jest open source?",
+ "home.faq.a8.p1": "Tak, OpenCode jest w pełni open source. Kod źródłowy jest publicznie dostępny na",
+ "home.faq.a8.p2": "na licencji",
+ "home.faq.a8.mitLicense": "MIT License",
+ "home.faq.a8.p3":
+ ", co oznacza, że każdy może go używać, modyfikować i wspierać jego rozwój. Każdy ze społeczności może zgłaszać błędy, przesyłać pull requesty i rozszerzać funkcjonalność.",
+
+ "home.zenCta.title": "Uzyskaj dostęp do niezawodnych, zoptymalizowanych modeli dla agentów kodujących",
+ "home.zenCta.body":
+ "Zen daje dostęp do wyselekcjonowanego zestawu modeli AI, które OpenCode przetestował i sprawdził (benchmark) specjalnie dla agentów kodujących. Nie musisz martwić się o niespójną wydajność i jakość u różnych dostawców, używaj sprawdzonych modeli, które działają.",
+ "home.zenCta.link": "Dowiedz się więcej o Zen",
+
+ "zen.title": "OpenCode Zen | Wyselekcjonowany zestaw niezawodnych, zoptymalizowanych modeli dla agentów kodujących",
+ "zen.hero.title": "Niezawodne, zoptymalizowane modele dla agentów kodujących",
+ "zen.hero.body":
+ "Zen daje dostęp do wyselekcjonowanego zestawu modeli AI, które OpenCode przetestował i sprawdził (benchmark) specjalnie dla agentów kodujących. Nie musisz martwić się o niespójną wydajność i jakość, używaj sprawdzonych modeli, które działają.",
+
+ "zen.faq.q1": "Czym jest OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen to wyselekcjonowany zestaw modeli AI przetestowanych i sprawdzonych pod kątem agentów kodujących, stworzony przez zespół stojący za OpenCode.",
+ "zen.faq.q2": "Co sprawia, że Zen jest bardziej precyzyjny?",
+ "zen.faq.a2":
+ "Zen oferuje tylko modele, które zostały specjalnie przetestowane i sprawdzone dla agentów kodujących. Nie używasz noża do masła do krojenia steku, więc nie używaj słabych modeli do kodowania.",
+ "zen.faq.q3": "Czy Zen jest tańszy?",
+ "zen.faq.a3":
+ "Zen nie jest nastawiony na zysk. Zen przekazuje koszty od dostawców modeli bezpośrednio do Ciebie. Im większe użycie Zen, tym lepsze stawki OpenCode może wynegocjować i przekazać Tobie.",
+ "zen.faq.q4": "Ile kosztuje Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "pobiera opłaty za żądanie",
+ "zen.faq.a4.p1.afterPricing": "bez marży, więc płacisz dokładnie tyle, ile pobiera dostawca modelu.",
+ "zen.faq.a4.p2.beforeAccount":
+ "Twój całkowity koszt zależy od użycia, i możesz ustawić miesięczne limity wydatków na swoim",
+ "zen.faq.a4.p2.accountLink": "koncie",
+ "zen.faq.a4.p3":
+ "Aby pokryć koszty, OpenCode dolicza jedynie niewielką opłatę za przetwarzanie płatności w wysokości $1.23 przy każdym doładowaniu salda o $20.",
+ "zen.faq.q5": "A co z danymi i prywatnością?",
+ "zen.faq.a5.beforeExceptions":
+ "Wszystkie modele Zen są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z",
+ "zen.faq.a5.exceptionsLink": "następującymi wyjątkami",
+ "zen.faq.q6": "Czy mogę ustawić limity wydatków?",
+ "zen.faq.a6": "Tak, możesz ustawić miesięczne limity wydatków na swoim koncie.",
+ "zen.faq.q7": "Czy mogę anulować?",
+ "zen.faq.a7": "Tak, możesz wyłączyć rozliczenia w dowolnym momencie i wykorzystać pozostałe saldo.",
+ "zen.faq.q8": "Czy mogę używać Zen z innymi agentami kodującymi?",
+ "zen.faq.a8":
+ "Chociaż Zen świetnie działa z OpenCode, możesz używać Zen z dowolnym agentem. Postępuj zgodnie z instrukcjami konfiguracji w swoim preferowanym agencie.",
+
+ "zen.cta.start": "Zacznij korzystać z Zen",
+ "zen.pricing.title": "Dodaj 20$ salda Pay as you go",
+ "zen.pricing.fee": "(+$1.23 opłaty za przetwarzanie karty)",
+ "zen.pricing.body": "Używaj z dowolnym agentem. Ustaw miesięczne limity wydatków. Anuluj w dowolnym momencie.",
+ "zen.problem.title": "Jaki problem rozwiązuje Zen?",
+ "zen.problem.body":
+ "Dostępnych jest wiele modeli, ale tylko nieliczne dobrze współpracują z agentami kodującymi. Większość dostawców konfiguruje je inaczej, co daje różne wyniki.",
+ "zen.problem.subtitle": "Naprawiamy to dla wszystkich, nie tylko dla użytkowników OpenCode.",
+ "zen.problem.item1": "Testowanie wybranych modeli i konsultacje z ich zespołami",
+ "zen.problem.item2": "Współpraca z dostawcami w celu zapewnienia ich prawidłowego dostarczania",
+ "zen.problem.item3": "Benchmark wszystkich rekomendowanych przez nas kombinacji modeli i dostawców",
+ "zen.how.title": "Jak działa Zen",
+ "zen.how.body": "Chociaż sugerujemy używanie Zen z OpenCode, możesz używać Zen z dowolnym agentem.",
+ "zen.how.step1.title": "Zarejestruj się i doładuj saldo 20$",
+ "zen.how.step1.beforeLink": "postępuj zgodnie z",
+ "zen.how.step1.link": "instrukcją konfiguracji",
+ "zen.how.step2.title": "Używaj Zen z przejrzystym cennikiem",
+ "zen.how.step2.link": "płać za żądanie",
+ "zen.how.step2.afterLink": "bez marży",
+ "zen.how.step3.title": "Automatyczne doładowanie",
+ "zen.how.step3.body": "gdy Twoje saldo osiągnie 5$, automatycznie dodamy 20$",
+ "zen.privacy.title": "Twoja prywatność jest dla nas ważna",
+ "zen.privacy.beforeExceptions":
+ "Wszystkie modele Zen są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie wykorzystują Twoich danych do trenowania modeli, z",
+ "zen.privacy.exceptionsLink": "następującymi wyjątkami",
+
+ "go.title": "OpenCode Go | Niskokosztowe modele do kodowania dla każdego",
+ "go.meta.description":
+ "Go zaczyna się od $5 za pierwszy miesiąc, potem $10/miesiąc, z hojnymi 5-godzinnymi limitami zapytań dla GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro i DeepSeek V4 Flash.",
+ "go.hero.title": "Niskokosztowe modele do kodowania dla każdego",
+ "go.hero.body":
+ "Go udostępnia programowanie z agentami programistom na całym świecie. Oferuje hojne limity i niezawodny dostęp do najzdolniejszych modeli open source, dzięki czemu możesz budować za pomocą potężnych agentów, nie martwiąc się o koszty czy dostępność.",
+
+ "go.cta.start": "Zasubskrybuj Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Zasubskrybuj Go",
+ "go.cta.price": "$10/miesiąc",
+ "go.cta.promo": "$5 pierwszy miesiąc",
+ "go.pricing.body":
+ "Używaj z dowolnym agentem. $5 za pierwszy miesiąc, potem $10/miesiąc. Doładuj konto w razie potrzeby. Anuluj w dowolnym momencie.",
+ "go.graph.free": "Darmowe",
+ "go.graph.freePill": "Big Pickle i darmowe modele",
+ "go.graph.go": "Go",
+ "go.graph.label": "Żądania na 5 godzin",
+ "go.graph.usageLimits": "Limity użycia",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Żądania na 5h: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "zmieniło moje życie, to naprawdę oczywisty wybór.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 na 5 osób w naszym zespole uwielbia używać",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Nie mogę wystarczająco polecić",
+ "go.testimonials.adam.quoteAfter": ". Poważnie, to jest naprawdę dobre.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Dzięki",
+ "go.testimonials.david.quoteAfter": "wiem, że wszystkie modele są przetestowane i idealne dla agentów kodujących.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
+ "go.testimonials.frank.quote": "Chciałbym wciąż być w Nvidia.",
+ "go.problem.title": "Jaki problem rozwiązuje Go?",
+ "go.problem.body":
+ "Skupiamy się na udostępnieniu doświadczenia OpenCode jak największej liczbie osób. OpenCode Go to tania subskrypcja: $5 za pierwszy miesiąc, potem $10/miesiąc. Zapewnia hojne limity i niezawodny dostęp do najbardziej wydajnych modeli open source.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Niskokosztowa cena subskrypcji",
+ "go.problem.item2": "Hojne limity i niezawodny dostęp",
+ "go.problem.item3": "Stworzony dla jak największej liczby programistów",
+ "go.problem.item4":
+ "Zawiera GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro i DeepSeek V4 Flash",
+ "go.how.title": "Jak działa Go",
+ "go.how.body":
+ "Go zaczyna się od $5 za pierwszy miesiąc, potem $10/miesiąc. Możesz go używać z OpenCode lub dowolnym agentem.",
+ "go.how.step1.title": "Załóż konto",
+ "go.how.step1.beforeLink": "postępuj zgodnie z",
+ "go.how.step1.link": "instrukcją konfiguracji",
+ "go.how.step2.title": "Zasubskrybuj Go",
+ "go.how.step2.link": "$5 za pierwszy miesiąc",
+ "go.how.step2.afterLink": "potem $10/miesiąc z hojnymi limitami",
+ "go.how.step3.title": "Zacznij kodować",
+ "go.how.step3.body": "z niezawodnym dostępem do modeli open source",
+ "go.privacy.title": "Twoja prywatność jest dla nas ważna",
+ "go.privacy.body":
+ "Plan został zaprojektowany głównie dla użytkowników międzynarodowych, z modelami hostowanymi w USA, UE i Singapurze, aby zapewnić stabilny globalny dostęp.",
+ "go.privacy.contactAfter": "jeśli masz jakiekolwiek pytania.",
+ "go.privacy.beforeExceptions":
+ "Modele Go są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z",
+ "go.privacy.exceptionsLink": "następującymi wyjątkami",
+ "go.faq.q1": "Czym jest OpenCode Go?",
+ "go.faq.a1":
+ "Go to niskokosztowa subskrypcja, która daje niezawodny dostęp do zdolnych modeli open source dla agentów kodujących.",
+ "go.faq.q2": "Jakie modele zawiera Go?",
+ "go.faq.a2": "Go obejmuje poniższe modele z wysokimi limitami i niezawodnym dostępem.",
+ "go.faq.q3": "Czy Go to to samo co Zen?",
+ "go.faq.a3":
+ "Nie. Zen to model płatności za użycie, podczas gdy Go zaczyna się od $5 za pierwszy miesiąc, potem $10/miesiąc, z hojnymi limitami i niezawodnym dostępem do modeli open source GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro i DeepSeek V4 Flash.",
+ "go.faq.q4": "Ile kosztuje Go?",
+ "go.faq.a4.p1.beforePricing": "Go kosztuje",
+ "go.faq.a4.p1.pricingLink": "$5 za pierwszy miesiąc",
+ "go.faq.a4.p1.afterPricing": "potem $10/miesiąc z hojnymi limitami.",
+ "go.faq.a4.p2.beforeAccount": "Możesz zarządzać subskrypcją na swoim",
+ "go.faq.a4.p2.accountLink": "koncie",
+ "go.faq.a4.p3": "Anuluj w dowolnym momencie.",
+ "go.faq.q5": "A co z danymi i prywatnością?",
+ "go.faq.a5.body":
+ "Plan został zaprojektowany głównie dla użytkowników międzynarodowych, z modelami hostowanymi w USA, UE i Singapurze, aby zapewnić stabilny globalny dostęp. Nasi dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli.",
+ "go.faq.a5.beforeExceptions":
+ "Modele Go są hostowane w USA. Dostawcy stosują politykę zerowej retencji i nie używają Twoich danych do trenowania modeli, z",
+ "go.faq.a5.exceptionsLink": "następującymi wyjątkami",
+ "go.faq.q6": "Czy mogę doładować środki?",
+ "go.faq.a6": "Jeśli potrzebujesz większego użycia, możesz doładować środki na swoim koncie.",
+ "go.faq.q7": "Czy mogę anulować?",
+ "go.faq.a7": "Tak, możesz anulować w dowolnym momencie.",
+ "go.faq.q8": "Czy mogę używać Go z innymi agentami kodującymi?",
+ "go.faq.a8":
+ "Tak, możesz używać Go z dowolnym agentem. Postępuj zgodnie z instrukcjami konfiguracji w swoim preferowanym agencie.",
+
+ "go.faq.q9": "Jaka jest różnica między darmowymi modelami a Go?",
+ "go.faq.a9":
+ "Darmowe modele obejmują Big Pickle oraz modele promocyjne dostępne w danym momencie, z limitem 200 zapytań/dzień. Go zawiera GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro i DeepSeek V4 Flash z wyższymi limitami zapytań egzekwowanymi w oknach kroczących (5-godzinnych, tygodniowych i miesięcznych), w przybliżeniu równoważnymi $12 na 5 godzin, $30 tygodniowo i $60 miesięcznie (rzeczywista liczba zapytań zależy od modelu i użycia).",
+
+ "zen.api.error.rateLimitExceeded": "Przekroczono limit zapytań. Spróbuj ponownie później.",
+ "zen.api.error.modelNotSupported": "Model {{model}} nie jest obsługiwany",
+ "zen.api.error.modelFormatNotSupported": "Model {{model}} nie jest obsługiwany dla formatu {{format}}",
+ "zen.api.error.noProviderAvailable": "Brak dostępnego dostawcy",
+ "zen.api.error.providerNotSupported": "Dostawca {{provider}} nie jest obsługiwany",
+ "zen.api.error.missingApiKey": "Brak klucza API.",
+ "zen.api.error.invalidApiKey": "Nieprawidłowy klucz API.",
+ "zen.api.error.subscriptionQuotaExceeded": "Przekroczono limit subskrypcji. Spróbuj ponownie za {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Osiągnięto 5-godzinny limit użycia. Resetuje się za {{retryIn}}. Aby nadal korzystać z tego modelu, włącz użycie z dostępnego salda: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Osiągnięto tygodniowy limit użycia. Resetuje się za {{retryIn}}. Aby nadal korzystać z tego modelu, włącz użycie z dostępnego salda: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Osiągnięto miesięczny limit użycia. Resetuje się za {{retryIn}}. Aby nadal korzystać z tego modelu, włącz użycie z dostępnego salda: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Brak metody płatności. Dodaj metodę płatności tutaj: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Niewystarczające saldo. Zarządzaj swoimi płatnościami tutaj: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Twoja przestrzeń robocza osiągnęła miesięczny limit wydatków w wysokości ${{amount}}. Zarządzaj swoimi limitami tutaj: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Osiągnąłeś swój miesięczny limit wydatków w wysokości ${{amount}}. Zarządzaj swoimi limitami tutaj: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Model jest wyłączony",
+ "zen.api.error.trialEnded":
+ "Bezpłatna promocja {{model}} dobiegła końca. Możesz dalej korzystać z modelu, subskrybując OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Dostęp do najlepszych na świecie modeli kodujących",
+ "black.meta.description": "Uzyskaj dostęp do Claude, GPT, Gemini i innych dzięki planom subskrypcji OpenCode Black.",
+ "black.hero.title": "Dostęp do najlepszych na świecie modeli kodujących",
+ "black.hero.subtitle": "W tym Claude, GPT, Gemini i inne",
+ "black.title": "OpenCode Black | Cennik",
+ "black.paused": "Rejestracja planu Black jest tymczasowo wstrzymana.",
+ "black.plan.icon20": "Plan Black 20",
+ "black.plan.icon100": "Plan Black 100",
+ "black.plan.icon200": "Plan Black 200",
+ "black.plan.multiplier100": "5x większe użycie niż Black 20",
+ "black.plan.multiplier200": "20x większe użycie niż Black 20",
+ "black.price.perMonth": "miesięcznie",
+ "black.price.perPersonBilledMonthly": "za osobę rozliczane miesięcznie",
+ "black.terms.1": "Twoja subskrypcja nie rozpocznie się natychmiast",
+ "black.terms.2": "Zostaniesz dodany do listy oczekujących i aktywowany wkrótce",
+ "black.terms.3": "Twoja karta zostanie obciążona dopiero po aktywacji subskrypcji",
+ "black.terms.4": "Obowiązują limity użycia, intensywne automatyczne użycie może wyczerpać limity szybciej",
+ "black.terms.5": "Subskrypcje są dla osób indywidualnych, skontaktuj się z Enterprise dla zespołów",
+ "black.terms.6": "Limity mogą zostać dostosowane, a plany mogą zostać wycofane w przyszłości",
+ "black.terms.7": "Anuluj subskrypcję w dowolnym momencie",
+ "black.action.continue": "Kontynuuj",
+ "black.finePrint.beforeTerms": "Podane ceny nie zawierają stosownego podatku",
+ "black.finePrint.terms": "Warunki świadczenia usług",
+ "black.workspace.title": "OpenCode Black | Wybierz obszar roboczy",
+ "black.workspace.selectPlan": "Wybierz obszar roboczy dla tego planu",
+ "black.workspace.name": "Obszar roboczy {{n}}",
+ "black.subscribe.title": "Subskrybuj OpenCode Black",
+ "black.subscribe.paymentMethod": "Metoda płatności",
+ "black.subscribe.loadingPaymentForm": "Ładowanie formularza płatności...",
+ "black.subscribe.selectWorkspaceToContinue": "Wybierz obszar roboczy, aby kontynuować",
+ "black.subscribe.failurePrefix": "O nie!",
+ "black.subscribe.error.generic": "Wystąpił błąd",
+ "black.subscribe.error.invalidPlan": "Nieprawidłowy plan",
+ "black.subscribe.error.workspaceRequired": "ID obszaru roboczego jest wymagane",
+ "black.subscribe.error.alreadySubscribed": "Ten obszar roboczy ma już subskrypcję",
+ "black.subscribe.processing": "Przetwarzanie...",
+ "black.subscribe.submit": "Subskrybuj ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Zostaniesz obciążony dopiero po aktywacji subskrypcji",
+ "black.subscribe.success.title": "Jesteś na liście oczekujących OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "Plan subskrypcji",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Kwota",
+ "black.subscribe.success.amountValue": "${{plan}} miesięcznie",
+ "black.subscribe.success.paymentMethod": "Metoda płatności",
+ "black.subscribe.success.dateJoined": "Data dołączenia",
+ "black.subscribe.success.chargeNotice": "Twoja karta zostanie obciążona po aktywacji subskrypcji",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Użycie",
+ "workspace.nav.apiKeys": "Klucze API",
+ "workspace.nav.members": "Członkowie",
+ "workspace.nav.billing": "Rozliczenia",
+ "workspace.nav.settings": "Ustawienia",
+
+ "workspace.home.banner.beforeLink": "Niezawodne, zoptymalizowane modele dla agentów kodujących.",
+ "workspace.lite.banner.beforeLink": "Niskokosztowe modele kodowania dla każdego.",
+ "workspace.home.billing.loading": "Ładowanie...",
+ "workspace.home.billing.enable": "Włącz rozliczenia",
+ "workspace.home.billing.currentBalance": "Aktualne saldo",
+
+ "workspace.newUser.feature.tested.title": "Przetestowane i zweryfikowane modele",
+ "workspace.newUser.feature.tested.body":
+ "Przeprowadziliśmy testy porównawcze i przetestowaliśmy modele specjalnie dla agentów kodujących, aby zapewnić najlepszą wydajność.",
+ "workspace.newUser.feature.quality.title": "Najwyższa jakość",
+ "workspace.newUser.feature.quality.body":
+ "Dostęp do modeli skonfigurowanych pod kątem optymalnej wydajności - bez degradacji jakości czy przekierowywania do tańszych dostawców.",
+ "workspace.newUser.feature.lockin.title": "Brak blokady (Lock-in)",
+ "workspace.newUser.feature.lockin.body":
+ "Używaj Zen z dowolnym agentem kodującym i kontynuuj korzystanie z innych dostawców z OpenCode, kiedy tylko chcesz.",
+ "workspace.newUser.copyApiKey": "Skopiuj klucz API",
+ "workspace.newUser.copyKey": "Skopiuj klucz",
+ "workspace.newUser.copied": "Skopiowano!",
+ "workspace.newUser.step.enableBilling": "Włącz rozliczenia",
+ "workspace.newUser.step.login.before": "Uruchom",
+ "workspace.newUser.step.login.after": "i wybierz opencode",
+ "workspace.newUser.step.pasteKey": "Wklej swój klucz API",
+ "workspace.newUser.step.models.before": "Uruchom opencode i wpisz",
+ "workspace.newUser.step.models.after": "aby wybrać model",
+
+ "workspace.models.title": "Modele",
+ "workspace.models.subtitle.beforeLink": "Zarządzaj dostępem członków obszaru roboczego do modeli.",
+ "workspace.models.table.model": "Model",
+ "workspace.models.table.enabled": "Włączony",
+
+ "workspace.providers.title": "Przynieś własny klucz (BYOK)",
+ "workspace.providers.subtitle": "Skonfiguruj własne klucze API od dostawców AI.",
+ "workspace.providers.placeholder": "Wprowadź klucz API {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Konfiguruj",
+ "workspace.providers.edit": "Edytuj",
+ "workspace.providers.delete": "Usuń",
+ "workspace.providers.saving": "Zapisywanie...",
+ "workspace.providers.save": "Zapisz",
+ "workspace.providers.table.provider": "Dostawca",
+ "workspace.providers.table.apiKey": "Klucz API",
+
+ "workspace.usage.title": "Historia użycia",
+ "workspace.usage.subtitle": "Ostatnie użycie API i koszty.",
+ "workspace.usage.empty": "Wykonaj pierwsze wywołanie API, aby rozpocząć.",
+ "workspace.usage.table.date": "Data",
+ "workspace.usage.table.model": "Model",
+ "workspace.usage.table.input": "Wejście",
+ "workspace.usage.table.output": "Wyjście",
+ "workspace.usage.table.cost": "Koszt",
+ "workspace.usage.table.session": "Sesja",
+ "workspace.usage.breakdown.input": "Wejście",
+ "workspace.usage.breakdown.cacheRead": "Odczyt Cache",
+ "workspace.usage.breakdown.cacheWrite": "Zapis Cache",
+ "workspace.usage.breakdown.output": "Wyjście",
+ "workspace.usage.breakdown.reasoning": "Rozumowanie",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Koszt",
+ "workspace.cost.subtitle": "Koszty użycia w podziale na modele.",
+ "workspace.cost.allModels": "Wszystkie modele",
+ "workspace.cost.allKeys": "Wszystkie klucze",
+ "workspace.cost.deletedSuffix": "(usunięte)",
+ "workspace.cost.empty": "Brak danych o użyciu dla wybranego okresu.",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "Klucze API",
+ "workspace.keys.subtitle": "Zarządzaj kluczami API do usług opencode.",
+ "workspace.keys.create": "Utwórz klucz API",
+ "workspace.keys.placeholder": "Wpisz nazwę klucza",
+ "workspace.keys.empty": "Utwórz klucz API bramy opencode",
+ "workspace.keys.table.name": "Nazwa",
+ "workspace.keys.table.key": "Klucz",
+ "workspace.keys.table.createdBy": "Utworzony przez",
+ "workspace.keys.table.lastUsed": "Ostatnio użyty",
+ "workspace.keys.copyApiKey": "Skopiuj klucz API",
+ "workspace.keys.delete": "Usuń",
+
+ "workspace.members.title": "Członkowie",
+ "workspace.members.subtitle": "Zarządzaj członkami obszaru roboczego i ich uprawnieniami.",
+ "workspace.members.invite": "Zaproś członka",
+ "workspace.members.inviting": "Zapraszanie...",
+ "workspace.members.beta.beforeLink": "Obszary robocze są darmowe dla zespołów w fazie beta.",
+ "workspace.members.form.invitee": "Zaproszona osoba",
+ "workspace.members.form.emailPlaceholder": "Wpisz e-mail",
+ "workspace.members.form.role": "Rola",
+ "workspace.members.form.monthlyLimit": "Miesięczny limit wydatków",
+ "workspace.members.noLimit": "Bez limitu",
+ "workspace.members.noLimitLowercase": "bez limitu",
+ "workspace.members.invited": "zaproszono",
+ "workspace.members.edit": "Edytuj",
+ "workspace.members.delete": "Usuń",
+ "workspace.members.saving": "Zapisywanie...",
+ "workspace.members.save": "Zapisz",
+ "workspace.members.table.email": "E-mail",
+ "workspace.members.table.role": "Rola",
+ "workspace.members.table.monthLimit": "Limit miesięczny",
+ "workspace.members.role.admin": "Administrator",
+ "workspace.members.role.adminDescription": "Może zarządzać modelami, członkami i rozliczeniami",
+ "workspace.members.role.member": "Członek",
+ "workspace.members.role.memberDescription": "Może generować klucze API tylko dla siebie",
+
+ "workspace.settings.title": "Ustawienia",
+ "workspace.settings.subtitle": "Zaktualizuj nazwę i preferencje obszaru roboczego.",
+ "workspace.settings.workspaceName": "Nazwa obszaru roboczego",
+ "workspace.settings.defaultName": "Domyślny",
+ "workspace.settings.updating": "Aktualizowanie...",
+ "workspace.settings.save": "Zapisz",
+ "workspace.settings.edit": "Edytuj",
+
+ "workspace.billing.title": "Rozliczenia",
+ "workspace.billing.subtitle.beforeLink": "Zarządzaj metodami płatności.",
+ "workspace.billing.contactUs": "Skontaktuj się z nami",
+ "workspace.billing.subtitle.afterLink": "jeśli masz jakiekolwiek pytania.",
+ "workspace.billing.currentBalance": "Aktualne saldo",
+ "workspace.billing.add": "Dodaj $",
+ "workspace.billing.enterAmount": "Wpisz kwotę",
+ "workspace.billing.loading": "Ładowanie...",
+ "workspace.billing.addAction": "Dodaj",
+ "workspace.billing.addBalance": "Doładuj saldo",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Połączono ze Stripe",
+ "workspace.billing.manage": "Zarządzaj",
+ "workspace.billing.enable": "Włącz rozliczenia",
+
+ "workspace.monthlyLimit.title": "Limit miesięczny",
+ "workspace.monthlyLimit.subtitle": "Ustaw miesięczny limit użycia dla swojego konta.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Ustawianie...",
+ "workspace.monthlyLimit.set": "Ustaw",
+ "workspace.monthlyLimit.edit": "Edytuj limit",
+ "workspace.monthlyLimit.noLimit": "Brak ustawionego limitu użycia.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Aktualne użycie za",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "wynosi $",
+
+ "workspace.redeem.title": "Zrealizuj kupon",
+ "workspace.redeem.subtitle": "Zrealizuj kod kuponu, aby otrzymać środki lub korzyści.",
+ "workspace.redeem.placeholder": "Wpisz kod kuponu",
+ "workspace.redeem.redeem": "Zrealizuj",
+ "workspace.redeem.redeeming": "Realizowanie...",
+ "workspace.redeem.success": "Kupon został zrealizowany.",
+
+ "workspace.reload.title": "Automatyczne doładowanie",
+ "workspace.reload.disabled.before": "Automatyczne doładowanie jest",
+ "workspace.reload.disabled.state": "wyłączone",
+ "workspace.reload.disabled.after": "Włącz, aby automatycznie doładować, gdy saldo jest niskie.",
+ "workspace.reload.enabled.before": "Automatyczne doładowanie jest",
+ "workspace.reload.enabled.state": "włączone",
+ "workspace.reload.enabled.middle": "Doładujemy",
+ "workspace.reload.processingFee": "opłata procesowa",
+ "workspace.reload.enabled.after": "gdy saldo osiągnie",
+ "workspace.reload.edit": "Edytuj",
+ "workspace.reload.enable": "Włącz",
+ "workspace.reload.enableAutoReload": "Włącz automatyczne doładowanie",
+ "workspace.reload.reloadAmount": "Doładuj kwotą $",
+ "workspace.reload.whenBalanceReaches": "Gdy saldo osiągnie $",
+ "workspace.reload.saving": "Zapisywanie...",
+ "workspace.reload.save": "Zapisz",
+ "workspace.reload.failedAt": "Doładowanie nie powiodło się o",
+ "workspace.reload.reason": "Powód:",
+ "workspace.reload.updatePaymentMethod": "Zaktualizuj metodę płatności i spróbuj ponownie.",
+ "workspace.reload.retrying": "Ponawianie...",
+ "workspace.reload.retry": "Spróbuj ponownie",
+ "workspace.reload.error.paymentFailed": "Płatność nie powiodła się.",
+
+ "workspace.payments.title": "Historia płatności",
+ "workspace.payments.subtitle": "Ostatnie transakcje płatnicze.",
+ "workspace.payments.table.date": "Data",
+ "workspace.payments.table.paymentId": "ID płatności",
+ "workspace.payments.table.amount": "Kwota",
+ "workspace.payments.table.receipt": "Rachunek",
+ "workspace.payments.type.credit": "środki",
+ "workspace.payments.type.subscription": "subskrypcja",
+ "workspace.payments.view": "Zobacz",
+
+ "workspace.black.loading": "Ładowanie...",
+ "workspace.black.time.day": "dzień",
+ "workspace.black.time.days": "dni",
+ "workspace.black.time.hour": "godzina",
+ "workspace.black.time.hours": "godzin(y)",
+ "workspace.black.time.minute": "minuta",
+ "workspace.black.time.minutes": "minut(y)",
+ "workspace.black.time.fewSeconds": "kilka sekund",
+ "workspace.black.subscription.title": "Subskrypcja",
+ "workspace.black.subscription.message": "Subskrybujesz OpenCode Black za ${{plan}} miesięcznie.",
+ "workspace.black.subscription.manage": "Zarządzaj subskrypcją",
+ "workspace.black.subscription.rollingUsage": "Użycie (okno 5h)",
+ "workspace.black.subscription.weeklyUsage": "Użycie tygodniowe",
+ "workspace.black.subscription.resetsIn": "Resetuje się za",
+ "workspace.black.subscription.useBalance": "Użyj dostępnego salda po osiągnięciu limitów użycia",
+ "workspace.black.waitlist.title": "Lista oczekujących",
+ "workspace.black.waitlist.joined": "Jesteś na liście oczekujących na plan OpenCode Black za ${{plan}} miesięcznie.",
+ "workspace.black.waitlist.ready": "Jesteśmy gotowi zapisać Cię do planu OpenCode Black za ${{plan}} miesięcznie.",
+ "workspace.black.waitlist.leave": "Opuść listę oczekujących",
+ "workspace.black.waitlist.leaving": "Opuszczanie...",
+ "workspace.black.waitlist.left": "Opuszczono",
+ "workspace.black.waitlist.enroll": "Zapisz się",
+ "workspace.black.waitlist.enrolling": "Zapisywanie...",
+ "workspace.black.waitlist.enrolled": "Zapisano",
+ "workspace.black.waitlist.enrollNote":
+ "Po kliknięciu Zapisz się, Twoja subskrypcja rozpocznie się natychmiast, a karta zostanie obciążona.",
+
+ "workspace.lite.loading": "Ładowanie...",
+ "workspace.lite.time.day": "dzień",
+ "workspace.lite.time.days": "dni",
+ "workspace.lite.time.hour": "godzina",
+ "workspace.lite.time.hours": "godzin(y)",
+ "workspace.lite.time.minute": "minuta",
+ "workspace.lite.time.minutes": "minut(y)",
+ "workspace.lite.time.fewSeconds": "kilka sekund",
+ "workspace.lite.subscription.message": "Subskrybujesz OpenCode Go.",
+ "workspace.lite.subscription.manage": "Zarządzaj subskrypcją",
+ "workspace.lite.subscription.rollingUsage": "Użycie kroczące",
+ "workspace.lite.subscription.weeklyUsage": "Użycie tygodniowe",
+ "workspace.lite.subscription.monthlyUsage": "Użycie miesięczne",
+ "workspace.lite.subscription.resetsIn": "Resetuje się za",
+ "workspace.lite.subscription.useBalance": "Użyj dostępnego salda po osiągnięciu limitów użycia",
+ "workspace.lite.subscription.selectProvider":
+ 'Wybierz "OpenCode Go" jako dostawcę w konfiguracji opencode, aby używać modeli Go.',
+ "workspace.lite.black.message":
+ "Obecnie subskrybujesz OpenCode Black lub jesteś na liście oczekujących. Jeśli chcesz przejść na Go, najpierw anuluj subskrypcję.",
+ "workspace.lite.other.message":
+ "Inny członek tego obszaru roboczego już subskrybuje OpenCode Go. Tylko jeden członek na obszar roboczy może subskrybować.",
+ "workspace.lite.promo.description":
+ "OpenCode Go zaczyna się od {{price}}, potem $10/miesiąc, i zapewnia niezawodny dostęp do popularnych otwartych modeli kodowania z hojnymi limitami użycia.",
+ "workspace.lite.promo.price": "$5 za pierwszy miesiąc",
+ "workspace.lite.promo.modelsTitle": "Co zawiera",
+ "workspace.lite.promo.footer":
+ "Plan został zaprojektowany głównie dla użytkowników międzynarodowych, z modelami hostowanymi w USA, UE i Singapurze, aby zapewnić stabilny globalny dostęp. Ceny i limity użycia mogą ulec zmianie w miarę analizy wczesnego użycia i zbierania opinii.",
+ "workspace.lite.promo.subscribe": "Subskrybuj Go",
+ "workspace.lite.promo.subscribing": "Przekierowywanie...",
+ "workspace.lite.promo.otherMethods": "Inne metody płatności",
+ "workspace.lite.promo.selectMethod": "Wybierz metodę płatności",
+
+ "workspace.referral.copyLink": "Kopiuj link",
+ "workspace.referral.copied": "Skopiowano",
+ "workspace.referral.overview.title": "Zaproś znajomych",
+ "workspace.referral.overview.subtitle": "Zdobądź $5, gdy znajomy się zasubskrybuje. On też dostanie $5.",
+ "workspace.referral.instructions.share": "Udostępnij swój link polecający",
+ "workspace.referral.instructions.subscribe": "Twój znajomy dołącza i subskrybuje Go",
+ "workspace.referral.instructions.claim": "Oboje otrzymujecie kredyt $5 do wykorzystania na limity użycia Go",
+ "workspace.referral.rewards.title": "Nagrody za polecenia",
+ "workspace.referral.rewards.description": "Wykorzystaj dostępne środki za polecenia na swoje użycie Go.",
+ "workspace.referral.rewards.subtitle": "Wykorzystano {{applied}} / {{total}} nagród.",
+ "workspace.referral.rewards.empty": "Brak nagród za polecenia.",
+ "workspace.referral.table.reward": "Nagroda",
+ "workspace.referral.table.referral": "Opis",
+ "workspace.referral.table.date": "Data",
+ "workspace.referral.reward.description.inviter": "Zaproszono {{email}}",
+ "workspace.referral.reward.description.invitee": "Zaproszony przez {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Subskrybuj, aby odblokować",
+ "workspace.referral.reward.action.view": "Zobacz nagrodę",
+ "workspace.referral.reward.action.applied": "Nagroda wykorzystana",
+ "workspace.referral.reward.source.pendingInviter": "Oczekiwanie na jego subskrypcję",
+ "workspace.referral.reward.source.pendingInvitee": "Subskrybuj, aby odblokować nagrodę",
+ "workspace.referral.reward.source.available": "Nagroda gotowa do wykorzystania",
+ "workspace.referral.reward.source.applied": "Nagroda wykorzystana",
+ "workspace.referral.reward.status.applied": "Nagroda wykorzystana",
+ "workspace.referral.reward.status.pendingInviter": "Subskrybuj, aby odblokować",
+ "workspace.referral.reward.status.pendingInvitee": "Subskrybuj, aby odblokować",
+ "workspace.referral.apply.noGo": "Subskrybuj, aby odblokować",
+ "workspace.referral.apply.preview": "Zobacz nagrodę",
+ "workspace.referral.apply.action": "Wykorzystaj",
+ "workspace.referral.apply.confirmTitle": "Wykorzystaj nagrodę",
+ "workspace.referral.apply.confirmBody": "Wykorzystaj {{amount}}, aby zmniejszyć aktualne użycie w tym workspace.",
+ "workspace.referral.apply.confirmAction": "Wykorzystaj",
+
+ "download.title": "OpenCode | Pobierz",
+ "download.meta.description": "Pobierz OpenCode na macOS, Windows i Linux",
+ "download.hero.title": "Pobierz OpenCode",
+ "download.hero.subtitle": "Dostępne w wersji Beta na macOS, Windows i Linux",
+ "download.hero.button": "Pobierz na {{os}}",
+ "download.section.terminal": "Terminal OpenCode",
+ "download.section.desktop": "Pulpit OpenCode (Beta)",
+ "download.section.extensions": "Rozszerzenia OpenCode",
+ "download.section.integrations": "Integracje OpenCode",
+ "download.action.download": "Pobierz",
+ "download.action.install": "Zainstaluj",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Niekoniecznie, ale prawdopodobnie. Będziesz potrzebować subskrypcji AI, jeśli chcesz połączyć OpenCode z płatnym dostawcą, chociaż możesz pracować z",
+ "download.faq.a3.localLink": "modelami lokalnymi",
+ "download.faq.a3.afterLocal.beforeZen": "za darmo. Chociaż zachęcamy użytkowników do korzystania z",
+ "download.faq.a3.afterZen":
+ ", OpenCode współpracuje ze wszystkimi popularnymi dostawcami, takimi jak OpenAI, Anthropic, xAI itp.",
+
+ "download.faq.a5.p1": "OpenCode jest w 100% darmowy.",
+ "download.faq.a5.p2.beforeZen":
+ "Wszelkie dodatkowe koszty będą pochodzić z Twojej subskrypcji u dostawcy modelu. Chociaż OpenCode współpracuje z dowolnym dostawcą modeli, zalecamy korzystanie z",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1":
+ "Twoje dane i informacje są przechowywane tylko wtedy, gdy tworzysz linki do udostępniania w OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Dowiedz się więcej o",
+ "download.faq.a6.shareLink": "stronach udostępniania",
+
+ "enterprise.title": "OpenCode | Rozwiązania Enterprise dla Twojej organizacji",
+ "enterprise.meta.description": "Skontaktuj się z OpenCode w sprawie rozwiązań dla przedsiębiorstw",
+ "enterprise.hero.title": "Twój kod jest Twój",
+ "enterprise.hero.body1":
+ "OpenCode działa bezpiecznie wewnątrz Twojej organizacji bez przechowywania danych czy kontekstu, oraz bez ograniczeń licencyjnych czy roszczeń własnościowych. Rozpocznij okres próbny ze swoim zespołem, a następnie wdróż go w całej organizacji, integrując z SSO i wewnętrzną bramą AI.",
+ "enterprise.hero.body2": "Daj nam znać, jak możemy pomóc.",
+ "enterprise.form.name.label": "Imię i nazwisko",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Rola",
+ "enterprise.form.role.placeholder": "Prezes Zarządu",
+ "enterprise.form.company.label": "Firma",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "E-mail firmowy",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Numer telefonu",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Jaki problem próbujesz rozwiązać?",
+ "enterprise.form.message.placeholder": "Potrzebujemy pomocy z...",
+ "enterprise.form.send": "Wyślij",
+ "enterprise.form.sending": "Wysyłanie...",
+ "enterprise.form.success": "Wiadomość wysłana, skontaktujemy się wkrótce.",
+ "enterprise.form.success.submitted": "Formularz został pomyślnie wysłany.",
+ "enterprise.form.error.allFieldsRequired": "Wszystkie pola są wymagane.",
+ "enterprise.form.error.invalidEmailFormat": "Nieprawidłowy format adresu e-mail.",
+ "enterprise.form.error.internalServer": "Wewnętrzny błąd serwera.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Czym jest OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise jest dla organizacji, które chcą mieć pewność, że ich kod i dane nigdy nie opuszczą ich infrastruktury. Można to osiągnąć dzięki scentralizowanej konfiguracji, która integruje się z Twoim SSO i wewnętrzną bramą AI.",
+ "enterprise.faq.q2": "Jak zacząć z OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Po prostu rozpocznij wewnętrzny okres próbny ze swoim zespołem. OpenCode domyślnie nie przechowuje Twojego kodu ani danych kontekstowych, co ułatwia start. Następnie skontaktuj się z nami, aby omówić opcje cenowe i wdrożeniowe.",
+ "enterprise.faq.q3": "Jak działa cennik enterprise?",
+ "enterprise.faq.a3":
+ "Oferujemy cennik enterprise za stanowisko (per-seat). Jeśli masz własną bramę LLM, nie pobieramy opłat za wykorzystane tokeny. Aby uzyskać więcej szczegółów, skontaktuj się z nami w celu uzyskania wyceny dostosowanej do potrzeb Twojej organizacji.",
+ "enterprise.faq.q4": "Czy moje dane są bezpieczne z OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Tak. OpenCode nie przechowuje Twojego kodu ani danych kontekstowych. Całe przetwarzanie odbywa się lokalnie lub poprzez bezpośrednie wywołania API do Twojego dostawcy AI. Dzięki centralnej konfiguracji i integracji SSO, Twoje dane pozostają bezpieczne w infrastrukturze Twojej organizacji.",
+
+ "brand.title": "OpenCode | Marka",
+ "brand.meta.description": "Wytyczne marki OpenCode",
+ "brand.heading": "Wytyczne marki",
+ "brand.subtitle": "Zasoby i aktywa, które pomogą Ci pracować z marką OpenCode.",
+ "brand.downloadAll": "Pobierz wszystkie zasoby",
+
+ "changelog.title": "OpenCode | Dziennik zmian",
+ "changelog.meta.description": "Notatki o wydaniu i dziennik zmian OpenCode",
+ "changelog.hero.title": "Dziennik zmian",
+ "changelog.hero.subtitle": "Nowe aktualizacje i ulepszenia OpenCode",
+ "changelog.empty": "Nie znaleziono wpisów w dzienniku zmian.",
+ "changelog.viewJson": "Zobacz JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarki",
+ "bench.list.table.agent": "Agent",
+ "bench.list.table.model": "Model",
+ "bench.list.table.score": "Wynik",
+ "bench.submission.error.allFieldsRequired": "Wszystkie pola są wymagane.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Nie znaleziono zadania",
+ "bench.detail.na": "Brak danych",
+ "bench.detail.labels.agent": "Agent",
+ "bench.detail.labels.model": "Model",
+ "bench.detail.labels.task": "Zadanie",
+ "bench.detail.labels.repo": "Repozytorium",
+ "bench.detail.labels.from": "Z",
+ "bench.detail.labels.to": "Do",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Średni czas trwania",
+ "bench.detail.labels.averageScore": "Średni wynik",
+ "bench.detail.labels.averageCost": "Średni koszt",
+ "bench.detail.labels.summary": "Podsumowanie",
+ "bench.detail.labels.runs": "Uruchomienia",
+ "bench.detail.labels.score": "Wynik",
+ "bench.detail.labels.base": "Baza",
+ "bench.detail.labels.penalty": "Kara",
+ "bench.detail.labels.weight": "waga",
+ "bench.detail.table.run": "Uruchomienie",
+ "bench.detail.table.score": "Wynik (Baza - Kara)",
+ "bench.detail.table.cost": "Koszt",
+ "bench.detail.table.duration": "Czas trwania",
+ "bench.detail.run.title": "Uruchomienie {{n}}",
+ "bench.detail.rawJson": "Surowy JSON",
+} as const
+
+export type Key = keyof typeof dict
+export type Dict = Record
diff --git a/packages/console/app/src/i18n/ru.ts b/packages/console/app/src/i18n/ru.ts
new file mode 100644
index 0000000..fe077c7
--- /dev/null
+++ b/packages/console/app/src/i18n/ru.ts
@@ -0,0 +1,831 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Документация",
+ "nav.changelog": "Список изменений",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Войти",
+ "nav.free": "Скачать",
+ "nav.home": "Главная",
+ "nav.openMenu": "Открыть меню",
+ "nav.getStartedFree": "Начать бесплатно",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Скопировать логотип как SVG",
+ "nav.context.copyWordmark": "Скопировать название как SVG",
+ "nav.context.brandAssets": "Ресурсы бренда",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Документация",
+ "footer.changelog": "Список изменений",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Бренд",
+ "legal.privacy": "Конфиденциальность",
+ "legal.terms": "Условия",
+
+ "email.title": "Узнайте первыми о выходе новых продуктов",
+ "email.subtitle": "Присоединяйтесь к списку ожидания для раннего доступа.",
+ "email.placeholder": "Email адрес",
+ "email.subscribe": "Подписаться",
+ "email.success": "Почти готово, проверьте почту и подтвердите ваш email",
+
+ "notFound.title": "Не найдено | opencode",
+ "notFound.heading": "404 - Страница не найдена",
+ "notFound.home": "Главная",
+ "notFound.docs": "Документация",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "светлый логотип opencode",
+ "notFound.logoDarkAlt": "темный логотип opencode",
+
+ "user.logout": "Выйти",
+
+ "auth.callback.error.codeMissing": "Код авторизации не найден.",
+
+ "workspace.select": "Выбрать рабочее пространство",
+ "workspace.createNew": "+ Создать рабочее пространство",
+ "workspace.modal.title": "Создать рабочее пространство",
+ "workspace.modal.placeholder": "Введите название рабочего пространства",
+
+ "common.cancel": "Отмена",
+ "common.creating": "Создание...",
+ "common.create": "Создать",
+
+ "common.videoUnsupported": "Ваш браузер не поддерживает видео тег.",
+ "common.figure": "Рис {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Подробнее",
+
+ "error.invalidPlan": "Неверный план",
+ "error.workspaceRequired": "Требуется ID рабочего пространства",
+ "error.alreadySubscribed": "У этого рабочего пространства уже есть подписка",
+ "error.limitRequired": "Требуется лимит.",
+ "error.monthlyLimitInvalid": "Укажите корректный ежемесячный лимит.",
+ "error.workspaceNameRequired": "Требуется название рабочего пространства.",
+ "error.nameTooLong": "Название должно быть не более 255 символов.",
+ "error.emailRequired": "Требуется email",
+ "error.roleRequired": "Требуется роль",
+ "error.idRequired": "Требуется ID",
+ "error.nameRequired": "Требуется имя",
+ "error.providerRequired": "Требуется провайдер",
+ "error.apiKeyRequired": "Требуется API ключ",
+ "error.modelRequired": "Требуется модель",
+ "error.reloadAmountMin": "Сумма пополнения должна быть не менее ${{amount}}",
+ "error.reloadTriggerMin": "Порог баланса должен быть не менее ${{amount}}",
+
+ "app.meta.description": "OpenCode - AI-агент с открытым кодом для программирования.",
+
+ "home.title": "OpenCode | AI-агент с открытым кодом для программирования",
+
+ "temp.title": "opencode | AI-агент для программирования в терминале",
+ "temp.hero.title": "AI-агент для программирования в терминале",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Начать",
+ "temp.feature.native.title": "Нативный TUI",
+ "temp.feature.native.body": "Отзывчивый, нативный, темизируемый терминальный интерфейс",
+ "temp.feature.zen.beforeLink": "",
+ "temp.feature.zen.link": "Отобранный список моделей",
+ "temp.feature.zen.afterLink": "от opencode",
+ "temp.feature.models.beforeLink": "Поддерживает 75+ провайдеров LLM через",
+ "temp.feature.models.afterLink": ", включая локальные модели",
+ "temp.screenshot.caption": "OpenCode TUI с темой tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI с темой tokyonight",
+ "temp.logoLightAlt": "светлый логотип opencode",
+ "temp.logoDarkAlt": "темный логотип opencode",
+
+ "home.banner.badge": "Новое",
+ "home.banner.text": "Доступно десктопное приложение (бета)",
+ "home.banner.platforms": "на macOS, Windows и Linux",
+ "home.banner.downloadNow": "Скачать",
+ "home.banner.downloadBetaNow": "Скачать бету для десктопа",
+
+ "home.hero.title": "AI-агент с открытым кодом для программирования",
+ "home.hero.subtitle.a": "Бесплатные модели включены, или подключите любую модель от любого провайдера,",
+ "home.hero.subtitle.b": "включая Claude, GPT, Gemini и другие.",
+
+ "home.install.ariaLabel": "Варианты установки",
+
+ "home.what.title": "Что такое OpenCode?",
+ "home.what.body":
+ "OpenCode — это агент с открытым исходным кодом, который помогает писать код в терминале, IDE или на десктопе.",
+ "home.what.lsp.title": "Поддержка LSP",
+ "home.what.lsp.body": "Автоматически загружает нужные LSP для LLM",
+ "home.what.multiSession.title": "Мульти-сессии",
+ "home.what.multiSession.body": "Запускайте несколько агентов параллельно в одном проекте",
+ "home.what.shareLinks.title": "Общие ссылки",
+ "home.what.shareLinks.body": "Делитесь ссылкой на любую сессию для справки или отладки",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Войдите через GitHub, чтобы использовать ваш аккаунт Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Войдите через OpenAI, чтобы использовать ваш аккаунт ChatGPT Plus или Pro",
+ "home.what.anyModel.title": "Любая модель",
+ "home.what.anyModel.body": "75+ провайдеров LLM через Models.dev, включая локальные модели",
+ "home.what.anyEditor.title": "Любой редактор",
+ "home.what.anyEditor.body": "Доступно как терминальный интерфейс, десктопное приложение и расширение для IDE",
+ "home.what.readDocs": "Читать документацию",
+
+ "home.growth.title": "AI-агент с открытым кодом для программирования",
+ "home.growth.body":
+ "С более чем {{stars}} звезд на GitHub, {{contributors}} контрибьюторов и {{commits}} коммитов, OpenCode доверяют более {{monthlyUsers}} разработчиков ежемесячно.",
+ "home.growth.githubStars": "Звезд на GitHub",
+ "home.growth.contributors": "Контрибьюторов",
+ "home.growth.monthlyDevs": "Разработчиков в месяц",
+
+ "home.privacy.title": "Создан с заботой о приватности",
+ "home.privacy.body":
+ "OpenCode не хранит ваш код или контекстные данные, поэтому он может работать в средах, чувствительных к приватности.",
+ "home.privacy.learnMore": "Подробнее о",
+ "home.privacy.link": "приватности",
+
+ "home.faq.q1": "Что такое OpenCode?",
+ "home.faq.a1":
+ "OpenCode — это агент с открытым исходным кодом, который помогает писать и запускать код с любой AI-моделью. Доступен как терминальный интерфейс, десктопное приложение или расширение для IDE.",
+ "home.faq.q2": "Как использовать OpenCode?",
+ "home.faq.a2.before": "Проще всего начать с чтения",
+ "home.faq.a2.link": "введения",
+ "home.faq.q3": "Нужны ли дополнительные подписки на AI для использования OpenCode?",
+ "home.faq.a3.p1":
+ "Не обязательно, OpenCode поставляется с набором бесплатных моделей, которые можно использовать без создания аккаунта.",
+ "home.faq.a3.p2.beforeZen":
+ "Помимо этого, вы можете использовать любые популярные модели для кодинга, создав аккаунт",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Хотя мы рекомендуем использовать Zen, OpenCode также работает со всеми популярными провайдерами, такими как OpenAI, Anthropic, xAI и др.",
+ "home.faq.a3.p4.beforeLocal": "Вы даже можете подключить ваши",
+ "home.faq.a3.p4.localLink": "локальные модели",
+ "home.faq.q4": "Могу ли я использовать мои существующие AI-подписки с OpenCode?",
+ "home.faq.a4.p1":
+ "Да, OpenCode поддерживает подписки всех основных провайдеров. Вы можете использовать ваши подписки Claude Pro/Max, ChatGPT Plus/Pro или GitHub Copilot.",
+ "home.faq.q5": "Можно ли использовать OpenCode только в терминале?",
+ "home.faq.a5.beforeDesktop": "Больше нет! OpenCode теперь доступен как приложение для",
+ "home.faq.a5.desktop": "десктопа",
+ "home.faq.a5.and": "и",
+ "home.faq.a5.web": "веба",
+ "home.faq.q6": "Сколько стоит OpenCode?",
+ "home.faq.a6":
+ "OpenCode на 100% бесплатен. Он также включает набор бесплатных моделей. Дополнительные расходы могут возникнуть, если вы подключите другого провайдера.",
+ "home.faq.q7": "Как насчет данных и приватности?",
+ "home.faq.a7.p1":
+ "Ваши данные сохраняются только тогда, когда вы используете наши бесплатные модели или создаете ссылки для шеринга.",
+ "home.faq.a7.p2.beforeModels": "Подробнее о",
+ "home.faq.a7.p2.modelsLink": "наших моделях",
+ "home.faq.a7.p2.and": "и",
+ "home.faq.a7.p2.shareLink": "страницах шеринга",
+ "home.faq.q8": "OpenCode — это open source?",
+ "home.faq.a8.p1": "Да, OpenCode полностью open source. Исходный код доступен публично на",
+ "home.faq.a8.p2": "под",
+ "home.faq.a8.mitLicense": "лицензией MIT",
+ "home.faq.a8.p3":
+ ", что означает, что любой может использовать, изменять или вносить вклад в его развитие. Любой участник сообщества может создавать issues, отправлять pull requests и расширять функциональность.",
+
+ "home.zenCta.title": "Доступ к надежным оптимизированным моделям для кодинг-агентов",
+ "home.zenCta.body":
+ "Zen дает доступ к отобранному набору AI-моделей, которые OpenCode протестировал и проверил специально для кодинг-агентов. Не нужно беспокоиться о нестабильной производительности и качестве разных провайдеров, используйте проверенные модели, которые работают.",
+ "home.zenCta.link": "Узнать о Zen",
+
+ "zen.title": "OpenCode Zen | Набор надежных оптимизированных моделей для кодинг-агентов",
+ "zen.hero.title": "Надежные оптимизированные модели для кодинг-агентов",
+ "zen.hero.body":
+ "Zen дает доступ к отобранному набору AI-моделей, которые OpenCode протестировал и проверил специально для кодинг-агентов. Не нужно беспокоиться о нестабильной производительности и качестве, используйте проверенные модели, которые работают.",
+
+ "zen.faq.q1": "Что такое OpenCode Zen?",
+ "zen.faq.a1":
+ "Zen — это отобранный набор AI-моделей, протестированных и проверенных для кодинг-агентов командой, стоящей за OpenCode.",
+ "zen.faq.q2": "Почему Zen точнее?",
+ "zen.faq.a2":
+ "Zen предоставляет только те модели, которые были специально протестированы и проверены для кодинг-агентов. Вы же не режете стейк ножом для масла, не используйте плохие модели для кодинга.",
+ "zen.faq.q3": "Zen дешевле?",
+ "zen.faq.a3":
+ "Zen — некоммерческий проект. Zen транслирует расходы от провайдеров моделей вам. Чем больше использование Zen, тем лучшие тарифы OpenCode может согласовать и передать вам.",
+ "zen.faq.q4": "Сколько стоит Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "взимает плату за запрос",
+ "zen.faq.a4.p1.afterPricing":
+ "с нулевой наценкой, так что вы платите ровно столько, сколько взимает провайдер модели.",
+ "zen.faq.a4.p2.beforeAccount":
+ "Общая стоимость зависит от использования, и вы можете установить ежемесячные лимиты расходов в своем",
+ "zen.faq.a4.p2.accountLink": "аккаунте",
+ "zen.faq.a4.p3":
+ "Для покрытия расходов OpenCode добавляет лишь небольшую комиссию за обработку платежа в размере $1.23 при пополнении баланса на $20.",
+ "zen.faq.q5": "Как насчет данных и приватности?",
+ "zen.faq.a5.beforeExceptions":
+ "Все модели Zen размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за",
+ "zen.faq.a5.exceptionsLink": "следующими исключениями",
+ "zen.faq.q6": "Могу ли я установить лимиты расходов?",
+ "zen.faq.a6": "Да, вы можете установить ежемесячные лимиты расходов в своем аккаунте.",
+ "zen.faq.q7": "Могу ли я отменить?",
+ "zen.faq.a7": "Да, вы можете отключить оплату в любое время и использовать оставшийся баланс.",
+ "zen.faq.q8": "Могу ли я использовать Zen с другими кодинг-агентами?",
+ "zen.faq.a8":
+ "Хотя Zen отлично работает с OpenCode, вы можете использовать Zen с любым агентом. Следуйте инструкциям по настройке в вашем любимом агенте.",
+
+ "zen.cta.start": "Начать работу с Zen",
+ "zen.pricing.title": "Пополнить баланс на $20 (Pay as you go)",
+ "zen.pricing.fee": "(+$1.23 комиссия за обработку карты)",
+ "zen.pricing.body": "Используйте с любым агентом. Установите ежемесячные лимиты. Отмените в любое время.",
+ "zen.problem.title": "Какую проблему решает Zen?",
+ "zen.problem.body":
+ "Доступно множество моделей, но лишь немногие хорошо работают с кодинг-агентами. Большинство провайдеров настраивают их по-разному с разными результатами.",
+ "zen.problem.subtitle": "Мы исправляем это для всех, а не только для пользователей OpenCode.",
+ "zen.problem.item1": "Тестирование избранных моделей и консультации с их командами",
+ "zen.problem.item2": "Работа с провайдерами для обеспечения правильной доставки",
+ "zen.problem.item3": "Бенчмаркинг всех рекомендуемых нами комбинаций модель-провайдер",
+ "zen.how.title": "Как работает Zen",
+ "zen.how.body": "Хотя мы предлагаем использовать Zen с OpenCode, вы можете использовать его с любым агентом.",
+ "zen.how.step1.title": "Зарегистрируйтесь и пополните баланс на $20",
+ "zen.how.step1.beforeLink": "следуйте",
+ "zen.how.step1.link": "инструкциям по настройке",
+ "zen.how.step2.title": "Используйте Zen с прозрачным ценообразованием",
+ "zen.how.step2.link": "оплата за запрос",
+ "zen.how.step2.afterLink": "с нулевой наценкой",
+ "zen.how.step3.title": "Автопополнение",
+ "zen.how.step3.body": "когда ваш баланс достигнет $5, мы автоматически добавим $20",
+ "zen.privacy.title": "Ваша приватность важна для нас",
+ "zen.privacy.beforeExceptions":
+ "Все модели Zen размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за",
+ "zen.privacy.exceptionsLink": "следующими исключениями",
+
+ "go.title": "OpenCode Go | Недорогие модели для кодинга для всех",
+ "go.meta.description":
+ "Go начинается с $5 за первый месяц, затем $10/месяц, с щедрыми лимитами запросов за 5 часов для GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro и DeepSeek V4 Flash.",
+ "go.hero.title": "Недорогие модели для кодинга для всех",
+ "go.hero.body":
+ "Go открывает доступ к агентам-программистам разработчикам по всему миру. Предлагая щедрые лимиты и надежный доступ к наиболее способным моделям с открытым исходным кодом, вы можете создавать проекты с мощными агентами, не беспокоясь о затратах или доступности.",
+
+ "go.cta.start": "Подписаться на Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Подписаться на Go",
+ "go.cta.price": "$10/месяц",
+ "go.cta.promo": "$5 первый месяц",
+ "go.pricing.body":
+ "Используйте с любым агентом. $5 за первый месяц, затем $10/месяц. Пополняйте баланс при необходимости. Отменить можно в любое время.",
+ "go.graph.free": "Бесплатно",
+ "go.graph.freePill": "Big Pickle и бесплатные модели",
+ "go.graph.go": "Go",
+ "go.graph.label": "Запросов за 5 часов",
+ "go.graph.usageLimits": "Лимиты использования",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Запросов за 5ч: {{free}} против {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "изменил мою жизнь, это действительно очевидный выбор.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, и ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 из 5 человек в нашей команде любят использовать",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Я не могу не порекомендовать",
+ "go.testimonials.adam.quoteAfter": "достаточно сильно. Серьезно, это очень круто.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "С",
+ "go.testimonials.david.quoteAfter":
+ "я знаю, что все модели протестированы и идеально подходят для агентов-программистов.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 раза)",
+ "go.testimonials.frank.quote": "Жаль, что я больше не в Nvidia.",
+ "go.problem.title": "Какую проблему решает Go?",
+ "go.problem.body":
+ "Мы стремимся сделать OpenCode доступным для как можно большего числа людей. OpenCode Go - это недорогая подписка: $5 за первый месяц, затем $10/месяц. Она предоставляет щедрые лимиты и надежный доступ к самым мощным моделям с открытым исходным кодом.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Недорогая подписка",
+ "go.problem.item2": "Щедрые лимиты и надежный доступ",
+ "go.problem.item3": "Создан для максимального числа программистов",
+ "go.problem.item4":
+ "Включает GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro и DeepSeek V4 Flash",
+ "go.how.title": "Как работает Go",
+ "go.how.body":
+ "Go начинается с $5 за первый месяц, затем $10/месяц. Вы можете использовать его с OpenCode или любым агентом.",
+ "go.how.step1.title": "Создайте аккаунт",
+ "go.how.step1.beforeLink": "следуйте",
+ "go.how.step1.link": "инструкциям по настройке",
+ "go.how.step2.title": "Подпишитесь на Go",
+ "go.how.step2.link": "$5 за первый месяц",
+ "go.how.step2.afterLink": "затем $10/месяц с щедрыми лимитами",
+ "go.how.step3.title": "Начните кодить",
+ "go.how.step3.body": "с надежным доступом к open-source моделям",
+ "go.privacy.title": "Ваша приватность важна для нас",
+ "go.privacy.body":
+ "План разработан в первую очередь для международных пользователей, с моделями, размещенными в США, ЕС и Сингапуре для стабильного глобального доступа.",
+ "go.privacy.contactAfter": "если у вас есть вопросы.",
+ "go.privacy.beforeExceptions":
+ "Модели Go размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за",
+ "go.privacy.exceptionsLink": "следующими исключениями",
+ "go.faq.q1": "Что такое OpenCode Go?",
+ "go.faq.a1":
+ "Go — это недорогая подписка, дающая надежный доступ к мощным моделям с открытым исходным кодом для агентов-программистов.",
+ "go.faq.q2": "Какие модели включает Go?",
+ "go.faq.a2": "Go включает перечисленные ниже модели с щедрыми лимитами и надежным доступом.",
+ "go.faq.q3": "Go — это то же самое, что и Zen?",
+ "go.faq.a3":
+ "Нет. Zen - это оплата по мере использования, в то время как Go начинается с $5 за первый месяц, затем $10/месяц, с щедрыми лимитами и надежным доступом к моделям с открытым исходным кодом GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro и DeepSeek V4 Flash.",
+ "go.faq.q4": "Сколько стоит Go?",
+ "go.faq.a4.p1.beforePricing": "Go стоит",
+ "go.faq.a4.p1.pricingLink": "$5 за первый месяц",
+ "go.faq.a4.p1.afterPricing": "затем $10/месяц с щедрыми лимитами.",
+ "go.faq.a4.p2.beforeAccount": "Вы можете управлять подпиской в своем",
+ "go.faq.a4.p2.accountLink": "аккаунте",
+ "go.faq.a4.p3": "Отмена в любое время.",
+ "go.faq.q5": "Как насчет данных и приватности?",
+ "go.faq.a5.body":
+ "План разработан в первую очередь для международных пользователей, с моделями, размещенными в США, ЕС и Сингапуре для стабильного глобального доступа. Наши провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей.",
+ "go.faq.a5.beforeExceptions":
+ "Модели Go размещены в США. Провайдеры следуют политике нулевого хранения и не используют ваши данные для обучения моделей, за",
+ "go.faq.a5.exceptionsLink": "следующими исключениями",
+ "go.faq.q6": "Могу ли я пополнить баланс?",
+ "go.faq.a6": "Если вам нужно больше использования, вы можете пополнить баланс в своем аккаунте.",
+ "go.faq.q7": "Могу ли я отменить подписку?",
+ "go.faq.a7": "Да, вы можете отменить подписку в любое время.",
+ "go.faq.q8": "Могу ли я использовать Go с другими кодинг-агентами?",
+ "go.faq.a8":
+ "Да, вы можете использовать Go с любым агентом. Следуйте инструкциям по настройке в вашем предпочитаемом агенте.",
+
+ "go.faq.q9": "В чем разница между бесплатными моделями и Go?",
+ "go.faq.a9":
+ "Бесплатные модели включают Big Pickle плюс промо-модели, доступные на данный момент, с квотой 200 запросов/день. Go включает GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro и DeepSeek V4 Flash с более высокими квотами запросов, применяемыми в скользящих окнах (5 часов, неделя и месяц), что примерно эквивалентно $12 за 5 часов, $30 в неделю и $60 в месяц (фактическое количество запросов зависит от модели и использования).",
+
+ "zen.api.error.rateLimitExceeded": "Превышен лимит запросов. Пожалуйста, попробуйте позже.",
+ "zen.api.error.modelNotSupported": "Модель {{model}} не поддерживается",
+ "zen.api.error.modelFormatNotSupported": "Модель {{model}} не поддерживается для формата {{format}}",
+ "zen.api.error.noProviderAvailable": "Нет доступных провайдеров",
+ "zen.api.error.providerNotSupported": "Провайдер {{provider}} не поддерживается",
+ "zen.api.error.missingApiKey": "Отсутствует API ключ.",
+ "zen.api.error.invalidApiKey": "Неверный API ключ.",
+ "zen.api.error.subscriptionQuotaExceeded": "Квота подписки превышена. Повторите попытку через {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Достигнут лимит использования за 5 часов. Сбросится через {{retryIn}}. Чтобы продолжить использовать эту модель сейчас, включите оплату с доступного баланса: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Достигнут недельный лимит использования. Сбросится через {{retryIn}}. Чтобы продолжить использовать эту модель сейчас, включите оплату с доступного баланса: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Достигнут месячный лимит использования. Сбросится через {{retryIn}}. Чтобы продолжить использовать эту модель сейчас, включите оплату с доступного баланса: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Нет способа оплаты. Добавьте способ оплаты здесь: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Недостаточно средств. Управляйте оплатой здесь: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Ваше рабочее пространство достигло ежемесячного лимита расходов в ${{amount}}. Управляйте лимитами здесь: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Вы достигли ежемесячного лимита расходов в ${{amount}}. Управляйте лимитами здесь: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Модель отключена",
+ "zen.api.error.trialEnded":
+ "Бесплатная акция для {{model}} завершена. Вы можете продолжить использование модели, подписавшись на OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Доступ к лучшим моделям для кодинга в мире",
+ "black.meta.description": "Получите доступ к Claude, GPT, Gemini и другим моделям с подпиской OpenCode Black.",
+ "black.hero.title": "Доступ к лучшим моделям для кодинга в мире",
+ "black.hero.subtitle": "Включая Claude, GPT, Gemini и другие",
+ "black.title": "OpenCode Black | Цены",
+ "black.paused": "Регистрация на план Black временно приостановлена.",
+ "black.plan.icon20": "План Black 20",
+ "black.plan.icon100": "План Black 100",
+ "black.plan.icon200": "План Black 200",
+ "black.plan.multiplier100": "в 5x больше использования, чем Black 20",
+ "black.plan.multiplier200": "в 20x больше использования, чем Black 20",
+ "black.price.perMonth": "в месяц",
+ "black.price.perPersonBilledMonthly": "за человека при ежемесячной оплате",
+ "black.terms.1": "Ваша подписка начнется не сразу",
+ "black.terms.2": "Вы будете добавлены в список ожидания и активированы в ближайшее время",
+ "black.terms.3": "Оплата с карты будет списана только при активации подписки",
+ "black.terms.4":
+ "Действуют лимиты использования; интенсивное автоматизированное использование может исчерпать лимиты быстрее",
+ "black.terms.5": "Подписки предназначены для частных лиц, для команд обратитесь в Enterprise",
+ "black.terms.6": "Лимиты могут быть скорректированы, а планы могут быть прекращены в будущем",
+ "black.terms.7": "Отмените подписку в любое время",
+ "black.action.continue": "Продолжить",
+ "black.finePrint.beforeTerms": "Указанные цены не включают применимые налоги",
+ "black.finePrint.terms": "Условия обслуживания",
+ "black.workspace.title": "OpenCode Black | Выбор рабочего пространства",
+ "black.workspace.selectPlan": "Выберите рабочее пространство для этого плана",
+ "black.workspace.name": "Рабочее пространство {{n}}",
+ "black.subscribe.title": "Подписаться на OpenCode Black",
+ "black.subscribe.paymentMethod": "Способ оплаты",
+ "black.subscribe.loadingPaymentForm": "Загрузка формы оплаты...",
+ "black.subscribe.selectWorkspaceToContinue": "Выберите рабочее пространство для продолжения",
+ "black.subscribe.failurePrefix": "Ой!",
+ "black.subscribe.error.generic": "Произошла ошибка",
+ "black.subscribe.error.invalidPlan": "Неверный план",
+ "black.subscribe.error.workspaceRequired": "Требуется ID рабочего пространства",
+ "black.subscribe.error.alreadySubscribed": "У этого рабочего пространства уже есть подписка",
+ "black.subscribe.processing": "Обработка...",
+ "black.subscribe.submit": "Подписаться на ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Оплата будет списана только при активации вашей подписки",
+ "black.subscribe.success.title": "Вы в списке ожидания OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "План подписки",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Сумма",
+ "black.subscribe.success.amountValue": "${{plan}} в месяц",
+ "black.subscribe.success.paymentMethod": "Способ оплаты",
+ "black.subscribe.success.dateJoined": "Дата присоединения",
+ "black.subscribe.success.chargeNotice": "С вашей карты будет списана оплата при активации подписки",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Использование",
+ "workspace.nav.apiKeys": "API Ключи",
+ "workspace.nav.members": "Участники",
+ "workspace.nav.billing": "Оплата",
+ "workspace.nav.settings": "Настройки",
+
+ "workspace.home.banner.beforeLink": "Надежные оптимизированные модели для кодинг-агентов.",
+ "workspace.lite.banner.beforeLink": "Недорогие модели для кодинга, доступные каждому.",
+ "workspace.home.billing.loading": "Загрузка...",
+ "workspace.home.billing.enable": "Включить оплату",
+ "workspace.home.billing.currentBalance": "Текущий баланс",
+
+ "workspace.newUser.feature.tested.title": "Протестированные и проверенные модели",
+ "workspace.newUser.feature.tested.body":
+ "Мы провели бенчмаркинг и тестирование моделей специально для кодинг-агентов, чтобы обеспечить лучшую производительность.",
+ "workspace.newUser.feature.quality.title": "Высочайшее качество",
+ "workspace.newUser.feature.quality.body":
+ "Доступ к моделям, настроенным для оптимальной производительности — никаких даунгрейдов или перенаправления к дешевым провайдерам.",
+ "workspace.newUser.feature.lockin.title": "Без привязки (Lock-in)",
+ "workspace.newUser.feature.lockin.body":
+ "Используйте Zen с любым кодинг-агентом и продолжайте использовать других провайдеров с opencode, когда захотите.",
+ "workspace.newUser.copyApiKey": "Копировать API ключ",
+ "workspace.newUser.copyKey": "Копировать ключ",
+ "workspace.newUser.copied": "Скопировано!",
+ "workspace.newUser.step.enableBilling": "Включить оплату",
+ "workspace.newUser.step.login.before": "Запустите",
+ "workspace.newUser.step.login.after": "и выберите opencode",
+ "workspace.newUser.step.pasteKey": "Вставьте ваш API ключ",
+ "workspace.newUser.step.models.before": "Запустите opencode и выполните",
+ "workspace.newUser.step.models.after": "для выбора модели",
+
+ "workspace.models.title": "Модели",
+ "workspace.models.subtitle.beforeLink":
+ "Управляйте тем, к каким моделям имеют доступ участники рабочего пространства.",
+ "workspace.models.table.model": "Модель",
+ "workspace.models.table.enabled": "Включено",
+
+ "workspace.providers.title": "Использовать свой ключ (BYOK)",
+ "workspace.providers.subtitle": "Настройте свои собственные API ключи от AI-провайдеров.",
+ "workspace.providers.placeholder": "Введите API ключ {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Настроить",
+ "workspace.providers.edit": "Изменить",
+ "workspace.providers.delete": "Удалить",
+ "workspace.providers.saving": "Сохранение...",
+ "workspace.providers.save": "Сохранить",
+ "workspace.providers.table.provider": "Провайдер",
+ "workspace.providers.table.apiKey": "API ключ",
+
+ "workspace.usage.title": "История использования",
+ "workspace.usage.subtitle": "Недавнее использование API и расходы.",
+ "workspace.usage.empty": "Сделайте первый API вызов, чтобы начать.",
+ "workspace.usage.table.date": "Дата",
+ "workspace.usage.table.model": "Модель",
+ "workspace.usage.table.input": "Вход",
+ "workspace.usage.table.output": "Выход",
+ "workspace.usage.table.cost": "Стоимость",
+ "workspace.usage.table.session": "Сессия",
+ "workspace.usage.breakdown.input": "Вход",
+ "workspace.usage.breakdown.cacheRead": "Чтение кэша",
+ "workspace.usage.breakdown.cacheWrite": "Запись кэша",
+ "workspace.usage.breakdown.output": "Выход",
+ "workspace.usage.breakdown.reasoning": "Reasoning (рассуждения)",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Расходы",
+ "workspace.cost.subtitle": "Расходы на использование с разбивкой по моделям.",
+ "workspace.cost.allModels": "Все модели",
+ "workspace.cost.allKeys": "Все ключи",
+ "workspace.cost.deletedSuffix": "(удалено)",
+ "workspace.cost.empty": "Нет данных об использовании за выбранный период.",
+ "workspace.cost.subscriptionShort": "подписка",
+
+ "workspace.keys.title": "API Ключи",
+ "workspace.keys.subtitle": "Управляйте вашими API ключами для доступа к сервисам opencode.",
+ "workspace.keys.create": "Создать API ключ",
+ "workspace.keys.placeholder": "Введите название ключа",
+ "workspace.keys.empty": "Создайте API ключ для шлюза opencode",
+ "workspace.keys.table.name": "Название",
+ "workspace.keys.table.key": "Ключ",
+ "workspace.keys.table.createdBy": "Создан",
+ "workspace.keys.table.lastUsed": "Использован",
+ "workspace.keys.copyApiKey": "Копировать API ключ",
+ "workspace.keys.delete": "Удалить",
+
+ "workspace.members.title": "Участники",
+ "workspace.members.subtitle": "Управляйте участниками рабочего пространства и их правами.",
+ "workspace.members.invite": "Пригласить участника",
+ "workspace.members.inviting": "Отправка приглашения...",
+ "workspace.members.beta.beforeLink": "Рабочие пространства бесплатны для команд во время беты.",
+ "workspace.members.form.invitee": "Приглашаемый",
+ "workspace.members.form.emailPlaceholder": "Введите email",
+ "workspace.members.form.role": "Роль",
+ "workspace.members.form.monthlyLimit": "Ежемесячный лимит расходов",
+ "workspace.members.noLimit": "Без лимита",
+ "workspace.members.noLimitLowercase": "без лимита",
+ "workspace.members.invited": "приглашен",
+ "workspace.members.edit": "Изменить",
+ "workspace.members.delete": "Удалить",
+ "workspace.members.saving": "Сохранение...",
+ "workspace.members.save": "Сохранить",
+ "workspace.members.table.email": "Email",
+ "workspace.members.table.role": "Роль",
+ "workspace.members.table.monthLimit": "Лимит на месяц",
+ "workspace.members.role.admin": "Админ",
+ "workspace.members.role.adminDescription": "Может управлять моделями, участниками и оплатой",
+ "workspace.members.role.member": "Участник",
+ "workspace.members.role.memberDescription": "Может создавать API ключи только для себя",
+
+ "workspace.settings.title": "Настройки",
+ "workspace.settings.subtitle": "Обновите название и настройки вашего рабочего пространства.",
+ "workspace.settings.workspaceName": "Название рабочего пространства",
+ "workspace.settings.defaultName": "По умолчанию",
+ "workspace.settings.updating": "Обновление...",
+ "workspace.settings.save": "Сохранить",
+ "workspace.settings.edit": "Изменить",
+
+ "workspace.billing.title": "Оплата",
+ "workspace.billing.subtitle.beforeLink": "Управление способами оплаты.",
+ "workspace.billing.contactUs": "Свяжитесь с нами",
+ "workspace.billing.subtitle.afterLink": "если у вас есть вопросы.",
+ "workspace.billing.currentBalance": "Текущий баланс",
+ "workspace.billing.add": "Пополнить $",
+ "workspace.billing.enterAmount": "Введите сумму",
+ "workspace.billing.loading": "Загрузка...",
+ "workspace.billing.addAction": "Пополнить",
+ "workspace.billing.addBalance": "Пополнить баланс",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Привязано к Stripe",
+ "workspace.billing.manage": "Управление",
+ "workspace.billing.enable": "Включить оплату",
+
+ "workspace.monthlyLimit.title": "Ежемесячный лимит",
+ "workspace.monthlyLimit.subtitle": "Установите ежемесячный лимит расходов для вашего аккаунта.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Сохранение...",
+ "workspace.monthlyLimit.set": "Установить",
+ "workspace.monthlyLimit.edit": "Изменить лимит",
+ "workspace.monthlyLimit.noLimit": "Лимит использования не установлен.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Текущее использование за",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "составляет $",
+
+ "workspace.redeem.title": "Активировать купон",
+ "workspace.redeem.subtitle": "Активируйте код купона, чтобы получить кредит или бонусы.",
+ "workspace.redeem.placeholder": "Введите код купона",
+ "workspace.redeem.redeem": "Активировать",
+ "workspace.redeem.redeeming": "Активация...",
+ "workspace.redeem.success": "Купон успешно активирован.",
+
+ "workspace.reload.title": "Автопополнение",
+ "workspace.reload.disabled.before": "Автопополнение",
+ "workspace.reload.disabled.state": "отключено",
+ "workspace.reload.disabled.after": "Включите для автоматического пополнения при низком балансе.",
+ "workspace.reload.enabled.before": "Автопополнение",
+ "workspace.reload.enabled.state": "включено",
+ "workspace.reload.enabled.middle": "Мы пополним на",
+ "workspace.reload.processingFee": "комиссия",
+ "workspace.reload.enabled.after": "когда баланс достигнет",
+ "workspace.reload.edit": "Изменить",
+ "workspace.reload.enable": "Включить",
+ "workspace.reload.enableAutoReload": "Включить автопополнение",
+ "workspace.reload.reloadAmount": "Пополнить на $",
+ "workspace.reload.whenBalanceReaches": "Когда баланс достигнет $",
+ "workspace.reload.saving": "Сохранение...",
+ "workspace.reload.save": "Сохранить",
+ "workspace.reload.failedAt": "Пополнение не удалось",
+ "workspace.reload.reason": "Причина:",
+ "workspace.reload.updatePaymentMethod": "Пожалуйста, обновите способ оплаты и попробуйте снова.",
+ "workspace.reload.retrying": "Повторная попытка...",
+ "workspace.reload.retry": "Повторить",
+ "workspace.reload.error.paymentFailed": "Ошибка оплаты.",
+
+ "workspace.payments.title": "История платежей",
+ "workspace.payments.subtitle": "Недавние транзакции.",
+ "workspace.payments.table.date": "Дата",
+ "workspace.payments.table.paymentId": "ID платежа",
+ "workspace.payments.table.amount": "Сумма",
+ "workspace.payments.table.receipt": "Квитанция",
+ "workspace.payments.type.credit": "кредит",
+ "workspace.payments.type.subscription": "подписка",
+ "workspace.payments.view": "Просмотр",
+
+ "workspace.black.loading": "Загрузка...",
+ "workspace.black.time.day": "день",
+ "workspace.black.time.days": "дней",
+ "workspace.black.time.hour": "час",
+ "workspace.black.time.hours": "часов",
+ "workspace.black.time.minute": "минута",
+ "workspace.black.time.minutes": "минут",
+ "workspace.black.time.fewSeconds": "несколько секунд",
+ "workspace.black.subscription.title": "Подписка",
+ "workspace.black.subscription.message": "Вы подписаны на OpenCode Black за ${{plan}} в месяц.",
+ "workspace.black.subscription.manage": "Управление подпиской",
+ "workspace.black.subscription.rollingUsage": "5-часовое использование",
+ "workspace.black.subscription.weeklyUsage": "Недельное использование",
+ "workspace.black.subscription.resetsIn": "Сброс через",
+ "workspace.black.subscription.useBalance": "Использовать доступный баланс после достижения лимитов",
+ "workspace.black.waitlist.title": "Список ожидания",
+ "workspace.black.waitlist.joined": "Вы в списке ожидания плана OpenCode Black за ${{plan}} в месяц.",
+ "workspace.black.waitlist.ready": "Мы готовы подключить вас к плану OpenCode Black за ${{plan}} в месяц.",
+ "workspace.black.waitlist.leave": "Покинуть список ожидания",
+ "workspace.black.waitlist.leaving": "Выход...",
+ "workspace.black.waitlist.left": "Вы покинули",
+ "workspace.black.waitlist.enroll": "Подключиться",
+ "workspace.black.waitlist.enrolling": "Подключение...",
+ "workspace.black.waitlist.enrolled": "Подключен",
+ "workspace.black.waitlist.enrollNote":
+ "Когда вы нажмете Подключиться, ваша подписка начнется немедленно, и с карты будет списана оплата.",
+
+ "workspace.lite.loading": "Загрузка...",
+ "workspace.lite.time.day": "день",
+ "workspace.lite.time.days": "дней",
+ "workspace.lite.time.hour": "час",
+ "workspace.lite.time.hours": "часов",
+ "workspace.lite.time.minute": "минута",
+ "workspace.lite.time.minutes": "минут",
+ "workspace.lite.time.fewSeconds": "несколько секунд",
+ "workspace.lite.subscription.message": "Вы подписаны на OpenCode Go.",
+ "workspace.lite.subscription.manage": "Управление подпиской",
+ "workspace.lite.subscription.rollingUsage": "Скользящее использование",
+ "workspace.lite.subscription.weeklyUsage": "Недельное использование",
+ "workspace.lite.subscription.monthlyUsage": "Ежемесячное использование",
+ "workspace.lite.subscription.resetsIn": "Сброс через",
+ "workspace.lite.subscription.useBalance": "Использовать доступный баланс после достижения лимитов",
+ "workspace.lite.subscription.selectProvider":
+ 'Выберите "OpenCode Go" в качестве провайдера в настройках opencode для использования моделей Go.',
+ "workspace.lite.black.message":
+ "Вы подписаны на OpenCode Black или находитесь в списке ожидания. Пожалуйста, сначала отмените подписку, если хотите перейти на Go.",
+ "workspace.lite.other.message":
+ "Другой участник в этом рабочем пространстве уже подписан на OpenCode Go. Только один участник в рабочем пространстве может оформить подписку.",
+ "workspace.lite.promo.description":
+ "OpenCode Go начинается с {{price}}, затем $10/месяц и предоставляет надежный доступ к популярным открытым моделям кодирования с щедрыми лимитами использования.",
+ "workspace.lite.promo.price": "$5 за первый месяц",
+ "workspace.lite.promo.modelsTitle": "Что включено",
+ "workspace.lite.promo.footer":
+ "План предназначен в первую очередь для международных пользователей. Модели размещены в США, ЕС и Сингапуре для стабильного глобального доступа. Цены и лимиты использования могут меняться по мере того, как мы изучаем раннее использование и собираем отзывы.",
+ "workspace.lite.promo.subscribe": "Подписаться на Go",
+ "workspace.lite.promo.subscribing": "Перенаправление...",
+ "workspace.lite.promo.otherMethods": "Другие способы оплаты",
+ "workspace.lite.promo.selectMethod": "Выберите способ оплаты",
+
+ "workspace.referral.copyLink": "Копировать ссылку",
+ "workspace.referral.copied": "Скопировано",
+ "workspace.referral.overview.title": "Пригласите друзей",
+ "workspace.referral.overview.subtitle": "Получите $5, когда друг оформит подписку. Он тоже получит $5.",
+ "workspace.referral.instructions.share": "Поделитесь своей реферальной ссылкой",
+ "workspace.referral.instructions.subscribe": "Ваш друг присоединяется и оформляет подписку на Go",
+ "workspace.referral.instructions.claim":
+ "Вы оба получаете кредит на использование $5, который можно применить к лимитам использования Go",
+ "workspace.referral.rewards.title": "Реферальные награды",
+ "workspace.referral.rewards.description": "Используйте доступные реферальные кредиты для оплаты использования Go.",
+ "workspace.referral.rewards.subtitle": "Использовано {{applied}} / {{total}} наград.",
+ "workspace.referral.rewards.empty": "Реферальных наград пока нет.",
+ "workspace.referral.table.reward": "Награда",
+ "workspace.referral.table.referral": "Описание",
+ "workspace.referral.table.date": "Дата",
+ "workspace.referral.reward.description.inviter": "Приглашён {{email}}",
+ "workspace.referral.reward.description.invitee": "Приглашены пользователем {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "Оформите подписку для разблокировки",
+ "workspace.referral.reward.action.view": "Посмотреть награду",
+ "workspace.referral.reward.action.applied": "Награда использована",
+ "workspace.referral.reward.source.pendingInviter": "Ожидание его подписки",
+ "workspace.referral.reward.source.pendingInvitee": "Подпишитесь, чтобы разблокировать награду",
+ "workspace.referral.reward.source.available": "Награда готова к применению",
+ "workspace.referral.reward.source.applied": "Награда использована",
+ "workspace.referral.reward.status.applied": "Награда использована",
+ "workspace.referral.reward.status.pendingInviter": "Оформите подписку для разблокировки",
+ "workspace.referral.reward.status.pendingInvitee": "Оформите подписку для разблокировки",
+ "workspace.referral.apply.noGo": "Оформите подписку для разблокировки",
+ "workspace.referral.apply.preview": "Посмотреть награду",
+ "workspace.referral.apply.action": "Применить",
+ "workspace.referral.apply.confirmTitle": "Применить награду",
+ "workspace.referral.apply.confirmBody":
+ "Используйте {{amount}}, чтобы уменьшить текущее использование этого workspace.",
+ "workspace.referral.apply.confirmAction": "Применить",
+
+ "download.title": "OpenCode | Скачать",
+ "download.meta.description": "Скачать OpenCode для macOS, Windows и Linux",
+ "download.hero.title": "Скачать OpenCode",
+ "download.hero.subtitle": "Доступна бета для macOS, Windows и Linux",
+ "download.hero.button": "Скачать для {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "Расширения OpenCode",
+ "download.section.integrations": "Интеграции OpenCode",
+ "download.action.download": "Скачать",
+ "download.action.install": "Установить",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Не обязательно, но возможно. Вам понадобится AI подписка, если вы хотите подключить OpenCode к платному провайдеру, хотя вы можете работать с",
+ "download.faq.a3.localLink": "локальными моделями",
+ "download.faq.a3.afterLocal.beforeZen": "бесплатно. Хотя мы рекомендуем использовать",
+ "download.faq.a3.afterZen":
+ ", OpenCode работает со всеми популярными провайдерами, такими как OpenAI, Anthropic, xAI и др.",
+
+ "download.faq.a5.p1": "OpenCode на 100% бесплатен.",
+ "download.faq.a5.p2.beforeZen":
+ "Любые дополнительные расходы будут связаны с вашей подпиской у провайдера моделей. Хотя OpenCode работает с любым провайдером моделей, мы рекомендуем использовать",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "Ваши данные и информация сохраняются только при создании ссылок для шеринга в OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Подробнее о",
+ "download.faq.a6.shareLink": "страницах шеринга",
+
+ "enterprise.title": "OpenCode | Корпоративные решения для вашей организации",
+ "enterprise.meta.description": "Свяжитесь с OpenCode для корпоративных решений",
+ "enterprise.hero.title": "Ваш код принадлежит вам",
+ "enterprise.hero.body1":
+ "OpenCode безопасно работает внутри вашей организации: не хранит данные и контекст, без лицензионных ограничений и претензий на собственность. Начните пробный период с командой, затем разверните по всей организации, интегрировав с SSO и внутренним AI-шлюзом.",
+ "enterprise.hero.body2": "Сообщите нам, чем мы можем помочь.",
+ "enterprise.form.name.label": "Полное имя",
+ "enterprise.form.name.placeholder": "Джефф Безос",
+ "enterprise.form.role.label": "Роль",
+ "enterprise.form.role.placeholder": "Исполнительный председатель",
+ "enterprise.form.company.label": "Компания",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Корпоративная почта",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Номер телефона",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Какую проблему вы пытаетесь решить?",
+ "enterprise.form.message.placeholder": "Нам нужна помощь с...",
+ "enterprise.form.send": "Отправить",
+ "enterprise.form.sending": "Отправка...",
+ "enterprise.form.success": "Сообщение отправлено, мы скоро свяжемся с вами.",
+ "enterprise.form.success.submitted": "Форма успешно отправлена.",
+ "enterprise.form.error.allFieldsRequired": "Все поля обязательны.",
+ "enterprise.form.error.invalidEmailFormat": "Неверный формат email.",
+ "enterprise.form.error.internalServer": "Внутренняя ошибка сервера.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Что такое OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise предназначен для организаций, которые хотят гарантировать, что их код и данные никогда не покинут их инфраструктуру. Это достигается за счет централизованной конфигурации, интегрированной с вашим SSO и внутренним AI-шлюзом.",
+ "enterprise.faq.q2": "Как начать работу с OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Просто начните с внутреннего триала с вашей командой. OpenCode по умолчанию не хранит ваш код или контекстные данные, поэтому начать легко. Затем свяжитесь с нами, чтобы обсудить цены и варианты внедрения.",
+ "enterprise.faq.q3": "Как работает корпоративное ценообразование?",
+ "enterprise.faq.a3":
+ "Мы предлагаем модель ценообразования за рабочее место (per-seat). Если у вас есть собственный LLM-шлюз, мы не взимаем плату за использованные токены. Для получения подробной информации свяжитесь с нами для индивидуального расчета на основе потребностей вашей организации.",
+ "enterprise.faq.q4": "Безопасны ли мои данные с OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Да. OpenCode не хранит ваш код или контекстные данные. Вся обработка происходит локально или через прямые вызовы API к вашему AI-провайдеру. Благодаря централизованной конфигурации и интеграции SSO ваши данные остаются защищенными внутри инфраструктуры вашей организации.",
+
+ "brand.title": "OpenCode | Бренд",
+ "brand.meta.description": "Гайдлайны бренда OpenCode",
+ "brand.heading": "Гайдлайны бренда",
+ "brand.subtitle": "Ресурсы и активы, которые помогут вам работать с брендом OpenCode.",
+ "brand.downloadAll": "Скачать все ресурсы",
+
+ "changelog.title": "OpenCode | Список изменений",
+ "changelog.meta.description": "Примечания к релизам и список изменений OpenCode",
+ "changelog.hero.title": "Список изменений",
+ "changelog.hero.subtitle": "Новые обновления и улучшения OpenCode",
+ "changelog.empty": "Записи в списке изменений не найдены.",
+ "changelog.viewJson": "Посмотреть JSON",
+
+ "bench.list.title": "Бенчмарк",
+ "bench.list.heading": "Бенчмарки",
+ "bench.list.table.agent": "Агент",
+ "bench.list.table.model": "Модель",
+ "bench.list.table.score": "Оценка",
+ "bench.submission.error.allFieldsRequired": "Все поля обязательны.",
+
+ "bench.detail.title": "Бенчмарк - {{task}}",
+ "bench.detail.notFound": "Задача не найдена",
+ "bench.detail.na": "Н/Д",
+ "bench.detail.labels.agent": "Агент",
+ "bench.detail.labels.model": "Модель",
+ "bench.detail.labels.task": "Задача",
+ "bench.detail.labels.repo": "Репозиторий",
+ "bench.detail.labels.from": "От",
+ "bench.detail.labels.to": "До",
+ "bench.detail.labels.prompt": "Промпт",
+ "bench.detail.labels.commit": "Коммит",
+ "bench.detail.labels.averageDuration": "Средняя длительность",
+ "bench.detail.labels.averageScore": "Средняя оценка",
+ "bench.detail.labels.averageCost": "Средняя стоимость",
+ "bench.detail.labels.summary": "Сводка",
+ "bench.detail.labels.runs": "Запуски",
+ "bench.detail.labels.score": "Оценка",
+ "bench.detail.labels.base": "База",
+ "bench.detail.labels.penalty": "Штраф",
+ "bench.detail.labels.weight": "вес",
+ "bench.detail.table.run": "Запуск",
+ "bench.detail.table.score": "Оценка (База - Штраф)",
+ "bench.detail.table.cost": "Стоимость",
+ "bench.detail.table.duration": "Длительность",
+ "bench.detail.run.title": "Запуск {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/th.ts b/packages/console/app/src/i18n/th.ts
new file mode 100644
index 0000000..4285e6f
--- /dev/null
+++ b/packages/console/app/src/i18n/th.ts
@@ -0,0 +1,817 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "เอกสาร",
+ "nav.changelog": "บันทึกการเปลี่ยนแปลง",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "องค์กร",
+ "nav.zen": "Zen",
+ "nav.login": "เข้าสู่ระบบ",
+ "nav.free": "ดาวน์โหลด",
+ "nav.home": "หน้าหลัก",
+ "nav.openMenu": "เปิดเมนู",
+ "nav.getStartedFree": "เริ่มต้นฟรี",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "คัดลอกโลโก้เป็น SVG",
+ "nav.context.copyWordmark": "คัดลอกตัวอักษรแบรนด์เป็น SVG",
+ "nav.context.brandAssets": "แอสเซทแบรนด์",
+
+ "footer.github": "GitHub",
+ "footer.docs": "เอกสาร",
+ "footer.changelog": "บันทึกการเปลี่ยนแปลง",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "แบรนด์",
+ "legal.privacy": "ความเป็นส่วนตัว",
+ "legal.terms": "ข้อกำหนด",
+
+ "email.title": "รู้ก่อนใครเมื่อเราปล่อยผลิตภัณฑ์ใหม่",
+ "email.subtitle": "เข้าร่วมรายชื่อรอเพื่อรับสิทธิ์เข้าถึงก่อนใคร",
+ "email.placeholder": "ที่อยู่อีเมล",
+ "email.subscribe": "สมัครรับข่าวสาร",
+ "email.success": "เกือบเสร็จแล้ว ตรวจสอบกล่องจดหมายและยืนยันที่อยู่อีเมลของคุณ",
+
+ "notFound.title": "ไม่พบหน้า | OpenCode",
+ "notFound.heading": "404 - ไม่พบหน้าที่ค้นหา",
+ "notFound.home": "หน้าหลัก",
+ "notFound.docs": "เอกสาร",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "โลโก้ opencode แบบสว่าง",
+ "notFound.logoDarkAlt": "โลโก้ opencode แบบมืด",
+
+ "user.logout": "ออกจากระบบ",
+
+ "auth.callback.error.codeMissing": "ไม่พบ authorization code",
+
+ "workspace.select": "เลือก Workspace",
+ "workspace.createNew": "+ สร้าง Workspace ใหม่",
+ "workspace.modal.title": "สร้าง Workspace ใหม่",
+ "workspace.modal.placeholder": "กรอกชื่อ Workspace",
+
+ "common.cancel": "ยกเลิก",
+ "common.creating": "กำลังสร้าง...",
+ "common.create": "สร้าง",
+
+ "common.videoUnsupported": "เบราว์เซอร์ของคุณไม่รองรับแท็ก video",
+ "common.figure": "รูปที่ {{n}}",
+ "common.faq": "คำถามที่พบบ่อย",
+ "common.learnMore": "ดูเพิ่มเติม",
+
+ "error.invalidPlan": "แผนไม่ถูกต้อง",
+ "error.workspaceRequired": "จำเป็นต้องมี Workspace ID",
+ "error.alreadySubscribed": "Workspace นี้มีการสมัครสมาชิกอยู่แล้ว",
+ "error.limitRequired": "จำเป็นต้องระบุขีดจำกัด",
+ "error.monthlyLimitInvalid": "โปรดระบุขีดจำกัดรายเดือนที่ถูกต้อง",
+ "error.workspaceNameRequired": "จำเป็นต้องระบุชื่อ Workspace",
+ "error.nameTooLong": "ชื่อต้องมีความยาวไม่เกิน 255 ตัวอักษร",
+ "error.emailRequired": "จำเป็นต้องระบุอีเมล",
+ "error.roleRequired": "จำเป็นต้องระบุบทบาท",
+ "error.idRequired": "จำเป็นต้องระบุ ID",
+ "error.nameRequired": "จำเป็นต้องระบุชื่อ",
+ "error.providerRequired": "จำเป็นต้องระบุผู้ให้บริการ",
+ "error.apiKeyRequired": "จำเป็นต้องระบุ API key",
+ "error.modelRequired": "จำเป็นต้องระบุโมเดล",
+ "error.reloadAmountMin": "จำนวนเงินที่โหลดซ้ำต้องมีอย่างน้อย ${{amount}}",
+ "error.reloadTriggerMin": "ยอดคงเหลือที่กระตุ้นต้องมีอย่างน้อย ${{amount}}",
+
+ "app.meta.description": "OpenCode - เอเจนต์เขียนโค้ดแบบโอเพนซอร์ส",
+
+ "home.title": "OpenCode | เอเจนต์เขียนโค้ดด้วย AI แบบโอเพนซอร์ส",
+
+ "temp.title": "OpenCode | เอเจนต์เขียนโค้ด AI ที่สร้างมาเพื่อเทอร์มินัล",
+ "temp.hero.title": "เอเจนต์เขียนโค้ด AI ที่สร้างมาเพื่อเทอร์มินัล",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "เริ่มต้นใช้งาน",
+ "temp.feature.native.title": "Native TUI",
+ "temp.feature.native.body": "UI เทอร์มินัลแบบเนทีฟที่ตอบสนองไวและปรับแต่งธีมได้",
+ "temp.feature.zen.beforeLink": "",
+ "temp.feature.zen.link": "รายการโมเดลที่คัดสรรแล้ว",
+ "temp.feature.zen.afterLink": "โดย OpenCode",
+ "temp.feature.models.beforeLink": "รองรับผู้ให้บริการ LLM กว่า 75 รายผ่าน",
+ "temp.feature.models.afterLink": "รวมถึงโมเดล Local",
+ "temp.screenshot.caption": "OpenCode TUI พร้อมธีม tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI พร้อมธีม tokyonight",
+ "temp.logoLightAlt": "โลโก้ opencode แบบสว่าง",
+ "temp.logoDarkAlt": "โลโก้ opencode แบบมืด",
+
+ "home.banner.badge": "ใหม่",
+ "home.banner.text": "แอปเดสก์ท็อปพร้อมใช้งานในเวอร์ชันเบต้า",
+ "home.banner.platforms": "บน macOS, Windows และ Linux",
+ "home.banner.downloadNow": "ดาวน์โหลดตอนนี้",
+ "home.banner.downloadBetaNow": "ดาวน์โหลดเบต้าเดสก์ท็อปตอนนี้",
+
+ "home.hero.title": "เอเจนต์เขียนโค้ดด้วย AI แบบโอเพนซอร์ส",
+ "home.hero.subtitle.a": "มีโมเดลฟรีรวมอยู่ หรือเชื่อมต่อโมเดลใดก็ได้จากผู้ให้บริการรายใดก็ได้,",
+ "home.hero.subtitle.b": "รวมถึง Claude, GPT, Gemini และอีกมากมาย",
+
+ "home.install.ariaLabel": "ตัวเลือกการติดตั้ง",
+
+ "home.what.title": "OpenCode คืออะไร?",
+ "home.what.body": "OpenCode คือเอเจนต์โอเพนซอร์สที่ช่วยคุณเขียนโค้ดในเทอร์มินัล, IDE หรือเดสก์ท็อป",
+ "home.what.lsp.title": "รองรับ LSP",
+ "home.what.lsp.body": "โหลด LSP ที่เหมาะสมสำหรับ LLM โดยอัตโนมัติ",
+ "home.what.multiSession.title": "หลายเซสชัน",
+ "home.what.multiSession.body": "เริ่มเอเจนต์หลายตัวทำงานคู่ขนานกันในโปรเจกต์เดียวกัน",
+ "home.what.shareLinks.title": "แชร์ลิงก์",
+ "home.what.shareLinks.body": "แชร์ลิงก์ไปยังเซสชันใดก็ได้เพื่อการอ้างอิงหรือ Debug",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "เข้าสู่ระบบด้วย GitHub เพื่อใช้บัญชี Copilot ของคุณ",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "เข้าสู่ระบบด้วย OpenAI เพื่อใช้บัญชี ChatGPT Plus หรือ Pro ของคุณ",
+ "home.what.anyModel.title": "โมเดลใดก็ได้",
+ "home.what.anyModel.body": "ผู้ให้บริการ LLM กว่า 75 รายผ่าน Models.dev รวมถึงโมเดล Local",
+ "home.what.anyEditor.title": "อีดิเตอร์ใดก็ได้",
+ "home.what.anyEditor.body": "ใช้งานได้ทั้งแบบเทอร์มินัล, แอปเดสก์ท็อป และส่วนขยาย IDE",
+ "home.what.readDocs": "อ่านเอกสาร",
+
+ "home.growth.title": "เอเจนต์เขียนโค้ดด้วย AI แบบโอเพนซอร์ส",
+ "home.growth.body":
+ "ด้วยยอดดาวบน GitHub กว่า {{stars}} ดวง, ผู้ร่วมพัฒนา {{contributors}} คน, และการคอมมิตกว่า {{commits}} ครั้ง, OpenCode ได้รับความไว้วางใจจากนักพัฒนากว่า {{monthlyUsers}} คนในทุกเดือน",
+ "home.growth.githubStars": "GitHub Stars",
+ "home.growth.contributors": "ผู้ร่วมพัฒนา",
+ "home.growth.monthlyDevs": "นักพัฒนารายเดือน",
+
+ "home.privacy.title": "สร้างโดยคำนึงถึงความเป็นส่วนตัวเป็นหลัก",
+ "home.privacy.body":
+ "OpenCode ไม่จัดเก็บโค้ดหรือข้อมูลบริบทของคุณ เพื่อให้สามารถทำงานในสภาพแวดล้อมที่ให้ความสำคัญกับความเป็นส่วนตัวได้",
+ "home.privacy.learnMore": "เรียนรู้เพิ่มเติมเกี่ยวกับ",
+ "home.privacy.link": "ความเป็นส่วนตัว",
+
+ "home.faq.q1": "OpenCode คืออะไร?",
+ "home.faq.a1":
+ "OpenCode เป็นเอเจนต์โอเพนซอร์สที่ช่วยให้คุณเขียนและรันโค้ดด้วยโมเดล AI ใดก็ได้ มีให้เลือกใช้ทั้งแบบอินเทอร์เฟซเทอร์มินัล, แอปเดสก์ท็อป หรือส่วนขยาย IDE",
+ "home.faq.q2": "ฉันจะเริ่มใช้ OpenCode ได้อย่างไร?",
+ "home.faq.a2.before": "วิธีเริ่มต้นที่ง่ายที่สุดคืออ่าน",
+ "home.faq.a2.link": "บทนำ",
+ "home.faq.q3": "ต้องสมัครสมาชิก AI เพิ่มเติมเพื่อใช้ OpenCode หรือไม่?",
+ "home.faq.a3.p1": "ไม่จำเป็นเสมอไป OpenCode มาพร้อมกับชุดโมเดลฟรีที่คุณสามารถใช้ได้โดยไม่ต้องสร้างบัญชี",
+ "home.faq.a3.p2.beforeZen": "นอกจากนี้ คุณสามารถใช้โมเดลยอดนิยมใดก็ได้โดยการสร้างบัญชี",
+ "home.faq.a3.p2.afterZen": "",
+ "home.faq.a3.p3":
+ "แม้เราจะแนะนำให้ใช้ Zen แต่ OpenCode ก็ทำงานร่วมกับผู้ให้บริการยอดนิยมทั้งหมด เช่น OpenAI, Anthropic, xAI เป็นต้น",
+ "home.faq.a3.p4.beforeLocal": "คุณยังสามารถเชื่อมต่อกับ",
+ "home.faq.a3.p4.localLink": "โมเดล Local ของคุณ",
+ "home.faq.q4": "ฉันสามารถใช้การสมัครสมาชิก AI ที่มีอยู่กับ OpenCode ได้หรือไม่?",
+ "home.faq.a4.p1":
+ "ได้ OpenCode รองรับแผนการสมัครสมาชิกจากผู้ให้บริการหลักทั้งหมด คุณสามารถใช้การสมัครสมาชิก Claude Pro/Max, ChatGPT Plus/Pro หรือ GitHub Copilot ของคุณได้",
+ "home.faq.q5": "ฉันใช้ OpenCode ได้เฉพาะในเทอร์มินัลใช่หรือไม่?",
+ "home.faq.a5.beforeDesktop": "ไม่อีกต่อไป! OpenCode มีแอปสำหรับ",
+ "home.faq.a5.desktop": "เดสก์ท็อป",
+ "home.faq.a5.and": "และ",
+ "home.faq.a5.web": "เว็บ",
+ "home.faq.q6": "OpenCode ราคาเท่าไหร่?",
+ "home.faq.a6":
+ "OpenCode ใช้งานได้ฟรี 100% และมาพร้อมกับชุดโมเดลฟรี อาจมีค่าใช้จ่ายเพิ่มเติมหากคุณเชื่อมต่อกับผู้ให้บริการรายอื่น",
+ "home.faq.q7": "แล้วเรื่องข้อมูลและความเป็นส่วนตัวล่ะ?",
+ "home.faq.a7.p1": "ข้อมูลของคุณจะถูกจัดเก็บเฉพาะเมื่อคุณใช้โมเดลฟรีของเราหรือสร้างลิงก์ที่แชร์ได้",
+ "home.faq.a7.p2.beforeModels": "เรียนรู้เพิ่มเติมเกี่ยวกับ",
+ "home.faq.a7.p2.modelsLink": "โมเดลของเรา",
+ "home.faq.a7.p2.and": "และ",
+ "home.faq.a7.p2.shareLink": "หน้าแชร์",
+ "home.faq.q8": "OpenCode เป็นโอเพนซอร์สหรือไม่?",
+ "home.faq.a8.p1": "ใช่ OpenCode เป็นโอเพนซอร์สเต็มรูปแบบ ซอร์สโค้ดเปิดเผยต่อสาธารณะบน",
+ "home.faq.a8.p2": "ภายใต้",
+ "home.faq.a8.mitLicense": "MIT License",
+ "home.faq.a8.p3":
+ " ซึ่งหมายความว่าใครๆ ก็สามารถใช้ แก้ไข หรือร่วมพัฒนาได้ ทุกคนในชุมชนสามารถเปิด issue, ส่ง pull request และขยายฟังก์ชันการทำงานได้",
+
+ "home.zenCta.title": "เข้าถึงโมเดลที่เชื่อถือได้และปรับแต่งมาแล้วสำหรับเอเจนต์เขียนโค้ด",
+ "home.zenCta.body":
+ "Zen ให้คุณเข้าถึงชุดโมเดล AI ที่คัดสรรมาแล้ว ซึ่ง OpenCode ได้ทดสอบและทำเบนช์มาร์กโดยเฉพาะสำหรับเอเจนต์เขียนโค้ด ไม่ต้องกังวลเรื่องประสิทธิภาพและคุณภาพที่ไม่สม่ำเสมอจากผู้ให้บริการ ใช้โมเดลที่ผ่านการตรวจสอบแล้วว่าใช้งานได้จริง",
+ "home.zenCta.link": "เรียนรู้เกี่ยวกับ Zen",
+
+ "zen.title": "OpenCode Zen | ชุดโมเดลที่คัดสรรมาอย่างดี เชื่อถือได้ และปรับแต่งแล้วสำหรับเอเจนต์เขียนโค้ด",
+ "zen.hero.title": "โมเดลที่ปรับแต่งมาอย่างดีและเชื่อถือได้สำหรับเอเจนต์เขียนโค้ด",
+ "zen.hero.body":
+ "Zen ให้คุณเข้าถึงชุดโมเดล AI ที่คัดสรรมาแล้ว ซึ่ง OpenCode ได้ทดสอบและทำเบนช์มาร์กโดยเฉพาะสำหรับเอเจนต์เขียนโค้ด ไม่ต้องกังวลเรื่องประสิทธิภาพและคุณภาพที่ไม่สม่ำเสมอ ใช้โมเดลที่ผ่านการตรวจสอบแล้วว่าใช้งานได้จริง",
+
+ "zen.faq.q1": "OpenCode Zen คืออะไร?",
+ "zen.faq.a1":
+ "Zen คือชุดโมเดล AI ที่คัดสรรมาอย่างดี ผ่านการทดสอบและทำเบนช์มาร์กสำหรับเอเจนต์เขียนโค้ด สร้างโดยทีมงานผู้อยู่เบื้องหลัง OpenCode",
+ "zen.faq.q2": "อะไรทำให้ Zen แม่นยำกว่า?",
+ "zen.faq.a2":
+ "Zen ให้บริการเฉพาะโมเดลที่ได้รับการทดสอบและทำเบนช์มาร์กสำหรับเอเจนต์เขียนโค้ดโดยเฉพาะ คุณคงไม่ใช้มีดทาเนยมาหั่นสเต็ก ดังนั้นอย่าใช้โมเดลคุณภาพต่ำสำหรับการเขียนโค้ด",
+ "zen.faq.q3": "Zen ราคาถูกกว่าหรือไม่?",
+ "zen.faq.a3":
+ "Zen ไม่ได้แสวงหากำไร Zen ส่งผ่านต้นทุนจากผู้ให้บริการโมเดลมาถึงคุณ ยิ่งมีการใช้งาน Zen มากเท่าไหร่ OpenCode ก็ยิ่งสามารถต่อรองเรตราคาที่ดีกว่าและส่งต่อให้คุณได้มากขึ้นเท่านั้น",
+ "zen.faq.q4": "Zen ราคาเท่าไหร่?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "คิดค่าบริการต่อคำขอ",
+ "zen.faq.a4.p1.afterPricing": "โดยไม่มีการบวกเพิ่ม ดังนั้นคุณจ่ายเท่ากับที่ผู้ให้บริการโมเดลเรียกเก็บ",
+ "zen.faq.a4.p2.beforeAccount":
+ "ค่าใช้จ่ายรวมของคุณขึ้นอยู่กับการใช้งาน และคุณสามารถตั้งวงเงินการใช้จ่ายรายเดือนได้ใน",
+ "zen.faq.a4.p2.accountLink": "บัญชีของคุณ",
+ "zen.faq.a4.p3":
+ "เพื่อครอบคลุมต้นทุน OpenCode คิดค่าธรรมเนียมการประมวลผลการชำระเงินเพียงเล็กน้อย $1.23 ต่อการเติมเงิน $20",
+ "zen.faq.q5": "แล้วเรื่องข้อมูลและความเป็นส่วนตัวล่ะ?",
+ "zen.faq.a5.beforeExceptions":
+ "โมเดล Zen ทั้งหมดโฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี",
+ "zen.faq.a5.exceptionsLink": "ข้อยกเว้นดังนี้",
+ "zen.faq.q6": "ฉันสามารถตั้งวงเงินการใช้จ่ายได้หรือไม่?",
+ "zen.faq.a6": "ได้ คุณสามารถตั้งวงเงินการใช้จ่ายรายเดือนได้ในบัญชีของคุณ",
+ "zen.faq.q7": "ฉันสามารถยกเลิกได้หรือไม่?",
+ "zen.faq.a7": "ได้ คุณสามารถปิดการเรียกเก็บเงินได้ตลอดเวลาและใช้ยอดเงินคงเหลือของคุณจนหมด",
+ "zen.faq.q8": "ฉันสามารถใช้ Zen กับเอเจนต์เขียนโค้ดอื่นได้หรือไม่?",
+ "zen.faq.a8":
+ "แม้ว่า Zen จะทำงานได้ดีเยี่ยมกับ OpenCode แต่คุณสามารถใช้ Zen กับเอเจนต์ใดก็ได้ เพียงทำตามคำแนะนำการตั้งค่าในเอเจนต์เขียนโค้ดที่คุณต้องการ",
+
+ "zen.cta.start": "เริ่มต้นใช้งาน Zen",
+ "zen.pricing.title": "เติมเงิน $20 แบบ Pay as you go",
+ "zen.pricing.fee": "(+ค่าธรรมเนียมประมวลผลบัตร $1.23)",
+ "zen.pricing.body": "ใช้ได้กับทุกเอเจนต์ ตั้งวงเงินรายเดือนได้ ยกเลิกได้ตลอดเวลา",
+ "zen.problem.title": "Zen กำลังแก้ปัญหาอะไร?",
+ "zen.problem.body":
+ "มีโมเดลมากมายให้เลือก แต่มีเพียงไม่กี่ตัวที่ทำงานได้ดีกับเอเจนต์เขียนโค้ด ผู้ให้บริการส่วนใหญ่กำหนดค่าแตกต่างกันไปซึ่งให้ผลลัพธ์ที่หลากหลาย",
+ "zen.problem.subtitle": "เรากำลังแก้ไขปัญหานี้สำหรับทุกคน ไม่ใช่แค่ผู้ใช้ OpenCode เท่านั้น",
+ "zen.problem.item1": "ทดสอบโมเดลที่คัดเลือกมาและปรึกษากับทีมของโมเดลนั้นๆ",
+ "zen.problem.item2": "ทำงานร่วมกับผู้ให้บริการเพื่อให้มั่นใจว่าโมเดลถูกส่งมอบอย่างถูกต้อง",
+ "zen.problem.item3": "ทำเบนช์มาร์กทุกการจับคู่ระหว่างโมเดลและผู้ให้บริการที่เราแนะนำ",
+ "zen.how.title": "Zen ทำงานอย่างไร",
+ "zen.how.body": "แม้เราจะแนะนำให้คุณใช้ Zen กับ OpenCode แต่คุณสามารถใช้ Zen กับเอเจนต์ใดก็ได้",
+ "zen.how.step1.title": "ลงทะเบียนและเติมเงิน $20",
+ "zen.how.step1.beforeLink": "ทำตาม",
+ "zen.how.step1.link": "คำแนะนำการตั้งค่า",
+ "zen.how.step2.title": "ใช้ Zen ด้วยราคาที่โปร่งใส",
+ "zen.how.step2.link": "จ่ายตามคำขอ (pay per request)",
+ "zen.how.step2.afterLink": "โดยไม่มีการบวกเพิ่ม",
+ "zen.how.step3.title": "เติมเงินอัตโนมัติ",
+ "zen.how.step3.body": "เมื่อยอดเงินของคุณเหลือ $5 เราจะเติมเงิน $20 ให้โดยอัตโนมัติ",
+ "zen.privacy.title": "ความเป็นส่วนตัวของคุณสำคัญสำหรับเรา",
+ "zen.privacy.beforeExceptions":
+ "โมเดล Zen ทั้งหมดโฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี",
+ "zen.privacy.exceptionsLink": "ข้อยกเว้นดังนี้",
+
+ "go.title": "OpenCode Go | โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
+ "go.meta.description":
+ "Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน พร้อมขีดจำกัดคำขอ 5 ชั่วโมงที่เอื้อเฟื้อสำหรับ GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro และ DeepSeek V4 Flash",
+ "go.hero.title": "โมเดลเขียนโค้ดราคาประหยัดสำหรับทุกคน",
+ "go.hero.body":
+ "Go นำการเขียนโค้ดแบบเอเจนต์มาสู่นักเขียนโปรแกรมทั่วโลก เสนอขีดจำกัดที่กว้างขวางและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดได้อย่างน่าเชื่อถือ เพื่อให้คุณสามารถสร้างสรรค์ด้วยเอเจนต์ที่ทรงพลังโดยไม่ต้องกังวลเรื่องค่าใช้จ่ายหรือความพร้อมใช้งาน",
+
+ "go.cta.start": "สมัครสมาชิก Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "สมัครสมาชิก Go",
+ "go.cta.price": "$10/เดือน",
+ "go.cta.promo": "$5 เดือนแรก",
+ "go.pricing.body": "ใช้กับเอเจนต์ใดก็ได้ $5 ในเดือนแรก จากนั้น $10/เดือน เติมเครดิตหากจำเป็น ยกเลิกได้ตลอดเวลา",
+ "go.graph.free": "ฟรี",
+ "go.graph.freePill": "Big Pickle และโมเดลฟรี",
+ "go.graph.go": "Go",
+ "go.graph.label": "คำขอต่อ 5 ชั่วโมง",
+ "go.graph.usageLimits": "ขีดจำกัดการใช้งาน",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "คำขอต่อ 5 ชม.: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "อดีต CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "เปลี่ยนชีวิตไปเลย มันเป็นสิ่งที่ต้องมีจริงๆ",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "อดีตผู้ก่อตั้ง SEED, PM, Melt, Pop, Dapt, Cadmus และ ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 ใน 5 คนในทีมของเราชอบใช้",
+ "go.testimonials.jay.quoteAfter": "",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "อดีต Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "ผมแนะนำ",
+ "go.testimonials.adam.quoteAfter": "ได้ไม่พอจริงๆ พูดจริงนะ มันดีมากๆ",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "อดีตหัวหน้าฝ่ายออกแบบ, Laravel",
+ "go.testimonials.david.quoteBefore": "ด้วย",
+ "go.testimonials.david.quoteAfter": "ผมรู้ว่าโมเดลทั้งหมดผ่านการทดสอบและสมบูรณ์แบบสำหรับเอเจนต์เขียนโค้ด",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "อดีตเด็กฝึกงาน, Nvidia (4 ครั้ง)",
+ "go.testimonials.frank.quote": "ผมหวังว่าผมจะยังอยู่ที่ Nvidia",
+ "go.problem.title": "Go แก้ปัญหาอะไร?",
+ "go.problem.body":
+ "เรามุ่งมั่นที่จะนำประสบการณ์ OpenCode ไปสู่ผู้คนให้ได้มากที่สุด OpenCode Go เป็นการสมัครสมาชิกราคาประหยัด: $5 สำหรับเดือนแรก จากนั้น $10/เดือน โดยมอบขีดจำกัดที่เอื้อเฟื้อและการเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสูงสุดอย่างเชื่อถือได้",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "ราคาการสมัครสมาชิกที่ต่ำ",
+ "go.problem.item2": "ขีดจำกัดที่กว้างขวางและการเข้าถึงที่เชื่อถือได้",
+ "go.problem.item3": "สร้างขึ้นเพื่อโปรแกรมเมอร์จำนวนมากที่สุดเท่าที่จะเป็นไปได้",
+ "go.problem.item4":
+ "รวมถึง GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro และ DeepSeek V4 Flash",
+ "go.how.title": "Go ทำงานอย่างไร",
+ "go.how.body": "Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน คุณสามารถใช้กับ OpenCode หรือเอเจนต์ใดก็ได้",
+ "go.how.step1.title": "สร้างบัญชี",
+ "go.how.step1.beforeLink": "ทำตาม",
+ "go.how.step1.link": "คำแนะนำการตั้งค่า",
+ "go.how.step2.title": "สมัครสมาชิก Go",
+ "go.how.step2.link": "$5 เดือนแรก",
+ "go.how.step2.afterLink": "จากนั้น $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อ",
+ "go.how.step3.title": "เริ่มเขียนโค้ด",
+ "go.how.step3.body": "ด้วยการเข้าถึงโมเดลโอเพนซอร์สที่เชื่อถือได้",
+ "go.privacy.title": "ความเป็นส่วนตัวของคุณสำคัญสำหรับเรา",
+ "go.privacy.body":
+ "แผนนี้ออกแบบมาเพื่อผู้ใช้งานระหว่างประเทศเป็นหลัก โดยมีโมเดลโฮสต์ในสหรัฐอเมริกา สหภาพยุโรป และสิงคโปร์ เพื่อการเข้าถึงทั่วโลกที่เสถียร",
+ "go.privacy.contactAfter": "หากคุณมีคำถามใดๆ",
+ "go.privacy.beforeExceptions":
+ "โมเดล Go โฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี",
+ "go.privacy.exceptionsLink": "ข้อยกเว้นดังนี้",
+ "go.faq.q1": "OpenCode Go คืออะไร?",
+ "go.faq.a1":
+ "Go คือการสมัครสมาชิกราคาประหยัดที่ให้คุณเข้าถึงโมเดลโอเพนซอร์สที่มีความสามารถสำหรับการเขียนโค้ดแบบเอเจนต์ได้อย่างน่าเชื่อถือ",
+ "go.faq.q2": "Go รวมโมเดลอะไรบ้าง?",
+ "go.faq.a2": "Go รวมโมเดลด้านล่างนี้ พร้อมขีดจำกัดที่มากและการเข้าถึงที่เชื่อถือได้",
+ "go.faq.q3": "Go เหมือนกับ Zen หรือไม่?",
+ "go.faq.a3":
+ "ไม่ Zen เป็นแบบจ่ายตามการใช้งาน ในขณะที่ Go เริ่มต้นที่ $5 สำหรับเดือนแรก จากนั้น $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อและการเข้าถึงโมเดลโอเพนซอร์ส GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro และ DeepSeek V4 Flash อย่างเชื่อถือได้",
+ "go.faq.q4": "Go ราคาเท่าไหร่?",
+ "go.faq.a4.p1.beforePricing": "Go ราคา",
+ "go.faq.a4.p1.pricingLink": "$5 เดือนแรก",
+ "go.faq.a4.p1.afterPricing": "จากนั้น $10/เดือน พร้อมขีดจำกัดที่เอื้อเฟื้อ",
+ "go.faq.a4.p2.beforeAccount": "คุณสามารถจัดการการสมัครสมาชิกของคุณได้ใน",
+ "go.faq.a4.p2.accountLink": "บัญชีของคุณ",
+ "go.faq.a4.p3": "ยกเลิกได้ตลอดเวลา",
+ "go.faq.q5": "แล้วเรื่องข้อมูลและความเป็นส่วนตัวล่ะ?",
+ "go.faq.a5.body":
+ "แผนนี้ออกแบบมาเพื่อผู้ใช้งานระหว่างประเทศเป็นหลัก โดยมีโมเดลโฮสต์ในสหรัฐอเมริกา สหภาพยุโรป และสิงคโปร์ เพื่อการเข้าถึงทั่วโลกที่เสถียร ผู้ให้บริการของเราปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูลและไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล",
+ "go.faq.a5.beforeExceptions":
+ "โมเดล Go โฮสต์ในสหรัฐอเมริกา ผู้ให้บริการปฏิบัติตามนโยบายไม่เก็บรักษาข้อมูล (zero-retention policy) และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมี",
+ "go.faq.a5.exceptionsLink": "ข้อยกเว้นดังนี้",
+ "go.faq.q6": "ฉันสามารถเติมเครดิตได้หรือไม่?",
+ "go.faq.a6": "หากคุณต้องการใช้งานเพิ่ม คุณสามารถเติมเครดิตในบัญชีของคุณได้",
+ "go.faq.q7": "ฉันสามารถยกเลิกได้หรือไม่?",
+ "go.faq.a7": "ได้ คุณสามารถยกเลิกได้ตลอดเวลา",
+ "go.faq.q8": "ฉันสามารถใช้ Go กับเอเจนต์เขียนโค้ดอื่นได้หรือไม่?",
+ "go.faq.a8": "ได้ คุณสามารถใช้ Go กับเอเจนต์ใดก็ได้ ทำตามคำแนะนำการตั้งค่าในเอเจนต์เขียนโค้ดที่คุณต้องการ",
+
+ "go.faq.q9": "ความแตกต่างระหว่างโมเดลฟรีและ Go คืออะไร?",
+ "go.faq.a9":
+ "โมเดลฟรีรวมถึง Big Pickle บวกกับโมเดลโปรโมชั่นที่มีให้ในขณะนั้น ด้วยโควต้า 200 คำขอ/วัน Go รวมถึง GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro และ DeepSeek V4 Flash ที่มีโควต้าคำขอสูงกว่า ซึ่งบังคับใช้ผ่านช่วงเวลาหมุนเวียน (5 ชั่วโมง, รายสัปดาห์ และรายเดือน) เทียบเท่าประมาณ $12 ต่อ 5 ชั่วโมง, $30 ต่อสัปดาห์ และ $60 ต่อเดือน (จำนวนคำขอจริงจะแตกต่างกันไปตามโมเดลและการใช้งาน)",
+
+ "zen.api.error.rateLimitExceeded": "เกินขีดจำกัดอัตราการใช้งาน กรุณาลองใหม่ในภายหลัง",
+ "zen.api.error.modelNotSupported": "ไม่รองรับโมเดล {{model}}",
+ "zen.api.error.modelFormatNotSupported": "ไม่รองรับโมเดล {{model}} สำหรับรูปแบบ {{format}}",
+ "zen.api.error.noProviderAvailable": "ไม่มีผู้ให้บริการที่พร้อมใช้งาน",
+ "zen.api.error.providerNotSupported": "ไม่รองรับผู้ให้บริการ {{provider}}",
+ "zen.api.error.missingApiKey": "ไม่มี API key",
+ "zen.api.error.invalidApiKey": "API key ไม่ถูกต้อง",
+ "zen.api.error.subscriptionQuotaExceeded": "โควต้าการสมัครสมาชิกเกินขีดจำกัด ลองใหม่ในอีก {{retryIn}}",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "ถึงขีดจำกัดการใช้งานในรอบ 5 ชั่วโมงแล้ว จะรีเซ็ตในอีก {{retryIn}} หากต้องการใช้โมเดลนี้ต่อทันที ให้เปิดใช้งานจากยอดเงินคงเหลือของคุณ: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "ถึงขีดจำกัดการใช้งานรายสัปดาห์แล้ว จะรีเซ็ตในอีก {{retryIn}} หากต้องการใช้โมเดลนี้ต่อทันที ให้เปิดใช้งานจากยอดเงินคงเหลือของคุณ: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "ถึงขีดจำกัดการใช้งานรายเดือนแล้ว จะรีเซ็ตในอีก {{retryIn}} หากต้องการใช้โมเดลนี้ต่อทันที ให้เปิดใช้งานจากยอดเงินคงเหลือของคุณ: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "ไม่มีวิธีการชำระเงิน เพิ่มวิธีการชำระเงินที่นี่: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "ยอดเงินคงเหลือไม่เพียงพอ จัดการการเรียกเก็บเงินของคุณที่นี่: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Workspace ของคุณถึงขีดจำกัดการใช้จ่ายรายเดือนที่ ${{amount}} แล้ว จัดการขีดจำกัดของคุณที่นี่: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "คุณถึงขีดจำกัดการใช้จ่ายรายเดือนที่ ${{amount}} แล้ว จัดการขีดจำกัดของคุณที่นี่: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "โมเดลถูกปิดใช้งาน",
+ "zen.api.error.trialEnded":
+ "โปรโมชันฟรีสำหรับ {{model}} สิ้นสุดแล้ว คุณสามารถใช้โมเดลต่อได้โดยสมัครสมาชิก OpenCode Go - {{link}}",
+
+ "black.meta.title": "OpenCode Black | เข้าถึงโมเดลเขียนโค้ดที่ดีที่สุดในโลก",
+ "black.meta.description": "เข้าถึง Claude, GPT, Gemini และอื่นๆ ด้วยแผนสมาชิก OpenCode Black",
+ "black.hero.title": "เข้าถึงโมเดลเขียนโค้ดที่ดีที่สุดในโลก",
+ "black.hero.subtitle": "รวมถึง Claude, GPT, Gemini และอื่นๆ อีกมากมาย",
+ "black.title": "OpenCode Black | ราคา",
+ "black.paused": "การสมัครแผน Black หยุดชั่วคราว",
+ "black.plan.icon20": "แผน Black 20",
+ "black.plan.icon100": "แผน Black 100",
+ "black.plan.icon200": "แผน Black 200",
+ "black.plan.multiplier100": "ใช้งานได้มากกว่า Black 20 ถึง 5 เท่า",
+ "black.plan.multiplier200": "ใช้งานได้มากกว่า Black 20 ถึง 20 เท่า",
+ "black.price.perMonth": "ต่อเดือน",
+ "black.price.perPersonBilledMonthly": "ต่อคน เรียกเก็บรายเดือน",
+ "black.terms.1": "การสมัครสมาชิกของคุณจะยังไม่เริ่มต้นทันที",
+ "black.terms.2": "คุณจะถูกเพิ่มในรายชื่อรอและจะได้รับการเปิดใช้งานเร็วๆ นี้",
+ "black.terms.3": "บัตรของคุณจะถูกตัดเงินเมื่อการสมัครสมาชิกของคุณถูกเปิดใช้งานเท่านั้น",
+ "black.terms.4": "มีขีดจำกัดการใช้งาน การใช้ระบบอัตโนมัติอย่างหนักอาจทำให้ถึงขีดจำกัดเร็วขึ้น",
+ "black.terms.5": "การสมัครสมาชิกสำหรับบุคคลธรรมดา ติดต่อฝ่ายองค์กรสำหรับทีม",
+ "black.terms.6": "ขีดจำกัดอาจมีการปรับเปลี่ยนและแผนอาจถูกยกเลิกในอนาคต",
+ "black.terms.7": "ยกเลิกการสมัครสมาชิกได้ตลอดเวลา",
+ "black.action.continue": "ดำเนินการต่อ",
+ "black.finePrint.beforeTerms": "ราคาที่แสดงยังไม่รวมภาษีที่เกี่ยวข้อง",
+ "black.finePrint.terms": "ข้อกำหนดการให้บริการ",
+ "black.workspace.title": "OpenCode Black | เลือก Workspace",
+ "black.workspace.selectPlan": "เลือก Workspace สำหรับแผนนี้",
+ "black.workspace.name": "Workspace {{n}}",
+ "black.subscribe.title": "สมัครสมาชิก OpenCode Black",
+ "black.subscribe.paymentMethod": "วิธีการชำระเงิน",
+ "black.subscribe.loadingPaymentForm": "กำลังโหลดแบบฟอร์มการชำระเงิน...",
+ "black.subscribe.selectWorkspaceToContinue": "เลือก Workspace เพื่อดำเนินการต่อ",
+ "black.subscribe.failurePrefix": "โอ๊ะโอ!",
+ "black.subscribe.error.generic": "เกิดข้อผิดพลาด",
+ "black.subscribe.error.invalidPlan": "แผนไม่ถูกต้อง",
+ "black.subscribe.error.workspaceRequired": "จำเป็นต้องมี Workspace ID",
+ "black.subscribe.error.alreadySubscribed": "Workspace นี้มีการสมัครสมาชิกอยู่แล้ว",
+ "black.subscribe.processing": "กำลังดำเนินการ...",
+ "black.subscribe.submit": "สมัครสมาชิก ${{plan}}",
+ "black.subscribe.form.chargeNotice": "คุณจะถูกเรียกเก็บเงินเมื่อการสมัครสมาชิกของคุณถูกเปิดใช้งานเท่านั้น",
+ "black.subscribe.success.title": "คุณอยู่ในรายชื่อรอ OpenCode Black แล้ว",
+ "black.subscribe.success.subscriptionPlan": "แผนการสมัครสมาชิก",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "จำนวนเงิน",
+ "black.subscribe.success.amountValue": "${{plan}} ต่อเดือน",
+ "black.subscribe.success.paymentMethod": "วิธีการชำระเงิน",
+ "black.subscribe.success.dateJoined": "วันที่เข้าร่วม",
+ "black.subscribe.success.chargeNotice": "บัตรของคุณจะถูกเรียกเก็บเงินเมื่อการสมัครสมาชิกของคุณถูกเปิดใช้งาน",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "การใช้งาน",
+ "workspace.nav.apiKeys": "API Keys",
+ "workspace.nav.members": "สมาชิก",
+ "workspace.nav.billing": "การเรียกเก็บเงิน",
+ "workspace.nav.settings": "การตั้งค่า",
+
+ "workspace.home.banner.beforeLink": "โมเดลที่เชื่อถือได้และปรับแต่งแล้วสำหรับเอเจนต์เขียนโค้ด",
+ "workspace.lite.banner.beforeLink": "โมเดลเขียนโค้ดต้นทุนต่ำสำหรับทุกคน",
+ "workspace.home.billing.loading": "กำลังโหลด...",
+ "workspace.home.billing.enable": "เปิดใช้งานการเรียกเก็บเงิน",
+ "workspace.home.billing.currentBalance": "ยอดคงเหลือปัจจุบัน",
+
+ "workspace.newUser.feature.tested.title": "โมเดลที่ผ่านการทดสอบและตรวจสอบแล้ว",
+ "workspace.newUser.feature.tested.body":
+ "เราได้ทำเบนช์มาร์กและทดสอบโมเดลสำหรับเอเจนต์เขียนโค้ดโดยเฉพาะเพื่อให้มั่นใจถึงประสิทธิภาพที่ดีที่สุด",
+ "workspace.newUser.feature.quality.title": "คุณภาพสูงสุด",
+ "workspace.newUser.feature.quality.body":
+ "เข้าถึงโมเดลที่กำหนดค่าไว้เพื่อประสิทธิภาพสูงสุด - ไม่มีการลดเกรดหรือส่งงานไปยังผู้ให้บริการที่ราคาถูกกว่า",
+ "workspace.newUser.feature.lockin.title": "ไม่มีการผูกมัด (Lock-in)",
+ "workspace.newUser.feature.lockin.body":
+ "ใช้ Zen กับเอเจนต์เขียนโค้ดใดก็ได้ และกลับมาใช้ผู้ให้บริการรายอื่นด้วย OpenCode ได้ทุกเมื่อที่คุณต้องการ",
+ "workspace.newUser.copyApiKey": "คัดลอก API key",
+ "workspace.newUser.copyKey": "คัดลอก Key",
+ "workspace.newUser.copied": "คัดลอกแล้ว!",
+ "workspace.newUser.step.enableBilling": "เปิดใช้งานการเรียกเก็บเงิน",
+ "workspace.newUser.step.login.before": "รัน",
+ "workspace.newUser.step.login.after": "และเลือก OpenCode",
+ "workspace.newUser.step.pasteKey": "วาง API key ของคุณ",
+ "workspace.newUser.step.models.before": "เริ่ม OpenCode และรัน",
+ "workspace.newUser.step.models.after": "เพื่อเลือกโมเดล",
+
+ "workspace.models.title": "โมเดล",
+ "workspace.models.subtitle.beforeLink": "จัดการว่าโมเดลใดที่สมาชิกใน Workspace สามารถเข้าถึงได้",
+ "workspace.models.table.model": "โมเดล",
+ "workspace.models.table.enabled": "เปิดใช้งาน",
+
+ "workspace.providers.title": "Bring Your Own Key",
+ "workspace.providers.subtitle": "กำหนดค่า API keys ของคุณเองจากผู้ให้บริการ AI",
+ "workspace.providers.placeholder": "ป้อน {{provider}} API key ({{prefix}}...)",
+ "workspace.providers.configure": "กำหนดค่า",
+ "workspace.providers.edit": "แก้ไข",
+ "workspace.providers.delete": "ลบ",
+ "workspace.providers.saving": "กำลังบันทึก...",
+ "workspace.providers.save": "บันทึก",
+ "workspace.providers.table.provider": "ผู้ให้บริการ",
+ "workspace.providers.table.apiKey": "API Key",
+
+ "workspace.usage.title": "ประวัติการใช้งาน",
+ "workspace.usage.subtitle": "การใช้งานและต้นทุน API ล่าสุด",
+ "workspace.usage.empty": "ทำการเรียก API ครั้งแรกเพื่อเริ่มต้น",
+ "workspace.usage.table.date": "วันที่",
+ "workspace.usage.table.model": "โมเดล",
+ "workspace.usage.table.input": "Input",
+ "workspace.usage.table.output": "Output",
+ "workspace.usage.table.cost": "ค่าใช้จ่าย",
+ "workspace.usage.table.session": "เซสชัน",
+ "workspace.usage.breakdown.input": "Input",
+ "workspace.usage.breakdown.cacheRead": "Cache Read",
+ "workspace.usage.breakdown.cacheWrite": "Cache Write",
+ "workspace.usage.breakdown.output": "Output",
+ "workspace.usage.breakdown.reasoning": "Reasoning",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "ค่าใช้จ่าย",
+ "workspace.cost.subtitle": "ต้นทุนการใช้งานแยกตามโมเดล",
+ "workspace.cost.allModels": "ทุกโมเดล",
+ "workspace.cost.allKeys": "ทุก Key",
+ "workspace.cost.deletedSuffix": "(ลบแล้ว)",
+ "workspace.cost.empty": "ไม่มีข้อมูลการใช้งานในช่วงเวลาที่เลือก",
+ "workspace.cost.subscriptionShort": "sub",
+
+ "workspace.keys.title": "API Keys",
+ "workspace.keys.subtitle": "จัดการ API keys ของคุณสำหรับการเข้าถึงบริการ OpenCode",
+ "workspace.keys.create": "สร้าง API Key",
+ "workspace.keys.placeholder": "ป้อนชื่อ Key",
+ "workspace.keys.empty": "สร้าง OpenCode Gateway API key",
+ "workspace.keys.table.name": "ชื่อ",
+ "workspace.keys.table.key": "Key",
+ "workspace.keys.table.createdBy": "สร้างโดย",
+ "workspace.keys.table.lastUsed": "ใช้ล่าสุด",
+ "workspace.keys.copyApiKey": "คัดลอก API key",
+ "workspace.keys.delete": "ลบ",
+
+ "workspace.members.title": "สมาชิก",
+ "workspace.members.subtitle": "จัดการสมาชิก Workspace และสิทธิ์ของพวกเขา",
+ "workspace.members.invite": "เชิญสมาชิก",
+ "workspace.members.inviting": "กำลังเชิญ...",
+ "workspace.members.beta.beforeLink": "Workspace ให้บริการฟรีสำหรับทีมในช่วงเบต้า",
+ "workspace.members.form.invitee": "ผู้ได้รับเชิญ",
+ "workspace.members.form.emailPlaceholder": "ใส่อีเมล",
+ "workspace.members.form.role": "บทบาท",
+ "workspace.members.form.monthlyLimit": "วงเงินการใช้จ่ายรายเดือน",
+ "workspace.members.noLimit": "ไม่มีขีดจำกัด",
+ "workspace.members.noLimitLowercase": "ไม่มีขีดจำกัด",
+ "workspace.members.invited": "เชิญแล้ว",
+ "workspace.members.edit": "แก้ไข",
+ "workspace.members.delete": "ลบ",
+ "workspace.members.saving": "กำลังบันทึก...",
+ "workspace.members.save": "บันทึก",
+ "workspace.members.table.email": "อีเมล",
+ "workspace.members.table.role": "บทบาท",
+ "workspace.members.table.monthLimit": "วงเงินเดือน",
+ "workspace.members.role.admin": "แอดมิน",
+ "workspace.members.role.adminDescription": "สามารถจัดการโมเดล สมาชิก และการเรียกเก็บเงินได้",
+ "workspace.members.role.member": "สมาชิก",
+ "workspace.members.role.memberDescription": "สามารถสร้าง API keys สำหรับตัวเองได้เท่านั้น",
+
+ "workspace.settings.title": "การตั้งค่า",
+ "workspace.settings.subtitle": "อัปเดตชื่อ Workspace และการตั้งค่าของคุณ",
+ "workspace.settings.workspaceName": "ชื่อ Workspace",
+ "workspace.settings.defaultName": "ค่าเริ่มต้น",
+ "workspace.settings.updating": "กำลังอัปเดต...",
+ "workspace.settings.save": "บันทึก",
+ "workspace.settings.edit": "แก้ไข",
+
+ "workspace.billing.title": "การเรียกเก็บเงิน",
+ "workspace.billing.subtitle.beforeLink": "จัดการวิธีการชำระเงิน",
+ "workspace.billing.contactUs": "ติดต่อเรา",
+ "workspace.billing.subtitle.afterLink": "หากคุณมีคำถามใดๆ",
+ "workspace.billing.currentBalance": "ยอดคงเหลือปัจจุบัน",
+ "workspace.billing.add": "เพิ่ม $",
+ "workspace.billing.enterAmount": "ใส่จำนวนเงิน",
+ "workspace.billing.loading": "กำลังโหลด...",
+ "workspace.billing.addAction": "เพิ่ม",
+ "workspace.billing.addBalance": "เพิ่มยอดคงเหลือ",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "เชื่อมโยงกับ Stripe",
+ "workspace.billing.manage": "จัดการ",
+ "workspace.billing.enable": "เปิดใช้งานการเรียกเก็บเงิน",
+
+ "workspace.monthlyLimit.title": "วงเงินรายเดือน",
+ "workspace.monthlyLimit.subtitle": "ตั้งขีดจำกัดการใช้งานรายเดือนสำหรับบัญชีของคุณ",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "กำลังตั้งค่า...",
+ "workspace.monthlyLimit.set": "ตั้งค่า",
+ "workspace.monthlyLimit.edit": "แก้ไขขีดจำกัด",
+ "workspace.monthlyLimit.noLimit": "ไม่ได้ตั้งขีดจำกัดการใช้งาน",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "การใช้งานปัจจุบันสำหรับ",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "คือ $",
+
+ "workspace.redeem.title": "แลกคูปอง",
+ "workspace.redeem.subtitle": "แลกรหัสคูปองเพื่อรับเครดิตหรือสิทธิพิเศษ",
+ "workspace.redeem.placeholder": "กรอกรหัสคูปอง",
+ "workspace.redeem.redeem": "แลก",
+ "workspace.redeem.redeeming": "กำลังแลก...",
+ "workspace.redeem.success": "แลกคูปองสำเร็จ",
+
+ "workspace.reload.title": "โหลดซ้ำอัตโนมัติ",
+ "workspace.reload.disabled.before": "การโหลดซ้ำอัตโนมัติ",
+ "workspace.reload.disabled.state": "ปิดใช้งานอยู่",
+ "workspace.reload.disabled.after": "เปิดใช้งานเพื่อเติมเงินอัตโนมัติเมื่อยอดคงเหลือต่ำ",
+ "workspace.reload.enabled.before": "การโหลดซ้ำอัตโนมัติ",
+ "workspace.reload.enabled.state": "เปิดใช้งานอยู่",
+ "workspace.reload.enabled.middle": "เราจะเติมเงิน",
+ "workspace.reload.processingFee": "ค่าธรรมเนียมดำเนินการ",
+ "workspace.reload.enabled.after": "เมื่อยอดคงเหลือถึง",
+ "workspace.reload.edit": "แก้ไข",
+ "workspace.reload.enable": "เปิดใช้งาน",
+ "workspace.reload.enableAutoReload": "เปิดใช้งานการโหลดซ้ำอัตโนมัติ",
+ "workspace.reload.reloadAmount": "เติมเงิน $",
+ "workspace.reload.whenBalanceReaches": "เมื่อยอดถึง $",
+ "workspace.reload.saving": "กำลังบันทึก...",
+ "workspace.reload.save": "บันทึก",
+ "workspace.reload.failedAt": "เติมเงินล้มเหลวเมื่อ",
+ "workspace.reload.reason": "เหตุผล:",
+ "workspace.reload.updatePaymentMethod": "โปรดอัปเดตวิธีการชำระเงินของคุณแล้วลองอีกครั้ง",
+ "workspace.reload.retrying": "กำลังลองอีกครั้ง...",
+ "workspace.reload.retry": "ลองอีกครั้ง",
+ "workspace.reload.error.paymentFailed": "การชำระเงินล้มเหลว",
+
+ "workspace.payments.title": "ประวัติการชำระเงิน",
+ "workspace.payments.subtitle": "รายการธุรกรรมการชำระเงินล่าสุด",
+ "workspace.payments.table.date": "วันที่",
+ "workspace.payments.table.paymentId": "Payment ID",
+ "workspace.payments.table.amount": "จำนวนเงิน",
+ "workspace.payments.table.receipt": "ใบเสร็จ",
+ "workspace.payments.type.credit": "credit",
+ "workspace.payments.type.subscription": "subscription",
+ "workspace.payments.view": "ดู",
+
+ "workspace.black.loading": "กำลังโหลด...",
+ "workspace.black.time.day": "วัน",
+ "workspace.black.time.days": "วัน",
+ "workspace.black.time.hour": "ชั่วโมง",
+ "workspace.black.time.hours": "ชั่วโมง",
+ "workspace.black.time.minute": "นาที",
+ "workspace.black.time.minutes": "นาที",
+ "workspace.black.time.fewSeconds": "ไม่กี่วินาที",
+ "workspace.black.subscription.title": "การสมัครสมาชิก",
+ "workspace.black.subscription.message": "คุณสมัครสมาชิก OpenCode Black ในราคา ${{plan}} ต่อเดือน",
+ "workspace.black.subscription.manage": "จัดการการสมัครสมาชิก",
+ "workspace.black.subscription.rollingUsage": "การใช้งาน 5 ชั่วโมง",
+ "workspace.black.subscription.weeklyUsage": "การใช้งานรายสัปดาห์",
+ "workspace.black.subscription.resetsIn": "รีเซ็ตใน",
+ "workspace.black.subscription.useBalance": "ใช้ยอดเงินคงเหลือของคุณหลังจากถึงขีดจำกัดการใช้งานแล้ว",
+ "workspace.black.waitlist.title": "รายชื่อรอ",
+ "workspace.black.waitlist.joined": "คุณอยู่ในรายชื่อรอสำหรับแผน OpenCode Black ราคา ${{plan}} ต่อเดือน",
+ "workspace.black.waitlist.ready": "เราพร้อมที่จะลงทะเบียนให้คุณเข้าสู่แผน OpenCode Black ราคา ${{plan}} ต่อเดือนแล้ว",
+ "workspace.black.waitlist.leave": "ออกจากรายชื่อรอ",
+ "workspace.black.waitlist.leaving": "กำลังออกจาก...",
+ "workspace.black.waitlist.left": "ออกแล้ว",
+ "workspace.black.waitlist.enroll": "ลงทะเบียน",
+ "workspace.black.waitlist.enrolling": "กำลังลงทะเบียน...",
+ "workspace.black.waitlist.enrolled": "ลงทะเบียนแล้ว",
+ "workspace.black.waitlist.enrollNote":
+ "เมื่อคุณคลิกลงทะเบียน การสมัครสมาชิกของคุณจะเริ่มต้นทันทีและบัตรของคุณจะถูกเรียกเก็บเงิน",
+
+ "workspace.lite.loading": "กำลังโหลด...",
+ "workspace.lite.time.day": "วัน",
+ "workspace.lite.time.days": "วัน",
+ "workspace.lite.time.hour": "ชั่วโมง",
+ "workspace.lite.time.hours": "ชั่วโมง",
+ "workspace.lite.time.minute": "นาที",
+ "workspace.lite.time.minutes": "นาที",
+ "workspace.lite.time.fewSeconds": "ไม่กี่วินาที",
+ "workspace.lite.subscription.message": "คุณได้สมัครสมาชิก OpenCode Go แล้ว",
+ "workspace.lite.subscription.manage": "จัดการการสมัครสมาชิก",
+ "workspace.lite.subscription.rollingUsage": "การใช้งานแบบหมุนเวียน",
+ "workspace.lite.subscription.weeklyUsage": "การใช้งานรายสัปดาห์",
+ "workspace.lite.subscription.monthlyUsage": "การใช้งานรายเดือน",
+ "workspace.lite.subscription.resetsIn": "รีเซ็ตใน",
+ "workspace.lite.subscription.useBalance": "ใช้ยอดคงเหลือของคุณหลังจากถึงขีดจำกัดการใช้งาน",
+ "workspace.lite.subscription.selectProvider":
+ 'เลือก "OpenCode Go" เป็นผู้ให้บริการในการตั้งค่า opencode ของคุณเพื่อใช้โมเดล Go',
+ "workspace.lite.black.message":
+ "ขณะนี้คุณสมัครสมาชิก OpenCode Black หรืออยู่ในรายการรอ โปรดยกเลิกการสมัครก่อนหากต้องการเปลี่ยนไปใช้ Go",
+ "workspace.lite.other.message":
+ "สมาชิกคนอื่นใน Workspace นี้ได้สมัคร OpenCode Go แล้ว สามารถสมัครได้เพียงหนึ่งคนต่อหนึ่ง Workspace เท่านั้น",
+ "workspace.lite.promo.description":
+ "OpenCode Go เริ่มต้นที่ {{price}} จากนั้น $10/เดือน และมอบการเข้าถึงโมเดลการเขียนโค้ดแบบเปิดยอดนิยมอย่างเสถียรพร้อมขีดจำกัดการใช้งานที่ให้มาอย่างเหลือเฟือ",
+ "workspace.lite.promo.price": "$5 สำหรับเดือนแรก",
+ "workspace.lite.promo.modelsTitle": "สิ่งที่รวมอยู่ด้วย",
+ "workspace.lite.promo.footer":
+ "แผนนี้ออกแบบมาสำหรับผู้ใช้งานต่างประเทศเป็นหลัก โดยมีโมเดลโฮสต์อยู่ในสหรัฐอเมริกา สหภาพยุโรป และสิงคโปร์ เพื่อการเข้าถึงที่เสถียรทั่วโลก ราคาและขีดจำกัดการใช้งานอาจมีการเปลี่ยนแปลงตามที่เราได้เรียนรู้จากการใช้งานในช่วงแรกและข้อเสนอแนะ",
+ "workspace.lite.promo.subscribe": "สมัครสมาชิก Go",
+ "workspace.lite.promo.subscribing": "กำลังเปลี่ยนเส้นทาง...",
+ "workspace.lite.promo.otherMethods": "วิธีการชำระเงินอื่นๆ",
+ "workspace.lite.promo.selectMethod": "เลือกวิธีการชำระเงิน",
+
+ "workspace.referral.copyLink": "คัดลอกลิงก์",
+ "workspace.referral.copied": "คัดลอกแล้ว",
+ "workspace.referral.overview.title": "ชวนเพื่อน",
+ "workspace.referral.overview.subtitle": "รับ $5 เมื่อเพื่อนสมัครสมาชิก เพื่อนก็จะได้รับ $5 เช่นกัน",
+ "workspace.referral.instructions.share": "แชร์ลิงก์แนะนำของคุณ",
+ "workspace.referral.instructions.subscribe": "เพื่อนของคุณเข้าร่วมและสมัครสมาชิก Go",
+ "workspace.referral.instructions.claim": "คุณทั้งคู่จะได้รับเครดิตการใช้งาน $5 เพื่อใช้กับขีดจำกัดการใช้งาน Go",
+ "workspace.referral.rewards.title": "รางวัลการแนะนำ",
+ "workspace.referral.rewards.description": "ใช้เครดิตการแนะนำที่มีอยู่กับการใช้งาน Go ของคุณ",
+ "workspace.referral.rewards.subtitle": "ใช้แล้ว {{applied}} / {{total}} รางวัล",
+ "workspace.referral.rewards.empty": "ยังไม่มีรางวัลการแนะนำ",
+ "workspace.referral.table.reward": "รางวัล",
+ "workspace.referral.table.referral": "คำอธิบาย",
+ "workspace.referral.table.date": "วันที่",
+ "workspace.referral.reward.description.inviter": "เชิญ {{email}}",
+ "workspace.referral.reward.description.invitee": "ได้รับเชิญจาก {{email}}",
+ "workspace.referral.reward.action.subscribeUnlock": "สมัครสมาชิกเพื่อปลดล็อก",
+ "workspace.referral.reward.action.view": "ดูรางวัล",
+ "workspace.referral.reward.action.applied": "ใช้รางวัลแล้ว",
+ "workspace.referral.reward.source.pendingInviter": "รอเพื่อนสมัครสมาชิก",
+ "workspace.referral.reward.source.pendingInvitee": "สมัครสมาชิกเพื่อปลดล็อกรางวัล",
+ "workspace.referral.reward.source.available": "รางวัลพร้อมใช้งาน",
+ "workspace.referral.reward.source.applied": "ใช้รางวัลแล้ว",
+ "workspace.referral.reward.status.applied": "ใช้รางวัลแล้ว",
+ "workspace.referral.reward.status.pendingInviter": "สมัครสมาชิกเพื่อปลดล็อก",
+ "workspace.referral.reward.status.pendingInvitee": "สมัครสมาชิกเพื่อปลดล็อก",
+ "workspace.referral.apply.noGo": "สมัครสมาชิกเพื่อปลดล็อก",
+ "workspace.referral.apply.preview": "ดูรางวัล",
+ "workspace.referral.apply.action": "ใช้",
+ "workspace.referral.apply.confirmTitle": "ใช้รางวัล",
+ "workspace.referral.apply.confirmBody": "ใช้ {{amount}} เพื่อลดการใช้งานปัจจุบันของ workspace นี้",
+ "workspace.referral.apply.confirmAction": "ใช้",
+
+ "download.title": "OpenCode | ดาวน์โหลด",
+ "download.meta.description": "ดาวน์โหลด OpenCode สำหรับ macOS, Windows และ Linux",
+ "download.hero.title": "ดาวน์โหลด OpenCode",
+ "download.hero.subtitle": "พร้อมใช้งานในเวอร์ชันเบต้าสำหรับ macOS, Windows และ Linux",
+ "download.hero.button": "ดาวน์โหลดสำหรับ {{os}}",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "ส่วนขยาย OpenCode",
+ "download.section.integrations": "การเชื่อมต่อ OpenCode",
+ "download.action.download": "ดาวน์โหลด",
+ "download.action.install": "ติดตั้ง",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "ไม่จำเป็นเสมอไป แต่อาจจะต้องมี คุณจะต้องมีการสมัครสมาชิก AI หากต้องการเชื่อมต่อ OpenCode กับผู้ให้บริการที่มีค่าใช้จ่าย แม้ว่าคุณจะสามารถทำงานกับ",
+ "download.faq.a3.localLink": "โมเดล Local",
+ "download.faq.a3.afterLocal.beforeZen": "ได้ฟรี แม้ว่าเราจะแนะนำให้ผู้ใช้ใช้งาน",
+ "download.faq.a3.afterZen": ", OpenCode ก็ทำงานร่วมกับผู้ให้บริการยอดนิยมทั้งหมด เช่น OpenAI, Anthropic, xAI เป็นต้น",
+
+ "download.faq.a5.p1": "OpenCode ใช้งานได้ฟรี 100%",
+ "download.faq.a5.p2.beforeZen":
+ "ค่าใช้จ่ายเพิ่มเติมใดๆ จะมาจากการสมัครสมาชิกของคุณกับผู้ให้บริการโมเดล แม้ว่า OpenCode จะทำงานร่วมกับผู้ให้บริการโมเดลใดก็ได้ แต่เราแนะนำให้ใช้",
+ "download.faq.a5.p2.afterZen": "",
+
+ "download.faq.a6.p1": "ข้อมูลของคุณจะถูกจัดเก็บเฉพาะเมื่อคุณสร้างลิงก์ที่แชร์ได้ใน OpenCode เท่านั้น",
+ "download.faq.a6.p2.beforeShare": "เรียนรู้เพิ่มเติมเกี่ยวกับ",
+ "download.faq.a6.shareLink": "หน้าแชร์",
+
+ "enterprise.title": "OpenCode | โซลูชันระดับองค์กรสำหรับองค์กรของคุณ",
+ "enterprise.meta.description": "ติดต่อ OpenCode สำหรับโซลูชันระดับองค์กร",
+ "enterprise.hero.title": "โค้ดของคุณเป็นของคุณ",
+ "enterprise.hero.body1":
+ "OpenCode ทำงานอย่างปลอดภัยภายในองค์กรของคุณ โดยไม่มีการจัดเก็บข้อมูลหรือบริบท และไม่มีข้อจำกัดด้านไลเซนส์หรือการอ้างสิทธิ์ความเป็นเจ้าของ เริ่มทดลองใช้งานกับทีมของคุณ แล้วนำไปใช้งานทั่วทั้งองค์กรโดยการผสานรวมกับ SSO และ AI gateway ภายในของคุณ",
+ "enterprise.hero.body2": "บอกเราว่าเราจะช่วยได้อย่างไร",
+ "enterprise.form.name.label": "ชื่อ-นามสกุล",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "ตำแหน่ง",
+ "enterprise.form.role.placeholder": "ประธานกรรมการบริหาร",
+ "enterprise.form.company.label": "บริษัท",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "อีเมลบริษัท",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "หมายเลขโทรศัพท์",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "คุณกำลังพยายามแก้ปัญหาอะไร?",
+ "enterprise.form.message.placeholder": "เราต้องการความช่วยเหลือเรื่อง...",
+ "enterprise.form.send": "ส่ง",
+ "enterprise.form.sending": "กำลังส่ง...",
+ "enterprise.form.success": "ส่งข้อความแล้ว เราจะติดต่อกลับเร็วๆ นี้",
+ "enterprise.form.success.submitted": "ส่งแบบฟอร์มสำเร็จแล้ว",
+ "enterprise.form.error.allFieldsRequired": "จำเป็นต้องกรอกทุกช่อง",
+ "enterprise.form.error.invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง",
+ "enterprise.form.error.internalServer": "เกิดข้อผิดพลาดภายในเซิร์ฟเวอร์",
+ "enterprise.faq.title": "คำถามที่พบบ่อย",
+ "enterprise.faq.q1": "OpenCode Enterprise คืออะไร?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise สำหรับองค์กรที่ต้องการให้มั่นใจว่าโค้ดและข้อมูลจะไม่ออกนอกโครงสร้างพื้นฐานของตน ทำได้โดยใช้การตั้งค่าแบบศูนย์กลางที่ผสานรวมกับ SSO และ AI gateway ภายในของคุณ",
+ "enterprise.faq.q2": "จะเริ่มต้นกับ OpenCode Enterprise ได้อย่างไร?",
+ "enterprise.faq.a2":
+ "เพียงเริ่มจากการทดลองใช้งานภายในกับทีมของคุณ โดยค่าเริ่มต้น OpenCode ไม่จัดเก็บโค้ดหรือข้อมูลบริบทของคุณ ทำให้เริ่มต้นได้ง่าย จากนั้นติดต่อเราเพื่อพูดคุยเรื่องราคาและตัวเลือกการติดตั้งใช้งาน",
+ "enterprise.faq.q3": "ราคาสำหรับองค์กรคิดอย่างไร?",
+ "enterprise.faq.a3":
+ "เราเสนอราคาแบบต่อที่นั่ง (per-seat) หากคุณมี LLM gateway ของคุณเอง เราจะไม่คิดค่าบริการตามโทเค็นที่ใช้ สำหรับรายละเอียดเพิ่มเติม โปรดติดต่อเราเพื่อขอใบเสนอราคาตามความต้องการขององค์กรของคุณ",
+ "enterprise.faq.q4": "ข้อมูลของฉันปลอดภัยกับ OpenCode Enterprise หรือไม่?",
+ "enterprise.faq.a4":
+ "ใช่ OpenCode ไม่จัดเก็บโค้ดหรือข้อมูลบริบทของคุณ การประมวลผลทั้งหมดเกิดขึ้นในเครื่องหรือผ่านการเรียก API โดยตรงไปยังผู้ให้บริการ AI ของคุณ ด้วยการตั้งค่าแบบศูนย์กลางและการผสานรวม SSO ข้อมูลของคุณจะยังคงปลอดภัยอยู่ภายในโครงสร้างพื้นฐานขององค์กร",
+
+ "brand.title": "OpenCode | แบรนด์",
+ "brand.meta.description": "แนวทางการใช้แบรนด์ OpenCode",
+ "brand.heading": "แนวทางการใช้แบรนด์",
+ "brand.subtitle": "ทรัพยากรและแอสเซทเพื่อช่วยให้คุณใช้งานแบรนด์ OpenCode",
+ "brand.downloadAll": "ดาวน์โหลดแอสเซททั้งหมด",
+
+ "changelog.title": "OpenCode | บันทึกการเปลี่ยนแปลง",
+ "changelog.meta.description": "บันทึกการออกรุ่นและบันทึกการเปลี่ยนแปลง OpenCode",
+ "changelog.hero.title": "บันทึกการเปลี่ยนแปลง",
+ "changelog.hero.subtitle": "การอัปเดตและการปรับปรุงใหม่ใน OpenCode",
+ "changelog.empty": "ไม่พบรายการบันทึกการเปลี่ยนแปลง",
+ "changelog.viewJson": "ดู JSON",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarks",
+ "bench.list.table.agent": "เอเจนต์",
+ "bench.list.table.model": "โมเดล",
+ "bench.list.table.score": "คะแนน",
+ "bench.submission.error.allFieldsRequired": "จำเป็นต้องกรอกทุกช่อง",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "ไม่พบงาน",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "เอเจนต์",
+ "bench.detail.labels.model": "โมเดล",
+ "bench.detail.labels.task": "งาน",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "จาก",
+ "bench.detail.labels.to": "ถึง",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "ระยะเวลาเฉลี่ย",
+ "bench.detail.labels.averageScore": "คะแนนเฉลี่ย",
+ "bench.detail.labels.averageCost": "ค่าใช้จ่ายเฉลี่ย",
+ "bench.detail.labels.summary": "สรุป",
+ "bench.detail.labels.runs": "Runs",
+ "bench.detail.labels.score": "คะแนน",
+ "bench.detail.labels.base": "ฐาน",
+ "bench.detail.labels.penalty": "บทลงโทษ",
+ "bench.detail.labels.weight": "น้ำหนัก",
+ "bench.detail.table.run": "Run",
+ "bench.detail.table.score": "คะแนน (ฐาน - บทลงโทษ)",
+ "bench.detail.table.cost": "ค่าใช้จ่าย",
+ "bench.detail.table.duration": "ระยะเวลา",
+ "bench.detail.run.title": "Run {{n}}",
+ "bench.detail.rawJson": "Raw JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/tr.ts b/packages/console/app/src/i18n/tr.ts
new file mode 100644
index 0000000..c5f2c65
--- /dev/null
+++ b/packages/console/app/src/i18n/tr.ts
@@ -0,0 +1,827 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Dokümantasyon",
+ "nav.changelog": "Değişiklik günlüğü",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Kurumsal",
+ "nav.zen": "Zen",
+ "nav.login": "Giriş",
+ "nav.free": "İndir",
+ "nav.home": "Ana sayfa",
+ "nav.openMenu": "Menüyü aç",
+ "nav.getStartedFree": "Ücretsiz başla",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Logoyu SVG olarak kopyala",
+ "nav.context.copyWordmark": "Wordmark'ı SVG olarak kopyala",
+ "nav.context.brandAssets": "Marka varlıkları",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Dokümantasyon",
+ "footer.changelog": "Değişiklik günlüğü",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Marka",
+ "legal.privacy": "Gizlilik",
+ "legal.terms": "Koşullar",
+
+ "email.title": "Yeni ürünler yayınladığımızda ilk siz haberdar olun",
+ "email.subtitle": "Erken erişim için bekleme listesine katılın.",
+ "email.placeholder": "E-posta adresi",
+ "email.subscribe": "Abone ol",
+ "email.success": "Neredeyse bitti, gelen kutunuzu kontrol edin ve e-postanızı onaylayın",
+
+ "notFound.title": "Bulunamadı | opencode",
+ "notFound.heading": "404 - Sayfa bulunamadı",
+ "notFound.home": "Ana sayfa",
+ "notFound.docs": "Dokümantasyon",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode açık logo",
+ "notFound.logoDarkAlt": "opencode koyu logo",
+
+ "user.logout": "Çıkış",
+
+ "auth.callback.error.codeMissing": "Yetkilendirme kodu bulunamadı.",
+
+ "workspace.select": "Çalışma alanı seç",
+ "workspace.createNew": "+ Yeni çalışma alanı oluştur",
+ "workspace.modal.title": "Yeni çalışma alanı oluştur",
+ "workspace.modal.placeholder": "Çalışma alanı adını girin",
+
+ "common.cancel": "İptal",
+ "common.creating": "Oluşturuluyor...",
+ "common.create": "Oluştur",
+
+ "common.videoUnsupported": "Tarayıcınız video etiketini desteklemiyor.",
+ "common.figure": "Şekil {{n}}.",
+ "common.faq": "SSS",
+ "common.learnMore": "Daha fazla bilgi",
+
+ "error.invalidPlan": "Geçersiz plan",
+ "error.workspaceRequired": "Çalışma alanı kimliği (ID) gerekli",
+ "error.alreadySubscribed": "Bu çalışma alanının zaten bir aboneliği var",
+ "error.limitRequired": "Limit gerekli.",
+ "error.monthlyLimitInvalid": "Geçerli bir aylık limit belirleyin.",
+ "error.workspaceNameRequired": "Çalışma alanı adı gerekli.",
+ "error.nameTooLong": "İsim 255 karakter veya daha az olmalıdır.",
+ "error.emailRequired": "E-posta gerekli",
+ "error.roleRequired": "Rol gerekli",
+ "error.idRequired": "Kimlik (ID) gerekli",
+ "error.nameRequired": "İsim gerekli",
+ "error.providerRequired": "Sağlayıcı gerekli",
+ "error.apiKeyRequired": "API anahtarı gerekli",
+ "error.modelRequired": "Model gerekli",
+ "error.reloadAmountMin": "Yükleme tutarı en az ${{amount}} olmalıdır",
+ "error.reloadTriggerMin": "Bakiye tetikleyicisi en az ${{amount}} olmalıdır",
+
+ "app.meta.description": "OpenCode - Açık kaynaklı kodlama ajanı.",
+
+ "home.title": "OpenCode | Açık kaynaklı yapay zeka kodlama ajanı",
+
+ "temp.title": "opencode | Terminal için geliştirilmiş yapay zeka kodlama ajanı",
+ "temp.hero.title": "Terminal için geliştirilmiş yapay zeka kodlama ajanı",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Başlayın",
+ "temp.feature.native.title": "Yerel (Native) TUI",
+ "temp.feature.native.body": "Duyarlı, yerel, temalandırılabilir bir terminal arayüzü",
+ "temp.feature.zen.beforeLink": "opencode tarafından sağlanan ",
+ "temp.feature.zen.link": "seçkin modeller listesi",
+ "temp.feature.zen.afterLink": "",
+ "temp.feature.models.beforeLink": "Yerel modeller dahil 75+ LLM sağlayıcısını ",
+ "temp.feature.models.afterLink": " üzerinden destekler",
+ "temp.screenshot.caption": "opencode TUI ve tokyonight teması",
+ "temp.screenshot.alt": "tokyonight temalı opencode TUI",
+ "temp.logoLightAlt": "opencode açık logo",
+ "temp.logoDarkAlt": "opencode koyu logo",
+
+ "home.banner.badge": "Yeni",
+ "home.banner.text": "Masaüstü uygulaması beta olarak mevcut",
+ "home.banner.platforms": "macOS, Windows ve Linux'ta",
+ "home.banner.downloadNow": "Şimdi indir",
+ "home.banner.downloadBetaNow": "Masaüstü betayı şimdi indir",
+
+ "home.hero.title": "Açık kaynaklı yapay zeka kodlama ajanı",
+ "home.hero.subtitle.a": "Ücretsiz modeller dahil veya herhangi bir sağlayıcıdan herhangi bir modeli bağlayın,",
+ "home.hero.subtitle.b": "Claude, GPT, Gemini ve daha fazlası dahil.",
+
+ "home.install.ariaLabel": "Kurulum seçenekleri",
+
+ "home.what.title": "OpenCode nedir?",
+ "home.what.body":
+ "OpenCode, terminalinizde, IDE'nizde veya masaüstünde kod yazmanıza yardım eden açık kaynaklı bir ajandır.",
+ "home.what.lsp.title": "LSP etkin",
+ "home.what.lsp.body": "LLM için doğru LSP'leri otomatik olarak yükler",
+ "home.what.multiSession.title": "Çoklu oturum",
+ "home.what.multiSession.body": "Aynı projede birden fazla ajanı paralel çalıştırın",
+ "home.what.shareLinks.title": "Paylaşım bağlantıları",
+ "home.what.shareLinks.body": "Referans veya hata ayıklama için herhangi bir oturumu bağlantı olarak paylaşın",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Copilot hesabınızı kullanmak için GitHub ile giriş yapın",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "ChatGPT Plus veya Pro hesabınızı kullanmak için OpenAI ile giriş yapın",
+ "home.what.anyModel.title": "Herhangi bir model",
+ "home.what.anyModel.body": "Models.dev üzerinden 75+ LLM sağlayıcısı, yerel modeller dahil",
+ "home.what.anyEditor.title": "Herhangi bir editör",
+ "home.what.anyEditor.body": "Terminal arayüzü, masaüstü uygulaması ve IDE uzantısı olarak kullanılabilir",
+ "home.what.readDocs": "Dokümanları oku",
+
+ "home.growth.title": "Açık kaynaklı yapay zeka kodlama ajanı",
+ "home.growth.body":
+ "GitHub'da {{stars}} + yıldız, {{contributors}} katılımcı ve {{commits}} + commit ile OpenCode, her ay {{monthlyUsers}} + geliştirici tarafından kullanılıyor ve güveniliyor.",
+ "home.growth.githubStars": "GitHub Yıldızları",
+ "home.growth.contributors": "Katılımcılar",
+ "home.growth.monthlyDevs": "Aylık Geliştiriciler",
+
+ "home.privacy.title": "Gizlilik öncelikli tasarlandı",
+ "home.privacy.body":
+ "OpenCode kodunuzu veya bağlam verilerinizi saklamaz; bu sayede gizliliğe duyarlı ortamlarda çalışabilir.",
+ "home.privacy.learnMore": "Hakkında daha fazla bilgi:",
+ "home.privacy.link": "gizlilik",
+
+ "home.faq.q1": "OpenCode nedir?",
+ "home.faq.a1":
+ "OpenCode, herhangi bir AI modeliyle kod yazmanıza ve çalıştırmanıza yardım eden açık kaynaklı bir ajandır. Terminal arayüzü, masaüstü uygulaması veya IDE uzantısı olarak kullanılabilir.",
+ "home.faq.q2": "OpenCode'u nasıl kullanırım?",
+ "home.faq.a2.before": "Başlamanın en kolay yolu",
+ "home.faq.a2.link": "girişi okumaktır",
+ "home.faq.q3": "OpenCode için ek AI aboneliklerine ihtiyacım var mı?",
+ "home.faq.a3.p1": "Şart değil. OpenCode, hesap açmadan kullanabileceğiniz ücretsiz modellerle gelir.",
+ "home.faq.a3.p2.beforeZen": "Bunun dışında, popüler kodlama modellerini kullanmak için bir",
+ "home.faq.a3.p2.afterZen": " hesabı oluşturabilirsiniz.",
+ "home.faq.a3.p3": "Zen'i öneriyoruz, ancak OpenCode OpenAI, Anthropic, xAI gibi popüler sağlayıcılarla da çalışır.",
+ "home.faq.a3.p4.beforeLocal": "Hatta",
+ "home.faq.a3.p4.localLink": "yerel modellerinizi bağlayabilirsiniz",
+ "home.faq.q4": "Mevcut AI aboneliklerimi OpenCode ile kullanabilir miyim?",
+ "home.faq.a4.p1":
+ "Evet. OpenCode tüm büyük sağlayıcıların aboneliklerini destekler. Claude Pro/Max, ChatGPT Plus/Pro veya GitHub Copilot kullanabilirsiniz.",
+ "home.faq.q5": "OpenCode'u sadece terminalde mi kullanabilirim?",
+ "home.faq.a5.beforeDesktop": "Artık hayır! OpenCode artık sizin bu cihazlarınıza",
+ "home.faq.a5.desktop": "masaüstü",
+ "home.faq.a5.and": "ve",
+ "home.faq.a5.web": "web",
+ "home.faq.q6": "OpenCode ne kadar?",
+ "home.faq.a6":
+ "OpenCode %100 ücretsizdir. Ayrıca ücretsiz model setiyle gelir. Başka bir sağlayıcı bağlarsanız ek maliyetler olabilir.",
+ "home.faq.q7": "Veri ve gizlilik ne olacak?",
+ "home.faq.a7.p1":
+ "Verileriniz yalnızca ücretsiz modellerimizi kullandığınızda veya paylaşılabilir bağlantılar oluşturduğunuzda saklanır.",
+ "home.faq.a7.p2.beforeModels": "Daha fazla bilgi:",
+ "home.faq.a7.p2.modelsLink": "modellerimiz",
+ "home.faq.a7.p2.and": "ve",
+ "home.faq.a7.p2.shareLink": "paylaşım sayfaları",
+ "home.faq.q8": "OpenCode açık kaynak mı?",
+ "home.faq.a8.p1": "Evet, OpenCode tamamen açık kaynaktır. Kaynak kodu",
+ "home.faq.a8.p2": "'da",
+ "home.faq.a8.mitLicense": "MIT Lisansı",
+ "home.faq.a8.p3":
+ "altında herkese açıktır, yani herkes kullanabilir, değiştirebilir veya geliştirmeye katkıda bulunabilir. Topluluktan herkes issue açabilir, pull request gönderebilir ve işlevselliği genişletebilir.",
+
+ "home.zenCta.title": "Kodlama ajanları için güvenilir, optimize modeller",
+ "home.zenCta.body":
+ "Zen, OpenCode'un kodlama ajanları için özel olarak test edip benchmark ettiği seçilmiş AI modellerine erişim sağlar. Sağlayıcılar arasında tutarsız performans ve kalite konusunda endişelenmeyin; çalışan, doğrulanmış modelleri kullanın.",
+ "home.zenCta.link": "Zen hakkında",
+
+ "zen.title": "OpenCode Zen | Kodlama ajanları için güvenilir, optimize edilmiş modellerin seçilmiş seti",
+ "zen.hero.title": "Kodlama ajanları için güvenilir, optimize modeller",
+ "zen.hero.body":
+ "Zen, OpenCode'un kodlama ajanları için özel olarak test edip benchmark ettiği seçilmiş AI modellerine erişim sağlar. Sağlayıcılar arasında tutarsız performans ve kalite konusunda endişelenmeyin; çalışan, doğrulanmış modelleri kullanın.",
+
+ "zen.faq.q1": "OpenCode Zen nedir?",
+ "zen.faq.a1":
+ "Zen, OpenCode ekibi tarafından oluşturulan ve kodlama ajanları için test edilip benchmark edilen seçilmiş bir AI model setidir.",
+ "zen.faq.q2": "Zen'i daha doğru yapan nedir?",
+ "zen.faq.a2":
+ "Zen yalnızca kodlama ajanları için özel olarak test edilip benchmark edilmiş modelleri sunar. Biftek kesmek için tereyağı bıçağı kullanmazsın; kodlama için kötü modeller kullanma.",
+ "zen.faq.q3": "Zen daha ucuz mu?",
+ "zen.faq.a3":
+ "Zen kâr amaçlı değildir. Zen, model sağlayıcılarının maliyetlerini size yansıtır. Zen'in kullanımı arttıkça OpenCode daha iyi fiyatlar pazarlayabilir ve bunları size yansıtabilir.",
+ "zen.faq.q4": "Zen ne kadar?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "istek başı ücret alır",
+ "zen.faq.a4.p1.afterPricing":
+ "ve hiçbir markup eklemez, yani model sağlayıcının ücretlendirdiği tutarı aynen ödersiniz.",
+ "zen.faq.a4.p2.beforeAccount": "Toplam maliyetiniz kullanım miktarına bağlıdır ve aylık harcama limitlerini",
+ "zen.faq.a4.p2.accountLink": "hesabınızda ayarlayabilirsiniz",
+ "zen.faq.a4.p3":
+ "Maliyetleri karşılamak için OpenCode, $20 bakiye yüklemesi başına yalnızca $1.23 tutarında küçük bir ödeme işleme ücreti ekler.",
+ "zen.faq.q5": "Veri ve gizlilik ne olacak?",
+ "zen.faq.a5.beforeExceptions":
+ "Tüm Zen modelleri ABD'de barındırılır. Sağlayıcılar sıfır-retention politikasını uygular ve verilerinizi model eğitimi için kullanmaz; şu",
+ "zen.faq.a5.exceptionsLink": "istisnalarla",
+ "zen.faq.q6": "Harcama limitleri ayarlayabilir miyim?",
+ "zen.faq.a6": "Evet, hesabınızda aylık harcama limitleri ayarlayabilirsiniz.",
+ "zen.faq.q7": "İptal edebilir miyim?",
+ "zen.faq.a7":
+ "Evet, istediğiniz zaman faturalandırmayı devre dışı bırakabilir ve kalan bakiyenizi kullanabilirsiniz.",
+ "zen.faq.q8": "Zen'i diğer kodlama ajanlarıyla kullanabilir miyim?",
+ "zen.faq.a8":
+ "Zen OpenCode ile harika çalışır, ama Zen'i herhangi bir ajan ile kullanabilirsiniz. Tercih ettiğiniz kodlama ajanında kurulum talimatlarını izleyin.",
+
+ "zen.cta.start": "Zen'i kullanmaya başlayın",
+ "zen.pricing.title": "20$ Kullandıkça öde bakiyesi ekle",
+ "zen.pricing.fee": "(+1,23$ kart işlem ücreti)",
+ "zen.pricing.body":
+ "Herhangi bir ajan ile kullanın. Aylık harcama limitlerini belirleyin. İstediğiniz zaman iptal edin.",
+ "zen.problem.title": "Zen hangi sorunu çözüyor?",
+ "zen.problem.body":
+ "Pek çok model mevcut ancak yalnızca birkaçı kodlama ajanlarıyla iyi çalışıyor. Çoğu sağlayıcı, bunları değişen sonuçlarla farklı şekilde yapılandırır.",
+ "zen.problem.subtitle": "Bu sorunu yalnızca OpenCode kullanıcıları için değil, herkes için düzeltiyoruz.",
+ "zen.problem.item1": "Seçilen modelleri test etme ve ekiplerine danışmanlık yapma",
+ "zen.problem.item2": "Düzgün bir şekilde teslim edildiklerinden emin olmak için sağlayıcılarla çalışmak",
+ "zen.problem.item3": "Önerdiğimiz tüm model-sağlayıcı kombinasyonlarının karşılaştırılması",
+ "zen.how.title": "Zen nasıl çalışır?",
+ "zen.how.body": "Zen'i OpenCode ile kullanmanızı önersek de, Zen'i herhangi bir ajan ile kullanabilirsiniz.",
+ "zen.how.step1.title": "Kaydolun ve 20$ bakiye ekleyin",
+ "zen.how.step1.beforeLink": "takip edin",
+ "zen.how.step1.link": "kurulum talimatları",
+ "zen.how.step2.title": "Şeffaf fiyatlandırmayla Zen kullanın",
+ "zen.how.step2.link": "istek başına ödeme",
+ "zen.how.step2.afterLink": "sıfır işaretlemeyle",
+ "zen.how.step3.title": "Otomatik yükleme",
+ "zen.how.step3.body": "bakiyeniz 5$'a ulaştığında otomatik olarak 20$ ekleyeceğiz",
+ "zen.privacy.title": "Gizliliğiniz bizim için önemlidir",
+ "zen.privacy.beforeExceptions":
+ "Tüm Zen modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu",
+ "zen.privacy.exceptionsLink": "aşağıdaki istisnalar",
+
+ "go.title": "OpenCode Go | Herkes için düşük maliyetli kodlama modelleri",
+ "go.meta.description":
+ "Go ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar; GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro ve DeepSeek V4 Flash için cömert 5 saatlik istek limitleri sunar.",
+ "go.hero.title": "Herkes için düşük maliyetli kodlama modelleri",
+ "go.hero.body":
+ "Go, dünya çapındaki programcılara ajan tabanlı kodlama getiriyor. En yetenekli açık kaynaklı modellere cömert limitler ve güvenilir erişim sunarak, maliyet veya erişilebilirlik konusunda endişelenmeden güçlü ajanlarla geliştirme yapmanızı sağlar.",
+
+ "go.cta.start": "Go'ya abone ol",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Go'ya abone ol",
+ "go.cta.price": "Ayda 10$",
+ "go.cta.promo": "İlk ay $5",
+ "go.pricing.body":
+ "Herhangi bir ajanla kullanın. İlk ay $5, sonrasında ayda 10$. Gerekirse kredi yükleyin. İstediğiniz zaman iptal edin.",
+ "go.graph.free": "Ücretsiz",
+ "go.graph.freePill": "Big Pickle ve ücretsiz modeller",
+ "go.graph.go": "Go",
+ "go.graph.label": "5 saat başına istekler",
+ "go.graph.usageLimits": "Kullanım limitleri",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "5 saatlik istekler: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "Eski CEO, Terminal Ürünleri",
+ "go.testimonials.dax.quoteAfter": "hayat değiştirdi, gerçekten düşünmeye bile gerek yok.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "Eski Kurucu, SEED, PM, Melt, Pop, Dapt, Cadmus ve ViewPoint",
+ "go.testimonials.jay.quoteBefore": "Ekibimizdeki 5 kişiden 4'ü",
+ "go.testimonials.jay.quoteAfter": "kullanmayı seviyor.",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "Eski Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "",
+ "go.testimonials.adam.quoteAfter": "için tavsiyem sonsuz. Cidden, gerçekten çok iyi.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "Eski Tasarım Başkanı, Laravel",
+ "go.testimonials.david.quoteBefore": "",
+ "go.testimonials.david.quoteAfter":
+ " ile modellerin test edildiğini ve kodlama ajanları için mükemmel olduğunu biliyorum.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "Eski Stajyer, Nvidia (4 kez)",
+ "go.testimonials.frank.quote": "Keşke hala Nvidia'da olsaydım.",
+ "go.problem.title": "Go hangi sorunu çözüyor?",
+ "go.problem.body":
+ "OpenCode deneyimini mümkün olduğunca çok kişiye ulaştırmaya odaklandık. OpenCode Go düşük maliyetli bir aboneliktir: İlk ay $5, sonrasında ayda 10$. Cömert limitler ve en yetenekli açık kaynak modellere güvenilir erişim sağlar.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Düşük maliyetli abonelik fiyatlandırması",
+ "go.problem.item2": "Cömert limitler ve güvenilir erişim",
+ "go.problem.item3": "Mümkün olduğunca çok programcı için geliştirildi",
+ "go.problem.item4":
+ "GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro ve DeepSeek V4 Flash içerir",
+ "go.how.title": "Go nasıl çalışır?",
+ "go.how.body":
+ "Go ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar. OpenCode veya herhangi bir ajanla kullanabilirsiniz.",
+ "go.how.step1.title": "Bir hesap oluşturun",
+ "go.how.step1.beforeLink": "takip edin",
+ "go.how.step1.link": "kurulum talimatları",
+ "go.how.step2.title": "Go'ya abone olun",
+ "go.how.step2.link": "İlk ay $5",
+ "go.how.step2.afterLink": "sonrasında cömert limitlerle ayda 10$",
+ "go.how.step3.title": "Kodlamaya başlayın",
+ "go.how.step3.body": "açık kaynaklı modellere güvenilir erişimle",
+ "go.privacy.title": "Gizliliğiniz bizim için önemlidir",
+ "go.privacy.body":
+ "Bu plan öncelikle uluslararası kullanıcılar için tasarlanmış olup, istikrarlı küresel erişim için modeller ABD, AB ve Singapur'da barındırılmaktadır.",
+ "go.privacy.contactAfter": "herhangi bir sorunuz varsa.",
+ "go.privacy.beforeExceptions":
+ "Go modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu",
+ "go.privacy.exceptionsLink": "aşağıdaki istisnalar",
+ "go.faq.q1": "OpenCode Go nedir?",
+ "go.faq.a1":
+ "Go, ajan tabanlı kodlama için yetenekli açık kaynaklı modellere güvenilir erişim sağlayan düşük maliyetli bir aboneliktir.",
+ "go.faq.q2": "Go hangi modelleri içerir?",
+ "go.faq.a2": "Go, aşağıda listelenen modelleri cömert limitler ve güvenilir erişimle sunar.",
+ "go.faq.q3": "Go, Zen ile aynı mı?",
+ "go.faq.a3":
+ "Hayır. Zen kullandıkça öde modelidir, Go ise ilk ay $5, sonrasında ayda 10$ fiyatıyla başlar; GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro ve DeepSeek V4 Flash açık kaynak modellerine cömert limitler ve güvenilir erişim sunar.",
+ "go.faq.q4": "Go ne kadar?",
+ "go.faq.a4.p1.beforePricing": "Go'nun maliyeti",
+ "go.faq.a4.p1.pricingLink": "İlk ay $5",
+ "go.faq.a4.p1.afterPricing": "sonrasında cömert limitlerle ayda 10$.",
+ "go.faq.a4.p2.beforeAccount": "Aboneliğinizi",
+ "go.faq.a4.p2.accountLink": "hesabınızdan",
+ "go.faq.a4.p3": "yönetebilirsiniz. İstediğiniz zaman iptal edin.",
+ "go.faq.q5": "Veri ve gizlilik ne olacak?",
+ "go.faq.a5.body":
+ "Bu plan öncelikle uluslararası kullanıcılar için tasarlanmış olup, istikrarlı küresel erişim için modeller ABD, AB ve Singapur'da barındırılmaktadır. Sağlayıcılarımız sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz.",
+ "go.faq.a5.beforeExceptions":
+ "Go modelleri ABD'de barındırılmaktadır. Sağlayıcılar sıfır saklama politikası izler ve verilerinizi model eğitimi için kullanmaz; şu",
+ "go.faq.a5.exceptionsLink": "aşağıdaki istisnalar",
+ "go.faq.q6": "Kredi yükleyebilir miyim?",
+ "go.faq.a6": "Daha fazla kullanıma ihtiyacınız varsa, hesabınıza kredi yükleyebilirsiniz.",
+ "go.faq.q7": "İptal edebilir miyim?",
+ "go.faq.a7": "Evet, istediğiniz zaman iptal edebilirsiniz.",
+ "go.faq.q8": "Go'yu diğer kodlama ajanlarıyla kullanabilir miyim?",
+ "go.faq.a8":
+ "Evet, Go'yu herhangi bir ajanla kullanabilirsiniz. Tercih ettiğiniz kodlama ajanındaki kurulum talimatlarını izleyin.",
+
+ "go.faq.q9": "Ücretsiz modeller ve Go arasındaki fark nedir?",
+ "go.faq.a9":
+ "Ücretsiz modeller, günlük 200 istek kotası ile Big Pickle ve o sırada mevcut olan promosyonel modelleri içerir. Go ise GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro ve DeepSeek V4 Flash modellerini; yuvarlanan pencereler (5 saatlik, haftalık ve aylık) üzerinden uygulanan daha yüksek istek kotalarıyla içerir. Bu kotalar kabaca her 5 saatte 12$, haftada 30$ ve ayda 60$ değerine eşdeğerdir (gerçek istek sayıları modele ve kullanıma göre değişir).",
+
+ "zen.api.error.rateLimitExceeded": "İstek limiti aşıldı. Lütfen daha sonra tekrar deneyin.",
+ "zen.api.error.modelNotSupported": "{{model}} modeli desteklenmiyor",
+ "zen.api.error.modelFormatNotSupported": "{{model}} modeli {{format}} formatı için desteklenmiyor",
+ "zen.api.error.noProviderAvailable": "Kullanılabilir sağlayıcı yok",
+ "zen.api.error.providerNotSupported": "{{provider}} sağlayıcısı desteklenmiyor",
+ "zen.api.error.missingApiKey": "API anahtarı eksik.",
+ "zen.api.error.invalidApiKey": "Geçersiz API anahtarı.",
+ "zen.api.error.subscriptionQuotaExceeded": "Abonelik kotası aşıldı. {{retryIn}} içinde tekrar deneyin.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "5 saatlik kullanım limitine ulaşıldı. {{retryIn}} içinde sıfırlanır. Bu modeli şimdi kullanmaya devam etmek için kullanılabilir bakiyenizden kullanımı etkinleştirin: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Haftalık kullanım limitine ulaşıldı. {{retryIn}} içinde sıfırlanır. Bu modeli şimdi kullanmaya devam etmek için kullanılabilir bakiyenizden kullanımı etkinleştirin: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Aylık kullanım limitine ulaşıldı. {{retryIn}} içinde sıfırlanır. Bu modeli şimdi kullanmaya devam etmek için kullanılabilir bakiyenizden kullanımı etkinleştirin: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Ödeme yöntemi bulunamadı. Buradan bir ödeme yöntemi ekleyin: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Yetersiz bakiye. Faturalandırmanızı buradan yönetin: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Çalışma alanınız aylık ${{amount}} harcama limitine ulaştı. Limitlerinizi buradan yönetin: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Aylık ${{amount}} harcama limitinize ulaştınız. Limitlerinizi buradan yönetin: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Model devre dışı",
+ "zen.api.error.trialEnded":
+ "{{model}} için ücretsiz promosyon sona erdi. OpenCode Go'ya abone olarak modeli kullanmaya devam edebilirsiniz - {{link}}",
+
+ "black.meta.title": "OpenCode Black | Dünyanın en iyi kodlama modellerine erişin",
+ "black.meta.description": "OpenCode Black abonelik planlarıyla Claude, GPT, Gemini ve daha fazlasına erişin.",
+ "black.hero.title": "Dünyanın en iyi kodlama modellerine erişin",
+ "black.hero.subtitle": "Claude, GPT, Gemini ve daha fazlası dahil",
+ "black.title": "OpenCode Black | Fiyatlandırma",
+ "black.paused": "Black plan kaydı geçici olarak duraklatıldı.",
+ "black.plan.icon20": "Black 20 planı",
+ "black.plan.icon100": "Black 100 planı",
+ "black.plan.icon200": "Black 200 planı",
+ "black.plan.multiplier100": "Black 20'den 5 kat daha fazla kullanım",
+ "black.plan.multiplier200": "Black 20'den 20 kat daha fazla kullanım",
+ "black.price.perMonth": "aylık",
+ "black.price.perPersonBilledMonthly": "kişi başı aylık faturalandırılır",
+ "black.terms.1": "Aboneliğiniz hemen başlamayacak",
+ "black.terms.2": "Bekleme listesine ekleneceksiniz ve yakında aktive edileceksiniz",
+ "black.terms.3": "Kartınızdan sadece aboneliğiniz aktive edildiğinde ödeme alınacaktır",
+ "black.terms.4": "Kullanım limitleri geçerlidir, yoğun otomatik kullanım limitlere daha erken ulaşabilir",
+ "black.terms.5": "Abonelikler bireyler içindir, ekipler için Enterprise ile iletişime geçin",
+ "black.terms.6": "Limitler ayarlanabilir ve planlar gelecekte sonlandırılabilir",
+ "black.terms.7": "Aboneliğinizi istediğiniz zaman iptal edin",
+ "black.action.continue": "Devam et",
+ "black.finePrint.beforeTerms": "Gösterilen fiyatlara geçerli vergiler dahil değildir",
+ "black.finePrint.terms": "Hizmet Şartları",
+ "black.workspace.title": "OpenCode Black | Çalışma Alanı Seç",
+ "black.workspace.selectPlan": "Bu plan için bir çalışma alanı seçin",
+ "black.workspace.name": "Çalışma Alanı {{n}}",
+ "black.subscribe.title": "OpenCode Black'e Abone Ol",
+ "black.subscribe.paymentMethod": "Ödeme yöntemi",
+ "black.subscribe.loadingPaymentForm": "Ödeme formu yükleniyor...",
+ "black.subscribe.selectWorkspaceToContinue": "Devam etmek için bir çalışma alanı seçin",
+ "black.subscribe.failurePrefix": "Olamaz!",
+ "black.subscribe.error.generic": "Bir hata oluştu",
+ "black.subscribe.error.invalidPlan": "Geçersiz plan",
+ "black.subscribe.error.workspaceRequired": "Çalışma alanı ID'si gerekli",
+ "black.subscribe.error.alreadySubscribed": "Bu çalışma alanının zaten bir aboneliği var",
+ "black.subscribe.processing": "İşleniyor...",
+ "black.subscribe.submit": "${{plan}} Abone Ol",
+ "black.subscribe.form.chargeNotice": "Sadece aboneliğiniz aktive edildiğinde ücretlendirileceksiniz",
+ "black.subscribe.success.title": "OpenCode Black bekleme listesindesiniz",
+ "black.subscribe.success.subscriptionPlan": "Abonelik planı",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Tutar",
+ "black.subscribe.success.amountValue": "Aylık ${{plan}}",
+ "black.subscribe.success.paymentMethod": "Ödeme yöntemi",
+ "black.subscribe.success.dateJoined": "Katılma tarihi",
+ "black.subscribe.success.chargeNotice": "Aboneliğiniz aktive edildiğinde kartınızdan ödeme alınacaktır",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Kullanım",
+ "workspace.nav.apiKeys": "API Anahtarları",
+ "workspace.nav.members": "Üyeler",
+ "workspace.nav.billing": "Faturalandırma",
+ "workspace.nav.settings": "Ayarlar",
+
+ "workspace.home.banner.beforeLink": "Kodlama ajanları için güvenilir optimize edilmiş modeller.",
+ "workspace.lite.banner.beforeLink": "Herkes için düşük maliyetli kodlama modelleri.",
+ "workspace.home.billing.loading": "Yükleniyor...",
+ "workspace.home.billing.enable": "Faturalandırmayı etkinleştir",
+ "workspace.home.billing.currentBalance": "Mevcut bakiye",
+
+ "workspace.newUser.feature.tested.title": "Test Edilmiş ve Doğrulanmış Modeller",
+ "workspace.newUser.feature.tested.body":
+ "En iyi performansı sağlamak için modelleri özellikle kodlama ajanlarına yönelik olarak karşılaştırdık ve test ettik.",
+ "workspace.newUser.feature.quality.title": "En Yüksek Kalite",
+ "workspace.newUser.feature.quality.body":
+ "Optimum performans için yapılandırılmış modellere erişin; sürüm düşürme veya daha ucuz sağlayıcılara yönlendirme yok.",
+ "workspace.newUser.feature.lockin.title": "Kilitlenme Yok",
+ "workspace.newUser.feature.lockin.body":
+ "Zen'i herhangi bir kodlama ajanıyla kullanın ve istediğiniz zaman opencode ile diğer sağlayıcıları kullanmaya devam edin.",
+ "workspace.newUser.copyApiKey": "API anahtarını kopyala",
+ "workspace.newUser.copyKey": "Anahtarı Kopyala",
+ "workspace.newUser.copied": "Kopyalandı!",
+ "workspace.newUser.step.enableBilling": "Faturalandırmayı etkinleştir",
+ "workspace.newUser.step.login.before": "Çalıştır",
+ "workspace.newUser.step.login.after": "ve opencode seçeneğini seçin",
+ "workspace.newUser.step.pasteKey": "API anahtarınızı yapıştırın",
+ "workspace.newUser.step.models.before": "opencode'u başlatın ve çalıştırın",
+ "workspace.newUser.step.models.after": "bir model seçmek için",
+
+ "workspace.models.title": "Modeller",
+ "workspace.models.subtitle.beforeLink": "Çalışma alanı üyelerinin hangi modellere erişebileceğini yönetin.",
+ "workspace.models.table.model": "Model",
+ "workspace.models.table.enabled": "Etkin",
+
+ "workspace.providers.title": "Kendi Anahtarınızı Getirin",
+ "workspace.providers.subtitle": "Yapay zeka sağlayıcılarından kendi API anahtarlarınızı yapılandırın.",
+ "workspace.providers.placeholder": "{{provider}} API anahtarını girin ({{prefix}}...)",
+ "workspace.providers.configure": "Yapılandır",
+ "workspace.providers.edit": "Düzenle",
+ "workspace.providers.delete": "Sil",
+ "workspace.providers.saving": "Kaydediliyor...",
+ "workspace.providers.save": "Kaydet",
+ "workspace.providers.table.provider": "Sağlayıcı",
+ "workspace.providers.table.apiKey": "API Anahtarı",
+
+ "workspace.usage.title": "Kullanım Geçmişi",
+ "workspace.usage.subtitle": "Son API kullanımı ve maliyetleri.",
+ "workspace.usage.empty": "Başlamak için ilk API çağrınızı yapın.",
+ "workspace.usage.table.date": "Tarih",
+ "workspace.usage.table.model": "Model",
+ "workspace.usage.table.input": "Giriş",
+ "workspace.usage.table.output": "Çıkış",
+ "workspace.usage.table.cost": "Maliyet",
+ "workspace.usage.table.session": "Oturum",
+ "workspace.usage.breakdown.input": "Giriş",
+ "workspace.usage.breakdown.cacheRead": "Önbellek Okuması",
+ "workspace.usage.breakdown.cacheWrite": "Önbellek Yazma",
+ "workspace.usage.breakdown.output": "Çıkış",
+ "workspace.usage.breakdown.reasoning": "Muhakeme",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Maliyet",
+ "workspace.cost.subtitle": "Modele göre ayrılmış kullanım maliyetleri.",
+ "workspace.cost.allModels": "Tüm Modeller",
+ "workspace.cost.allKeys": "Tüm Anahtarlar",
+ "workspace.cost.deletedSuffix": "(silindi)",
+ "workspace.cost.empty": "Seçilen döneme ait kullanım verisi yok.",
+ "workspace.cost.subscriptionShort": "abonelik",
+
+ "workspace.keys.title": "API Anahtarları",
+ "workspace.keys.subtitle": "opencode hizmetlerine erişim için API anahtarlarınızı yönetin.",
+ "workspace.keys.create": "API Anahtarı Oluştur",
+ "workspace.keys.placeholder": "Anahtar adını girin",
+ "workspace.keys.empty": "Bir opencode Gateway API anahtarı oluşturun",
+ "workspace.keys.table.name": "İsim",
+ "workspace.keys.table.key": "Anahtar",
+ "workspace.keys.table.createdBy": "Oluşturan",
+ "workspace.keys.table.lastUsed": "Son Kullanılan",
+ "workspace.keys.copyApiKey": "API anahtarını kopyala",
+ "workspace.keys.delete": "Sil",
+
+ "workspace.members.title": "Üyeler",
+ "workspace.members.subtitle": "Çalışma alanı üyelerini ve izinlerini yönetin.",
+ "workspace.members.invite": "Üyeyi Davet Et",
+ "workspace.members.inviting": "Davet ediliyor...",
+ "workspace.members.beta.beforeLink": "Beta süresince çalışma alanları ekipler için ücretsizdir.",
+ "workspace.members.form.invitee": "Davetli",
+ "workspace.members.form.emailPlaceholder": "E-posta girin",
+ "workspace.members.form.role": "Rol",
+ "workspace.members.form.monthlyLimit": "Aylık harcama limiti",
+ "workspace.members.noLimit": "Limit yok",
+ "workspace.members.noLimitLowercase": "limit yok",
+ "workspace.members.invited": "davet edildi",
+ "workspace.members.edit": "Düzenle",
+ "workspace.members.delete": "Sil",
+ "workspace.members.saving": "Kaydediliyor...",
+ "workspace.members.save": "Kaydet",
+ "workspace.members.table.email": "E-posta",
+ "workspace.members.table.role": "Rol",
+ "workspace.members.table.monthLimit": "Ay limiti",
+ "workspace.members.role.admin": "Yönetici",
+ "workspace.members.role.adminDescription": "Modelleri, üyeleri ve faturalamayı yönetebilir",
+ "workspace.members.role.member": "Üye",
+ "workspace.members.role.memberDescription": "Yalnızca kendileri için API anahtarları oluşturabilirler",
+
+ "workspace.settings.title": "Ayarlar",
+ "workspace.settings.subtitle": "Çalışma alanı adınızı ve tercihlerinizi güncelleyin.",
+ "workspace.settings.workspaceName": "Çalışma alanı adı",
+ "workspace.settings.defaultName": "Varsayılan",
+ "workspace.settings.updating": "Güncelleniyor...",
+ "workspace.settings.save": "Kaydet",
+ "workspace.settings.edit": "Düzenle",
+
+ "workspace.billing.title": "Faturalandırma",
+ "workspace.billing.subtitle.beforeLink": "Ödeme yöntemlerini yönetin.",
+ "workspace.billing.contactUs": "Bize Ulaşın",
+ "workspace.billing.subtitle.afterLink": "herhangi bir sorunuz varsa.",
+ "workspace.billing.currentBalance": "Güncel Bakiye",
+ "workspace.billing.add": "$ ekle",
+ "workspace.billing.enterAmount": "Tutarı girin",
+ "workspace.billing.loading": "Yükleniyor...",
+ "workspace.billing.addAction": "Ekle",
+ "workspace.billing.addBalance": "Bakiye Ekle",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Stripe'a bağlı",
+ "workspace.billing.manage": "Yönet",
+ "workspace.billing.enable": "Faturalandırmayı Etkinleştir",
+
+ "workspace.monthlyLimit.title": "Aylık Limit",
+ "workspace.monthlyLimit.subtitle": "Hesabınız için aylık kullanım limiti belirleyin.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Ayarlanıyor...",
+ "workspace.monthlyLimit.set": "Ayarla",
+ "workspace.monthlyLimit.edit": "Limiti Düzenle",
+ "workspace.monthlyLimit.noLimit": "Kullanım limiti belirlenmedi.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Şu anki kullanım",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "$",
+
+ "workspace.redeem.title": "Kupon Kullan",
+ "workspace.redeem.subtitle": "Kredi veya avantajlardan yararlanmak için bir kupon kodu kullanın.",
+ "workspace.redeem.placeholder": "Kupon kodunu girin",
+ "workspace.redeem.redeem": "Kullan",
+ "workspace.redeem.redeeming": "Kullanılıyor...",
+ "workspace.redeem.success": "Kupon başarıyla kullanıldı.",
+
+ "workspace.reload.title": "Otomatik Yeniden Yükleme",
+ "workspace.reload.disabled.before": "Otomatik yeniden yükleme:",
+ "workspace.reload.disabled.state": "devre dışı",
+ "workspace.reload.disabled.after": "Bakiye azaldığında otomatik olarak yeniden yüklemeyi etkinleştirin.",
+ "workspace.reload.enabled.before": "Otomatik yeniden yükleme:",
+ "workspace.reload.enabled.state": "etkin",
+ "workspace.reload.enabled.middle": "Yeniden yükleyeceğiz",
+ "workspace.reload.processingFee": "işlem ücreti",
+ "workspace.reload.enabled.after": "dengeye ulaşıldığında",
+ "workspace.reload.edit": "Düzenle",
+ "workspace.reload.enable": "Etkinleştir",
+ "workspace.reload.enableAutoReload": "Otomatik Yeniden Yüklemeyi Etkinleştir",
+ "workspace.reload.reloadAmount": "Yükle $",
+ "workspace.reload.whenBalanceReaches": "Bakiye $ seviyesine ulaştığında",
+ "workspace.reload.saving": "Kaydediliyor...",
+ "workspace.reload.save": "Kaydet",
+ "workspace.reload.failedAt": "Yeniden yükleme başarısız oldu:",
+ "workspace.reload.reason": "Sebep:",
+ "workspace.reload.updatePaymentMethod": "Lütfen ödeme yönteminizi güncelleyin ve tekrar deneyin.",
+ "workspace.reload.retrying": "Yeniden deneniyor...",
+ "workspace.reload.retry": "Yeniden dene",
+ "workspace.reload.error.paymentFailed": "Ödeme başarısız.",
+
+ "workspace.payments.title": "Ödeme Geçmişi",
+ "workspace.payments.subtitle": "Son ödeme işlemleri.",
+ "workspace.payments.table.date": "Tarih",
+ "workspace.payments.table.paymentId": "Ödeme Kimliği",
+ "workspace.payments.table.amount": "Tutar",
+ "workspace.payments.table.receipt": "Makbuz",
+ "workspace.payments.type.credit": "kredi",
+ "workspace.payments.type.subscription": "abonelik",
+ "workspace.payments.view": "Görüntüle",
+
+ "workspace.black.loading": "Yükleniyor...",
+ "workspace.black.time.day": "gün",
+ "workspace.black.time.days": "gün",
+ "workspace.black.time.hour": "saat",
+ "workspace.black.time.hours": "saat",
+ "workspace.black.time.minute": "dakika",
+ "workspace.black.time.minutes": "dakika",
+ "workspace.black.time.fewSeconds": "birkaç saniye",
+ "workspace.black.subscription.title": "Abonelik",
+ "workspace.black.subscription.message": "Aylık ${{plan}} karşılığında OpenCode Black'e abonesiniz.",
+ "workspace.black.subscription.manage": "Aboneliği Yönet",
+ "workspace.black.subscription.rollingUsage": "5 Saatlik Kullanım",
+ "workspace.black.subscription.weeklyUsage": "Haftalık Kullanım",
+ "workspace.black.subscription.resetsIn": "Sıfırlama süresi",
+ "workspace.black.subscription.useBalance": "Kullanım limitlerine ulaştıktan sonra mevcut bakiyenizi kullanın",
+ "workspace.black.waitlist.title": "Bekleme listesi",
+ "workspace.black.waitlist.joined": "Aylık ${{plan}} OpenCode Black planı için bekleme listesindesiniz.",
+ "workspace.black.waitlist.ready": "Sizi ayda {{plan}} $ tutarındaki OpenCode Black planına kaydetmeye hazırız.",
+ "workspace.black.waitlist.leave": "Bekleme Listesinden Ayrıl",
+ "workspace.black.waitlist.leaving": "Ayrılıyor...",
+ "workspace.black.waitlist.left": "Ayrıldı",
+ "workspace.black.waitlist.enroll": "Kayıt ol",
+ "workspace.black.waitlist.enrolling": "Kaydediliyor...",
+ "workspace.black.waitlist.enrolled": "Kayıtlı",
+ "workspace.black.waitlist.enrollNote":
+ "Kayıt Ol'a tıkladığınızda aboneliğiniz hemen başlar ve kartınızdan çekim yapılır.",
+
+ "workspace.lite.loading": "Yükleniyor...",
+ "workspace.lite.time.day": "gün",
+ "workspace.lite.time.days": "gün",
+ "workspace.lite.time.hour": "saat",
+ "workspace.lite.time.hours": "saat",
+ "workspace.lite.time.minute": "dakika",
+ "workspace.lite.time.minutes": "dakika",
+ "workspace.lite.time.fewSeconds": "birkaç saniye",
+ "workspace.lite.subscription.message": "OpenCode Go abonesisiniz.",
+ "workspace.lite.subscription.manage": "Aboneliği Yönet",
+ "workspace.lite.subscription.rollingUsage": "Devam Eden Kullanım",
+ "workspace.lite.subscription.weeklyUsage": "Haftalık Kullanım",
+ "workspace.lite.subscription.monthlyUsage": "Aylık Kullanım",
+ "workspace.lite.subscription.resetsIn": "Sıfırlama süresi",
+ "workspace.lite.subscription.useBalance": "Kullanım limitlerine ulaştıktan sonra mevcut bakiyenizi kullanın",
+ "workspace.lite.subscription.selectProvider":
+ 'Go modellerini kullanmak için opencode yapılandırmanızda "OpenCode Go"\'yu sağlayıcı olarak seçin.',
+ "workspace.lite.black.message":
+ "Şu anda OpenCode Black abonesisiniz veya bekleme listesindesiniz. Go'ya geçmek istiyorsanız lütfen önce aboneliğinizi iptal edin.",
+ "workspace.lite.other.message":
+ "Bu çalışma alanındaki başka bir üye zaten OpenCode Go abonesi. Çalışma alanı başına yalnızca bir üye abone olabilir.",
+ "workspace.lite.promo.description":
+ "OpenCode Go {{price}} fiyatından başlar, sonrasında ayda 10$ olur ve cömert kullanım limitleriyle popüler açık kodlama modellerine güvenilir erişim sağlar.",
+ "workspace.lite.promo.price": "İlk ay $5",
+ "workspace.lite.promo.modelsTitle": "Neler Dahil",
+ "workspace.lite.promo.footer":
+ "Plan öncelikle uluslararası kullanıcılar için tasarlanmıştır; modeller istikrarlı küresel erişim için ABD, AB ve Singapur'da barındırılmaktadır. Erken kullanımdan öğrendikçe ve geri bildirim topladıkça fiyatlandırma ve kullanım limitleri değişebilir.",
+ "workspace.lite.promo.subscribe": "Go'ya Abone Ol",
+ "workspace.lite.promo.subscribing": "Yönlendiriliyor...",
+ "workspace.lite.promo.otherMethods": "Diğer ödeme yöntemleri",
+ "workspace.lite.promo.selectMethod": "Ödeme yöntemini seçin",
+
+ "workspace.referral.copyLink": "Bağlantıyı Kopyala",
+ "workspace.referral.copied": "Kopyalandı",
+ "workspace.referral.overview.title": "Arkadaşlarını davet et",
+ "workspace.referral.overview.subtitle": "Bir arkadaşın abone olduğunda $5 kazan. O da $5 alacak.",
+ "workspace.referral.instructions.share": "Referans bağlantını paylaş",
+ "workspace.referral.instructions.subscribe": "Arkadaşın katılır ve Go'ya abone olur",
+ "workspace.referral.instructions.claim":
+ "İkiniz de Go kullanım limitlerinize uygulamak için $5 kullanım kredisi alırsınız",
+ "workspace.referral.rewards.title": "Davet ödülleri",
+ "workspace.referral.rewards.description": "Mevcut davet kredilerini Go kullanımınıza uygulayın.",
+ "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} ödül kullanıldı.",
+ "workspace.referral.rewards.empty": "Henüz davet ödülü yok.",
+ "workspace.referral.table.reward": "Ödül",
+ "workspace.referral.table.referral": "Açıklama",
+ "workspace.referral.table.date": "Tarih",
+ "workspace.referral.reward.description.inviter": "{{email}} davet edildi",
+ "workspace.referral.reward.description.invitee": "{{email}} tarafından davet edildi",
+ "workspace.referral.reward.action.subscribeUnlock": "Kilidi açmak için abone ol",
+ "workspace.referral.reward.action.view": "Ödülü Görüntüle",
+ "workspace.referral.reward.action.applied": "Ödül Kullanıldı",
+ "workspace.referral.reward.source.pendingInviter": "Abone olması bekleniyor",
+ "workspace.referral.reward.source.pendingInvitee": "Ödülün kilidini açmak için abone ol",
+ "workspace.referral.reward.source.available": "Ödül kullanıma hazır",
+ "workspace.referral.reward.source.applied": "Ödül kullanıldı",
+ "workspace.referral.reward.status.applied": "Ödül Kullanıldı",
+ "workspace.referral.reward.status.pendingInviter": "Kilidi açmak için abone ol",
+ "workspace.referral.reward.status.pendingInvitee": "Kilidi açmak için abone ol",
+ "workspace.referral.apply.noGo": "Kilidi açmak için abone ol",
+ "workspace.referral.apply.preview": "Ödülü Görüntüle",
+ "workspace.referral.apply.action": "Kullan",
+ "workspace.referral.apply.confirmTitle": "Ödülü kullan",
+ "workspace.referral.apply.confirmBody": "Bu workspace'in mevcut kullanımını azaltmak için {{amount}} kullan.",
+ "workspace.referral.apply.confirmAction": "Kullan",
+
+ "download.title": "OpenCode | İndir",
+ "download.meta.description": "OpenCode'u macOS, Windows ve Linux için indirin",
+ "download.hero.title": "OpenCode'u İndir",
+ "download.hero.subtitle": "macOS, Windows ve Linux için Beta olarak sunuluyor",
+ "download.hero.button": "{{os}} için indir",
+ "download.section.terminal": "OpenCode Terminal",
+ "download.section.desktop": "OpenCode Desktop (Beta)",
+ "download.section.extensions": "OpenCode Eklentileri",
+ "download.section.integrations": "OpenCode Entegrasyonları",
+ "download.action.download": "İndir",
+ "download.action.install": "Kur",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Tam olarak değil, ama muhtemelen. OpenCode'u ücretli bir sağlayıcıya bağlamak istiyorsanız bir AI aboneliği gerekir, ancak",
+ "download.faq.a3.localLink": "yerel modeller",
+ "download.faq.a3.afterLocal.beforeZen": "ile ücretsiz çalışabilirsiniz. Kullanıcıları",
+ "download.faq.a3.afterZen":
+ " kullanmaya teşvik ediyoruz, ancak OpenCode OpenAI, Anthropic, xAI vb. gibi tüm popüler sağlayıcılarla çalışır.",
+
+ "download.faq.a5.p1": "OpenCode %100 ücretsizdir.",
+ "download.faq.a5.p2.beforeZen":
+ "Ek maliyetler, bir model sağlayıcısına olan aboneliğinizden gelir. OpenCode herhangi bir model sağlayıcısıyla çalışır, ancak",
+ "download.faq.a5.p2.afterZen": " kullanmanızı öneririz.",
+
+ "download.faq.a6.p1":
+ "Verileriniz ve bilginiz yalnızca OpenCode'da paylaşılabilir bağlantılar oluşturduğunuzda saklanır.",
+ "download.faq.a6.p2.beforeShare": "Daha fazla bilgi:",
+ "download.faq.a6.shareLink": "paylaşım sayfaları",
+
+ "enterprise.title": "OpenCode | Kurumunuz için kurumsal çözümler",
+ "enterprise.meta.description": "Kurumsal çözümler için OpenCode ile iletişime geçin",
+ "enterprise.hero.title": "Kodunuz size aittir",
+ "enterprise.hero.body1":
+ "OpenCode, hiçbir veri veya bağlam saklamadan ve lisans kısıtlamaları ya da sahiplik iddiaları olmadan kuruluşunuzun içinde güvenli şekilde çalışır. Ekibinizle bir deneme başlatın, ardından SSO'nuz ve dahili AI geçidiniz ile entegre ederek tüm kuruluşunuzda devreye alın.",
+ "enterprise.hero.body2": "Nasıl yardımcı olabileceğimizi bize söyleyin.",
+ "enterprise.form.name.label": "Ad soyad",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "Rol",
+ "enterprise.form.role.placeholder": "Yönetim Kurulu Başkanı",
+ "enterprise.form.company.label": "Şirket",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Şirket e-postası",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Telefon numarası",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Hangi problemi çözmeye çalışıyorsunuz?",
+ "enterprise.form.message.placeholder": "Şu konuda yardıma ihtiyacımız var...",
+ "enterprise.form.send": "Gönder",
+ "enterprise.form.sending": "Gönderiliyor...",
+ "enterprise.form.success": "Mesaj gönderildi, yakında size dönüş yapacağız.",
+ "enterprise.form.success.submitted": "Form başarıyla gönderildi.",
+ "enterprise.form.error.allFieldsRequired": "Tüm alanlar gereklidir.",
+ "enterprise.form.error.invalidEmailFormat": "Geçersiz e-posta formatı.",
+ "enterprise.form.error.internalServer": "İç sunucu hatası.",
+ "enterprise.faq.title": "SSS",
+ "enterprise.faq.q1": "OpenCode Enterprise nedir?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise, kodunuzun ve verilerinizin asla altyapınızı terk etmemesini sağlamak isteyen kurumlar içindir. Bunu, SSO'nuz ve dahili AI geçidiniz ile entegre olan merkezileştirilmiş bir konfigürasyonla sağlar.",
+ "enterprise.faq.q2": "OpenCode Enterprise'a nasıl başlarım?",
+ "enterprise.faq.a2":
+ "Ekibinizle dahili bir deneme ile başlayın. OpenCode varsayılan olarak kodunuzu veya bağlam verilerinizi saklamaz, bu da başlamayı kolaylaştırır. Ardından fiyatlandırma ve uygulama seçeneklerini görüşmek için bize ulaşın.",
+ "enterprise.faq.q3": "Kurumsal fiyatlandırma nasıl çalışır?",
+ "enterprise.faq.a3":
+ "Kullanıcı başı (per-seat) kurumsal fiyatlandırma sunuyoruz. Kendi LLM geçidiniz varsa, kullanılan tokenlar için ücret almıyoruz. Daha fazla bilgi için, kurumunuzun ihtiyaçlarına göre özel bir teklif için bize ulaşın.",
+ "enterprise.faq.q4": "OpenCode Enterprise ile verilerim güvende mi?",
+ "enterprise.faq.a4":
+ "Evet. OpenCode kodunuzu veya bağlam verilerinizi saklamaz. Tüm işleme yerel olarak ya da AI sağlayıcınıza doğrudan API çağrıları ile gerçekleştirilir. Merkezileştirilmiş konfigürasyon ve SSO entegrasyonu ile verileriniz kurumunuzun altyapısı içinde güvende kalır.",
+
+ "brand.title": "OpenCode | Marka",
+ "brand.meta.description": "OpenCode marka kılavuzu",
+ "brand.heading": "Marka kılavuzu",
+ "brand.subtitle": "OpenCode markası ile çalışmanıza yardımcı olacak kaynaklar ve varlıklar.",
+ "brand.downloadAll": "Tüm varlıkları indir",
+
+ "changelog.title": "OpenCode | Değişiklik günlüğü",
+ "changelog.meta.description": "OpenCode sürüm notları ve değişiklik günlüğü",
+ "changelog.hero.title": "Değişiklik günlüğü",
+ "changelog.hero.subtitle": "OpenCode için yeni güncellemeler ve iyileştirmeler",
+ "changelog.empty": "Değişiklik günlüğü kaydı bulunamadı.",
+ "changelog.viewJson": "JSON'u görüntüle",
+
+ "bench.list.title": "Benchmark",
+ "bench.list.heading": "Benchmarklar",
+ "bench.list.table.agent": "Ajan",
+ "bench.list.table.model": "Model",
+ "bench.list.table.score": "Puan",
+ "bench.submission.error.allFieldsRequired": "Tüm alanlar gereklidir.",
+
+ "bench.detail.title": "Benchmark - {{task}}",
+ "bench.detail.notFound": "Görev bulunamadı",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "Ajan",
+ "bench.detail.labels.model": "Model",
+ "bench.detail.labels.task": "Görev",
+ "bench.detail.labels.repo": "Repo",
+ "bench.detail.labels.from": "Başlangıç",
+ "bench.detail.labels.to": "Bitiş",
+ "bench.detail.labels.prompt": "İstem",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "Ortalama Süre",
+ "bench.detail.labels.averageScore": "Ortalama Puan",
+ "bench.detail.labels.averageCost": "Ortalama Maliyet",
+ "bench.detail.labels.summary": "Özet",
+ "bench.detail.labels.runs": "Çalıştırmalar",
+ "bench.detail.labels.score": "Puan",
+ "bench.detail.labels.base": "Baz",
+ "bench.detail.labels.penalty": "Ceza",
+ "bench.detail.labels.weight": "ağırlık",
+ "bench.detail.table.run": "Çalıştırma",
+ "bench.detail.table.score": "Puan (Baz - Ceza)",
+ "bench.detail.table.cost": "Maliyet",
+ "bench.detail.table.duration": "Süre",
+ "bench.detail.run.title": "Çalıştırma {{n}}",
+ "bench.detail.rawJson": "Ham JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/uk.ts b/packages/console/app/src/i18n/uk.ts
new file mode 100644
index 0000000..fc0efb3
--- /dev/null
+++ b/packages/console/app/src/i18n/uk.ts
@@ -0,0 +1,785 @@
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "Документація",
+ "nav.changelog": "Журнал змін",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "Enterprise",
+ "nav.zen": "Zen",
+ "nav.login": "Увійти",
+ "nav.free": "Завантажити",
+ "nav.home": "Головна",
+ "nav.openMenu": "Відкрити меню",
+ "nav.getStartedFree": "Почати безкоштовно",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "Копіювати логотип як SVG",
+ "nav.context.copyWordmark": "Копіювати знак як SVG",
+ "nav.context.brandAssets": "Бренд-матеріали",
+
+ "footer.github": "GitHub",
+ "footer.docs": "Документація",
+ "footer.changelog": "Журнал змін",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "Бренд",
+ "legal.privacy": "Конфіденційність",
+ "legal.terms": "Умови",
+
+ "email.title": "Дізнайтеся першими про нові продукти",
+ "email.subtitle": "Приєднуйтесь до списку очікування для раннього доступу.",
+ "email.placeholder": "Електронна адреса",
+ "email.subscribe": "Підписатися",
+ "email.success": "Майже готово! Перевірте пошту та підтвердьте адресу",
+
+ "notFound.title": "Не знайдено | opencode",
+ "notFound.heading": "404 — Сторінку не знайдено",
+ "notFound.home": "Головна",
+ "notFound.docs": "Документація",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "світлий логотип opencode",
+ "notFound.logoDarkAlt": "темний логотип opencode",
+
+ "user.logout": "Вийти",
+
+ "auth.callback.error.codeMissing": "Не знайдено код авторизації.",
+
+ "workspace.select": "Виберіть робочий простір",
+ "workspace.createNew": "+ Створити новий робочий простір",
+ "workspace.modal.title": "Створити новий робочий простір",
+ "workspace.modal.placeholder": "Введіть назву робочого простору",
+
+ "common.cancel": "Скасувати",
+ "common.creating": "Створення...",
+ "common.create": "Створити",
+ "common.contactUs": "Зв'яжіться з нами",
+
+ "common.videoUnsupported": "Ваш браузер не підтримує відео.",
+ "common.figure": "Рис. {{n}}.",
+ "common.faq": "FAQ",
+ "common.learnMore": "Дізнатися більше",
+
+ "error.invalidPlan": "Недійсний план",
+ "error.workspaceRequired": "ID робочого простору обов'язкове",
+ "error.alreadySubscribed": "Цей робочий простір уже має підписку",
+ "error.limitRequired": "Ліміт обов'язковий.",
+ "error.monthlyLimitInvalid": "Встановіть дійсний місячний ліміт.",
+ "error.workspaceNameRequired": "Назва робочого простору обов'язкова.",
+ "error.nameTooLong": "Назва має містити не більше 255 символів.",
+ "error.emailRequired": "Електронна адреса обов'язкова",
+ "error.roleRequired": "Роль обов'язкова",
+ "error.idRequired": "ID обов'язкове",
+ "error.nameRequired": "Назва обов'язкова",
+ "error.providerRequired": "Провайдер обов'язковий",
+ "error.apiKeyRequired": "Ключ API обов'язковий",
+ "error.modelRequired": "Модель обов'язкова",
+ "error.reloadAmountMin": "Сума поповнення має бути щонайменше ${{amount}}",
+ "error.reloadTriggerMin": "Поріг балансу має бути щонайменше ${{amount}}",
+
+ "app.meta.description": "OpenCode — відкритий агент для програмування.",
+
+ "home.title": "OpenCode | Відкритий AI-агент для кодування",
+
+ "temp.title": "opencode | AI-агент для кодування, створений для термінала",
+ "temp.hero.title": "AI-агент для кодування, створений для термінала",
+ "temp.zen": "opencode zen",
+ "temp.getStarted": "Почати",
+ "temp.feature.native.title": "Рідний TUI",
+ "temp.feature.native.body": "Чуйний, рідний інтерфейс термінала з темами",
+ "temp.feature.zen.beforeLink": "A",
+ "temp.feature.zen.link": "добірка моделей",
+ "temp.feature.zen.afterLink": "від opencode",
+ "temp.feature.models.beforeLink": "Підтримує 75+ LLM-провайдерів через",
+ "temp.feature.models.afterLink": ", включаючи локальні моделі",
+ "temp.screenshot.caption": "OpenCode TUI з темою tokyonight",
+ "temp.screenshot.alt": "OpenCode TUI з темою tokyonight",
+ "temp.logoLightAlt": "світлий логотип opencode",
+ "temp.logoDarkAlt": "темний логотип opencode",
+
+ "home.banner.badge": "Нове",
+ "home.banner.text": "Десктопний застосунок доступний у бета-версії",
+ "home.banner.platforms": "на macOS, Windows та Linux",
+ "home.banner.downloadNow": "Завантажити зараз",
+ "home.banner.downloadBetaNow": "Завантажити бета-версію десктопного застосунку",
+
+ "home.hero.title": "Відкритий AI-агент для кодування",
+ "home.hero.subtitle.a": "Безкоштовні моделі включено або підключіть будь-яку модель від будь-якого провайдера,",
+ "home.hero.subtitle.b": "включно з Claude, GPT, Gemini та іншими.",
+
+ "home.install.ariaLabel": "Параметри встановлення",
+
+ "home.what.title": "Що таке OpenCode?",
+ "home.what.body": "OpenCode — це відкритий агент, який допомагає писати код у терміналі, IDE або на десктопі.",
+ "home.what.lsp.title": "LSP увімкнено",
+ "home.what.lsp.body": "Автоматично завантажує потрібні LSP для LLM",
+ "home.what.multiSession.title": "Багатосесійність",
+ "home.what.multiSession.body": "Запускайте кількох агентів паралельно в одному проекті",
+ "home.what.shareLinks.title": "Посилання для обміну",
+ "home.what.shareLinks.body": "Діліться посиланням на будь-яку сесію для обговорення або налагодження",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "Увійдіть через GitHub, щоб використовувати свій обліковий запис Copilot",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "Увійдіть через OpenAI, щоб використовувати ChatGPT Plus або Pro",
+ "home.what.anyModel.title": "Будь-яка модель",
+ "home.what.anyModel.body": "75+ LLM-провайдерів через Models.dev, включаючи локальні моделі",
+ "home.what.anyEditor.title": "Будь-який редактор",
+ "home.what.anyEditor.body": "Доступний як термінальний інтерфейс, десктопний застосунок та розширення IDE",
+ "home.what.readDocs": "Читати документацію",
+
+ "home.growth.title": "Відкритий AI-агент для кодування",
+ "home.growth.body":
+ "З понад {{stars}} зірками на GitHub, {{contributors}} учасниками та понад {{commits}} комітами, OpenCode використовують понад {{monthlyUsers}} розробників щомісяця.",
+ "home.growth.githubStars": "Зірки GitHub",
+ "home.growth.contributors": "Учасники",
+ "home.growth.monthlyDevs": "Розробників на місяць",
+
+ "home.privacy.title": "Створено для конфіденційності",
+ "home.privacy.body":
+ "OpenCode не зберігає ваш код або контекстні дані, тому може працювати в середовищах з чутливими даними.",
+ "home.privacy.learnMore": "Дізнатися більше про",
+ "home.privacy.link": "конфіденційність",
+
+ "home.faq.q1": "Що таке OpenCode?",
+ "home.faq.a1":
+ "OpenCode — це відкритий агент, який допомагає писати та запускати код з будь-якою AI-моделлю. Доступний як термінальний інтерфейс, десктопний застосунок або розширення IDE.",
+ "home.faq.q2": "Як почати користуватися OpenCode?",
+ "home.faq.a2.before": "Найпростіший спосіб почати — прочитати",
+ "home.faq.a2.link": "вступ",
+ "home.faq.q3": "Чи потрібні додаткові AI-підписки для використання OpenCode?",
+ "home.faq.a3.p1":
+ "Не обов'язково, OpenCode має набір безкоштовних моделей, які можна використовувати без реєстрації.",
+ "home.faq.a3.p2.beforeZen":
+ "Крім цього, ви можете використовувати будь-які популярні моделі, створивши обліковий запис",
+ "home.faq.a3.p2.afterZen": ".",
+ "home.faq.a3.p3":
+ "Хоча ми рекомендуємо Zen, OpenCode також працює з усіма популярними провайдерами, такими як OpenAI, Anthropic, xAI тощо.",
+ "home.faq.a3.p4.beforeLocal": "Ви навіть можете підключити свої",
+ "home.faq.a3.p4.localLink": "локальні моделі",
+ "home.faq.q4": "Чи можу я використовувати свої наявні AI-підписки з OpenCode?",
+ "home.faq.a4.p1":
+ "Так, OpenCode підтримує підписки всіх основних провайдерів. Ви можете використовувати Claude Pro/Max, ChatGPT Plus/Pro або GitHub Copilot.",
+ "home.faq.q5": "Чи можна використовувати OpenCode лише в терміналі?",
+ "home.faq.a5.beforeDesktop": "Вже ні! OpenCode тепер доступний як застосунок для",
+ "home.faq.a5.desktop": "десктопа",
+ "home.faq.a5.and": "та",
+ "home.faq.a5.web": "вебу",
+ "home.faq.q6": "Скільки коштує OpenCode?",
+ "home.faq.a6":
+ "OpenCode є 100% безкоштовним. Він також має набір безкоштовних моделей. Додаткові витрати можливі, якщо ви підключите іншого провайдера.",
+ "home.faq.q7": "А як щодо даних та конфіденційності?",
+ "home.faq.a7.p1":
+ "Ваші дані зберігаються лише тоді, коли ви використовуєте безкоштовні моделі або створюєте посилання для обміну.",
+ "home.faq.a7.p2.beforeModels": "Дізнайтеся більше про",
+ "home.faq.a7.p2.modelsLink": "наші моделі",
+ "home.faq.a7.p2.and": "та",
+ "home.faq.a7.p2.shareLink": "сторінки обміну",
+ "home.faq.q8": "Чи є OpenCode відкритим?",
+ "home.faq.a8.p1": "Так, OpenCode повністю відкритий. Вихідний код доступний публічно на",
+ "home.faq.a8.p2": "під ліцензією",
+ "home.faq.a8.mitLicense": "MIT License",
+ "home.faq.a8.p3":
+ ", тобто кожен може використовувати, змінювати або сприяти його розвитку. Будь-хто зі спільноти може створювати issues, надсилати pull request'и та розширювати функціональність.",
+
+ "home.zenCta.title": "Отримайте доступ до надійних оптимізованих моделей для агентів кодування",
+ "home.zenCta.body":
+ "Zen дає доступ до добірки AI-моделей, які OpenCode протестував спеціально для агентів кодування. Не турбуйтеся про нестабільну якість — використовуйте перевірені моделі.",
+ "home.zenCta.link": "Дізнатися про Zen",
+
+ "zen.title": "OpenCode Zen | Добірка надійних оптимізованих моделей для агентів кодування",
+ "zen.hero.title": "Надійні оптимізовані моделі для агентів кодування",
+ "zen.hero.body":
+ "Zen дає доступ до добірки AI-моделей, які OpenCode протестував спеціально для агентів кодування. Не турбуйтеся про нестабільну якість — використовуйте перевірені моделі.",
+
+ "zen.faq.q1": "Що таке OpenCode Zen?",
+ "zen.faq.a1": "Zen — це добірка AI-моделей, протестованих для агентів кодування, створена командою OpenCode.",
+ "zen.faq.q2": "Чому Zen точніший?",
+ "zen.faq.a2":
+ "Zen надає лише моделі, спеціально протестовані для агентів кодування. Ви ж не використовуєте масло ніж для стейка — не використовуйте погані моделі для кодування.",
+ "zen.faq.q3": "Чи Zen дешевший?",
+ "zen.faq.a3":
+ "Zen не є прибутковим. Zen передає вам вартість від провайдерів моделей. Чим вище використання Zen, тим кращі ціни OpenCode може узгодити та передати вам.",
+ "zen.faq.q4": "Скільки коштує Zen?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "стягує плату за запит",
+ "zen.faq.a4.p1.afterPricing": "без націнок — ви платите рівно стільки, скільки стягує провайдер моделі.",
+ "zen.faq.a4.p2.beforeAccount": "Загальна вартість залежить від використання. Ви можете встановити місячні ліміти в",
+ "zen.faq.a4.p2.accountLink": "обліковому записі",
+ "zen.faq.a4.p3":
+ "Щоб покрити витрати, OpenCode додає лише невелику комісію за обробку платежу в розмірі $1.23 за кожне поповнення балансу $20.",
+ "zen.faq.q5": "А як щодо даних та конфіденційності?",
+ "zen.faq.a5.beforeExceptions":
+ "Усі моделі Zen розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+ "zen.faq.a5.exceptionsLink": "такими винятками",
+ "zen.faq.q6": "Чи можна встановити ліміти витрат?",
+ "zen.faq.a6": "Так, ви можете встановити місячні ліміти витрат в обліковому записі.",
+ "zen.faq.q7": "Чи можна скасувати?",
+ "zen.faq.a7": "Так, ви можете вимкнути оплату в будь-який час і використовувати залишок.",
+ "zen.faq.q8": "Чи можна використовувати Zen з іншими агентами кодування?",
+ "zen.faq.a8":
+ "Хоча Zen чудово працює з OpenCode, ви можете використовувати Zen з будь-яким агентом. Дотримуйтесь інструкцій з налаштування у вашому агенті.",
+
+ "zen.cta.start": "Почати з Zen",
+ "zen.pricing.title": "Додати $20 балансу Pay as you go",
+ "zen.pricing.fee": "(+$1.23 комісія за обробку карти)",
+ "zen.pricing.body": "Використовуйте з будь-яким агентом. Встановлюйте місячні ліміти. Скасуйте в будь-який час.",
+ "zen.problem.title": "Яку проблему вирішує Zen?",
+ "zen.problem.body":
+ "Доступно багато моделей, але лише деякі добре працюють з агентами кодування. Більшість провайдерів налаштовують їх по-різному з різними результатами.",
+ "zen.problem.subtitle": "Ми вирішуємо це для всіх, а не лише для користувачів OpenCode.",
+ "zen.problem.item1": "Тестування вибраних моделей та консультації з їхніми командами",
+ "zen.problem.item2": "Співпраця з провайдерами для забезпечення правильної доставки",
+ "zen.problem.item3": "Бенчмаркінг усіх комбінацій моделей та провайдерів, які ми рекомендуємо",
+ "zen.how.title": "Як працює Zen",
+ "zen.how.body":
+ "Хоча ми пропонуємо використовувати Zen з OpenCode, ви можете використовувати Zen з будь-яким агентом.",
+ "zen.how.step1.title": "Зареєструйтеся та додайте $20 балансу",
+ "zen.how.step1.beforeLink": "дотримуйтесь",
+ "zen.how.step1.link": "інструкцій з налаштування",
+ "zen.how.step2.title": "Використовуйте Zen із прозорими цінами",
+ "zen.how.step2.link": "платіть за запит",
+ "zen.how.step2.afterLink": "без націнок",
+ "zen.how.step3.title": "Автоматичне поповнення",
+ "zen.how.step3.body": "коли баланс досягає $5, ми автоматично додаємо $20",
+ "zen.privacy.title": "Ваша конфіденційність важлива для нас",
+ "zen.privacy.beforeExceptions":
+ "Усі моделі Zen розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+ "zen.privacy.exceptionsLink": "такими винятками",
+
+ "go.title": "OpenCode Go | Недорогі моделі кодування для всіх",
+ "go.meta.description":
+ "Go починається від $5 за перший місяць, потім $10/місяць, з generous 5-годинними лімітами запитів для GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro та DeepSeek V4 Flash.",
+ "go.hero.title": "Недорогі моделі кодування для всіх",
+ "go.hero.body":
+ "Go надає агентне програмування програмістам у всьому світі, пропонуючи щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
+
+ "go.cta.start": "Підписатися на Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "Підписатися на Go",
+ "go.cta.price": "$10/місяць",
+ "go.cta.promo": "$5 перший місяць",
+ "go.pricing.body":
+ "Використовуйте з будь-яким агентом. $5 перший місяць, потім $10/місяць. Поповнюйте за потреби. Скасуйте в будь-який час.",
+ "go.graph.free": "Безкоштовно",
+ "go.graph.freePill": "Big Pickle та безкоштовні моделі",
+ "go.graph.go": "Go",
+ "go.graph.label": "Запитів за 5 годин",
+ "go.graph.usageLimits": "Ліміти використання",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Запитів за 5 год: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "змінило моє життя, це справді очевидний вибір.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 з 5 людей у нашій команді люблять використовувати",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "Я не можу достатньо рекомендувати",
+ "go.testimonials.adam.quoteAfter": ". Серйозно, це дійсно добре.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "Завдяки",
+ "go.testimonials.david.quoteAfter": "я знаю, що всі моделі протестовані та ідеальні для агентів кодування.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
+ "go.testimonials.frank.quote": "Хотів би я досі бути в Nvidia.",
+ "go.problem.title": "Яку проблему вирішує Go?",
+ "go.problem.body":
+ "Ми зосереджені на тому, щоб зробити досвід OpenCode доступним для якомога більшої кількості людей. OpenCode Go — це недорога підписка: $5 за перший місяць, потім $10/місяць. Вона надає щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "Недорога підписка",
+ "go.problem.item2": "Щедрі ліміти та надійний доступ",
+ "go.problem.item3": "Створено для якомога більшої кількості програмістів",
+ "go.problem.item4":
+ "Включає GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro та DeepSeek V4 Flash",
+ "go.how.title": "Як працює Go",
+ "go.how.body":
+ "Go починається від $5 за перший місяць, потім $10/місяць. Використовуйте з OpenCode або будь-яким агентом.",
+ "go.how.step1.title": "Створіть обліковий запис",
+ "go.how.step1.beforeLink": "дотримуйтесь",
+ "go.how.step1.link": "інструкцій з налаштування",
+ "go.how.step2.title": "Підпишіться на Go",
+ "go.how.step2.link": "$5 перший місяць",
+ "go.how.step2.afterLink": "потім $10/місяць із щедрими лімітами",
+ "go.how.step3.title": "Почніть кодувати",
+ "go.how.step3.body": "з надійним доступом до моделей з відкритим кодом",
+ "go.privacy.title": "Ваша конфіденційність важлива для нас",
+ "go.privacy.body":
+ "План розроблений переважно для міжнародних користувачів, з моделями, розміщеними в США, ЄС та Сінгапурі для стабільного глобального доступу.",
+ "go.privacy.contactAfter": "якщо у вас є запитання.",
+ "go.privacy.beforeExceptions":
+ "Моделі Go розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+ "go.privacy.exceptionsLink": "такими винятками",
+ "go.faq.q1": "Що таке OpenCode Go?",
+ "go.faq.a1":
+ "Go — це недорога підписка, яка надає надійний доступ до найкращих моделей з відкритим кодом для агентного кодування.",
+ "go.faq.q2": "Які моделі включає Go?",
+ "go.faq.a2": "Go включає моделі, перелічені нижче, із щедрими лімітами та надійним доступом.",
+ "go.faq.q3": "Чи Go те саме, що Zen?",
+ "go.faq.a3":
+ "Ні. Zen — це плата за використання, тоді як Go починається від $5 за перший місяць, потім $10/місяць, із щедрими лімітами та надійним доступом до моделей з відкритим кодом GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro та DeepSeek V4 Flash.",
+ "go.faq.q4": "Скільки коштує Go?",
+ "go.faq.a4.p1.beforePricing": "Go коштує",
+ "go.faq.a4.p1.pricingLink": "$5 за перший місяць",
+ "go.faq.a4.p1.afterPricing": "потім $10/місяць із щедрими лімітами.",
+ "go.faq.a4.p2.beforeAccount": "Ви можете керувати підпискою в",
+ "go.faq.a4.p2.accountLink": "обліковому записі",
+ "go.faq.a4.p3": "Скасуйте в будь-який час.",
+ "go.faq.q5": "А як щодо даних та конфіденційності?",
+ "go.faq.a5.body":
+ "План розроблений переважно для міжнародних користувачів, з моделями в США, ЄС та Сінгапурі. Провайдери дотримуються політики нульового зберігання.",
+ "go.faq.a5.beforeExceptions":
+ "Моделі Go розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+ "go.faq.a5.exceptionsLink": "такими винятками",
+ "go.faq.q6": "Чи можна поповнити баланс?",
+ "go.faq.a6": "Якщо вам потрібно більше використання, ви можете поповнити баланс в обліковому записі.",
+ "go.faq.q7": "Чи можна скасувати?",
+ "go.faq.a7": "Так, ви можете скасувати в будь-який час.",
+ "go.faq.q8": "Чи можна використовувати Go з іншими агентами кодування?",
+ "go.faq.a8": "Так, ви можете використовувати Go з будь-яким агентом.",
+
+ "go.faq.q9": "Яка різниця між безкоштовними моделями та Go?",
+ "go.faq.a9":
+ "Безкоштовні моделі включають Big Pickle та акційні моделі з лімітом 200 запитів/день. Go включає GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro та DeepSeek V4 Flash із вищими лімітами.",
+
+ "zen.api.error.rateLimitExceeded": "Перевищено ліміт запитів. Спробуйте пізніше.",
+ "zen.api.error.modelNotSupported": "Модель {{model}} не підтримується",
+ "zen.api.error.modelFormatNotSupported": "Модель {{model}} не підтримується для формату {{format}}",
+ "zen.api.error.noProviderAvailable": "Немає доступного провайдера",
+ "zen.api.error.providerNotSupported": "Провайдер {{provider}} не підтримується",
+ "zen.api.error.missingApiKey": "Відсутній ключ API.",
+ "zen.api.error.invalidApiKey": "Недійсний ключ API.",
+ "zen.api.error.subscriptionQuotaExceeded": "Перевищено квоту підписки. Повторіть через {{retryIn}}.",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "Досягнуто 5-годинного ліміту використання. Скидається через {{retryIn}}. Щоб продовжити, увімкніть використання з доступного балансу: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "Досягнуто тижневого ліміту використання. Скидається через {{retryIn}}. Щоб продовжити, увімкніть використання з доступного балансу: {{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "Досягнуто місячного ліміту використання. Скидається через {{retryIn}}. Щоб продовжити, увімкніть використання з доступного балансу: {{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "Немає способу оплати. Додайте метод оплати: {{billingUrl}}",
+ "zen.api.error.insufficientBalance": "Недостатньо коштів. Керуйте оплатою: {{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "Ваш робочий простір досяг місячного ліміту витрат ${{amount}}. Керуйте лімітами: {{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached":
+ "Ви досягли місячного ліміту витрат ${{amount}}. Керуйте лімітами: {{membersUrl}}",
+ "zen.api.error.modelDisabled": "Модель вимкнено",
+ "zen.api.error.trialEnded":
+ "Безкоштовна акція для {{model}} закінчилася. Ви можете продовжити використання, підписавшись на OpenCode Go — {{link}}",
+
+ "black.meta.title": "OpenCode Black | Доступ до найкращих моделей кодування",
+ "black.meta.description": "Отримайте доступ до Claude, GPT, Gemini та інших із планами підписки OpenCode Black.",
+ "black.hero.title": "Доступ до найкращих моделей кодування",
+ "black.hero.subtitle": "Включаючи Claude, GPT, Gemini та інші",
+ "black.title": "OpenCode Black | Ціни",
+ "black.paused": "Реєстрація в план Black тимчасово призупинена.",
+ "black.plan.icon20": "План Black 20",
+ "black.plan.icon100": "План Black 100",
+ "black.plan.icon200": "План Black 200",
+ "black.plan.multiplier100": "5x більше використання ніж Black 20",
+ "black.plan.multiplier200": "20x більше використання ніж Black 20",
+ "black.price.perMonth": "на місяць",
+ "black.price.perPersonBilledMonthly": "за особу з щомісячною оплатою",
+ "black.terms.1": "Ваша підписка не розпочнеться негайно",
+ "black.terms.2": "Вас додадуть до списку очікування та активують незабаром",
+ "black.terms.3": "Картку буде списано лише після активації підписки",
+ "black.terms.4": "Діють ліміти використання, інтенсивне автоматичне використання може швидше вичерпати ліміти",
+ "black.terms.5": "Підписки призначені для фізичних осіб, зверніться в Enterprise для команд",
+ "black.terms.6": "Ліміти можуть бути змінені, а плани можуть бути припинені в майбутньому",
+ "black.terms.7": "Скасуйте підписку в будь-який час",
+ "black.action.continue": "Продовжити",
+ "black.finePrint.beforeTerms": "Зазначені ціни не включають податки",
+ "black.finePrint.terms": "Умови надання послуг",
+ "black.workspace.title": "OpenCode Black | Виберіть робочий простір",
+ "black.workspace.selectPlan": "Виберіть робочий простір для цього плану",
+ "black.workspace.name": "Робочий простір {{n}}",
+ "black.subscribe.title": "Підписатися на OpenCode Black",
+ "black.subscribe.paymentMethod": "Спосіб оплати",
+ "black.subscribe.loadingPaymentForm": "Завантаження форми оплати...",
+ "black.subscribe.selectWorkspaceToContinue": "Виберіть робочий простір для продовження",
+ "black.subscribe.failurePrefix": "Ой!",
+ "black.subscribe.error.generic": "Сталася помилка",
+ "black.subscribe.error.invalidPlan": "Недійсний план",
+ "black.subscribe.error.workspaceRequired": "ID робочого простору обов'язкове",
+ "black.subscribe.error.alreadySubscribed": "Цей робочий простір уже має підписку",
+ "black.subscribe.processing": "Обробка...",
+ "black.subscribe.submit": "Підписатися ${{plan}}",
+ "black.subscribe.form.chargeNotice": "Платіж буде списано лише після активації підписки",
+ "black.subscribe.success.title": "Ви в списку очікування OpenCode Black",
+ "black.subscribe.success.subscriptionPlan": "План підписки",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "Сума",
+ "black.subscribe.success.amountValue": "${{plan}} на місяць",
+ "black.subscribe.success.paymentMethod": "Спосіб оплати",
+ "black.subscribe.success.dateJoined": "Дата приєднання",
+ "black.subscribe.success.chargeNotice": "Вашу картку буде списано після активації підписки",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "Використання",
+ "workspace.nav.apiKeys": "Ключі API",
+ "workspace.nav.members": "Учасники",
+ "workspace.nav.billing": "Оплата",
+ "workspace.nav.settings": "Налаштування",
+
+ "workspace.home.banner.beforeLink": "Надійні оптимізовані моделі для агентів кодування.",
+ "workspace.lite.banner.beforeLink": "Недорогі моделі кодування для всіх.",
+ "workspace.home.billing.loading": "Завантаження...",
+ "workspace.home.billing.enable": "Увімкнути оплату",
+ "workspace.home.billing.currentBalance": "Поточний баланс",
+
+ "workspace.newUser.feature.tested.title": "Протестовані та перевірені моделі",
+ "workspace.newUser.feature.tested.body":
+ "Ми протестували моделі спеціально для агентів кодування, щоб забезпечити найкращу продуктивність.",
+ "workspace.newUser.feature.quality.title": "Найвища якість",
+ "workspace.newUser.feature.quality.body":
+ "Доступ до моделей, налаштованих для оптимальної продуктивності — без зниження якості.",
+ "workspace.newUser.feature.lockin.title": "Без блокування (Lock-in)",
+ "workspace.newUser.feature.lockin.body":
+ "Використовуйте Zen з будь-яким агентом і продовжуйте користуватися іншими провайдерами.",
+ "workspace.newUser.copyApiKey": "Копіювати ключ API",
+ "workspace.newUser.copyKey": "Копіювати ключ",
+ "workspace.newUser.copied": "Скопійовано!",
+ "workspace.newUser.step.enableBilling": "Увімкнути оплату",
+ "workspace.newUser.step.login.before": "Запустіть",
+ "workspace.newUser.step.login.after": "і виберіть opencode",
+ "workspace.newUser.step.pasteKey": "Вставте ключ API",
+ "workspace.newUser.step.models.before": "Запустіть opencode і виконайте",
+ "workspace.newUser.step.models.after": "щоб вибрати модель",
+
+ "workspace.models.title": "Моделі",
+ "workspace.models.subtitle.beforeLink": "Керуйте доступом учасників до моделей.",
+ "workspace.models.table.model": "Модель",
+ "workspace.models.table.enabled": "Увімкнено",
+
+ "workspace.providers.title": "Принесіть власний ключ (BYOK)",
+ "workspace.providers.subtitle": "Налаштуйте власні ключі API від AI-провайдерів.",
+ "workspace.providers.placeholder": "Введіть ключ API {{provider}} ({{prefix}}...)",
+ "workspace.providers.configure": "Налаштувати",
+ "workspace.providers.edit": "Редагувати",
+ "workspace.providers.delete": "Видалити",
+ "workspace.providers.saving": "Збереження...",
+ "workspace.providers.save": "Зберегти",
+ "workspace.providers.table.provider": "Провайдер",
+ "workspace.providers.table.apiKey": "Ключ API",
+
+ "workspace.usage.title": "Історія використання",
+ "workspace.usage.subtitle": "Останнє використання API та витрати.",
+ "workspace.usage.empty": "Зробіть перший API-запит, щоб почати.",
+ "workspace.usage.table.date": "Дата",
+ "workspace.usage.table.model": "Модель",
+ "workspace.usage.table.input": "Вхід",
+ "workspace.usage.table.output": "Вихід",
+ "workspace.usage.table.cost": "Вартість",
+ "workspace.usage.table.session": "Сесія",
+ "workspace.usage.breakdown.input": "Вхід",
+ "workspace.usage.breakdown.cacheRead": "Читання кешу",
+ "workspace.usage.breakdown.cacheWrite": "Запис кешу",
+ "workspace.usage.breakdown.output": "Вихід",
+ "workspace.usage.breakdown.reasoning": "Міркування",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "Вартість",
+ "workspace.cost.subtitle": "Витрати в розрізі моделей.",
+ "workspace.cost.allModels": "Усі моделі",
+ "workspace.cost.allKeys": "Усі ключі",
+ "workspace.cost.deletedSuffix": "(видалено)",
+ "workspace.cost.empty": "Немає даних про використання за вибраний період.",
+ "workspace.cost.subscriptionShort": "підп",
+
+ "workspace.keys.title": "Ключі API",
+ "workspace.keys.subtitle": "Керуйте ключами API для доступу до сервісів opencode.",
+ "workspace.keys.create": "Створити ключ API",
+ "workspace.keys.placeholder": "Введіть назву ключа",
+ "workspace.keys.empty": "Створіть ключ API шлюзу opencode",
+ "workspace.keys.table.name": "Назва",
+ "workspace.keys.table.key": "Ключ",
+ "workspace.keys.table.createdBy": "Створено",
+ "workspace.keys.table.lastUsed": "Останнє використання",
+ "workspace.keys.copyApiKey": "Копіювати ключ API",
+ "workspace.keys.delete": "Видалити",
+
+ "workspace.members.title": "Учасники",
+ "workspace.members.subtitle": "Керуйте учасниками робочого простору та їхніми дозволами.",
+ "workspace.members.invite": "Запросити учасника",
+ "workspace.members.inviting": "Запрошення...",
+ "workspace.members.beta.beforeLink": "Робочі простори безкоштовні для команд під час бета-версії.",
+ "workspace.members.form.invitee": "Запрошений",
+ "workspace.members.form.emailPlaceholder": "Введіть email",
+ "workspace.members.form.role": "Роль",
+ "workspace.members.form.monthlyLimit": "Місячний ліміт витрат",
+ "workspace.members.noLimit": "Без ліміту",
+ "workspace.members.noLimitLowercase": "без ліміту",
+ "workspace.members.invited": "запрошено",
+ "workspace.members.edit": "Редагувати",
+ "workspace.members.delete": "Видалити",
+ "workspace.members.saving": "Збереження...",
+ "workspace.members.save": "Зберегти",
+ "workspace.members.table.email": "Email",
+ "workspace.members.table.role": "Роль",
+ "workspace.members.table.monthLimit": "Ліміт на місяць",
+ "workspace.members.role.admin": "Адміністратор",
+ "workspace.members.role.adminDescription": "Може керувати моделями, учасниками та оплатою",
+ "workspace.members.role.member": "Учасник",
+ "workspace.members.role.memberDescription": "Може створювати ключі API лише для себе",
+
+ "workspace.settings.title": "Налаштування",
+ "workspace.settings.subtitle": "Оновіть назву робочого простору та налаштування.",
+ "workspace.settings.workspaceName": "Назва робочого простору",
+ "workspace.settings.defaultName": "Стандартна",
+ "workspace.settings.updating": "Оновлення...",
+ "workspace.settings.save": "Зберегти",
+ "workspace.settings.edit": "Редагувати",
+
+ "workspace.billing.title": "Оплата",
+ "workspace.billing.subtitle.beforeLink": "Керуйте способами оплати.",
+ "workspace.billing.contactUs": "Зв'яжіться з нами",
+ "workspace.billing.subtitle.afterLink": "якщо у вас є запитання.",
+ "workspace.billing.currentBalance": "Поточний баланс",
+ "workspace.billing.add": "Додати $",
+ "workspace.billing.enterAmount": "Введіть суму",
+ "workspace.billing.loading": "Завантаження...",
+ "workspace.billing.addAction": "Додати",
+ "workspace.billing.addBalance": "Поповнити баланс",
+ "workspace.billing.alipay": "Alipay",
+ "workspace.billing.wechat": "WeChat Pay",
+ "workspace.billing.linkedToStripe": "Підключено до Stripe",
+ "workspace.billing.manage": "Керувати",
+ "workspace.billing.enable": "Увімкнути оплату",
+
+ "workspace.monthlyLimit.title": "Місячний ліміт",
+ "workspace.monthlyLimit.subtitle": "Встановіть місячний ліміт використання для облікового запису.",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "Встановлення...",
+ "workspace.monthlyLimit.set": "Встановити",
+ "workspace.monthlyLimit.edit": "Редагувати ліміт",
+ "workspace.monthlyLimit.noLimit": "Ліміт використання не встановлено.",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "Поточне використання за",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "становить $",
+
+ "workspace.redeem.title": "Активувати купон",
+ "workspace.redeem.subtitle": "Активуйте код купона для отримання коштів або бонусів.",
+ "workspace.redeem.placeholder": "Введіть код купона",
+ "workspace.redeem.redeem": "Активувати",
+ "workspace.redeem.redeeming": "Активація...",
+ "workspace.redeem.success": "Купон успішно активовано.",
+
+ "workspace.reload.title": "Автоматичне поповнення",
+ "workspace.reload.disabled.before": "Автоматичне поповнення",
+ "workspace.reload.disabled.state": "вимкнено",
+ "workspace.reload.disabled.after": "Увімкніть для автоматичного поповнення при низькому балансі.",
+ "workspace.reload.enabled.before": "Автоматичне поповнення",
+ "workspace.reload.enabled.state": "увімкнено",
+ "workspace.reload.enabled.middle": "Ми поповнимо",
+ "workspace.reload.processingFee": "комісія за обробку",
+ "workspace.reload.enabled.after": "коли баланс досягне",
+ "workspace.reload.edit": "Редагувати",
+ "workspace.reload.enable": "Увімкнути",
+ "workspace.reload.enableAutoReload": "Увімкнути автоматичне поповнення",
+ "workspace.reload.reloadAmount": "Поповнити на $",
+ "workspace.reload.whenBalanceReaches": "Коли баланс досягне $",
+ "workspace.reload.saving": "Збереження...",
+ "workspace.reload.save": "Зберегти",
+ "workspace.reload.failedAt": "Поповнення не вдалося о",
+ "workspace.reload.reason": "Причина:",
+ "workspace.reload.updatePaymentMethod": "Оновіть спосіб оплати та спробуйте ще раз.",
+ "workspace.reload.retrying": "Повтор...",
+ "workspace.reload.retry": "Повторити",
+ "workspace.reload.error.paymentFailed": "Платіж не вдався.",
+
+ "workspace.payments.title": "Історія платежів",
+ "workspace.payments.subtitle": "Останні платіжні транзакції.",
+ "workspace.payments.table.date": "Дата",
+ "workspace.payments.table.paymentId": "ID платежу",
+ "workspace.payments.table.amount": "Сума",
+ "workspace.payments.table.receipt": "Квитанція",
+ "workspace.payments.type.credit": "кредит",
+ "workspace.payments.type.subscription": "підписка",
+ "workspace.payments.view": "Переглянути",
+
+ "workspace.black.loading": "Завантаження...",
+ "workspace.black.time.day": "день",
+ "workspace.black.time.days": "дні",
+ "workspace.black.time.hour": "година",
+ "workspace.black.time.hours": "годин(и)",
+ "workspace.black.time.minute": "хвилина",
+ "workspace.black.time.minutes": "хвилин(и)",
+ "workspace.black.time.fewSeconds": "кілька секунд",
+ "workspace.black.subscription.title": "Підписка",
+ "workspace.black.subscription.message": "Ви підписані на OpenCode Black за ${{plan}} на місяць.",
+ "workspace.black.subscription.manage": "Керувати підпискою",
+ "workspace.black.subscription.rollingUsage": "Використання (5 год)",
+ "workspace.black.subscription.weeklyUsage": "Тижневе використання",
+ "workspace.black.subscription.resetsIn": "Скидається через",
+ "workspace.black.subscription.useBalance": "Використовуйте доступний баланс після досягнення лімітів",
+ "workspace.black.waitlist.title": "Список очікування",
+ "workspace.black.waitlist.joined": "Ви в списку очікування на план OpenCode Black за ${{plan}} на місяць.",
+ "workspace.black.waitlist.ready": "Ми готові зареєструвати вас на план OpenCode Black за ${{plan}} на місяць.",
+ "workspace.black.waitlist.leave": "Залишити список очікування",
+ "workspace.black.waitlist.leaving": "Вихід...",
+ "workspace.black.waitlist.left": "Вишли",
+ "workspace.black.waitlist.enroll": "Зареєструватися",
+ "workspace.black.waitlist.enrolling": "Реєстрація...",
+ "workspace.black.waitlist.enrolled": "Зареєстровано",
+ "workspace.black.waitlist.enrollNote":
+ "Після натискання «Зареєструватися» підписка почнеться негайно, а картку буде списано.",
+
+ "workspace.lite.loading": "Завантаження...",
+ "workspace.lite.time.day": "день",
+ "workspace.lite.time.days": "дні",
+ "workspace.lite.time.hour": "година",
+ "workspace.lite.time.hours": "годин(и)",
+ "workspace.lite.time.minute": "хвилина",
+ "workspace.lite.time.minutes": "хвилин(и)",
+ "workspace.lite.time.fewSeconds": "кілька секунд",
+ "workspace.lite.subscription.message": "Ви підписані на OpenCode Go.",
+ "workspace.lite.subscription.manage": "Керувати підпискою",
+ "workspace.lite.subscription.rollingUsage": "Ковзне використання",
+ "workspace.lite.subscription.weeklyUsage": "Тижневе використання",
+ "workspace.lite.subscription.monthlyUsage": "Місячне використання",
+ "workspace.lite.subscription.resetsIn": "Скидається через",
+ "workspace.lite.subscription.useBalance": "Використовуйте доступний баланс після досягнення лімітів",
+ "workspace.lite.subscription.selectProvider": 'Виберіть "OpenCode Go" як провайдера в конфігурації opencode.',
+ "workspace.lite.black.message":
+ "Ви вже підписані на OpenCode Black або в списку очікування. Спочатку скасуйте підписку, якщо хочете перейти на Go.",
+ "workspace.lite.other.message": "Інший учасник цього робочого простору вже підписаний на OpenCode Go.",
+ "workspace.lite.promo.description": "OpenCode Go починається від {{price}}, потім $10/місяць, із щедрими лімітами.",
+ "workspace.lite.promo.price": "$5 за перший місяць",
+ "workspace.lite.promo.modelsTitle": "Що включено",
+ "workspace.lite.promo.footer": "План призначений для міжнародних користувачів. Ціни можуть змінюватися.",
+ "workspace.lite.promo.subscribe": "Підписатися на Go",
+ "workspace.lite.promo.subscribing": "Перенаправлення...",
+ "workspace.lite.promo.otherMethods": "Інші способи оплати",
+ "workspace.lite.promo.selectMethod": "Виберіть спосіб оплати",
+
+ "download.title": "OpenCode | Завантажити",
+ "download.meta.description": "Завантажте OpenCode для macOS, Windows та Linux",
+ "download.hero.title": "Завантажити OpenCode",
+ "download.hero.subtitle": "Доступно в бета-версії для macOS, Windows та Linux",
+ "download.hero.button": "Завантажити для {{os}}",
+ "download.section.terminal": "Термінал OpenCode",
+ "download.section.desktop": "Десктоп OpenCode (Бета)",
+ "download.section.extensions": "Розширення OpenCode",
+ "download.section.integrations": "Інтеграції OpenCode",
+ "download.action.download": "Завантажити",
+ "download.action.install": "Встановити",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "Не обов'язково, але ймовірно. Вам знадобиться AI-підписка, якщо ви хочете підключити платного провайдера, хоча ви можете працювати з",
+ "download.faq.a3.localLink": "локальними моделями",
+ "download.faq.a3.afterLocal.beforeZen": "безкоштовно. Хоча ми рекомендуємо",
+ "download.faq.a3.afterZen":
+ ", OpenCode працює з усіма популярними провайдерами, такими як OpenAI, Anthropic, xAI тощо.",
+
+ "download.faq.a5.p1": "OpenCode є 100% безкоштовним.",
+ "download.faq.a5.p2.beforeZen":
+ "Будь-які додаткові витрати будуть з вашої підписки у провайдера моделі. Ми рекомендуємо",
+ "download.faq.a5.p2.afterZen": ".",
+
+ "download.faq.a6.p1": "Ваші дані зберігаються лише при створенні посилань для обміну в OpenCode.",
+ "download.faq.a6.p2.beforeShare": "Дізнайтеся більше про",
+ "download.faq.a6.shareLink": "сторінки обміну",
+
+ "enterprise.title": "OpenCode | Enterprise-рішення для вашої організації",
+ "enterprise.meta.description": "Зв'яжіться з OpenCode для Enterprise-рішень",
+ "enterprise.hero.title": "Ваш код належить вам",
+ "enterprise.hero.body1":
+ "OpenCode працює безпечно всередині вашої організації без зберігання даних, ліцензійних обмежень. Почніть пробний період із командою, потім розгорніть через SSO та внутрішній AI-шлюз.",
+ "enterprise.hero.body2": "Дайте знати, чим ми можемо допомогти.",
+ "enterprise.form.name.label": "Повне ім'я",
+ "enterprise.form.name.placeholder": "Джеф Безос",
+ "enterprise.form.role.label": "Посада",
+ "enterprise.form.role.placeholder": "Голова правління",
+ "enterprise.form.company.label": "Компанія",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "Робоча електронна адреса",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "Номер телефону",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "Яку проблему ви намагаєтеся вирішити?",
+ "enterprise.form.message.placeholder": "Нам потрібна допомога з...",
+ "enterprise.form.send": "Надіслати",
+ "enterprise.form.sending": "Надсилання...",
+ "enterprise.form.success": "Повідомлення надіслано, ми зв'яжемося найближчим часом.",
+ "enterprise.form.success.submitted": "Форму успішно надіслано.",
+ "enterprise.form.error.allFieldsRequired": "Усі поля обов'язкові.",
+ "enterprise.form.error.invalidEmailFormat": "Недійсний формат email.",
+ "enterprise.form.error.internalServer": "Внутрішня помилка сервера.",
+ "enterprise.faq.title": "FAQ",
+ "enterprise.faq.q1": "Що таке OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise для організацій, які хочуть гарантувати, що код і дані ніколи не залишають їхню інфраструктуру.",
+ "enterprise.faq.q2": "Як почати з OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "Почніть із внутрішнього тестування з командою. OpenCode за замовчуванням не зберігає код. Потім зв'яжіться з нами для обговорення цін.",
+ "enterprise.faq.q3": "Як працює ціноутворення enterprise?",
+ "enterprise.faq.a3":
+ "Ми пропонуємо ціну за робоче місце. Якщо у вас власний LLM-шлюз, ми не стягуємо плату за токени.",
+ "enterprise.faq.q4": "Чи безпечні мої дані з OpenCode Enterprise?",
+ "enterprise.faq.a4":
+ "Так. OpenCode не зберігає ваш код або контекст. Вся обробка відбувається локально або через прямі API-виклики.",
+
+ "brand.title": "OpenCode | Бренд",
+ "brand.meta.description": "Рекомендації щодо бренду OpenCode",
+ "brand.heading": "Рекомендації щодо бренду",
+ "brand.subtitle": "Ресурси та матеріали для роботи з брендом OpenCode.",
+ "brand.downloadAll": "Завантажити всі матеріали",
+
+ "changelog.title": "OpenCode | Журнал змін",
+ "changelog.meta.description": "Нотатки про випуски та журнал змін OpenCode",
+ "changelog.hero.title": "Журнал змін",
+ "changelog.hero.subtitle": "Нові оновлення та покращення OpenCode",
+ "changelog.empty": "Записів у журналі змін не знайдено.",
+ "changelog.viewJson": "Переглянути JSON",
+
+ "bench.list.title": "Бенчмарк",
+ "bench.list.heading": "Бенчмарки",
+ "bench.list.table.agent": "Агент",
+ "bench.list.table.model": "Модель",
+ "bench.list.table.score": "Результат",
+ "bench.submission.error.allFieldsRequired": "Усі поля обов'язкові.",
+
+ "bench.detail.title": "Бенчмарк — {{task}}",
+ "bench.detail.notFound": "Завдання не знайдено",
+ "bench.detail.na": "Н/Д",
+ "bench.detail.labels.agent": "Агент",
+ "bench.detail.labels.model": "Модель",
+ "bench.detail.labels.task": "Завдання",
+ "bench.detail.labels.repo": "Репозиторій",
+ "bench.detail.labels.from": "Від",
+ "bench.detail.labels.to": "До",
+ "bench.detail.labels.prompt": "Prompt",
+ "bench.detail.labels.commit": "Коміт",
+ "bench.detail.labels.averageDuration": "Середня тривалість",
+ "bench.detail.labels.averageScore": "Середній результат",
+ "bench.detail.labels.averageCost": "Середня вартість",
+ "bench.detail.labels.summary": "Підсумок",
+ "bench.detail.labels.runs": "Запуски",
+ "bench.detail.labels.score": "Результат",
+ "bench.detail.labels.base": "База",
+ "bench.detail.labels.penalty": "Штраф",
+ "bench.detail.labels.weight": "вага",
+ "bench.detail.table.run": "Запуск",
+ "bench.detail.table.score": "Результат (База — Штраф)",
+ "bench.detail.table.cost": "Вартість",
+ "bench.detail.table.duration": "Тривалість",
+ "bench.detail.run.title": "Запуск {{n}}",
+ "bench.detail.rawJson": "Сирий JSON",
+}
diff --git a/packages/console/app/src/i18n/zh.ts b/packages/console/app/src/i18n/zh.ts
new file mode 100644
index 0000000..914afd9
--- /dev/null
+++ b/packages/console/app/src/i18n/zh.ts
@@ -0,0 +1,797 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "文档",
+ "nav.changelog": "更新日志",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "企业版",
+ "nav.zen": "Zen",
+ "nav.login": "登录",
+ "nav.free": "下载",
+ "nav.home": "首页",
+ "nav.openMenu": "打开菜单",
+ "nav.getStartedFree": "免费开始",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "复制 Logo (SVG)",
+ "nav.context.copyWordmark": "复制商标 (SVG)",
+ "nav.context.brandAssets": "品牌资产",
+
+ "footer.github": "GitHub",
+ "footer.docs": "文档",
+ "footer.changelog": "更新日志",
+ "footer.feishu": "飞书",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "品牌",
+ "legal.privacy": "隐私",
+ "legal.terms": "条款",
+
+ "email.title": "第一时间获知我们的新产品发布",
+ "email.subtitle": "加入候补名单,获取抢先体验资格。",
+ "email.placeholder": "电子邮箱地址",
+ "email.subscribe": "订阅",
+ "email.success": "即将完成,请检查您的收件箱并确认您的邮箱地址",
+
+ "notFound.title": "未找到页面 | OpenCode",
+ "notFound.heading": "404 - 页面未找到",
+ "notFound.home": "首页",
+ "notFound.docs": "文档",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode logo 亮色",
+ "notFound.logoDarkAlt": "opencode logo 暗色",
+
+ "user.logout": "退出登录",
+
+ "auth.callback.error.codeMissing": "未找到授权码。",
+
+ "workspace.select": "选择工作区",
+ "workspace.createNew": "+ 新建工作区",
+ "workspace.modal.title": "新建工作区",
+ "workspace.modal.placeholder": "输入工作区名称",
+
+ "common.cancel": "取消",
+ "common.creating": "正在创建...",
+ "common.create": "创建",
+
+ "common.videoUnsupported": "您的浏览器不支持 video 标签。",
+ "common.figure": "图 {{n}}.",
+ "common.faq": "常见问题",
+ "common.learnMore": "了解更多",
+
+ "error.invalidPlan": "无效的计划",
+ "error.workspaceRequired": "缺少工作区 ID",
+ "error.alreadySubscribed": "此工作区已有订阅",
+ "error.limitRequired": "缺少限制设置。",
+ "error.monthlyLimitInvalid": "设置有效的每月限额。",
+ "error.workspaceNameRequired": "缺少工作区名称。",
+ "error.nameTooLong": "名称必须少于 255 个字符。",
+ "error.emailRequired": "缺少电子邮箱",
+ "error.roleRequired": "缺少角色",
+ "error.idRequired": "缺少 ID",
+ "error.nameRequired": "缺少名称",
+ "error.providerRequired": "缺少提供商",
+ "error.apiKeyRequired": "缺少 API 密钥",
+ "error.modelRequired": "缺少模型",
+ "error.reloadAmountMin": "充值金额必须至少为 ${{amount}}",
+ "error.reloadTriggerMin": "余额触发阈值必须至少为 ${{amount}}",
+
+ "app.meta.description": "OpenCode - 开源编程代理。",
+
+ "home.title": "OpenCode | 开源 AI 编程代理",
+
+ "temp.title": "OpenCode | 专为终端打造的 AI 编程代理",
+ "temp.hero.title": "专为终端打造的 AI 编程代理",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "开始使用",
+ "temp.feature.native.title": "原生 TUI",
+ "temp.feature.native.body": "响应迅速、原生的、可定制主题的终端 UI",
+ "temp.feature.zen.beforeLink": "由 OpenCode 提供的",
+ "temp.feature.zen.link": "精选模型列表",
+ "temp.feature.zen.afterLink": "",
+ "temp.feature.models.beforeLink": "通过 Models.dev 支持 75+ LLM 提供商",
+ "temp.feature.models.afterLink": ",包括本地模型",
+ "temp.screenshot.caption": "使用 Tokyonight 主题的 OpenCode TUI",
+ "temp.screenshot.alt": "使用 Tokyonight 主题的 OpenCode TUI",
+ "temp.logoLightAlt": "opencode logo 亮色",
+ "temp.logoDarkAlt": "opencode logo 暗色",
+
+ "home.banner.badge": "新",
+ "home.banner.text": "桌面应用 Beta 版现已推出",
+ "home.banner.platforms": "支持 macOS, Windows, 和 Linux",
+ "home.banner.downloadNow": "立即下载",
+ "home.banner.downloadBetaNow": "立即下载桌面 Beta 版",
+
+ "home.hero.title": "开源 AI 编程代理",
+ "home.hero.subtitle.a": "内置免费模型,或连接任意提供商的任意模型,",
+ "home.hero.subtitle.b": "包括 Claude, GPT, Gemini 等。",
+
+ "home.install.ariaLabel": "安装选项",
+
+ "home.what.title": "什么是 OpenCode?",
+ "home.what.body": "OpenCode 是一个开源代理,帮助您在终端、IDE 或桌面端编写代码。",
+ "home.what.lsp.title": "支持 LSP",
+ "home.what.lsp.body": "为 LLM 自动加载合适的 LSP",
+ "home.what.multiSession.title": "多会话",
+ "home.what.multiSession.body": "在同一个项目中并行启动多个代理",
+ "home.what.shareLinks.title": "分享链接",
+ "home.what.shareLinks.body": "分享任意会话链接以供参考或调试",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "使用 GitHub 登录以使用您的 Copilot 账户",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "使用 OpenAI 登录以使用您的 ChatGPT Plus 或 Pro 账户",
+ "home.what.anyModel.title": "任意模型",
+ "home.what.anyModel.body": "通过 Models.dev 支持 75+ LLM 提供商,包括本地模型",
+ "home.what.anyEditor.title": "任意编辑器",
+ "home.what.anyEditor.body": "提供终端界面、桌面应用及 IDE 扩展",
+ "home.what.readDocs": "阅读文档",
+
+ "home.growth.title": "开源 AI 编程代理",
+ "home.growth.body":
+ "拥有超过 {{stars}} 颗 GitHub Star,{{contributors}} 位贡献者,以及超过 {{commits}} 次提交,OpenCode 每月被超过 {{monthlyUsers}} 名开发者使用并信赖。",
+ "home.growth.githubStars": "GitHub Stars",
+ "home.growth.contributors": "贡献者",
+ "home.growth.monthlyDevs": "月活开发者",
+
+ "home.privacy.title": "隐私优先的设计",
+ "home.privacy.body": "OpenCode 不存储您的任何代码或上下文数据,确保可以在对隐私敏感的环境中运行。",
+ "home.privacy.learnMore": "了解更多关于",
+ "home.privacy.link": "隐私",
+
+ "home.faq.q1": "什么是 OpenCode?",
+ "home.faq.a1": "OpenCode 是一个开源代理,帮助您使用任意 AI 模型编写和运行代码。它提供终端界面、桌面应用及 IDE 扩展。",
+ "home.faq.q2": "如何使用 OpenCode?",
+ "home.faq.a2.before": "最简单的入门方式是阅读",
+ "home.faq.a2.link": "介绍",
+ "home.faq.q3": "使用 OpenCode 需要额外的 AI 订阅吗?",
+ "home.faq.a3.p1": "不一定。OpenCode 自带一组免费模型,无需创建账户即可使用。",
+ "home.faq.a3.p2.beforeZen": "此外,您可以通过创建",
+ "home.faq.a3.p2.afterZen": "账户来使用流行的编程模型。",
+ "home.faq.a3.p3": "虽然我们鼓励使用 Zen,但 OpenCode 也支持所有主流提供商,如 OpenAI, Anthropic, xAI 等。",
+ "home.faq.a3.p4.beforeLocal": "您甚至可以连接您的",
+ "home.faq.a3.p4.localLink": "本地模型",
+ "home.faq.q4": "我可以使用现有的 AI 订阅吗?",
+ "home.faq.a4.p1":
+ "可以,OpenCode 支持所有主流提供商的订阅计划。您可以使用您的 Claude Pro/Max, ChatGPT Plus/Pro, 或 GitHub Copilot 订阅。",
+ "home.faq.q5": "OpenCode 只能在终端使用吗?",
+ "home.faq.a5.beforeDesktop": "不再是了!OpenCode 现在也提供",
+ "home.faq.a5.desktop": "桌面端应用",
+ "home.faq.a5.and": "和",
+ "home.faq.a5.web": "网页端",
+ "home.faq.q6": "OpenCode 多少钱?",
+ "home.faq.a6": "OpenCode 是 100% 免费使用的。它还自带一组免费模型。如果您连接其他提供商,可能会产生额外费用。",
+ "home.faq.q7": "数据和隐私如何?",
+ "home.faq.a7.p1": "只有当您使用我们的免费模型或创建分享链接时,您的数据和信息才会被存储。",
+ "home.faq.a7.p2.beforeModels": "了解更多关于",
+ "home.faq.a7.p2.modelsLink": "我们的模型",
+ "home.faq.a7.p2.and": "和",
+ "home.faq.a7.p2.shareLink": "分享页面",
+ "home.faq.q8": "OpenCode 是开源的吗?",
+ "home.faq.a8.p1": "是的,OpenCode 是完全开源的。源代码公开在",
+ "home.faq.a8.p2": "遵循",
+ "home.faq.a8.mitLicense": "MIT 许可证",
+ "home.faq.a8.p3":
+ ",这意味着任何人都可以使用、修改或为它的发展做贡献。社区中的任何人都可以提交 issue、提交 PR 并扩展功能。",
+
+ "home.zenCta.title": "访问可靠、优化的编程代理模型",
+ "home.zenCta.body":
+ "Zen 为您提供一组精选的 AI 模型,这些模型经过 OpenCode 专门针对编程代理的测试和基准测试。无需担心不同提供商之间不稳定的性能和质量,直接使用行之有效的验证模型。",
+ "home.zenCta.link": "了解 Zen",
+
+ "zen.title": "OpenCode Zen | 为编程代理精选的可靠、优化模型",
+ "zen.hero.title": "为编程代理打造的可靠、优化模型",
+ "zen.hero.body":
+ "Zen 为您提供一组精选的 AI 模型,这些模型经过 OpenCode 专门针对编程代理的测试和基准测试。无需担心不稳定的性能和质量,直接使用行之有效的验证模型。",
+
+ "zen.faq.q1": "什么是 OpenCode Zen?",
+ "zen.faq.a1": "Zen 是一组由 OpenCode 团队创建的,专门针对编程代理进行测试和基准测试的 AI 模型精选集。",
+ "zen.faq.q2": "为什么 Zen 更准确?",
+ "zen.faq.a2":
+ "Zen 仅提供经过专门针对编程代理测试和基准测试的模型。正如你不会用黄油刀切牛排一样,也不要用糟糕的模型来写代码。",
+ "zen.faq.q3": "Zen 更便宜吗?",
+ "zen.faq.a3":
+ "Zen 不以盈利为目的。Zen 将模型提供商的成本直接传递给您。Zen 的使用量越高,OpenCode 就越能协商出更好的费率并回馈给您。",
+ "zen.faq.q4": "Zen 多少钱?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "按请求收费",
+ "zen.faq.a4.p1.afterPricing": "零加价,所以您只需支付模型提供商收取的费用。",
+ "zen.faq.a4.p2.beforeAccount": "您的总费用取决于使用量,且您可以在您的",
+ "zen.faq.a4.p2.accountLink": "账户中设置每月支出限额",
+ "zen.faq.a4.p3": "为覆盖成本,OpenCode 仅收取少量支付处理费,每充值 $20 收取 $1.23。",
+ "zen.faq.q5": "数据和隐私如何?",
+ "zen.faq.a5.beforeExceptions": "所有 Zen 模型均托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,",
+ "zen.faq.a5.exceptionsLink": "以下例外情况除外",
+ "zen.faq.q6": "我可以设置支出限额吗?",
+ "zen.faq.a6": "可以,您可以在账户中设置每月支出限额。",
+ "zen.faq.q7": "我可以取消吗?",
+ "zen.faq.a7": "可以,您可以随时禁用计费并使用剩余余额。",
+ "zen.faq.q8": "我可以在其他编程代理中使用 Zen 吗?",
+ "zen.faq.a8":
+ "虽然 Zen 与 OpenCode 配合效果极佳,但您可以在任何代理中使用 Zen。请按照您首选编程代理中的设置说明进行操作。",
+
+ "zen.cta.start": "开始使用 Zen",
+ "zen.pricing.title": "充值 $20 (即用即付)",
+ "zen.pricing.fee": "(+ $1.23 银行卡手续费)",
+ "zen.pricing.body": "可配合任何代理使用。支持设置月度消费限额。随时取消。",
+ "zen.problem.title": "Zen 解决了什么问题?",
+ "zen.problem.body": "市面上有太多模型,但只有少数能与编程代理良好配合。大多数提供商配置不同,导致结果参差不齐。",
+ "zen.problem.subtitle": "我们要为所有人解决这个问题,不仅仅是 OpenCode 用户。",
+ "zen.problem.item1": "测试精选模型并咨询其团队",
+ "zen.problem.item2": "与提供商合作确保正确交付",
+ "zen.problem.item3": "对所有推荐的模型-提供商组合进行基准测试",
+ "zen.how.title": "Zen 如何工作",
+ "zen.how.body": "虽然我们建议您配合 OpenCode 使用 Zen,但您也可以将其用于任何代理。",
+ "zen.how.step1.title": "注册并充值 $20",
+ "zen.how.step1.beforeLink": "遵循",
+ "zen.how.step1.link": "设置说明",
+ "zen.how.step2.title": "使用 Zen,价格透明",
+ "zen.how.step2.link": "按请求付费",
+ "zen.how.step2.afterLink": "零加价",
+ "zen.how.step3.title": "自动充值",
+ "zen.how.step3.body": "当您的余额低于 $5 时,我们将自动充值 $20",
+ "zen.privacy.title": "您的隐私对我们很重要",
+ "zen.privacy.beforeExceptions": "所有 Zen 模型均托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,",
+ "zen.privacy.exceptionsLink": "以下例外情况除外",
+
+ "go.title": "OpenCode Go | 人人可用的低成本编程模型",
+ "go.meta.description":
+ "Go 首月 $5,之后 $10/月,提供对 GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 和 DeepSeek V4 Flash 的 5 小时充裕请求额度。",
+ "go.hero.title": "人人可用的低成本编程模型",
+ "go.hero.body":
+ "Go 将代理编程带给全世界的程序员。提供充裕的限额和对最强大的开源模型的可靠访问,让您可以利用强大的代理进行构建,而无需担心成本或可用性。",
+
+ "go.cta.start": "订阅 Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "订阅 Go",
+ "go.cta.price": "$10/月",
+ "go.cta.promo": "首月 $5",
+ "go.pricing.body": "可配合任何代理使用。首月 $5,之后 $10/月。如有需要可充值。随时取消。",
+ "go.graph.free": "免费",
+ "go.graph.freePill": "Big Pickle 和免费模型",
+ "go.graph.go": "Go",
+ "go.graph.label": "每 5 小时请求数",
+ "go.graph.usageLimits": "使用限制",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "每 5 小时请求数: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "前 CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "彻底改变了我的生活,这绝对是不二之选。",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "前创始人, SEED, PM, Melt, Pop, Dapt, Cadmus, 和 ViewPoint",
+ "go.testimonials.jay.quoteBefore": "我们团队 5 个人里有 4 个都爱用",
+ "go.testimonials.jay.quoteAfter": "。",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "前 Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "我强烈推荐",
+ "go.testimonials.adam.quoteAfter": "。真的,非常好用。",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "前设计主管, Laravel",
+ "go.testimonials.david.quoteBefore": "有了",
+ "go.testimonials.david.quoteAfter": "我知道所有模型都经过测试,非常适合编程代理。",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "前实习生, Nvidia (4 次)",
+ "go.testimonials.frank.quote": "我希望我还在 Nvidia。",
+ "go.problem.title": "Go 解决了什么问题?",
+ "go.problem.body":
+ "我们致力于将 OpenCode 体验带给尽可能多的人。OpenCode Go 是一款低成本订阅服务:首月 $5,之后 $10/月。它提供充裕的额度,并让您能可靠地使用最强大的开源模型。",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "低成本订阅定价",
+ "go.problem.item2": "充裕的限额和可靠的访问",
+ "go.problem.item3": "为尽可能多的程序员打造",
+ "go.problem.item4":
+ "包含 GLM-5.1, GLM-5, Kimi K2.5、Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 和 DeepSeek V4 Flash",
+ "go.how.title": "Go 如何工作",
+ "go.how.body": "Go 起价为首月 $5,之后 $10/月。您可以将其与 OpenCode 或任何代理搭配使用。",
+ "go.how.step1.title": "创建账户",
+ "go.how.step1.beforeLink": "遵循",
+ "go.how.step1.link": "设置说明",
+ "go.how.step2.title": "订阅 Go",
+ "go.how.step2.link": "首月 $5",
+ "go.how.step2.afterLink": "之后 $10/月,额度充裕",
+ "go.how.step3.title": "开始编程",
+ "go.how.step3.body": "可靠访问开源模型",
+ "go.privacy.title": "您的隐私对我们很重要",
+ "go.privacy.body": "该计划主要面向国际用户设计,模型部署在美国、欧盟和新加坡,以确保稳定的全球访问。",
+ "go.privacy.contactAfter": "如果您有任何问题。",
+ "go.privacy.beforeExceptions": "Go 模型托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,",
+ "go.privacy.exceptionsLink": "以下例外情况除外",
+ "go.faq.q1": "什么是 OpenCode Go?",
+ "go.faq.a1": "Go 是一项低成本订阅服务,为您提供对强大的开源模型的可靠访问,用于代理编程。",
+ "go.faq.q2": "Go 包含哪些模型?",
+ "go.faq.a2": "Go 包含下方列出的模型,提供充足的限额和可靠的访问。",
+ "go.faq.q3": "Go 和 Zen 一样吗?",
+ "go.faq.a3":
+ "不。Zen 是按量付费,而 Go 首月 $5,之后 $10/月,提供充裕的额度,并可可靠地访问 GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 和 DeepSeek V4 Flash 等开源模型。",
+ "go.faq.q4": "Go 多少钱?",
+ "go.faq.a4.p1.beforePricing": "Go 费用为",
+ "go.faq.a4.p1.pricingLink": "首月 $5",
+ "go.faq.a4.p1.afterPricing": "之后 $10/月,额度充裕。",
+ "go.faq.a4.p2.beforeAccount": "您可以在您的",
+ "go.faq.a4.p2.accountLink": "账户",
+ "go.faq.a4.p3": "中管理订阅。随时取消。",
+ "go.faq.q5": "数据和隐私如何?",
+ "go.faq.a5.body":
+ "该计划主要面向国际用户设计,模型部署在美国、欧盟和新加坡,以确保稳定的全球访问。我们的提供商遵循零留存政策,不使用您的数据进行模型训练。",
+ "go.faq.a5.beforeExceptions": "Go 模型托管在美国。提供商遵循零留存政策,不使用您的数据进行模型训练,",
+ "go.faq.a5.exceptionsLink": "以下例外情况除外",
+ "go.faq.q6": "我可以充值余额吗?",
+ "go.faq.a6": "如果您需要更多用量,可以在账户中充值余额。",
+ "go.faq.q7": "我可以取消吗?",
+ "go.faq.a7": "可以,您可以随时取消。",
+ "go.faq.q8": "我可以在其他编程代理中使用 Go 吗?",
+ "go.faq.a8": "可以,您可以在任何代理中使用 Go。请遵循您首选编程代理中的设置说明。",
+
+ "go.faq.q9": "免费模型和 Go 之间的区别是什么?",
+ "go.faq.a9":
+ "免费模型包含 Big Pickle 加上当时可用的促销模型,每天有 200 次请求的配额。Go 包含 GLM-5.1, GLM-5, Kimi K2.5、Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 和 DeepSeek V4 Flash,并在滚动窗口(5 小时、每周和每月)内执行更高的请求配额,大致相当于每 5 小时 $12、每周 $30 和每月 $60(实际请求计数因模型和使用情况而异)。",
+
+ "zen.api.error.rateLimitExceeded": "超出速率限制。请稍后重试。",
+ "zen.api.error.modelNotSupported": "不支持模型 {{model}}",
+ "zen.api.error.modelFormatNotSupported": "格式 {{format}} 不支持模型 {{model}}",
+ "zen.api.error.noProviderAvailable": "没有可用的提供商",
+ "zen.api.error.providerNotSupported": "不支持提供商 {{provider}}",
+ "zen.api.error.missingApiKey": "缺少 API 密钥。",
+ "zen.api.error.invalidApiKey": "无效的 API 密钥。",
+ "zen.api.error.subscriptionQuotaExceeded": "超出订阅配额。请在 {{retryIn}} 后重试。",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "已达到 5 小时使用限额。将在 {{retryIn}} 后重置。如需立即继续使用该模型,请启用从可用余额扣费:{{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "已达到每周使用限额。将在 {{retryIn}} 后重置。如需立即继续使用该模型,请启用从可用余额扣费:{{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "已达到每月使用限额。将在 {{retryIn}} 后重置。如需立即继续使用该模型,请启用从可用余额扣费:{{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "没有付款方式。请在此处添加付款方式:{{billingUrl}}",
+ "zen.api.error.insufficientBalance": "余额不足。请在此处管理您的计费:{{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "您的工作区已达到每月支出限额 ${{amount}}。请在此处管理您的限额:{{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached": "您已达到每月支出限额 ${{amount}}。请在此处管理您的限额:{{membersUrl}}",
+ "zen.api.error.modelDisabled": "模型已禁用",
+ "zen.api.error.trialEnded": "{{model}} 的限免活动已结束。您可以订阅 OpenCode Go 继续使用该模型 - {{link}}",
+
+ "black.meta.title": "OpenCode Black | 访问全球顶尖编程模型",
+ "black.meta.description": "通过 OpenCode Black 订阅计划使用 Claude, GPT, Gemini 等模型。",
+ "black.hero.title": "访问全球顶尖编程模型",
+ "black.hero.subtitle": "包括 Claude, GPT, Gemini 等",
+ "black.title": "OpenCode Black | 定价",
+ "black.paused": "Black 订阅已暂时暂停注册。",
+ "black.plan.icon20": "Black 20 计划",
+ "black.plan.icon100": "Black 100 计划",
+ "black.plan.icon200": "Black 200 计划",
+ "black.plan.multiplier100": "用量是 Black 20 的 5 倍",
+ "black.plan.multiplier200": "用量是 Black 20 的 20 倍",
+ "black.price.perMonth": "/ 月",
+ "black.price.perPersonBilledMonthly": "每人每月",
+ "black.terms.1": "您的订阅不会立即开始",
+ "black.terms.2": "您将被加入候补名单,并很快激活",
+ "black.terms.3": "您的卡只会在订阅激活时扣费",
+ "black.terms.4": "适用使用限制,高度自动化的使用可能会更快达到限制",
+ "black.terms.5": "订阅仅限个人,团队请联系企业版",
+ "black.terms.6": "未来可能会调整限制或停止计划",
+ "black.terms.7": "随时取消订阅",
+ "black.action.continue": "继续",
+ "black.finePrint.beforeTerms": "显示价格不含税",
+ "black.finePrint.terms": "服务条款",
+ "black.workspace.title": "OpenCode Black | 选择工作区",
+ "black.workspace.selectPlan": "为此计划选择一个工作区",
+ "black.workspace.name": "工作区 {{n}}",
+ "black.subscribe.title": "订阅 OpenCode Black",
+ "black.subscribe.paymentMethod": "付款方式",
+ "black.subscribe.loadingPaymentForm": "正在加载付款表单...",
+ "black.subscribe.selectWorkspaceToContinue": "选择一个工作区以继续",
+ "black.subscribe.failurePrefix": "哎呀!",
+ "black.subscribe.error.generic": "发生错误",
+ "black.subscribe.error.invalidPlan": "无效的计划",
+ "black.subscribe.error.workspaceRequired": "缺少工作区 ID",
+ "black.subscribe.error.alreadySubscribed": "此工作区已有订阅",
+ "black.subscribe.processing": "处理中...",
+ "black.subscribe.submit": "订阅 ${{plan}}",
+ "black.subscribe.form.chargeNotice": "您的卡只会在订阅激活时扣费",
+ "black.subscribe.success.title": "您已加入 OpenCode Black 候补名单",
+ "black.subscribe.success.subscriptionPlan": "订阅计划",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "金额",
+ "black.subscribe.success.amountValue": "${{plan}} / 月",
+ "black.subscribe.success.paymentMethod": "付款方式",
+ "black.subscribe.success.dateJoined": "加入日期",
+ "black.subscribe.success.chargeNotice": "您的卡将在订阅激活时扣费",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "使用量",
+ "workspace.nav.apiKeys": "API 密钥",
+ "workspace.nav.members": "成员",
+ "workspace.nav.billing": "计费",
+ "workspace.nav.settings": "设置",
+
+ "workspace.home.banner.beforeLink": "可靠、优化的编程代理模型。",
+ "workspace.lite.banner.beforeLink": "低成本编码模型,人人可用。",
+ "workspace.home.billing.loading": "加载中...",
+ "workspace.home.billing.enable": "启用计费",
+ "workspace.home.billing.currentBalance": "当前余额",
+
+ "workspace.newUser.feature.tested.title": "经过测试与验证的模型",
+ "workspace.newUser.feature.tested.body": "我们专门针对编程代理对模型进行了基准测试和测试,以确保最佳性能。",
+ "workspace.newUser.feature.quality.title": "最高质量",
+ "workspace.newUser.feature.quality.body": "访问配置为最佳性能的模型 - 无需降级或路由到更便宜的提供商。",
+ "workspace.newUser.feature.lockin.title": "无锁定",
+ "workspace.newUser.feature.lockin.body":
+ "将 Zen 与任何编程代理结合使用,并在需要时继续在 OpenCode 中使用其他提供商。",
+ "workspace.newUser.copyApiKey": "复制 API 密钥",
+ "workspace.newUser.copyKey": "复制密钥",
+ "workspace.newUser.copied": "已复制!",
+ "workspace.newUser.step.enableBilling": "启用计费",
+ "workspace.newUser.step.login.before": "运行",
+ "workspace.newUser.step.login.after": "并选择 OpenCode",
+ "workspace.newUser.step.pasteKey": "粘贴您的 API 密钥",
+ "workspace.newUser.step.models.before": "启动 OpenCode 并运行",
+ "workspace.newUser.step.models.after": "以选择模型",
+
+ "workspace.models.title": "模型",
+ "workspace.models.subtitle.beforeLink": "管理工作区成员可以访问哪些模型。",
+ "workspace.models.table.model": "模型",
+ "workspace.models.table.enabled": "已启用",
+
+ "workspace.providers.title": "自带密钥 (BYOK)",
+ "workspace.providers.subtitle": "配置您自己的 AI 提供商 API 密钥。",
+ "workspace.providers.placeholder": "输入 {{provider}} API 密钥 ({{prefix}}...)",
+ "workspace.providers.configure": "配置",
+ "workspace.providers.edit": "编辑",
+ "workspace.providers.delete": "删除",
+ "workspace.providers.saving": "正在保存...",
+ "workspace.providers.save": "保存",
+ "workspace.providers.table.provider": "提供商",
+ "workspace.providers.table.apiKey": "API 密钥",
+
+ "workspace.usage.title": "使用历史",
+ "workspace.usage.subtitle": "近期 API 使用情况和成本。",
+ "workspace.usage.empty": "发起第一个 API 调用以开始。",
+ "workspace.usage.table.date": "日期",
+ "workspace.usage.table.model": "模型",
+ "workspace.usage.table.input": "输入",
+ "workspace.usage.table.output": "输出",
+ "workspace.usage.table.cost": "成本",
+ "workspace.usage.table.session": "会话",
+ "workspace.usage.breakdown.input": "输入",
+ "workspace.usage.breakdown.cacheRead": "缓存读取",
+ "workspace.usage.breakdown.cacheWrite": "缓存写入",
+ "workspace.usage.breakdown.output": "输出",
+ "workspace.usage.breakdown.reasoning": "推理",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "成本",
+ "workspace.cost.subtitle": "按模型细分的使用成本。",
+ "workspace.cost.allModels": "所有模型",
+ "workspace.cost.allKeys": "所有密钥",
+ "workspace.cost.deletedSuffix": "(已删除)",
+ "workspace.cost.empty": "所选期间无可用使用数据。",
+ "workspace.cost.subscriptionShort": "订阅",
+
+ "workspace.keys.title": "API 密钥",
+ "workspace.keys.subtitle": "管理访问 OpenCode 服务的 API 密钥。",
+ "workspace.keys.create": "创建 API 密钥",
+ "workspace.keys.placeholder": "输入密钥名称",
+ "workspace.keys.empty": "创建 OpenCode 网关 API 密钥",
+ "workspace.keys.table.name": "名称",
+ "workspace.keys.table.key": "密钥",
+ "workspace.keys.table.createdBy": "创建者",
+ "workspace.keys.table.lastUsed": "最后使用",
+ "workspace.keys.copyApiKey": "复制 API 密钥",
+ "workspace.keys.delete": "删除",
+
+ "workspace.members.title": "成员",
+ "workspace.members.subtitle": "管理工作区成员及其权限。",
+ "workspace.members.invite": "邀请成员",
+ "workspace.members.inviting": "正在邀请...",
+ "workspace.members.beta.beforeLink": "Beta 期间工作区对团队免费。",
+ "workspace.members.form.invitee": "受邀者",
+ "workspace.members.form.emailPlaceholder": "输入电子邮箱",
+ "workspace.members.form.role": "角色",
+ "workspace.members.form.monthlyLimit": "每月消费限额",
+ "workspace.members.noLimit": "无限制",
+ "workspace.members.noLimitLowercase": "无限制",
+ "workspace.members.invited": "已邀请",
+ "workspace.members.edit": "编辑",
+ "workspace.members.delete": "删除",
+ "workspace.members.saving": "正在保存...",
+ "workspace.members.save": "保存",
+ "workspace.members.table.email": "邮箱",
+ "workspace.members.table.role": "角色",
+ "workspace.members.table.monthLimit": "月限额",
+ "workspace.members.role.admin": "管理员",
+ "workspace.members.role.adminDescription": "可以管理模型、成员和计费",
+ "workspace.members.role.member": "成员",
+ "workspace.members.role.memberDescription": "只能为自己生成 API 密钥",
+
+ "workspace.settings.title": "设置",
+ "workspace.settings.subtitle": "更新您的工作区名称和偏好。",
+ "workspace.settings.workspaceName": "工作区名称",
+ "workspace.settings.defaultName": "默认",
+ "workspace.settings.updating": "正在更新...",
+ "workspace.settings.save": "保存",
+ "workspace.settings.edit": "编辑",
+
+ "workspace.billing.title": "计费",
+ "workspace.billing.subtitle.beforeLink": "管理付款方式。",
+ "workspace.billing.contactUs": "联系我们",
+ "workspace.billing.subtitle.afterLink": "如果您有任何问题。",
+ "workspace.billing.currentBalance": "当前余额",
+ "workspace.billing.add": "充值 $",
+ "workspace.billing.enterAmount": "输入金额",
+ "workspace.billing.loading": "加载中...",
+ "workspace.billing.addAction": "充值",
+ "workspace.billing.addBalance": "充值余额",
+ "workspace.billing.alipay": "支付宝",
+ "workspace.billing.wechat": "微信支付",
+ "workspace.billing.linkedToStripe": "已关联 Stripe",
+ "workspace.billing.manage": "管理",
+ "workspace.billing.enable": "启用计费",
+
+ "workspace.monthlyLimit.title": "每月限额",
+ "workspace.monthlyLimit.subtitle": "为您的账户设置每月使用限额。",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "正在设置...",
+ "workspace.monthlyLimit.set": "设置",
+ "workspace.monthlyLimit.edit": "编辑限额",
+ "workspace.monthlyLimit.noLimit": "未设置使用限额。",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "当前",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "的使用量为 $",
+
+ "workspace.redeem.title": "兑换优惠券",
+ "workspace.redeem.subtitle": "兑换优惠码以领取充值额度或权益。",
+ "workspace.redeem.placeholder": "输入优惠码",
+ "workspace.redeem.redeem": "兑换",
+ "workspace.redeem.redeeming": "兑换中...",
+ "workspace.redeem.success": "优惠券兑换成功。",
+
+ "workspace.reload.title": "自动充值",
+ "workspace.reload.disabled.before": "自动充值已",
+ "workspace.reload.disabled.state": "禁用",
+ "workspace.reload.disabled.after": "启用后将在余额不足时自动充值。",
+ "workspace.reload.enabled.before": "自动充值已",
+ "workspace.reload.enabled.state": "启用",
+ "workspace.reload.enabled.middle": "我们将自动充值",
+ "workspace.reload.processingFee": "手续费",
+ "workspace.reload.enabled.after": "当余额达到",
+ "workspace.reload.edit": "编辑",
+ "workspace.reload.enable": "启用",
+ "workspace.reload.enableAutoReload": "启用自动充值",
+ "workspace.reload.reloadAmount": "充值 $",
+ "workspace.reload.whenBalanceReaches": "当余额达到 $",
+ "workspace.reload.saving": "正在保存...",
+ "workspace.reload.save": "保存",
+ "workspace.reload.failedAt": "充值失败于",
+ "workspace.reload.reason": "原因:",
+ "workspace.reload.updatePaymentMethod": "请更新您的付款方式并重试。",
+ "workspace.reload.retrying": "正在重试...",
+ "workspace.reload.retry": "重试",
+ "workspace.reload.error.paymentFailed": "支付失败。",
+
+ "workspace.payments.title": "支付历史",
+ "workspace.payments.subtitle": "近期支付交易。",
+ "workspace.payments.table.date": "日期",
+ "workspace.payments.table.paymentId": "支付 ID",
+ "workspace.payments.table.amount": "金额",
+ "workspace.payments.table.receipt": "收据",
+ "workspace.payments.type.credit": "充值",
+ "workspace.payments.type.subscription": "订阅",
+ "workspace.payments.view": "查看",
+
+ "workspace.black.loading": "加载中...",
+ "workspace.black.time.day": "天",
+ "workspace.black.time.days": "天",
+ "workspace.black.time.hour": "小时",
+ "workspace.black.time.hours": "小时",
+ "workspace.black.time.minute": "分钟",
+ "workspace.black.time.minutes": "分钟",
+ "workspace.black.time.fewSeconds": "几秒钟",
+ "workspace.black.subscription.title": "订阅",
+ "workspace.black.subscription.message": "您已订阅 OpenCode Black,价格为每月 ${{plan}}。",
+ "workspace.black.subscription.manage": "管理订阅",
+ "workspace.black.subscription.rollingUsage": "5 小时用量",
+ "workspace.black.subscription.weeklyUsage": "每周用量",
+ "workspace.black.subscription.resetsIn": "重置于",
+ "workspace.black.subscription.useBalance": "达到使用限额后使用您的可用余额",
+ "workspace.black.waitlist.title": "候补名单",
+ "workspace.black.waitlist.joined": "您已加入每月 ${{plan}} 的 OpenCode Black 计划候补名单。",
+ "workspace.black.waitlist.ready": "我们已准备好将您加入每月 ${{plan}} 的 OpenCode Black 计划。",
+ "workspace.black.waitlist.leave": "退出候补名单",
+ "workspace.black.waitlist.leaving": "正在退出...",
+ "workspace.black.waitlist.left": "已退出",
+ "workspace.black.waitlist.enroll": "加入",
+ "workspace.black.waitlist.enrolling": "正在加入...",
+ "workspace.black.waitlist.enrolled": "已加入",
+ "workspace.black.waitlist.enrollNote": "点击加入后,您的订阅将立即开始,并将从您的卡中扣费。",
+
+ "workspace.lite.loading": "加载中...",
+ "workspace.lite.time.day": "天",
+ "workspace.lite.time.days": "天",
+ "workspace.lite.time.hour": "小时",
+ "workspace.lite.time.hours": "小时",
+ "workspace.lite.time.minute": "分钟",
+ "workspace.lite.time.minutes": "分钟",
+ "workspace.lite.time.fewSeconds": "几秒钟",
+ "workspace.lite.subscription.message": "您已订阅 OpenCode Go。",
+ "workspace.lite.subscription.manage": "管理订阅",
+ "workspace.lite.subscription.rollingUsage": "滚动用量",
+ "workspace.lite.subscription.weeklyUsage": "每周用量",
+ "workspace.lite.subscription.monthlyUsage": "每月用量",
+ "workspace.lite.subscription.resetsIn": "重置于",
+ "workspace.lite.subscription.useBalance": "达到使用限额后使用您的可用余额",
+ "workspace.lite.subscription.selectProvider":
+ "在你的 opencode 配置中选择「OpenCode Go」作为提供商,即可使用 Go 模型。",
+ "workspace.lite.black.message": "您当前已订阅 OpenCode Black 或在候补名单中。如需切换到 Go,请先取消订阅。",
+ "workspace.lite.other.message": "此工作区中的另一位成员已经订阅了 OpenCode Go。每个工作区只有一名成员可以订阅。",
+ "workspace.lite.promo.description":
+ "OpenCode Go 起价为 {{price}},之后 $10/月,并提供对流行开放编码模型的可靠访问,同时享有充裕的使用限额。",
+ "workspace.lite.promo.price": "首月 $5",
+ "workspace.lite.promo.modelsTitle": "包含模型",
+ "workspace.lite.promo.footer":
+ "该计划主要面向国际用户设计,模型部署在美国、欧盟和新加坡,以确保全球范围内的稳定访问体验。定价和使用额度可能会根据早期用户的使用情况和反馈持续调整与优化。",
+ "workspace.lite.promo.subscribe": "订阅 Go",
+ "workspace.lite.promo.subscribing": "正在重定向...",
+ "workspace.lite.promo.otherMethods": "其他付款方式",
+ "workspace.lite.promo.selectMethod": "选择付款方式",
+
+ "workspace.referral.copyLink": "复制链接",
+ "workspace.referral.copied": "已复制",
+ "workspace.referral.overview.title": "邀请好友",
+ "workspace.referral.overview.subtitle": "好友订阅后,您可获得 $5,对方也可获得 $5。",
+ "workspace.referral.instructions.share": "分享您的推荐链接。",
+ "workspace.referral.instructions.subscribe": "好友加入并订阅 Go。",
+ "workspace.referral.instructions.claim": "你们都将获得 $5 使用额度,可用于您的 Go 使用限额。",
+ "workspace.referral.rewards.title": "邀请奖励",
+ "workspace.referral.rewards.description": "将可用的邀请积分应用到您的 Go 用量。",
+ "workspace.referral.rewards.subtitle": "已使用 {{applied}} / {{total}} 个奖励。",
+ "workspace.referral.rewards.empty": "暂无邀请奖励。",
+ "workspace.referral.table.reward": "奖励",
+ "workspace.referral.table.referral": "描述",
+ "workspace.referral.table.date": "日期",
+ "workspace.referral.reward.description.inviter": "已邀请 {{email}}",
+ "workspace.referral.reward.description.invitee": "由 {{email}} 邀请",
+ "workspace.referral.reward.action.subscribeUnlock": "订阅以解锁",
+ "workspace.referral.reward.action.view": "查看奖励",
+ "workspace.referral.reward.action.applied": "奖励已使用",
+ "workspace.referral.reward.source.pendingInviter": "等待对方订阅",
+ "workspace.referral.reward.source.pendingInvitee": "订阅即可解锁奖励",
+ "workspace.referral.reward.source.available": "奖励可使用",
+ "workspace.referral.reward.source.applied": "奖励已使用",
+ "workspace.referral.reward.status.applied": "奖励已使用",
+ "workspace.referral.reward.status.pendingInviter": "订阅以解锁",
+ "workspace.referral.reward.status.pendingInvitee": "订阅以解锁",
+ "workspace.referral.apply.noGo": "订阅以解锁",
+ "workspace.referral.apply.preview": "查看奖励",
+ "workspace.referral.apply.action": "使用",
+ "workspace.referral.apply.confirmTitle": "使用奖励",
+ "workspace.referral.apply.confirmBody": "使用 {{amount}} 抵扣当前工作区的用量。",
+ "workspace.referral.apply.confirmAction": "使用",
+
+ "download.title": "OpenCode | 下载",
+ "download.meta.description": "下载适用于 macOS, Windows, 和 Linux 的 OpenCode",
+ "download.hero.title": "下载 OpenCode",
+ "download.hero.subtitle": "适用于 macOS, Windows, 和 Linux 的 Beta 版",
+ "download.hero.button": "下载 {{os}} 版",
+ "download.section.terminal": "OpenCode 终端",
+ "download.section.desktop": "OpenCode 桌面版 (Beta)",
+ "download.section.extensions": "OpenCode 扩展",
+ "download.section.integrations": "OpenCode 集成",
+ "download.action.download": "下载",
+ "download.action.install": "安装",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "不一定,但可能需要。如果您想将 OpenCode 连接到付费提供商,您需要 AI 订阅,尽管您可以配合",
+ "download.faq.a3.localLink": "本地模型",
+ "download.faq.a3.afterLocal.beforeZen": "免费使用。虽然我们鼓励用户使用",
+ "download.faq.a3.afterZen": ",但 OpenCode 支持所有主流提供商,如 OpenAI, Anthropic, xAI 等。",
+
+ "download.faq.a5.p1": "OpenCode 是 100% 免费使用的。",
+ "download.faq.a5.p2.beforeZen":
+ "任何额外费用都来自您对模型提供商的订阅。虽然 OpenCode 支持任何模型提供商,但我们建议使用",
+ "download.faq.a5.p2.afterZen": "。",
+
+ "download.faq.a6.p1": "只有当您在 OpenCode 中创建分享链接时,您的数据和信息才会被存储。",
+ "download.faq.a6.p2.beforeShare": "了解更多关于",
+ "download.faq.a6.shareLink": "分享页面",
+
+ "enterprise.title": "OpenCode | 面向组织的 OpenCode 企业版解决方案",
+ "enterprise.meta.description": "联系 OpenCode 获取企业版解决方案",
+ "enterprise.hero.title": "您的代码属于您",
+ "enterprise.hero.body1":
+ "OpenCode 在您的组织内部安全运行,不存储任何数据或上下文,也没有许可限制或所有权主张。您可以先与团队开始试用,然后通过集成 SSO 和内部 AI 网关将其部署到整个组织。",
+ "enterprise.hero.body2": "告诉我们如何为您提供帮助。",
+ "enterprise.form.name.label": "全名",
+ "enterprise.form.name.placeholder": "Jeff Bezos",
+ "enterprise.form.role.label": "角色",
+ "enterprise.form.role.placeholder": "执行主席",
+ "enterprise.form.company.label": "公司",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "公司邮箱",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "电话号码",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "您想解决什么问题?",
+ "enterprise.form.message.placeholder": "我们需要帮助...",
+ "enterprise.form.send": "发送",
+ "enterprise.form.sending": "正在发送...",
+ "enterprise.form.success": "消息已发送,我们会尽快与您联系。",
+ "enterprise.form.success.submitted": "表单提交成功。",
+ "enterprise.form.error.allFieldsRequired": "所有字段均为必填项。",
+ "enterprise.form.error.invalidEmailFormat": "邮箱格式无效。",
+ "enterprise.form.error.internalServer": "内部服务器错误。",
+ "enterprise.faq.title": "常见问题",
+ "enterprise.faq.q1": "什么是 OpenCode 企业版?",
+ "enterprise.faq.a1":
+ "OpenCode 企业版专为那些希望确保代码和数据永远不离开其基础设施的组织而设计。它通过使用集中式配置,与您的 SSO 和内部 AI 网关集成来实现这一点。",
+ "enterprise.faq.q2": "如何开始使用 OpenCode 企业版?",
+ "enterprise.faq.a2":
+ "只需从您的团队内部试用开始即可。OpenCode 默认不存储您的代码或上下文数据,使得入门非常容易。然后联系我们讨论定价和实施选项。",
+ "enterprise.faq.q3": "企业版定价如何运作?",
+ "enterprise.faq.a3":
+ "我们提供按席位计费的企业定价。如果您拥有自己的 LLM 网关,我们不收取 token 使用费。如需了解更多详情,请联系我们获取基于您组织需求的定制报价。",
+ "enterprise.faq.q4": "OpenCode 企业版安全吗?",
+ "enterprise.faq.a4":
+ "是的。OpenCode 不存储您的代码或上下文数据。所有处理均在本地进行,或通过直接 API 调用您的 AI 提供商。通过集中配置和 SSO 集成,您的数据始终保留在您组织的基础设施内。",
+
+ "brand.title": "OpenCode | 品牌",
+ "brand.meta.description": "OpenCode 品牌指南",
+ "brand.heading": "品牌指南",
+ "brand.subtitle": "帮助您使用 OpenCode 品牌的资源和资产。",
+ "brand.downloadAll": "下载所有资产",
+
+ "changelog.title": "OpenCode | 更新日志",
+ "changelog.meta.description": "OpenCode 发布说明和更新日志",
+ "changelog.hero.title": "更新日志",
+ "changelog.hero.subtitle": "OpenCode 的新更新和改进",
+ "changelog.empty": "未找到更新日志条目。",
+ "changelog.viewJson": "查看 JSON",
+
+ "bench.list.title": "基准测试",
+ "bench.list.heading": "基准测试",
+ "bench.list.table.agent": "代理",
+ "bench.list.table.model": "模型",
+ "bench.list.table.score": "分数",
+ "bench.submission.error.allFieldsRequired": "所有字段均为必填项。",
+
+ "bench.detail.title": "基准测试 - {{task}}",
+ "bench.detail.notFound": "未找到任务",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "代理",
+ "bench.detail.labels.model": "模型",
+ "bench.detail.labels.task": "任务",
+ "bench.detail.labels.repo": "仓库",
+ "bench.detail.labels.from": "来源",
+ "bench.detail.labels.to": "目标",
+ "bench.detail.labels.prompt": "提示词",
+ "bench.detail.labels.commit": "Commit",
+ "bench.detail.labels.averageDuration": "平均耗时",
+ "bench.detail.labels.averageScore": "平均分数",
+ "bench.detail.labels.averageCost": "平均成本",
+ "bench.detail.labels.summary": "摘要",
+ "bench.detail.labels.runs": "运行次数",
+ "bench.detail.labels.score": "分数",
+ "bench.detail.labels.base": "基础",
+ "bench.detail.labels.penalty": "惩罚",
+ "bench.detail.labels.weight": "权重",
+ "bench.detail.table.run": "运行",
+ "bench.detail.table.score": "分数 (基础 - 惩罚)",
+ "bench.detail.table.cost": "成本",
+ "bench.detail.table.duration": "耗时",
+ "bench.detail.run.title": "运行 {{n}}",
+ "bench.detail.rawJson": "原始 JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/i18n/zht.ts b/packages/console/app/src/i18n/zht.ts
new file mode 100644
index 0000000..62be01c
--- /dev/null
+++ b/packages/console/app/src/i18n/zht.ts
@@ -0,0 +1,796 @@
+import type { Dict } from "./en"
+import { dict as en } from "./en"
+
+export const dict = {
+ ...en,
+ "nav.github": "GitHub",
+ "nav.docs": "文件",
+ "nav.changelog": "更新日誌",
+ "nav.discord": "Discord",
+ "nav.x": "X",
+ "nav.enterprise": "企業",
+ "nav.zen": "Zen",
+ "nav.login": "登入",
+ "nav.free": "下載",
+ "nav.home": "首頁",
+ "nav.openMenu": "開啟選單",
+ "nav.getStartedFree": "免費開始使用",
+ "nav.logoAlt": "OpenCode",
+
+ "nav.context.copyLogo": "複製標誌(SVG)",
+ "nav.context.copyWordmark": "複製字標(SVG)",
+ "nav.context.brandAssets": "品牌資產",
+
+ "footer.github": "GitHub",
+ "footer.docs": "文件",
+ "footer.changelog": "更新日誌",
+ "footer.feishu": "飞书",
+ "footer.discord": "Discord",
+ "footer.x": "X",
+
+ "legal.brand": "品牌",
+ "legal.privacy": "隱私",
+ "legal.terms": "條款",
+
+ "email.title": "第一時間獲取我們發布新產品的消息",
+ "email.subtitle": "加入候補名單,搶先體驗。",
+ "email.placeholder": "電子郵件地址",
+ "email.subscribe": "訂閱",
+ "email.success": "就差一步,請查收你的信箱並確認電子郵件地址",
+
+ "notFound.title": "找不到頁面 | OpenCode",
+ "notFound.heading": "404 - 找不到頁面",
+ "notFound.home": "首頁",
+ "notFound.docs": "文件",
+ "notFound.github": "GitHub",
+ "notFound.discord": "Discord",
+ "notFound.logoLightAlt": "opencode 淺色標誌",
+ "notFound.logoDarkAlt": "opencode 深色標誌",
+
+ "user.logout": "登出",
+
+ "auth.callback.error.codeMissing": "找不到授權碼。",
+
+ "workspace.select": "選取工作區",
+ "workspace.createNew": "+ 建立新工作區",
+ "workspace.modal.title": "建立新工作區",
+ "workspace.modal.placeholder": "輸入工作區名稱",
+
+ "common.cancel": "取消",
+ "common.creating": "正在建立...",
+ "common.create": "建立",
+
+ "common.videoUnsupported": "你的瀏覽器不支援 video 標籤。",
+ "common.figure": "圖 {{n}}.",
+ "common.faq": "常見問題",
+ "common.learnMore": "了解更多",
+
+ "error.invalidPlan": "無效的方案",
+ "error.workspaceRequired": "需要工作區 ID",
+ "error.alreadySubscribed": "此工作區已有訂閱",
+ "error.limitRequired": "需要設定限額。",
+ "error.monthlyLimitInvalid": "請設定有效的每月限額。",
+ "error.workspaceNameRequired": "需要工作區名稱。",
+ "error.nameTooLong": "名稱長度不能超過 255 個字元。",
+ "error.emailRequired": "需要電子郵件",
+ "error.roleRequired": "需要角色",
+ "error.idRequired": "需要 ID",
+ "error.nameRequired": "需要名稱",
+ "error.providerRequired": "需要供應商",
+ "error.apiKeyRequired": "需要 API 金鑰",
+ "error.modelRequired": "需要模型",
+ "error.reloadAmountMin": "儲值金額必須至少為 ${{amount}}",
+ "error.reloadTriggerMin": "餘額觸發門檻必須至少為 ${{amount}}",
+
+ "app.meta.description": "OpenCode - 開源編碼代理。",
+
+ "home.title": "OpenCode | 開源 AI 編碼代理",
+
+ "temp.title": "OpenCode | 專為終端打造的 AI 編碼代理",
+ "temp.hero.title": "專為終端打造的 AI 編碼代理",
+ "temp.zen": "OpenCode Zen",
+ "temp.getStarted": "開始使用",
+ "temp.feature.native.title": "原生 TUI",
+ "temp.feature.native.body": "響應式、原生、可自訂主題的終端介面",
+ "temp.feature.zen.beforeLink": "",
+ "temp.feature.zen.link": "精選模型列表",
+ "temp.feature.zen.afterLink": "由 OpenCode 提供",
+ "temp.feature.models.beforeLink": "透過",
+ "temp.feature.models.afterLink": "支援 75+ 家 LLM 供應商,包括本地模型",
+ "temp.screenshot.caption": "使用 tokyonight 主題的 OpenCode TUI",
+ "temp.screenshot.alt": "使用 tokyonight 主題的 OpenCode TUI",
+ "temp.logoLightAlt": "opencode 淺色標誌",
+ "temp.logoDarkAlt": "opencode 深色標誌",
+
+ "home.banner.badge": "新",
+ "home.banner.text": "桌面應用已推出 Beta",
+ "home.banner.platforms": "支援 macOS、Windows 與 Linux",
+ "home.banner.downloadNow": "立即下載",
+ "home.banner.downloadBetaNow": "立即下載桌面 Beta 版",
+
+ "home.hero.title": "開源 AI 編碼代理",
+ "home.hero.subtitle.a": "內建免費模型,或連接任意供應商的任意模型,",
+ "home.hero.subtitle.b": "包括 Claude、GPT、Gemini 等。",
+
+ "home.install.ariaLabel": "安裝選項",
+
+ "home.what.title": "什麼是 OpenCode?",
+ "home.what.body": "OpenCode 是一個開源代理,幫助你在終端、IDE 或桌面端編寫程式碼。",
+ "home.what.lsp.title": "支援 LSP",
+ "home.what.lsp.body": "為 LLM 自動載入合適的 LSP",
+ "home.what.multiSession.title": "多工作階段",
+ "home.what.multiSession.body": "在同一專案中平行啟動多個代理",
+ "home.what.shareLinks.title": "分享連結",
+ "home.what.shareLinks.body": "將任意階段的連結分享給他人供參考或除錯",
+ "home.what.copilot.title": "GitHub Copilot",
+ "home.what.copilot.body": "使用 GitHub 登入以使用你的 Copilot 帳號",
+ "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+ "home.what.chatgptPlus.body": "使用 OpenAI 登入以使用你的 ChatGPT Plus 或 Pro 帳號",
+ "home.what.anyModel.title": "任意模型",
+ "home.what.anyModel.body": "透過 Models.dev 連接 75+ 家 LLM 供應商,包括本地模型",
+ "home.what.anyEditor.title": "任意編輯器",
+ "home.what.anyEditor.body": "可作為終端介面、桌面應用程式與 IDE 擴充功能使用",
+ "home.what.readDocs": "閱讀文件",
+
+ "home.growth.title": "開源 AI 編碼代理",
+ "home.growth.body":
+ "擁有超過 {{stars}} 個 GitHub Star、{{contributors}} 位貢獻者以及超過 {{commits}} 次提交,OpenCode 每月被超過 {{monthlyUsers}} 名開發者使用並信賴。",
+ "home.growth.githubStars": "GitHub Star",
+ "home.growth.contributors": "貢獻者",
+ "home.growth.monthlyDevs": "每月活躍開發者",
+
+ "home.privacy.title": "隱私優先",
+ "home.privacy.body": "OpenCode 不儲存你的程式碼或上下文資料,因此可以在注重隱私的環境中運作。",
+ "home.privacy.learnMore": "了解更多關於",
+ "home.privacy.link": "隱私",
+
+ "home.faq.q1": "什麼是 OpenCode?",
+ "home.faq.a1":
+ "OpenCode 是一個開源代理,幫助你使用任意 AI 模型編寫並執行程式碼。它提供終端介面、桌面應用程式或 IDE 擴充功能。",
+ "home.faq.q2": "如何使用 OpenCode?",
+ "home.faq.a2.before": "最簡單的方式是先閱讀",
+ "home.faq.a2.link": "入門介紹",
+ "home.faq.q3": "使用 OpenCode 需要額外的 AI 訂閱嗎?",
+ "home.faq.a3.p1": "不一定。OpenCode 自帶一組免費模型,無需建立帳號即可使用。",
+ "home.faq.a3.p2.beforeZen": "此外,你可以透過建立",
+ "home.faq.a3.p2.afterZen": "帳號使用常見的編碼模型。",
+ "home.faq.a3.p3": "我們鼓勵使用 Zen,但 OpenCode 也支援 OpenAI、Anthropic、xAI 等主流供應商。",
+ "home.faq.a3.p4.beforeLocal": "你還可以連接你的",
+ "home.faq.a3.p4.localLink": "本地模型",
+ "home.faq.q4": "可以使用我現有的 AI 訂閱嗎?",
+ "home.faq.a4.p1":
+ "可以。OpenCode 支援主流供應商的訂閱方案,包括 Claude Pro/Max、ChatGPT Plus/Pro 與 GitHub Copilot。",
+ "home.faq.q5": "OpenCode 只能在終端中使用嗎?",
+ "home.faq.a5.beforeDesktop": "不再是了!OpenCode 現在也提供",
+ "home.faq.a5.desktop": "桌面端",
+ "home.faq.a5.and": "與",
+ "home.faq.a5.web": "網頁端",
+ "home.faq.q6": "OpenCode 價格如何?",
+ "home.faq.a6": "OpenCode 100% 免費使用。它也自帶一組免費模型。如果你連接其他供應商,可能會產生額外費用。",
+ "home.faq.q7": "資料與隱私怎麼辦?",
+ "home.faq.a7.p1": "僅當你使用我們的免費模型或建立可分享連結時,才會儲存你的資料與資訊。",
+ "home.faq.a7.p2.beforeModels": "了解更多關於",
+ "home.faq.a7.p2.modelsLink": "我們的模型",
+ "home.faq.a7.p2.and": "與",
+ "home.faq.a7.p2.shareLink": "分享頁面",
+ "home.faq.q8": "OpenCode 是開源的嗎?",
+ "home.faq.a8.p1": "是的,OpenCode 完全開源。原始碼公開在",
+ "home.faq.a8.p2": "並採用",
+ "home.faq.a8.mitLicense": "MIT 授權條款",
+ "home.faq.a8.p3": ",意味著任何人都可以使用、修改或貢獻。社群中的任何人都可以提交 issue、pull requests 並擴充功能。",
+
+ "home.zenCta.title": "存取可靠且最佳化的編碼代理模型",
+ "home.zenCta.body":
+ "Zen 提供一組精選的 AI 模型,這些模型是 OpenCode 為了編碼代理專門測試與評測過的。無需擔心不同供應商之間效能與品質參差不齊,使用經過驗證的模型即可。",
+ "home.zenCta.link": "了解 Zen",
+
+ "zen.title": "OpenCode Zen | 專為編碼代理精選的可靠最佳化模型",
+ "zen.hero.title": "專為編碼代理提供的可靠最佳化模型",
+ "zen.hero.body":
+ "Zen 提供一組精選的 AI 模型,這些模型是 OpenCode 為了編碼代理專門測試與評測過的。無需擔心效能與品質參差不齊,使用經過驗證的模型即可。",
+
+ "zen.faq.q1": "什麼是 OpenCode Zen?",
+ "zen.faq.a1": "Zen 是由 OpenCode 團隊打造、專為編碼代理測試與評測的 AI 模型精選集合。",
+ "zen.faq.q2": "是什麼讓 Zen 更準確?",
+ "zen.faq.a2": "Zen 只提供專為編碼代理測試與評測的模型。你不會用奶油刀切牛排,也別用糟糕的模型來寫程式。",
+ "zen.faq.q3": "Zen 更便宜嗎?",
+ "zen.faq.a3":
+ "Zen 不以營利為目的。Zen 會把模型供應商的成本原樣轉給你。Zen 的使用量越高,OpenCode 就越能談到更好的價格並把優惠讓利給你。",
+ "zen.faq.q4": "Zen 費用是多少?",
+ "zen.faq.a4.p1.beforePricing": "Zen",
+ "zen.faq.a4.p1.pricingLink": "按請求付費",
+ "zen.faq.a4.p1.afterPricing": "且零加價,因此你支付的就是模型供應商的原價。",
+ "zen.faq.a4.p2.beforeAccount": "總費用取決於使用量,你可以在",
+ "zen.faq.a4.p2.accountLink": "帳戶中設定每月支出上限",
+ "zen.faq.a4.p3": "為了覆蓋成本,OpenCode 只會收取很小的支付處理費:每次儲值 $20 會額外收取 $1.23。",
+ "zen.faq.q5": "資料與隱私如何?",
+ "zen.faq.a5.beforeExceptions": "所有 Zen 模型都託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有",
+ "zen.faq.a5.exceptionsLink": "以下例外",
+ "zen.faq.q6": "我可以設定支出上限嗎?",
+ "zen.faq.a6": "可以,你可以在帳戶中設定每月支出上限。",
+ "zen.faq.q7": "我可以取消嗎?",
+ "zen.faq.a7": "可以,你可以隨時停用計費並使用剩餘餘額。",
+ "zen.faq.q8": "我可以在其他編碼代理中使用 Zen 嗎?",
+ "zen.faq.a8":
+ "Zen 與 OpenCode 搭配得很好,但你也可以在任何代理中使用 Zen。請在你偏好的編碼代理中按照設定說明進行配置。",
+
+ "zen.cta.start": "開始使用 Zen",
+ "zen.pricing.title": "儲值 $20 即用即付餘額",
+ "zen.pricing.fee": "(+$1.23 刷卡手續費)",
+ "zen.pricing.body": "可與任何代理一起使用。設定每月支出限額。隨時取消。",
+ "zen.problem.title": "Zen 正在解決什麼問題?",
+ "zen.problem.body":
+ "可用的模型有很多,但只有少數可以與編碼代理配合良好。大多數供應商以不同的方式配置它們,導致結果參差不齊。",
+ "zen.problem.subtitle": "我們正在為所有人解決此問題,而不僅僅是 OpenCode 使用者。",
+ "zen.problem.item1": "測試選定的模型並諮詢其團隊",
+ "zen.problem.item2": "與供應商合作以確保正確交付",
+ "zen.problem.item3": "對我們推薦的所有模型-供應商組合進行基準測試",
+ "zen.how.title": "Zen 如何運作",
+ "zen.how.body": "雖然我們建議你將 Zen 與 OpenCode 一起使用,但你可以將 Zen 與任何代理一起使用。",
+ "zen.how.step1.title": "註冊並儲值 $20 餘額",
+ "zen.how.step1.beforeLink": "遵循",
+ "zen.how.step1.link": "設定說明",
+ "zen.how.step2.title": "使用 Zen 並享有透明定價",
+ "zen.how.step2.link": "按請求付費",
+ "zen.how.step2.afterLink": "零加價",
+ "zen.how.step3.title": "自動儲值",
+ "zen.how.step3.body": "當你的餘額達到 $5 時,我們會自動儲值 $20",
+ "zen.privacy.title": "你的隱私對我們很重要",
+ "zen.privacy.beforeExceptions": "所有 Zen 模型均在美國託管。供應商遵循零留存政策,不會將你的資料用於模型訓練,並且有",
+ "zen.privacy.exceptionsLink": "以下例外情況",
+
+ "go.title": "OpenCode Go | 低成本全民編碼模型",
+ "go.meta.description":
+ "Go 首月 $5,之後 $10/月,提供對 GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 和 DeepSeek V4 Flash 的 5 小時充裕請求額度。",
+ "go.hero.title": "低成本全民編碼模型",
+ "go.hero.body":
+ "Go 將代理編碼帶給全世界的程式設計師。提供寬裕的限額以及對最強大開源模型的穩定存取,讓你可以使用強大的代理進行構建,而無需擔心成本或可用性。",
+
+ "go.cta.start": "訂閱 Go",
+ "go.cta.template": "{{text}} {{price}}",
+ "go.cta.text": "訂閱 Go",
+ "go.cta.price": "$10/月",
+ "go.cta.promo": "首月 $5",
+ "go.pricing.body": "可搭配任何代理使用。首月 $5,之後 $10/月。如有需要可儲值。隨時取消。",
+ "go.graph.free": "免費",
+ "go.graph.freePill": "Big Pickle 與免費模型",
+ "go.graph.go": "Go",
+ "go.graph.label": "每 5 小時請求數",
+ "go.graph.usageLimits": "使用限制",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "每 5 小時請求數:{{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "前 Terminal Products CEO",
+ "go.testimonials.dax.quoteAfter": "改變了我的生活,這絕對是不二之選。",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "前 SEED、Melt、Pop、Dapt、Cadmus 與 ViewPoint 創辦人",
+ "go.testimonials.jay.quoteBefore": "我們團隊中 5 個人有 4 個人喜歡使用",
+ "go.testimonials.jay.quoteAfter": "。",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "前 AWS Hero",
+ "go.testimonials.adam.quoteBefore": "我強烈推薦",
+ "go.testimonials.adam.quoteAfter": "。認真說,真的很好用。",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "前 Laravel 設計總監",
+ "go.testimonials.david.quoteBefore": "有了",
+ "go.testimonials.david.quoteAfter": ",我知道所有模型都經過測試並且完美適用於編碼代理。",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "前 Nvidia 實習生(4 次)",
+ "go.testimonials.frank.quote": "我希望我還在 Nvidia。",
+ "go.problem.title": "Go 正在解決什麼問題?",
+ "go.problem.body":
+ "我們致力於將 OpenCode 體驗帶給盡可能多的人。OpenCode Go 是一款低成本訂閱服務:首月 $5,之後 $10/月。它提供充裕的額度,並讓您能可靠地使用最強大的開源模型。",
+ "go.problem.subtitle": " ",
+ "go.problem.item1": "低成本訂閱定價",
+ "go.problem.item2": "寬裕的限額與穩定存取",
+ "go.problem.item3": "專為盡可能多的程式設計師打造",
+ "go.problem.item4":
+ "包含 GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 與 DeepSeek V4 Flash",
+ "go.how.title": "Go 如何運作",
+ "go.how.body": "Go 起價為首月 $5,之後 $10/月。您可以將其與 OpenCode 或任何代理搭配使用。",
+ "go.how.step1.title": "建立帳號",
+ "go.how.step1.beforeLink": "遵循",
+ "go.how.step1.link": "設定說明",
+ "go.how.step2.title": "訂閱 Go",
+ "go.how.step2.link": "首月 $5",
+ "go.how.step2.afterLink": "之後 $10/月,額度充裕",
+ "go.how.step3.title": "開始編碼",
+ "go.how.step3.body": "穩定存取開源模型",
+ "go.privacy.title": "你的隱私對我們很重要",
+ "go.privacy.body": "該方案主要面向國際用戶設計,模型託管在美國、歐盟和新加坡,以確保全球穩定存取。",
+ "go.privacy.contactAfter": "如果你有任何問題。",
+ "go.privacy.beforeExceptions": "Go 模型託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有",
+ "go.privacy.exceptionsLink": "以下例外",
+ "go.faq.q1": "什麼是 OpenCode Go?",
+ "go.faq.a1": "Go 是一個低成本訂閱方案,讓你穩定存取強大的開源模型以進行代理編碼。",
+ "go.faq.q2": "Go 包含哪些模型?",
+ "go.faq.a2": "Go 包含下方列出的模型,提供充足的額度與穩定的存取。",
+ "go.faq.q3": "Go 與 Zen 一樣嗎?",
+ "go.faq.a3":
+ "不。Zen 是按量付費,而 Go 首月 $5,之後 $10/月,提供充裕的額度,並可可靠地存取 GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 和 DeepSeek V4 Flash 等開源模型。",
+ "go.faq.q4": "Go 費用是多少?",
+ "go.faq.a4.p1.beforePricing": "Go 費用為",
+ "go.faq.a4.p1.pricingLink": "首月 $5",
+ "go.faq.a4.p1.afterPricing": "之後 $10/月,額度充裕。",
+ "go.faq.a4.p2.beforeAccount": "你可以在你的",
+ "go.faq.a4.p2.accountLink": "帳戶",
+ "go.faq.a4.p3": "中管理訂閱。隨時取消。",
+ "go.faq.q5": "資料與隱私怎麼辦?",
+ "go.faq.a5.body":
+ "該方案主要面向國際用戶設計,模型託管在美國、歐盟和新加坡,以確保全球穩定存取。我們的供應商遵循零留存政策,不會將你的資料用於模型訓練。",
+ "go.faq.a5.beforeExceptions": "Go 模型託管在美國。供應商遵循零留存政策,不會將你的資料用於模型訓練,但有",
+ "go.faq.a5.exceptionsLink": "以下例外",
+ "go.faq.q6": "我可以儲值額度嗎?",
+ "go.faq.a6": "如果你需要更多使用量,可以在帳戶中儲值額度。",
+ "go.faq.q7": "我可以取消嗎?",
+ "go.faq.a7": "可以,你可以隨時取消。",
+ "go.faq.q8": "我可以在其他編碼代理中使用 Go 嗎?",
+ "go.faq.a8": "可以,你可以將 Go 與任何代理一起使用。請在你偏好的編碼代理中按照設定說明進行配置。",
+
+ "go.faq.q9": "免費模型與 Go 有什麼區別?",
+ "go.faq.a9":
+ "免費模型包括 Big Pickle 以及當時可用的促銷模型,配額為 200 次請求/天。Go 包括 GLM-5.1、GLM-5、Kimi K2.5、Kimi K2.6、MiMo-V2.5-Pro、MiMo-V2.5、Qwen3.7 Max、Qwen3.7 Plus、Qwen3.6 Plus、MiniMax M2.5、MiniMax M2.7、MiniMax M3、DeepSeek V4 Pro 與 DeepSeek V4 Flash,並在滾動視窗(5 小時、每週和每月)內執行更高的請求配額,大約相當於每 5 小時 $12、每週 $30 和每月 $60(實際請求數因模型和使用情況而異)。",
+
+ "zen.api.error.rateLimitExceeded": "超出頻率限制。請稍後再試。",
+ "zen.api.error.modelNotSupported": "不支援模型 {{model}}",
+ "zen.api.error.modelFormatNotSupported": "模型 {{model}} 不支援格式 {{format}}",
+ "zen.api.error.noProviderAvailable": "無可用的供應商",
+ "zen.api.error.providerNotSupported": "不支援供應商 {{provider}}",
+ "zen.api.error.missingApiKey": "缺少 API 金鑰。",
+ "zen.api.error.invalidApiKey": "無效的 API 金鑰。",
+ "zen.api.error.subscriptionQuotaExceeded": "超出訂閱配額。請在 {{retryIn}} 後重試。",
+ "zen.api.error.goSubscriptionRollingLimitExceeded":
+ "已達 5 小時使用上限,將在 {{retryIn}} 後重置。若要立即繼續使用此模型,請從可用餘額啟用使用量:{{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+ "已達每週使用上限,將在 {{retryIn}} 後重置。若要立即繼續使用此模型,請從可用餘額啟用使用量:{{consoleGoUrl}}",
+ "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+ "已達每月使用上限,將在 {{retryIn}} 後重置。若要立即繼續使用此模型,請從可用餘額啟用使用量:{{consoleGoUrl}}",
+ "zen.api.error.noPaymentMethod": "無付款方式。請在此處新增付款方式:{{billingUrl}}",
+ "zen.api.error.insufficientBalance": "餘額不足。請在此處管理你的帳務:{{billingUrl}}",
+ "zen.api.error.workspaceMonthlyLimitReached":
+ "你的工作區已達到每月支出限額 ${{amount}}。請在此處管理你的限額:{{billingUrl}}",
+ "zen.api.error.userMonthlyLimitReached": "你已達到每月支出限額 ${{amount}}。請在此處管理你的限額:{{membersUrl}}",
+ "zen.api.error.modelDisabled": "模型已停用",
+ "zen.api.error.trialEnded": "{{model}} 的限免活动已結束。您可以訂閱 OpenCode Go 繼續使用該模型 - {{link}}",
+
+ "black.meta.title": "OpenCode Black | 存取全球最佳編碼模型",
+ "black.meta.description": "透過 OpenCode Black 訂閱方案存取 Claude、GPT、Gemini 等模型。",
+ "black.hero.title": "存取全球最佳編碼模型",
+ "black.hero.subtitle": "包括 Claude、GPT、Gemini 等",
+ "black.title": "OpenCode Black | 定價",
+ "black.paused": "Black 訂閱暫時暫停註冊。",
+ "black.plan.icon20": "Black 20 方案",
+ "black.plan.icon100": "Black 100 方案",
+ "black.plan.icon200": "Black 200 方案",
+ "black.plan.multiplier100": "比 Black 20 多 5 倍使用量",
+ "black.plan.multiplier200": "比 Black 20 多 20 倍使用量",
+ "black.price.perMonth": "每月",
+ "black.price.perPersonBilledMonthly": "每人每月計費",
+ "black.terms.1": "你的訂閱不會立即開始",
+ "black.terms.2": "你將被加入候補名單並在不久後啟用",
+ "black.terms.3": "你的卡片僅在訂閱啟用時才會扣款",
+ "black.terms.4": "適用使用限制,高度自動化的使用可能會更快達到限制",
+ "black.terms.5": "訂閱僅限個人使用,團隊請聯繫企業版",
+ "black.terms.6": "未來可能會調整限制或終止方案",
+ "black.terms.7": "隨時取消你的訂閱",
+ "black.action.continue": "繼續",
+ "black.finePrint.beforeTerms": "顯示價格未包含適用稅項",
+ "black.finePrint.terms": "服務條款",
+ "black.workspace.title": "OpenCode Black | 選擇工作區",
+ "black.workspace.selectPlan": "為此方案選擇一個工作區",
+ "black.workspace.name": "工作區 {{n}}",
+ "black.subscribe.title": "訂閱 OpenCode Black",
+ "black.subscribe.paymentMethod": "付款方式",
+ "black.subscribe.loadingPaymentForm": "正在載入付款表單...",
+ "black.subscribe.selectWorkspaceToContinue": "選擇一個工作區以繼續",
+ "black.subscribe.failurePrefix": "噢不!",
+ "black.subscribe.error.generic": "發生錯誤",
+ "black.subscribe.error.invalidPlan": "無效的方案",
+ "black.subscribe.error.workspaceRequired": "需要工作區 ID",
+ "black.subscribe.error.alreadySubscribed": "此工作區已有訂閱",
+ "black.subscribe.processing": "處理中...",
+ "black.subscribe.submit": "訂閱 ${{plan}}",
+ "black.subscribe.form.chargeNotice": "你僅在訂閱啟用時才會被扣款",
+ "black.subscribe.success.title": "你已在 OpenCode Black 候補名單上",
+ "black.subscribe.success.subscriptionPlan": "訂閱方案",
+ "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+ "black.subscribe.success.amount": "金額",
+ "black.subscribe.success.amountValue": "${{plan}} 每月",
+ "black.subscribe.success.paymentMethod": "付款方式",
+ "black.subscribe.success.dateJoined": "加入日期",
+ "black.subscribe.success.chargeNotice": "你的卡片將在訂閱啟用時扣款",
+
+ "workspace.nav.zen": "Zen",
+ "workspace.nav.go": "Go",
+ "workspace.nav.usage": "使用量",
+ "workspace.nav.apiKeys": "API 金鑰",
+ "workspace.nav.members": "成員",
+ "workspace.nav.billing": "帳務",
+ "workspace.nav.settings": "設定",
+
+ "workspace.home.banner.beforeLink": "編碼代理的可靠最佳化模型。",
+ "workspace.lite.banner.beforeLink": "低成本編碼模型,人人可用。",
+ "workspace.home.billing.loading": "載入中...",
+ "workspace.home.billing.enable": "啟用帳務",
+ "workspace.home.billing.currentBalance": "目前餘額",
+
+ "workspace.newUser.feature.tested.title": "經過測試與驗證的模型",
+ "workspace.newUser.feature.tested.body": "我們專門針對編碼代理對模型進行了基準測試和測試,以確保最佳效能。",
+ "workspace.newUser.feature.quality.title": "最高品質",
+ "workspace.newUser.feature.quality.body": "存取配置為最佳效能的模型 - 無需降級或路由到更便宜的供應商。",
+ "workspace.newUser.feature.lockin.title": "無綁定",
+ "workspace.newUser.feature.lockin.body":
+ "將 Zen 與任何編碼代理結合使用,並在需要時隨時使用 OpenCode 連接其他供應商。",
+ "workspace.newUser.copyApiKey": "複製 API 金鑰",
+ "workspace.newUser.copyKey": "複製金鑰",
+ "workspace.newUser.copied": "已複製!",
+ "workspace.newUser.step.enableBilling": "啟用帳務",
+ "workspace.newUser.step.login.before": "執行",
+ "workspace.newUser.step.login.after": "並選擇 OpenCode",
+ "workspace.newUser.step.pasteKey": "貼上你的 API 金鑰",
+ "workspace.newUser.step.models.before": "啟動 OpenCode 並執行",
+ "workspace.newUser.step.models.after": "以選擇模型",
+
+ "workspace.models.title": "模型",
+ "workspace.models.subtitle.beforeLink": "管理工作區成員可以存取哪些模型。",
+ "workspace.models.table.model": "模型",
+ "workspace.models.table.enabled": "啟用",
+
+ "workspace.providers.title": "自帶金鑰",
+ "workspace.providers.subtitle": "設定你自己的 AI 供應商 API 金鑰。",
+ "workspace.providers.placeholder": "輸入 {{provider}} API 金鑰({{prefix}}...)",
+ "workspace.providers.configure": "設定",
+ "workspace.providers.edit": "編輯",
+ "workspace.providers.delete": "刪除",
+ "workspace.providers.saving": "儲存中...",
+ "workspace.providers.save": "儲存",
+ "workspace.providers.table.provider": "供應商",
+ "workspace.providers.table.apiKey": "API 金鑰",
+
+ "workspace.usage.title": "使用紀錄",
+ "workspace.usage.subtitle": "最近的 API 使用情況與成本。",
+ "workspace.usage.empty": "進行第一次 API 呼叫即可開始。",
+ "workspace.usage.table.date": "日期",
+ "workspace.usage.table.model": "模型",
+ "workspace.usage.table.input": "輸入",
+ "workspace.usage.table.output": "輸出",
+ "workspace.usage.table.cost": "成本",
+ "workspace.usage.table.session": "會話",
+ "workspace.usage.breakdown.input": "輸入",
+ "workspace.usage.breakdown.cacheRead": "快取讀取",
+ "workspace.usage.breakdown.cacheWrite": "快取寫入",
+ "workspace.usage.breakdown.output": "輸出",
+ "workspace.usage.breakdown.reasoning": "推理",
+ "workspace.usage.subscription": "Black (${{amount}})",
+ "workspace.usage.lite": "Go (${{amount}})",
+ "workspace.usage.byok": "BYOK (${{amount}})",
+
+ "workspace.cost.title": "成本",
+ "workspace.cost.subtitle": "按模型細分的使用成本。",
+ "workspace.cost.allModels": "所有模型",
+ "workspace.cost.allKeys": "所有金鑰",
+ "workspace.cost.deletedSuffix": "(已刪除)",
+ "workspace.cost.empty": "所選期間沒有可用的使用資料。",
+ "workspace.cost.subscriptionShort": "訂",
+
+ "workspace.keys.title": "API 金鑰",
+ "workspace.keys.subtitle": "管理你的 API 金鑰以存取 OpenCode 服務。",
+ "workspace.keys.create": "建立 API 金鑰",
+ "workspace.keys.placeholder": "輸入金鑰名稱",
+ "workspace.keys.empty": "建立 OpenCode 閘道器 API 金鑰",
+ "workspace.keys.table.name": "名稱",
+ "workspace.keys.table.key": "金鑰",
+ "workspace.keys.table.createdBy": "建立者",
+ "workspace.keys.table.lastUsed": "最後使用",
+ "workspace.keys.copyApiKey": "複製 API 金鑰",
+ "workspace.keys.delete": "刪除",
+
+ "workspace.members.title": "成員",
+ "workspace.members.subtitle": "管理工作區成員及其權限。",
+ "workspace.members.invite": "邀請成員",
+ "workspace.members.inviting": "邀請中...",
+ "workspace.members.beta.beforeLink": "Beta 測試期間,工作區對團隊免費。",
+ "workspace.members.form.invitee": "受邀者",
+ "workspace.members.form.emailPlaceholder": "輸入電子郵件",
+ "workspace.members.form.role": "角色",
+ "workspace.members.form.monthlyLimit": "每月支出限額",
+ "workspace.members.noLimit": "無限制",
+ "workspace.members.noLimitLowercase": "無限制",
+ "workspace.members.invited": "已邀請",
+ "workspace.members.edit": "編輯",
+ "workspace.members.delete": "刪除",
+ "workspace.members.saving": "儲存中...",
+ "workspace.members.save": "儲存",
+ "workspace.members.table.email": "電子郵件",
+ "workspace.members.table.role": "角色",
+ "workspace.members.table.monthLimit": "月限額",
+ "workspace.members.role.admin": "管理員",
+ "workspace.members.role.adminDescription": "可以管理模型、成員和帳務",
+ "workspace.members.role.member": "成員",
+ "workspace.members.role.memberDescription": "只能為自己生成 API 金鑰",
+
+ "workspace.settings.title": "設定",
+ "workspace.settings.subtitle": "更新你的工作區名稱與偏好設定。",
+ "workspace.settings.workspaceName": "工作區名稱",
+ "workspace.settings.defaultName": "預設",
+ "workspace.settings.updating": "更新中...",
+ "workspace.settings.save": "儲存",
+ "workspace.settings.edit": "編輯",
+
+ "workspace.billing.title": "帳務",
+ "workspace.billing.subtitle.beforeLink": "管理付款方式。",
+ "workspace.billing.contactUs": "聯絡我們",
+ "workspace.billing.subtitle.afterLink": "如果你有任何問題。",
+ "workspace.billing.currentBalance": "目前餘額",
+ "workspace.billing.add": "儲值 $",
+ "workspace.billing.enterAmount": "輸入金額",
+ "workspace.billing.loading": "載入中...",
+ "workspace.billing.addAction": "儲值",
+ "workspace.billing.addBalance": "儲值餘額",
+ "workspace.billing.alipay": "支付寶",
+ "workspace.billing.wechat": "微信支付",
+ "workspace.billing.linkedToStripe": "已連結 Stripe",
+ "workspace.billing.manage": "管理",
+ "workspace.billing.enable": "啟用帳務",
+
+ "workspace.monthlyLimit.title": "每月限額",
+ "workspace.monthlyLimit.subtitle": "為你的帳戶設定每月使用限額。",
+ "workspace.monthlyLimit.placeholder": "50",
+ "workspace.monthlyLimit.setting": "設定中...",
+ "workspace.monthlyLimit.set": "設定",
+ "workspace.monthlyLimit.edit": "編輯限額",
+ "workspace.monthlyLimit.noLimit": "未設定使用限額。",
+ "workspace.monthlyLimit.currentUsage.beforeMonth": "目前",
+ "workspace.monthlyLimit.currentUsage.beforeAmount": "的使用量為 $",
+
+ "workspace.redeem.title": "兌換優惠券",
+ "workspace.redeem.subtitle": "兌換優惠碼以領取儲值額度或權益。",
+ "workspace.redeem.placeholder": "輸入優惠碼",
+ "workspace.redeem.redeem": "兌換",
+ "workspace.redeem.redeeming": "兌換中...",
+ "workspace.redeem.success": "優惠券兌換成功。",
+
+ "workspace.reload.title": "自動儲值",
+ "workspace.reload.disabled.before": "自動儲值已",
+ "workspace.reload.disabled.state": "停用",
+ "workspace.reload.disabled.after": "啟用後會在餘額偏低時自動儲值。",
+ "workspace.reload.enabled.before": "自動儲值已",
+ "workspace.reload.enabled.state": "啟用",
+ "workspace.reload.enabled.middle": "我們將自動儲值",
+ "workspace.reload.processingFee": "手續費",
+ "workspace.reload.enabled.after": "當餘額達到",
+ "workspace.reload.edit": "編輯",
+ "workspace.reload.enable": "啟用",
+ "workspace.reload.enableAutoReload": "啟用自動儲值",
+ "workspace.reload.reloadAmount": "儲值 $",
+ "workspace.reload.whenBalanceReaches": "當餘額達到 $",
+ "workspace.reload.saving": "儲存中...",
+ "workspace.reload.save": "儲存",
+ "workspace.reload.failedAt": "儲值失敗於",
+ "workspace.reload.reason": "原因:",
+ "workspace.reload.updatePaymentMethod": "請更新你的付款方式並重試。",
+ "workspace.reload.retrying": "重試中...",
+ "workspace.reload.retry": "重試",
+ "workspace.reload.error.paymentFailed": "付款失敗。",
+
+ "workspace.payments.title": "付款紀錄",
+ "workspace.payments.subtitle": "最近的付款交易。",
+ "workspace.payments.table.date": "日期",
+ "workspace.payments.table.paymentId": "付款 ID",
+ "workspace.payments.table.amount": "金額",
+ "workspace.payments.table.receipt": "收據",
+ "workspace.payments.type.credit": "信用額度",
+ "workspace.payments.type.subscription": "訂閱",
+ "workspace.payments.view": "檢視",
+
+ "workspace.black.loading": "載入中...",
+ "workspace.black.time.day": "天",
+ "workspace.black.time.days": "天",
+ "workspace.black.time.hour": "小時",
+ "workspace.black.time.hours": "小時",
+ "workspace.black.time.minute": "分鐘",
+ "workspace.black.time.minutes": "分鐘",
+ "workspace.black.time.fewSeconds": "幾秒鐘",
+ "workspace.black.subscription.title": "訂閱",
+ "workspace.black.subscription.message": "你已訂閱 OpenCode Black,費用為每月 ${{plan}}。",
+ "workspace.black.subscription.manage": "管理訂閱",
+ "workspace.black.subscription.rollingUsage": "5 小時使用量",
+ "workspace.black.subscription.weeklyUsage": "每週使用量",
+ "workspace.black.subscription.resetsIn": "重置於",
+ "workspace.black.subscription.useBalance": "達到使用限額後使用你的可用餘額",
+ "workspace.black.waitlist.title": "候補名單",
+ "workspace.black.waitlist.joined": "你已加入每月 ${{plan}} 的 OpenCode Black 方案候補名單。",
+ "workspace.black.waitlist.ready": "我們已準備好將你加入每月 ${{plan}} 的 OpenCode Black 方案。",
+ "workspace.black.waitlist.leave": "離開候補名單",
+ "workspace.black.waitlist.leaving": "離開中...",
+ "workspace.black.waitlist.left": "已離開",
+ "workspace.black.waitlist.enroll": "加入",
+ "workspace.black.waitlist.enrolling": "加入中...",
+ "workspace.black.waitlist.enrolled": "已加入",
+ "workspace.black.waitlist.enrollNote": "當你點選「加入」後,你的訂閱將立即開始,並且將從你的卡片中扣款。",
+
+ "workspace.lite.loading": "載入中...",
+ "workspace.lite.time.day": "天",
+ "workspace.lite.time.days": "天",
+ "workspace.lite.time.hour": "小時",
+ "workspace.lite.time.hours": "小時",
+ "workspace.lite.time.minute": "分鐘",
+ "workspace.lite.time.minutes": "分鐘",
+ "workspace.lite.time.fewSeconds": "幾秒",
+ "workspace.lite.subscription.message": "您已訂閱 OpenCode Go。",
+ "workspace.lite.subscription.manage": "管理訂閱",
+ "workspace.lite.subscription.rollingUsage": "滾動使用量",
+ "workspace.lite.subscription.weeklyUsage": "每週使用量",
+ "workspace.lite.subscription.monthlyUsage": "每月使用量",
+ "workspace.lite.subscription.resetsIn": "重置時間:",
+ "workspace.lite.subscription.useBalance": "達到使用限制後使用您的可用餘額",
+ "workspace.lite.subscription.selectProvider":
+ "在您的 opencode 設定中選擇「OpenCode Go」作為提供商,即可使用 Go 模型。",
+ "workspace.lite.black.message": "您目前已訂閱 OpenCode Black 或在候補名單中。若要切換至 Go,請先取消訂閱。",
+ "workspace.lite.other.message": "此工作區中的另一位成員已訂閱 OpenCode Go。每個工作區只能有一位成員訂閱。",
+ "workspace.lite.promo.description":
+ "OpenCode Go 起價為 {{price}},之後 $10/月,並提供對熱門開放編碼模型的可靠存取,同時享有充裕的使用額度。",
+ "workspace.lite.promo.price": "首月 $5",
+ "workspace.lite.promo.modelsTitle": "包含模型",
+ "workspace.lite.promo.footer":
+ "該計畫主要面向國際用戶設計,模型部署在美國、歐盟和新加坡,以確保全球範圍內的穩定存取體驗。定價和使用額度可能會根據早期用戶的使用情況和回饋持續調整與優化。",
+ "workspace.lite.promo.subscribe": "訂閱 Go",
+ "workspace.lite.promo.subscribing": "重新導向中...",
+ "workspace.lite.promo.otherMethods": "其他付款方式",
+ "workspace.lite.promo.selectMethod": "選擇付款方式",
+
+ "workspace.referral.copyLink": "複製連結",
+ "workspace.referral.copied": "已複製",
+ "workspace.referral.overview.title": "邀請朋友",
+ "workspace.referral.overview.subtitle": "朋友訂閱後,您可獲得 $5,對方也可獲得 $5。",
+ "workspace.referral.instructions.share": "分享您的推薦連結。",
+ "workspace.referral.instructions.subscribe": "朋友加入並訂閱 Go。",
+ "workspace.referral.instructions.claim": "你們都將獲得 $5 使用額度,可用於您的 Go 使用限額。",
+ "workspace.referral.rewards.title": "邀請獎勵",
+ "workspace.referral.rewards.description": "將可用的邀請點數套用至您的 Go 使用量。",
+ "workspace.referral.rewards.subtitle": "已使用 {{applied}} / {{total}} 個獎勵。",
+ "workspace.referral.rewards.empty": "暫無邀請獎勵。",
+ "workspace.referral.table.reward": "獎勵",
+ "workspace.referral.table.referral": "描述",
+ "workspace.referral.table.date": "日期",
+ "workspace.referral.reward.description.inviter": "已邀請 {{email}}",
+ "workspace.referral.reward.description.invitee": "由 {{email}} 邀請",
+ "workspace.referral.reward.action.subscribeUnlock": "訂閱以解鎖",
+ "workspace.referral.reward.action.view": "查看獎勵",
+ "workspace.referral.reward.action.applied": "獎勵已使用",
+ "workspace.referral.reward.source.pendingInviter": "等待對方訂閱",
+ "workspace.referral.reward.source.pendingInvitee": "訂閱即可解鎖獎勵",
+ "workspace.referral.reward.source.available": "獎勵可使用",
+ "workspace.referral.reward.source.applied": "獎勵已使用",
+ "workspace.referral.reward.status.applied": "獎勵已使用",
+ "workspace.referral.reward.status.pendingInviter": "訂閱以解鎖",
+ "workspace.referral.reward.status.pendingInvitee": "訂閱以解鎖",
+ "workspace.referral.apply.noGo": "訂閱以解鎖",
+ "workspace.referral.apply.preview": "查看獎勵",
+ "workspace.referral.apply.action": "使用",
+ "workspace.referral.apply.confirmTitle": "使用獎勵",
+ "workspace.referral.apply.confirmBody": "使用 {{amount}} 抵扣目前工作區的用量。",
+ "workspace.referral.apply.confirmAction": "使用",
+
+ "download.title": "OpenCode | 下載",
+ "download.meta.description": "下載適用於 macOS、Windows 與 Linux 的 OpenCode",
+ "download.hero.title": "下載 OpenCode",
+ "download.hero.subtitle": "適用於 macOS、Windows 與 Linux 的 Beta 版現已提供",
+ "download.hero.button": "下載 {{os}} 版",
+ "download.section.terminal": "OpenCode 終端",
+ "download.section.desktop": "OpenCode 桌面版(Beta)",
+ "download.section.extensions": "OpenCode 擴充功能",
+ "download.section.integrations": "OpenCode 整合",
+ "download.action.download": "下載",
+ "download.action.install": "安裝",
+
+ "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+ "download.platform.macosIntel": "macOS (Intel)",
+ "download.platform.windowsX64": "Windows (x64)",
+ "download.platform.linuxDeb": "Linux (.deb)",
+ "download.platform.linuxRpm": "Linux (.rpm)",
+
+ "download.faq.a3.beforeLocal":
+ "不一定,但很可能需要。如果你想將 OpenCode 連接到付費供應商,你需要 AI 訂閱,不過你也可以使用",
+ "download.faq.a3.localLink": "本地模型",
+ "download.faq.a3.afterLocal.beforeZen": "免費。我們也推薦使用",
+ "download.faq.a3.afterZen": ",但 OpenCode 同樣支援 OpenAI、Anthropic、xAI 等所有主流供應商。",
+
+ "download.faq.a5.p1": "OpenCode 100% 免費使用。",
+ "download.faq.a5.p2.beforeZen": "額外費用來自你對模型供應商的訂閱。雖然 OpenCode 支援任何模型供應商,但我們建議使用",
+ "download.faq.a5.p2.afterZen": "。",
+
+ "download.faq.a6.p1": "你的資料與資訊只會在你於 OpenCode 中建立可分享連結時被儲存。",
+ "download.faq.a6.p2.beforeShare": "了解更多關於",
+ "download.faq.a6.shareLink": "分享頁面",
+
+ "enterprise.title": "OpenCode | 面向組織的企業解決方案",
+ "enterprise.meta.description": "聯絡 OpenCode 取得企業解決方案",
+ "enterprise.hero.title": "你的程式碼屬於你",
+ "enterprise.hero.body1":
+ "OpenCode 在你的組織內部安全運作,不會儲存任何資料或上下文,也沒有授權限制或所有權主張。你可以先與團隊進行試用,然後透過與你的 SSO 與內部 AI 閘道器整合,將其部署到整個組織。",
+ "enterprise.hero.body2": "告訴我們能如何幫助你。",
+ "enterprise.form.name.label": "全名",
+ "enterprise.form.name.placeholder": "傑夫·貝佐斯",
+ "enterprise.form.role.label": "職稱",
+ "enterprise.form.role.placeholder": "執行董事長",
+ "enterprise.form.company.label": "公司",
+ "enterprise.form.company.placeholder": "Acme Inc",
+ "enterprise.form.email.label": "公司 Email",
+ "enterprise.form.email.placeholder": "jeff@amazon.com",
+ "enterprise.form.phone.label": "電話號碼",
+ "enterprise.form.phone.placeholder": "+1 234 567 8900",
+ "enterprise.form.message.label": "你想解決什麼問題?",
+ "enterprise.form.message.placeholder": "我們需要幫助來...",
+ "enterprise.form.send": "傳送",
+ "enterprise.form.sending": "傳送中...",
+ "enterprise.form.success": "訊息已傳送,我們會盡快與你聯絡。",
+ "enterprise.form.success.submitted": "表單已成功送出。",
+ "enterprise.form.error.allFieldsRequired": "所有欄位均為必填。",
+ "enterprise.form.error.invalidEmailFormat": "無效的電子郵件格式。",
+ "enterprise.form.error.internalServer": "內部伺服器錯誤。",
+ "enterprise.faq.title": "常見問題",
+ "enterprise.faq.q1": "什麼是 OpenCode Enterprise?",
+ "enterprise.faq.a1":
+ "OpenCode Enterprise 適用於希望確保程式碼與資料絕不離開自己基礎設施的組織。透過中央化設定,它可與你的 SSO 與內部 AI 閘道器整合,以達成此目標。",
+ "enterprise.faq.q2": "如何開始使用 OpenCode Enterprise?",
+ "enterprise.faq.a2":
+ "只要先以團隊的內部試用開始。OpenCode 預設不會儲存你的程式碼或上下文資料,所以上手非常容易。之後聯絡我們,討論定價與完整實作方案。",
+ "enterprise.faq.q3": "企業定價是如何進行的?",
+ "enterprise.faq.a3":
+ "我們提供按席位的企業定價。如果你有自己的 LLM 閘道器,我們不會對使用的 token 另外收費。更多詳情,請聯絡我們以獲得依據組織需求的客製報價。",
+ "enterprise.faq.q4": "我的資料在 OpenCode Enterprise 中是安全的嗎?",
+ "enterprise.faq.a4":
+ "是的。OpenCode 不會儲存你的程式碼或上下文資料。所有處理都會在本地或透過直接呼叫你的 AI 供應商 API 完成。透過中央化設定與 SSO 整合,你的資料會安全保留在組織的基礎設施內部。",
+
+ "brand.title": "OpenCode | 品牌",
+ "brand.meta.description": "OpenCode 品牌指南",
+ "brand.heading": "品牌指南",
+ "brand.subtitle": "協助你使用 OpenCode 品牌的資源與素材。",
+ "brand.downloadAll": "下載所有素材",
+
+ "changelog.title": "OpenCode | 更新日誌",
+ "changelog.meta.description": "OpenCode 發布說明與更新日誌",
+ "changelog.hero.title": "更新日誌",
+ "changelog.hero.subtitle": "OpenCode 的新更新與改善",
+ "changelog.empty": "找不到更新日誌項目。",
+ "changelog.viewJson": "檢視 JSON",
+
+ "bench.list.title": "評測",
+ "bench.list.heading": "評測",
+ "bench.list.table.agent": "代理",
+ "bench.list.table.model": "模型",
+ "bench.list.table.score": "分數",
+ "bench.submission.error.allFieldsRequired": "所有欄位均為必填。",
+
+ "bench.detail.title": "評測 - {{task}}",
+ "bench.detail.notFound": "找不到任務",
+ "bench.detail.na": "N/A",
+ "bench.detail.labels.agent": "代理",
+ "bench.detail.labels.model": "模型",
+ "bench.detail.labels.task": "任務",
+ "bench.detail.labels.repo": "儲存庫",
+ "bench.detail.labels.from": "起點",
+ "bench.detail.labels.to": "終點",
+ "bench.detail.labels.prompt": "提示詞",
+ "bench.detail.labels.commit": "提交",
+ "bench.detail.labels.averageDuration": "平均耗時",
+ "bench.detail.labels.averageScore": "平均分數",
+ "bench.detail.labels.averageCost": "平均成本",
+ "bench.detail.labels.summary": "摘要",
+ "bench.detail.labels.runs": "執行次數",
+ "bench.detail.labels.score": "分數",
+ "bench.detail.labels.base": "基準",
+ "bench.detail.labels.penalty": "扣分",
+ "bench.detail.labels.weight": "權重",
+ "bench.detail.table.run": "執行",
+ "bench.detail.table.score": "分數(基準 - 扣分)",
+ "bench.detail.table.cost": "成本",
+ "bench.detail.table.duration": "耗時",
+ "bench.detail.run.title": "執行 {{n}}",
+ "bench.detail.rawJson": "原始 JSON",
+} satisfies Dict
diff --git a/packages/console/app/src/lib/changelog.ts b/packages/console/app/src/lib/changelog.ts
new file mode 100644
index 0000000..93a0d42
--- /dev/null
+++ b/packages/console/app/src/lib/changelog.ts
@@ -0,0 +1,146 @@
+import { query } from "@solidjs/router"
+
+type Release = {
+ tag_name: string
+ name: string
+ body: string
+ published_at: string
+ html_url: string
+}
+
+export type HighlightMedia =
+ | { type: "video"; src: string }
+ | { type: "image"; src: string; width: string; height: string }
+
+export type HighlightItem = {
+ title: string
+ description: string
+ shortDescription?: string
+ media: HighlightMedia
+}
+
+export type HighlightGroup = {
+ source: string
+ items: HighlightItem[]
+}
+
+export type ChangelogRelease = {
+ tag: string
+ name: string
+ date: string
+ url: string
+ highlights: HighlightGroup[]
+ sections: { title: string; items: string[] }[]
+}
+
+export type ChangelogData = {
+ ok: boolean
+ releases: ChangelogRelease[]
+}
+
+export async function loadChangelog(): Promise {
+ const response = await fetch("https://api.github.com/repos/anomalyco/opencode/releases?per_page=20", {
+ headers: {
+ Accept: "application/vnd.github.v3+json",
+ "User-Agent": "OpenCode-Console",
+ },
+ cf: {
+ // best-effort edge caching (ignored outside Cloudflare)
+ cacheTtl: 60 * 5,
+ cacheEverything: true,
+ },
+ } as RequestInit).catch(() => undefined)
+
+ if (!response?.ok) return { ok: false, releases: [] }
+
+ const data = await response.json().catch(() => undefined)
+ if (!Array.isArray(data)) return { ok: false, releases: [] }
+
+ const releases = (data as Release[]).map((release) => {
+ const parsed = parseMarkdown(release.body || "")
+ return {
+ tag: release.tag_name,
+ name: release.name,
+ date: release.published_at,
+ url: release.html_url,
+ highlights: parsed.highlights,
+ sections: parsed.sections,
+ }
+ })
+
+ return { ok: true, releases }
+}
+
+export const changelog = query(async () => {
+ "use server"
+ const result = await loadChangelog()
+ return result.releases
+}, "changelog")
+
+function parseHighlights(body: string): HighlightGroup[] {
+ const groups = new Map()
+ const regex = /([\s\S]*?)<\/highlight>/g
+ let match
+
+ while ((match = regex.exec(body)) !== null) {
+ const source = match[1]
+ const content = match[2]
+
+ const titleMatch = content.match(/([^<]+)<\/h2>/)
+ const pMatch = content.match(/ ([^<]+)<\/p>/)
+ const imgMatch = content.match(/ {
+ if (videoMatch) return { type: "video", src: videoMatch[1] } satisfies HighlightMedia
+ if (imgMatch) {
+ return {
+ type: "image",
+ src: imgMatch[3],
+ width: imgMatch[1],
+ height: imgMatch[2],
+ } satisfies HighlightMedia
+ }
+ })()
+
+ if (!titleMatch || !media) continue
+
+ const item: HighlightItem = {
+ title: titleMatch[1],
+ description: pMatch?.[2] || "",
+ shortDescription: pMatch?.[1],
+ media,
+ }
+
+ if (!groups.has(source)) groups.set(source, [])
+ groups.get(source)!.push(item)
+ }
+
+ return Array.from(groups.entries()).map(([source, items]) => ({ source, items }))
+}
+
+function parseMarkdown(body: string) {
+ const lines = body.split("\n")
+ const sections: { title: string; items: string[] }[] = []
+ let current: { title: string; items: string[] } | null = null
+ let skip = false
+
+ for (const line of lines) {
+ if (line.startsWith("## ")) {
+ if (current) sections.push(current)
+ current = { title: line.slice(3).trim(), items: [] }
+ skip = false
+ continue
+ }
+
+ if (line.startsWith("**Thank you")) {
+ skip = true
+ continue
+ }
+
+ if (line.startsWith("- ") && !skip) current?.items.push(line.slice(2).trim())
+ }
+
+ if (current) sections.push(current)
+ return { sections, highlights: parseHighlights(body) }
+}
diff --git a/packages/console/app/src/lib/form-error.ts b/packages/console/app/src/lib/form-error.ts
new file mode 100644
index 0000000..d643a98
--- /dev/null
+++ b/packages/console/app/src/lib/form-error.ts
@@ -0,0 +1,86 @@
+import type { Key } from "~/i18n"
+
+export const formError = {
+ invalidPlan: "error.invalidPlan",
+ workspaceRequired: "error.workspaceRequired",
+ alreadySubscribed: "error.alreadySubscribed",
+ limitRequired: "error.limitRequired",
+ monthlyLimitInvalid: "error.monthlyLimitInvalid",
+ workspaceNameRequired: "error.workspaceNameRequired",
+ nameTooLong: "error.nameTooLong",
+ emailRequired: "error.emailRequired",
+ roleRequired: "error.roleRequired",
+ idRequired: "error.idRequired",
+ nameRequired: "error.nameRequired",
+ providerRequired: "error.providerRequired",
+ apiKeyRequired: "error.apiKeyRequired",
+ modelRequired: "error.modelRequired",
+} as const
+
+const map = {
+ [formError.invalidPlan]: "error.invalidPlan",
+ [formError.workspaceRequired]: "error.workspaceRequired",
+ [formError.alreadySubscribed]: "error.alreadySubscribed",
+ [formError.limitRequired]: "error.limitRequired",
+ [formError.monthlyLimitInvalid]: "error.monthlyLimitInvalid",
+ [formError.workspaceNameRequired]: "error.workspaceNameRequired",
+ [formError.nameTooLong]: "error.nameTooLong",
+ [formError.emailRequired]: "error.emailRequired",
+ [formError.roleRequired]: "error.roleRequired",
+ [formError.idRequired]: "error.idRequired",
+ [formError.nameRequired]: "error.nameRequired",
+ [formError.providerRequired]: "error.providerRequired",
+ [formError.apiKeyRequired]: "error.apiKeyRequired",
+ [formError.modelRequired]: "error.modelRequired",
+ "Invalid plan": "error.invalidPlan",
+ "Workspace ID is required": "error.workspaceRequired",
+ "Workspace ID is required.": "error.workspaceRequired",
+ "This workspace already has a subscription": "error.alreadySubscribed",
+ "Limit is required.": "error.limitRequired",
+ "Set a valid monthly limit": "error.monthlyLimitInvalid",
+ "Set a valid monthly limit.": "error.monthlyLimitInvalid",
+ "Workspace name is required.": "error.workspaceNameRequired",
+ "Name must be 255 characters or less.": "error.nameTooLong",
+ "Email is required": "error.emailRequired",
+ "Role is required": "error.roleRequired",
+ "ID is required": "error.idRequired",
+ "Name is required": "error.nameRequired",
+ "Provider is required": "error.providerRequired",
+ "API key is required": "error.apiKeyRequired",
+ "Model is required": "error.modelRequired",
+ "workspace.reload.error.paymentFailed": "workspace.reload.error.paymentFailed",
+ "Payment failed": "workspace.reload.error.paymentFailed",
+ "Payment failed.": "workspace.reload.error.paymentFailed",
+} as const satisfies Record
+
+export function formErrorReloadAmountMin(amount: number) {
+ return `error.reloadAmountMin:${amount}`
+}
+
+export function formErrorReloadTriggerMin(amount: number) {
+ return `error.reloadTriggerMin:${amount}`
+}
+
+export function localizeError(t: (key: Key, params?: Record) => string, error?: string) {
+ if (!error) return ""
+
+ if (error.startsWith("error.reloadAmountMin:")) {
+ const amount = Number(error.split(":")[1] ?? 0)
+ return t("error.reloadAmountMin", { amount })
+ }
+
+ if (error.startsWith("error.reloadTriggerMin:")) {
+ const amount = Number(error.split(":")[1] ?? 0)
+ return t("error.reloadTriggerMin", { amount })
+ }
+
+ const amount = error.match(/^Reload amount must be at least \$(\d+)$/)
+ if (amount) return t("error.reloadAmountMin", { amount: Number(amount[1]) })
+
+ const trigger = error.match(/^Balance trigger must be at least \$(\d+)$/)
+ if (trigger) return t("error.reloadTriggerMin", { amount: Number(trigger[1]) })
+
+ const key = map[error as keyof typeof map]
+ if (key) return t(key)
+ return error
+}
diff --git a/packages/console/app/src/lib/format-reset-time.ts b/packages/console/app/src/lib/format-reset-time.ts
new file mode 100644
index 0000000..2462a87
--- /dev/null
+++ b/packages/console/app/src/lib/format-reset-time.ts
@@ -0,0 +1,47 @@
+import type { Key } from "~/i18n"
+import type { useI18n } from "~/context/i18n"
+
+type ResetTimeKeys = {
+ day: Key
+ days: Key
+ hour: Key
+ hours: Key
+ minute: Key
+ minutes: Key
+ fewSeconds: Key
+}
+
+export const liteResetTimeKeys = {
+ day: "workspace.lite.time.day",
+ days: "workspace.lite.time.days",
+ hour: "workspace.lite.time.hour",
+ hours: "workspace.lite.time.hours",
+ minute: "workspace.lite.time.minute",
+ minutes: "workspace.lite.time.minutes",
+ fewSeconds: "workspace.lite.time.fewSeconds",
+} satisfies ResetTimeKeys
+
+export const blackResetTimeKeys = {
+ day: "workspace.black.time.day",
+ days: "workspace.black.time.days",
+ hour: "workspace.black.time.hour",
+ hours: "workspace.black.time.hours",
+ minute: "workspace.black.time.minute",
+ minutes: "workspace.black.time.minutes",
+ fewSeconds: "workspace.black.time.fewSeconds",
+} satisfies ResetTimeKeys
+
+export function formatResetTime(seconds: number, i18n: ReturnType, keys: ResetTimeKeys) {
+ const days = Math.floor(seconds / 86400)
+ if (days >= 1) {
+ const hours = Math.floor((seconds % 86400) / 3600)
+ return `${days} ${days === 1 ? i18n.t(keys.day) : i18n.t(keys.days)} ${hours} ${hours === 1 ? i18n.t(keys.hour) : i18n.t(keys.hours)}`
+ }
+
+ const hours = Math.floor(seconds / 3600)
+ const minutes = Math.floor((seconds % 3600) / 60)
+ if (hours >= 1)
+ return `${hours} ${hours === 1 ? i18n.t(keys.hour) : i18n.t(keys.hours)} ${minutes} ${minutes === 1 ? i18n.t(keys.minute) : i18n.t(keys.minutes)}`
+ if (minutes === 0) return i18n.t(keys.fewSeconds)
+ return `${minutes} ${minutes === 1 ? i18n.t(keys.minute) : i18n.t(keys.minutes)}`
+}
diff --git a/packages/console/app/src/lib/github.ts b/packages/console/app/src/lib/github.ts
new file mode 100644
index 0000000..ccde597
--- /dev/null
+++ b/packages/console/app/src/lib/github.ts
@@ -0,0 +1,38 @@
+import { query } from "@solidjs/router"
+import { config } from "~/config"
+
+export const github = query(async () => {
+ "use server"
+ const headers = {
+ "User-Agent":
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
+ }
+ const apiBaseUrl = config.github.repoUrl.replace("https://github.com/", "https://api.github.com/repos/")
+ try {
+ const [meta, releases, contributors] = await Promise.all([
+ fetch(apiBaseUrl, { headers }).then((res) => res.json()),
+ fetch(`${apiBaseUrl}/releases`, { headers }).then((res) => res.json()),
+ fetch(`${apiBaseUrl}/contributors?per_page=1`, { headers }),
+ ])
+ if (!Array.isArray(releases) || releases.length === 0) {
+ return undefined
+ }
+ const [release] = releases
+ const linkHeader = contributors.headers.get("Link")
+ const contributorCount = linkHeader
+ ? Number.parseInt(linkHeader.match(/&page=(\d+)>; rel="last"/)?.at(1) ?? "0")
+ : 0
+ return {
+ stars: meta.stargazers_count,
+ release: {
+ name: release.name,
+ url: release.html_url,
+ tag_name: release.tag_name,
+ },
+ contributors: contributorCount,
+ }
+ } catch (e) {
+ console.error(e)
+ }
+ return undefined
+}, "github")
diff --git a/packages/console/app/src/lib/language.ts b/packages/console/app/src/lib/language.ts
new file mode 100644
index 0000000..a196f66
--- /dev/null
+++ b/packages/console/app/src/lib/language.ts
@@ -0,0 +1,331 @@
+export const LOCALES = [
+ "en",
+ "zh",
+ "zht",
+ "ko",
+ "de",
+ "es",
+ "fr",
+ "it",
+ "da",
+ "ja",
+ "pl",
+ "ru",
+ "uk",
+ "ar",
+ "no",
+ "br",
+ "th",
+ "tr",
+] as const
+
+export type Locale = (typeof LOCALES)[number]
+
+export const LOCALE_COOKIE = "oc_locale" as const
+export const LOCALE_HEADER = "x-opencode-locale" as const
+
+function fix(pathname: string) {
+ if (pathname.startsWith("/")) return pathname
+ return `/${pathname}`
+}
+
+const LABEL = {
+ en: "English",
+ zh: "简体中文",
+ zht: "繁體中文",
+ ko: "한국어",
+ de: "Deutsch",
+ es: "Español",
+ fr: "Français",
+ it: "Italiano",
+ da: "Dansk",
+ ja: "日本語",
+ pl: "Polski",
+ ru: "Русский",
+ uk: "Українська",
+ ar: "العربية",
+ no: "Norsk",
+ br: "Português (Brasil)",
+ th: "ไทย",
+ tr: "Türkçe",
+} satisfies Record
+
+const TAG = {
+ en: "en",
+ zh: "zh-Hans",
+ zht: "zh-Hant",
+ ko: "ko",
+ de: "de",
+ es: "es",
+ fr: "fr",
+ it: "it",
+ da: "da",
+ ja: "ja",
+ pl: "pl",
+ ru: "ru",
+ uk: "uk",
+ ar: "ar",
+ no: "no",
+ br: "pt-BR",
+ th: "th",
+ tr: "tr",
+} satisfies Record
+
+const DOCS = {
+ en: "root",
+ zh: "zh-cn",
+ zht: "zh-tw",
+ ko: "ko",
+ de: "de",
+ es: "es",
+ fr: "fr",
+ it: "it",
+ da: "da",
+ ja: "ja",
+ pl: "pl",
+ ru: "ru",
+ uk: "uk",
+ ar: "ar",
+ no: "nb",
+ br: "pt-br",
+ th: "th",
+ tr: "tr",
+} satisfies Record
+
+const DOCS_SEGMENT = new Set([
+ "ar",
+ "bs",
+ "da",
+ "de",
+ "es",
+ "fr",
+ "it",
+ "ja",
+ "ko",
+ "nb",
+ "pl",
+ "pt-br",
+ "ru",
+ "th",
+ "tr",
+ "uk",
+ "zh-cn",
+ "zh-tw",
+])
+
+const DOCS_LOCALE = {
+ ar: "ar",
+ da: "da",
+ de: "de",
+ en: "en",
+ es: "es",
+ fr: "fr",
+ it: "it",
+ ja: "ja",
+ ko: "ko",
+ nb: "no",
+ "pt-br": "br",
+ root: "en",
+ ru: "ru",
+ th: "th",
+ tr: "tr",
+ uk: "uk",
+ "zh-cn": "zh",
+ "zh-tw": "zht",
+} as const satisfies Record
+
+function suffix(pathname: string) {
+ const index = pathname.search(/[?#]/)
+ if (index === -1) {
+ return {
+ path: fix(pathname),
+ suffix: "",
+ }
+ }
+
+ return {
+ path: fix(pathname.slice(0, index)),
+ suffix: pathname.slice(index),
+ }
+}
+
+export function docs(locale: Locale, pathname: string) {
+ const value = DOCS[locale]
+ const next = suffix(pathname)
+ if (next.path !== "/docs" && next.path !== "/docs/" && !next.path.startsWith("/docs/")) {
+ return `${next.path}${next.suffix}`
+ }
+
+ if (value === "root") {
+ if (next.path === "/docs/en") return `/docs${next.suffix}`
+ if (next.path === "/docs/en/") return `/docs/${next.suffix}`
+ if (next.path.startsWith("/docs/en/")) return `/docs/${next.path.slice("/docs/en/".length)}${next.suffix}`
+ return `${next.path}${next.suffix}`
+ }
+
+ if (next.path === "/docs") return `/docs/${value}${next.suffix}`
+ if (next.path === "/docs/") return `/docs/${value}/${next.suffix}`
+
+ const head = next.path.slice("/docs/".length).split("/")[0] ?? ""
+ if (!head) return `/docs/${value}/${next.suffix}`
+ if (DOCS_SEGMENT.has(head)) return `${next.path}${next.suffix}`
+ if (head.startsWith("_")) return `${next.path}${next.suffix}`
+ if (head.includes(".")) return `${next.path}${next.suffix}`
+
+ return `/docs/${value}${next.path.slice("/docs".length)}${next.suffix}`
+}
+
+export function parseLocale(value: unknown): Locale | null {
+ if (typeof value !== "string") return null
+ if ((LOCALES as readonly string[]).includes(value)) return value as Locale
+ return null
+}
+
+export function fromPathname(pathname: string) {
+ return parseLocale(fix(pathname).split("/")[1])
+}
+
+export function fromDocsPathname(pathname: string) {
+ const next = fix(pathname)
+ const value = next.split("/")[2]?.toLowerCase()
+ if (!value) return null
+ if (!next.startsWith("/docs/")) return null
+ if (!(value in DOCS_LOCALE)) return null
+ return DOCS_LOCALE[value as keyof typeof DOCS_LOCALE]
+}
+
+export function strip(pathname: string) {
+ const locale = fromPathname(pathname)
+ if (!locale) return fix(pathname)
+
+ const next = fix(pathname).slice(locale.length + 1)
+ if (!next) return "/"
+ if (next.startsWith("/")) return next
+ return `/${next}`
+}
+
+export function route(locale: Locale, pathname: string) {
+ const next = strip(pathname)
+ if (next.startsWith("/docs")) return docs(locale, next)
+ if (next.startsWith("/auth")) return next
+ if (next.startsWith("/workspace")) return next
+ if (locale === "en") return next
+ if (next === "/") return `/${locale}`
+ return `/${locale}${next}`
+}
+
+export function label(locale: Locale) {
+ return LABEL[locale]
+}
+
+export function tag(locale: Locale) {
+ return TAG[locale]
+}
+
+export function dir(locale: Locale) {
+ if (locale === "ar") return "rtl"
+ return "ltr"
+}
+
+function match(input: string): Locale | null {
+ const value = input.trim().toLowerCase()
+ if (!value) return null
+
+ if (value.startsWith("zh")) {
+ if (value.includes("hant") || value.includes("-tw") || value.includes("-hk") || value.includes("-mo")) return "zht"
+ return "zh"
+ }
+
+ if (value.startsWith("ko")) return "ko"
+ if (value.startsWith("de")) return "de"
+ if (value.startsWith("es")) return "es"
+ if (value.startsWith("fr")) return "fr"
+ if (value.startsWith("it")) return "it"
+ if (value.startsWith("da")) return "da"
+ if (value.startsWith("ja")) return "ja"
+ if (value.startsWith("pl")) return "pl"
+ if (value.startsWith("ru")) return "ru"
+ if (value.startsWith("uk")) return "uk"
+ if (value.startsWith("ar")) return "ar"
+ if (value.startsWith("tr")) return "tr"
+ if (value.startsWith("th")) return "th"
+ if (value.startsWith("pt")) return "br"
+ if (value.startsWith("no") || value.startsWith("nb") || value.startsWith("nn")) return "no"
+ if (value.startsWith("en")) return "en"
+ return null
+}
+
+export function detectFromLanguages(languages: readonly string[]) {
+ for (const language of languages) {
+ const locale = match(language)
+ if (locale) return locale
+ }
+ return "en" satisfies Locale
+}
+
+export function detectFromAcceptLanguage(header: string | null) {
+ if (!header) return "en" satisfies Locale
+
+ const items = header
+ .split(",")
+ .map((raw) => raw.trim())
+ .filter(Boolean)
+ .map((raw) => {
+ const parts = raw.split(";").map((x) => x.trim())
+ const lang = parts[0] ?? ""
+ const q = parts
+ .slice(1)
+ .find((x) => x.startsWith("q="))
+ ?.slice(2)
+ return {
+ lang,
+ q: q ? Number.parseFloat(q) : 1,
+ }
+ })
+ .sort((a, b) => b.q - a.q)
+
+ for (const item of items) {
+ if (!item.lang || item.lang === "*") continue
+ const locale = match(item.lang)
+ if (locale) return locale
+ }
+
+ return "en" satisfies Locale
+}
+
+export function localeFromCookieHeader(header: string | null) {
+ if (!header) return null
+
+ const raw = header
+ .split(";")
+ .map((x) => x.trim())
+ .find((x) => x.startsWith(`${LOCALE_COOKIE}=`))
+ ?.slice(`${LOCALE_COOKIE}=`.length)
+
+ if (!raw) return null
+ return parseLocale(decodeURIComponent(raw))
+}
+
+export function localeFromRequest(request: Request) {
+ const fromHeader = parseLocale(request.headers.get(LOCALE_HEADER))
+ if (fromHeader) return fromHeader
+
+ const fromPath = fromPathname(new URL(request.url).pathname)
+ if (fromPath) return fromPath
+
+ const fromDocsPath = fromDocsPathname(new URL(request.url).pathname)
+ if (fromDocsPath) return fromDocsPath
+
+ return (
+ localeFromCookieHeader(request.headers.get("cookie")) ??
+ detectFromAcceptLanguage(request.headers.get("accept-language"))
+ )
+}
+
+export function cookie(locale: Locale) {
+ return `${LOCALE_COOKIE}=${encodeURIComponent(locale)}; Path=/; Max-Age=31536000; SameSite=Lax`
+}
+
+export function clearCookie() {
+ return `${LOCALE_COOKIE}=; Path=/; Max-Age=0; SameSite=Lax`
+}
diff --git a/packages/console/app/src/lib/referral-invite.ts b/packages/console/app/src/lib/referral-invite.ts
new file mode 100644
index 0000000..dc83ff0
--- /dev/null
+++ b/packages/console/app/src/lib/referral-invite.ts
@@ -0,0 +1,44 @@
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { Referral } from "@opencode-ai/console-core/referral.js"
+import { getRequestEvent } from "solid-js/web"
+
+const REFERRAL_COOKIE = "oc_referral"
+const REFERRAL_MAX_AGE = 60 * 60 * 24 * 30
+
+export function normalizeReferralCode(code?: string | null) {
+ return Referral.normalizeCode(code)
+}
+
+export function referralCookie(code: string) {
+ return `${REFERRAL_COOKIE}=${encodeURIComponent(code)}; Path=/; Max-Age=${REFERRAL_MAX_AGE}; SameSite=Lax; HttpOnly`
+}
+
+export function clearReferralCookie() {
+ return `${REFERRAL_COOKIE}=; Path=/; Max-Age=0; SameSite=Lax; HttpOnly`
+}
+
+export function referralCodeFromCookieHeader(header: string | null) {
+ if (!header) return undefined
+
+ return normalizeReferralCode(
+ header
+ .split(";")
+ .map((x) => x.trim())
+ .find((x) => x.startsWith(`${REFERRAL_COOKIE}=`))
+ ?.slice(`${REFERRAL_COOKIE}=`.length),
+ )
+}
+
+export async function createReferralFromCookie() {
+ const event = getRequestEvent()
+ const referralCode = referralCodeFromCookieHeader(event?.request.headers.get("cookie") ?? null)
+ if (!referralCode) return
+
+ await Referral.createFromAccount({
+ accountID: Actor.account(),
+ referralCode,
+ }).catch((error) => {
+ console.error("Referral create failed", error)
+ })
+ event?.response.headers.append("set-cookie", clearReferralCookie())
+}
diff --git a/packages/console/app/src/lib/salesforce.ts b/packages/console/app/src/lib/salesforce.ts
new file mode 100644
index 0000000..48e0cae
--- /dev/null
+++ b/packages/console/app/src/lib/salesforce.ts
@@ -0,0 +1,81 @@
+import { Resource } from "@opencode-ai/console-resource"
+
+async function login() {
+ const url = Resource.SALESFORCE_INSTANCE_URL.value.replace(/\/$/, "")
+ const clientId = Resource.SALESFORCE_CLIENT_ID.value
+ const clientSecret = Resource.SALESFORCE_CLIENT_SECRET.value
+
+ const params = new URLSearchParams({
+ grant_type: "client_credentials",
+ client_id: clientId,
+ client_secret: clientSecret,
+ })
+
+ const res = await fetch(`${url}/services/oauth2/token`, {
+ method: "POST",
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
+ body: params.toString(),
+ }).catch((err) => {
+ console.error("Failed to fetch Salesforce access token:", err)
+ })
+
+ if (!res) return
+
+ if (!res.ok) {
+ console.error("Failed to fetch Salesforce access token:", res.status, await res.text())
+ return
+ }
+
+ const data = (await res.json()) as { access_token?: string; instance_url?: string }
+ if (!data.access_token) {
+ console.error("Salesforce auth response did not include an access token")
+ return
+ }
+
+ return {
+ token: data.access_token,
+ url: data.instance_url ?? url,
+ }
+}
+
+export interface SalesforceLeadInput {
+ name: string
+ role: string
+ company?: string
+ email: string
+ phone?: string
+ message: string
+}
+
+export async function createLead(input: SalesforceLeadInput): Promise {
+ const auth = await login()
+ if (!auth) return false
+
+ const res = await fetch(`${auth.url}/services/data/v59.0/sobjects/Lead`, {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${auth.token}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ LastName: input.name,
+ Company: input.company?.trim() || "Website",
+ Email: input.email,
+ Phone: input.phone ?? null,
+ Title: input.role,
+ Description: input.message,
+ LeadSource: "Website",
+ }),
+ }).catch((err) => {
+ console.error("Failed to create Salesforce lead:", err)
+ })
+
+ if (!res) return false
+
+ if (!res.ok) {
+ console.error("Failed to create Salesforce lead:", res.status, await res.text())
+ return false
+ }
+
+ return true
+}
diff --git a/packages/console/app/src/lib/stats-proxy.ts b/packages/console/app/src/lib/stats-proxy.ts
new file mode 100644
index 0000000..e75ab33
--- /dev/null
+++ b/packages/console/app/src/lib/stats-proxy.ts
@@ -0,0 +1,54 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { Resource } from "@opencode-ai/console-resource"
+
+const dataPath = "/data"
+
+export async function statsProxy(evt: APIEvent) {
+ const req = evt.request.clone()
+ const targetUrl = new URL(req.url)
+ targetUrl.protocol = "https:"
+ targetUrl.hostname = Resource.App.stage === "production" ? "stats.opencode.ai" : "stats.dev.opencode.ai"
+ targetUrl.port = ""
+
+ if (
+ targetUrl.pathname.startsWith(`${dataPath}/_build/`) ||
+ targetUrl.pathname === `${dataPath}/banner.jpg` ||
+ targetUrl.pathname === `${dataPath}/banner.png`
+ ) {
+ targetUrl.pathname = targetUrl.pathname.slice(dataPath.length)
+ }
+
+ const response = await fetch(targetUrl, {
+ method: req.method,
+ headers: req.headers,
+ body: req.body,
+ })
+
+ if (!response.headers.get("content-type")?.includes("text/html")) return response
+
+ const headers = new Headers(response.headers)
+ headers.delete("content-encoding")
+ headers.delete("content-length")
+ headers.delete("etag")
+
+ return new Response(rewriteStatsHtml(await response.text()), {
+ status: response.status,
+ statusText: response.statusText,
+ headers,
+ })
+}
+
+export function statsRedirect(evt: APIEvent) {
+ const url = new URL(evt.request.url)
+ url.pathname = `${dataPath}${url.pathname.slice("/stats".length)}`
+ return new Response(null, {
+ status: 308,
+ headers: {
+ Location: url.toString(),
+ },
+ })
+}
+
+function rewriteStatsHtml(html: string) {
+ return html.replaceAll('"/_build/', `"${dataPath}/_build/`).replaceAll("'/_build/", `'${dataPath}/_build/`)
+}
diff --git a/packages/console/app/src/middleware.ts b/packages/console/app/src/middleware.ts
new file mode 100644
index 0000000..ad5aa09
--- /dev/null
+++ b/packages/console/app/src/middleware.ts
@@ -0,0 +1,20 @@
+import { createMiddleware } from "@solidjs/start/middleware"
+import { LOCALE_HEADER, cookie, fromPathname, strip } from "~/lib/language"
+import { normalizeReferralCode, referralCookie } from "~/lib/referral-invite"
+
+export default createMiddleware({
+ onRequest(event) {
+ const url = new URL(event.request.url)
+ const locale = fromPathname(url.pathname)
+ if (locale) {
+ url.pathname = strip(url.pathname)
+ const request = new Request(url, event.request)
+ request.headers.set(LOCALE_HEADER, locale)
+ event.request = request
+ event.response.headers.append("set-cookie", cookie(locale))
+ }
+
+ const referralCode = normalizeReferralCode(url.searchParams.get("ref"))
+ if (referralCode) event.response.headers.append("set-cookie", referralCookie(referralCode))
+ },
+})
diff --git a/packages/console/app/src/routes/[...404].css b/packages/console/app/src/routes/[...404].css
new file mode 100644
index 0000000..1edbd0a
--- /dev/null
+++ b/packages/console/app/src/routes/[...404].css
@@ -0,0 +1,130 @@
+[data-page="not-found"] {
+ --color-text: hsl(224, 10%, 10%);
+ --color-text-secondary: hsl(224, 7%, 46%);
+ --color-text-dimmed: hsl(224, 6%, 63%);
+ --color-text-inverted: hsl(0, 0%, 100%);
+
+ --color-border: hsl(224, 6%, 77%);
+}
+
+[data-page="not-found"] {
+ @media (prefers-color-scheme: dark) {
+ --color-text: hsl(0, 0%, 100%);
+ --color-text-secondary: hsl(224, 6%, 66%);
+ --color-text-dimmed: hsl(224, 7%, 46%);
+ --color-text-inverted: hsl(224, 10%, 10%);
+
+ --color-border: hsl(224, 6%, 36%);
+ }
+}
+
+[data-page="not-found"] {
+ --padding: 3rem;
+ --vertical-padding: 1.5rem;
+ --heading-font-size: 1.375rem;
+
+ @media (max-width: 30rem) {
+ --padding: 1rem;
+ --vertical-padding: 0.75rem;
+ --heading-font-size: 1rem;
+ }
+
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding: calc(var(--padding) + 1rem);
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ a {
+ color: var(--color-text);
+ text-decoration: underline;
+ text-underline-offset: var(--space-0-75);
+ text-decoration-thickness: 1px;
+ }
+
+ [data-component="content"] {
+ max-width: 40rem;
+ width: 100%;
+ border: 1px solid var(--color-border);
+ }
+
+ [data-component="top"] {
+ padding: var(--padding);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: calc(var(--vertical-padding) / 2);
+ text-align: center;
+
+ [data-slot="logo-link"] {
+ text-decoration: none;
+ }
+
+ img {
+ height: auto;
+ width: clamp(200px, 85vw, 400px);
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+
+ [data-slot="title"] {
+ line-height: 1.25;
+ font-weight: 500;
+ text-align: center;
+ font-size: var(--heading-font-size);
+ color: var(--color-text);
+ text-transform: uppercase;
+ margin: 0;
+ }
+ }
+
+ [data-component="actions"] {
+ border-top: 1px solid var(--color-border);
+ display: flex;
+
+ [data-slot="action"] {
+ flex: 1;
+ text-align: center;
+ line-height: 1.4;
+ padding: var(--vertical-padding) 1rem;
+ text-transform: uppercase;
+ font-size: 1rem;
+
+ a {
+ display: block;
+ width: 100%;
+ height: 100%;
+ color: var(--color-text);
+ text-decoration: underline;
+ text-underline-offset: var(--space-0-75);
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="action"] + [data-slot="action"] {
+ border-left: 1px solid var(--color-border);
+ }
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+
+ [data-slot="action"] + [data-slot="action"] {
+ border-left: none;
+ border-top: 1px solid var(--color-border);
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/[...404].tsx b/packages/console/app/src/routes/[...404].tsx
new file mode 100644
index 0000000..e20ec36
--- /dev/null
+++ b/packages/console/app/src/routes/[...404].tsx
@@ -0,0 +1,42 @@
+import "./[...404].css"
+import { Title } from "@solidjs/meta"
+import { HttpStatusCode } from "@solidjs/start"
+import logoLight from "../asset/logo-ornate-light.svg"
+import logoDark from "../asset/logo-ornate-dark.svg"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+
+export default function NotFound() {
+ const i18n = useI18n()
+ const language = useLanguage()
+ return (
+
+ {i18n.t("notFound.title")}
+
+
+
+
+
+
+
+ {i18n.t("notFound.heading")}
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/api/enterprise.ts b/packages/console/app/src/routes/api/enterprise.ts
new file mode 100644
index 0000000..ff8f229
--- /dev/null
+++ b/packages/console/app/src/routes/api/enterprise.ts
@@ -0,0 +1,129 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { AWS } from "@opencode-ai/console-core/aws.js"
+import { Resource } from "@opencode-ai/console-resource"
+import { i18n } from "~/i18n"
+import { localeFromRequest } from "~/lib/language"
+import { createLead } from "~/lib/salesforce"
+
+interface EnterpriseFormData {
+ name: string
+ role: string
+ company?: string
+ email: string
+ phone?: string
+ alias?: string
+ message: string
+}
+
+const EMAIL_OCTOPUS_LIST_ID = "1b381e5e-39bd-11f1-ba4a-cdd4791f0c43"
+
+function splitFullName(fullName: string) {
+ const parts = fullName
+ .trim()
+ .split(/\s+/)
+ .filter((p) => p.length > 0)
+ if (parts.length === 0) return { firstName: "", lastName: "" }
+ if (parts.length === 1) return { firstName: parts[0], lastName: "" }
+ return { firstName: parts[0], lastName: parts.slice(1).join(" ") }
+}
+
+function subscribe(email: string, fullName: string) {
+ const name = splitFullName(fullName)
+ const fields: Record = {}
+ if (name.firstName) fields.FirstName = name.firstName
+ if (name.lastName) fields.LastName = name.lastName
+
+ const payload: { email_address: string; fields?: Record } = { email_address: email }
+ if (Object.keys(fields).length) payload.fields = fields
+
+ return fetch(`https://api.emailoctopus.com/lists/${EMAIL_OCTOPUS_LIST_ID}/contacts`, {
+ method: "PUT",
+ headers: {
+ Authorization: `Bearer ${Resource.EMAILOCTOPUS_API_KEY.value}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(payload),
+ }).then(
+ async (res) => {
+ if (!res.ok) {
+ console.error("EmailOctopus subscribe failed:", res.status, res.statusText, await res.text())
+ return false
+ }
+ return true
+ },
+ (err) => {
+ console.error("Failed to subscribe enterprise email:", err)
+ return false
+ },
+ )
+}
+
+export async function POST(event: APIEvent) {
+ const dict = i18n(localeFromRequest(event.request))
+ try {
+ const body = (await event.request.json()) as EnterpriseFormData
+ const trap = typeof body.alias === "string" ? body.alias.trim() : ""
+
+ if (trap) {
+ return Response.json({ success: true, message: dict["enterprise.form.success.submitted"] }, { status: 200 })
+ }
+
+ if (!body.name || !body.role || !body.email || !body.message) {
+ return Response.json({ error: dict["enterprise.form.error.allFieldsRequired"] }, { status: 400 })
+ }
+
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
+ if (!emailRegex.test(body.email)) {
+ return Response.json({ error: dict["enterprise.form.error.invalidEmailFormat"] }, { status: 400 })
+ }
+
+ const emailContent = `
+${body.message}
+--
+${body.name}
+${body.role}
+${body.company ? `${body.company} ` : ""}${body.email}
+${body.phone ? `${body.phone} ` : ""}`.trim()
+
+ const [lead, mail, octopus] = await Promise.all([
+ createLead({
+ name: body.name,
+ role: body.role,
+ company: body.company,
+ email: body.email,
+ phone: body.phone,
+ message: body.message,
+ }).catch((err) => {
+ console.error("Failed to create Salesforce lead:", err)
+ return false
+ }),
+ AWS.sendEmail({
+ to: "contact@anoma.ly",
+ subject: `Enterprise Inquiry from ${body.name}`,
+ body: emailContent,
+ replyTo: body.email,
+ }).then(
+ () => true,
+ (err) => {
+ console.error("Failed to send enterprise email:", err)
+ return false
+ },
+ ),
+ subscribe(body.email, body.name),
+ ])
+
+ if (!lead && !mail && !octopus) {
+ if (import.meta.env.DEV) {
+ console.warn("Enterprise inquiry accepted in dev mode without integrations", { email: body.email })
+ return Response.json({ success: true, message: dict["enterprise.form.success.submitted"] }, { status: 200 })
+ }
+ console.error("Enterprise inquiry delivery failed", { email: body.email })
+ return Response.json({ error: dict["enterprise.form.error.internalServer"] }, { status: 500 })
+ }
+
+ return Response.json({ success: true, message: dict["enterprise.form.success.submitted"] }, { status: 200 })
+ } catch (error) {
+ console.error("Error processing enterprise form:", error)
+ return Response.json({ error: dict["enterprise.form.error.internalServer"] }, { status: 500 })
+ }
+}
diff --git a/packages/console/app/src/routes/auth/[...callback].ts b/packages/console/app/src/routes/auth/[...callback].ts
new file mode 100644
index 0000000..00bb894
--- /dev/null
+++ b/packages/console/app/src/routes/auth/[...callback].ts
@@ -0,0 +1,46 @@
+import { redirect } from "@solidjs/router"
+import type { APIEvent } from "@solidjs/start/server"
+import { AuthClient } from "~/context/auth"
+import { useAuthSession } from "~/context/auth"
+import { i18n } from "~/i18n"
+import { localeFromRequest, route } from "~/lib/language"
+
+export async function GET(input: APIEvent) {
+ const url = new URL(input.request.url)
+ const locale = localeFromRequest(input.request)
+ const dict = i18n(locale)
+
+ try {
+ const code = url.searchParams.get("code")
+ if (!code) throw new Error(dict["auth.callback.error.codeMissing"])
+ const result = await AuthClient.exchange(code, `${url.origin}${url.pathname}`)
+ if (result.err) throw new Error(result.err.message)
+ const decoded = AuthClient.decode(result.tokens.access, {} as any)
+ if (decoded.err) throw new Error(decoded.err.message)
+ const session = await useAuthSession()
+ const id = decoded.subject.properties.accountID
+ await session.update((value) => {
+ return {
+ ...value,
+ account: {
+ ...value.account,
+ [id]: {
+ id,
+ email: decoded.subject.properties.email,
+ },
+ },
+ current: id,
+ }
+ })
+ const next = url.pathname === "/auth/callback" ? "/auth" : url.pathname.replace("/auth/callback", "")
+ return redirect(route(locale, next))
+ } catch (e: any) {
+ return new Response(
+ JSON.stringify({
+ error: e.message,
+ cause: Object.fromEntries(url.searchParams.entries()),
+ }),
+ { status: 500 },
+ )
+ }
+}
diff --git a/packages/console/app/src/routes/auth/authorize.ts b/packages/console/app/src/routes/auth/authorize.ts
new file mode 100644
index 0000000..0f0651a
--- /dev/null
+++ b/packages/console/app/src/routes/auth/authorize.ts
@@ -0,0 +1,10 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { AuthClient } from "~/context/auth"
+
+export async function GET(input: APIEvent) {
+ const url = new URL(input.request.url)
+ const cont = url.searchParams.get("continue") ?? ""
+ const callbackUrl = new URL(`./callback${cont}`, input.request.url)
+ const result = await AuthClient.authorize(callbackUrl.toString(), "code")
+ return Response.redirect(result.url, 302)
+}
diff --git a/packages/console/app/src/routes/auth/index.ts b/packages/console/app/src/routes/auth/index.ts
new file mode 100644
index 0000000..0fefb98
--- /dev/null
+++ b/packages/console/app/src/routes/auth/index.ts
@@ -0,0 +1,14 @@
+import { redirect } from "@solidjs/router"
+import type { APIEvent } from "@solidjs/start/server"
+import { getLastSeenWorkspaceID } from "../workspace/common"
+import { localeFromRequest, route } from "~/lib/language"
+
+export async function GET(input: APIEvent) {
+ const locale = localeFromRequest(input.request)
+ try {
+ const workspaceID = await getLastSeenWorkspaceID()
+ return redirect(route(locale, `/workspace/${workspaceID}`))
+ } catch {
+ return redirect("/auth/authorize")
+ }
+}
diff --git a/packages/console/app/src/routes/auth/logout.ts b/packages/console/app/src/routes/auth/logout.ts
new file mode 100644
index 0000000..9aaac37
--- /dev/null
+++ b/packages/console/app/src/routes/auth/logout.ts
@@ -0,0 +1,17 @@
+import { redirect } from "@solidjs/router"
+import { APIEvent } from "@solidjs/start"
+import { useAuthSession } from "~/context/auth"
+
+export async function GET(event: APIEvent) {
+ const auth = await useAuthSession()
+ const current = auth.data.current
+ if (current)
+ await auth.update((val) => {
+ delete val.account?.[current]
+ const first = Object.keys(val.account ?? {})[0]
+ val.current = first
+ event!.locals.actor = undefined
+ return val
+ })
+ return redirect("/zen")
+}
diff --git a/packages/console/app/src/routes/auth/status.ts b/packages/console/app/src/routes/auth/status.ts
new file mode 100644
index 0000000..ed522d7
--- /dev/null
+++ b/packages/console/app/src/routes/auth/status.ts
@@ -0,0 +1,7 @@
+import { APIEvent } from "@solidjs/start"
+import { useAuthSession } from "~/context/auth"
+
+export async function GET(_input: APIEvent) {
+ const session = await useAuthSession()
+ return Response.json(session.data)
+}
diff --git a/packages/console/app/src/routes/bench/[id].tsx b/packages/console/app/src/routes/bench/[id].tsx
new file mode 100644
index 0000000..c6d1082
--- /dev/null
+++ b/packages/console/app/src/routes/bench/[id].tsx
@@ -0,0 +1,375 @@
+import { Title } from "@solidjs/meta"
+import { createAsync, query, useParams } from "@solidjs/router"
+import { createSignal, For, Show } from "solid-js"
+import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js"
+import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js"
+import { useI18n } from "~/context/i18n"
+
+interface TaskSource {
+ repo: string
+ from: string
+ to: string
+}
+
+interface Judge {
+ score: number
+ rationale: string
+ judge: string
+}
+
+interface ScoreDetail {
+ criterion: string
+ weight: number
+ average: number
+ variance?: number
+ judges?: Judge[]
+}
+
+interface RunUsage {
+ input: number
+ output: number
+ cost: number
+}
+
+interface Run {
+ task: string
+ model: string
+ agent: string
+ score: {
+ final: number
+ base: number
+ penalty: number
+ }
+ scoreDetails: ScoreDetail[]
+ usage?: RunUsage
+ duration?: number
+}
+
+interface Prompt {
+ commit: string
+ prompt: string
+}
+
+interface AverageUsage {
+ input: number
+ output: number
+ cost: number
+}
+
+interface Task {
+ averageScore: number
+ averageDuration?: number
+ averageUsage?: AverageUsage
+ model?: string
+ agent?: string
+ summary?: string
+ runs?: Run[]
+ task: {
+ id: string
+ source: TaskSource
+ prompts?: Prompt[]
+ }
+}
+
+interface BenchmarkResult {
+ averageScore: number
+ tasks: Task[]
+}
+
+async function getTaskDetail(benchmarkId: string, taskId: string) {
+ "use server"
+ const rows = await Database.use((tx) =>
+ tx.select().from(BenchmarkTable).where(eq(BenchmarkTable.id, benchmarkId)).limit(1),
+ )
+ if (!rows[0]) return null
+ const parsed = JSON.parse(rows[0].result) as BenchmarkResult
+ const task = parsed.tasks.find((t) => t.task.id === taskId)
+ return task ?? null
+}
+
+const queryTaskDetail = query(getTaskDetail, "benchmark.task.detail")
+
+function formatDuration(ms: number): string {
+ const seconds = Math.floor(ms / 1000)
+ const minutes = Math.floor(seconds / 60)
+ const remainingSeconds = seconds % 60
+ if (minutes > 0) {
+ return `${minutes}m ${remainingSeconds}s`
+ }
+ return `${remainingSeconds}s`
+}
+
+export default function BenchDetail() {
+ const params = useParams()
+ const i18n = useI18n()
+ const [benchmarkId, taskId] = (params.id ?? "").split(":")
+ const task = createAsync(() => queryTaskDetail(benchmarkId, taskId))
+
+ return (
+
+ {i18n.t("bench.detail.title", { task: taskId })}
+
+
{i18n.t("bench.detail.notFound")}}>
+
+
+ {i18n.t("bench.detail.labels.agent")}:
+ {task()?.agent ?? i18n.t("bench.detail.na")}
+
+
+ {i18n.t("bench.detail.labels.model")}:
+ {task()?.model ?? i18n.t("bench.detail.na")}
+
+
+ {i18n.t("bench.detail.labels.task")}:
+ {task()!.task.id}
+
+
+
+
+
+ 0}>
+
+
{i18n.t("bench.detail.labels.prompt")}:
+
+ {(p) => (
+
+
+ {i18n.t("bench.detail.labels.commit")}: {p.commit.slice(0, 7)}
+
+
{p.prompt}
+
+ )}
+
+
+
+
+
+
+
+
+ {i18n.t("bench.detail.labels.averageDuration")}:
+ {task()?.averageDuration ? formatDuration(task()!.averageDuration!) : i18n.t("bench.detail.na")}
+
+
+ {i18n.t("bench.detail.labels.averageScore")}:
+ {task()?.averageScore?.toFixed(3) ?? i18n.t("bench.detail.na")}
+
+
+ {i18n.t("bench.detail.labels.averageCost")}:
+ {task()?.averageUsage?.cost ? `$${task()!.averageUsage!.cost.toFixed(4)}` : i18n.t("bench.detail.na")}
+
+
+
+
+
+
{i18n.t("bench.detail.labels.summary")}:
+
{task()!.summary}
+
+
+
+ 0}>
+
+
{i18n.t("bench.detail.labels.runs")}:
+
+
+
+
+ {i18n.t("bench.detail.table.run")}
+
+
+ {i18n.t("bench.detail.table.score")}
+
+
+ {i18n.t("bench.detail.table.cost")}
+
+
+ {i18n.t("bench.detail.table.duration")}
+
+
+ {(detail) => (
+
+ {detail.criterion} ({detail.weight})
+
+ )}
+
+
+
+
+
+ {(run, index) => (
+
+ {index() + 1}
+
+ {run.score.final.toFixed(3)} ({run.score.base.toFixed(3)} - {run.score.penalty.toFixed(3)})
+
+
+ {run.usage?.cost ? `$${run.usage.cost.toFixed(4)}` : i18n.t("bench.detail.na")}
+
+
+ {run.duration ? formatDuration(run.duration) : i18n.t("bench.detail.na")}
+
+
+ {(detail) => (
+
+
+ {(judge) => (
+
+ {judge.score === 1 ? "✓" : judge.score === 0 ? "✗" : judge.score}
+
+ )}
+
+
+ )}
+
+
+ )}
+
+
+
+
+ {(run, index) => (
+
+
{i18n.t("bench.detail.run.title", { n: index() + 1 })}
+
+ {i18n.t("bench.detail.labels.score")}:
+ {run.score.final.toFixed(3)} ({i18n.t("bench.detail.labels.base")}: {run.score.base.toFixed(3)} -{" "}
+ {i18n.t("bench.detail.labels.penalty")}: {run.score.penalty.toFixed(3)})
+
+
+ {(detail) => (
+
+
+ {detail.criterion} ({i18n.t("bench.detail.labels.weight")}: {detail.weight}){" "}
+
+ {(judge) => (
+
+ {judge.score === 1 ? "✓" : judge.score === 0 ? "✗" : judge.score}
+
+ )}
+
+
+
0}>
+
+ {(judge) => {
+ const [expanded, setExpanded] = createSignal(false)
+ return (
+
+
setExpanded(!expanded())}
+ >
+ {expanded() ? "▼" : "▶"}
+
+ {judge.score === 1 ? "✓" : judge.score === 0 ? "✗" : judge.score}
+ {" "}
+ {judge.judge}
+
+
+
+ {judge.rationale}
+
+
+
+ )
+ }}
+
+
+
+ )}
+
+
+ )}
+
+
+
+
+ {(() => {
+ const [jsonExpanded, setJsonExpanded] = createSignal(false)
+ return (
+
+
setJsonExpanded(!jsonExpanded())}
+ >
+ {jsonExpanded() ? "▼" : "▶"}
+ {i18n.t("bench.detail.rawJson")}
+
+
+ {JSON.stringify(task(), null, 2)}
+
+
+ )
+ })()}
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/bench/index.tsx b/packages/console/app/src/routes/bench/index.tsx
new file mode 100644
index 0000000..17798ef
--- /dev/null
+++ b/packages/console/app/src/routes/bench/index.tsx
@@ -0,0 +1,88 @@
+import { Title } from "@solidjs/meta"
+import { A, createAsync, query } from "@solidjs/router"
+import { createMemo, For, Show } from "solid-js"
+import { Database, desc } from "@opencode-ai/console-core/drizzle/index.js"
+import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js"
+import { useI18n } from "~/context/i18n"
+
+interface BenchmarkResult {
+ averageScore: number
+ tasks: { averageScore: number; task: { id: string } }[]
+}
+
+async function getBenchmarks() {
+ "use server"
+ const rows = await Database.use((tx) =>
+ tx.select().from(BenchmarkTable).orderBy(desc(BenchmarkTable.timeCreated)).limit(100),
+ )
+ return rows.map((row) => {
+ const parsed = JSON.parse(row.result) as BenchmarkResult
+ const taskScores: Record = {}
+ for (const t of parsed.tasks) {
+ taskScores[t.task.id] = t.averageScore
+ }
+ return {
+ id: row.id,
+ agent: row.agent,
+ model: row.model,
+ averageScore: parsed.averageScore,
+ taskScores,
+ }
+ })
+}
+
+const queryBenchmarks = query(getBenchmarks, "benchmarks.list")
+
+export default function Bench() {
+ const i18n = useI18n()
+ const benchmarks = createAsync(() => queryBenchmarks())
+
+ const taskIds = createMemo(() => {
+ const ids = new Set()
+ for (const row of benchmarks() ?? []) {
+ for (const id of Object.keys(row.taskScores)) {
+ ids.add(id)
+ }
+ }
+ return [...ids].sort()
+ })
+
+ return (
+
+ {i18n.t("bench.list.title")}
+ {i18n.t("bench.list.heading")}
+
+
+
+ {i18n.t("bench.list.table.agent")}
+ {i18n.t("bench.list.table.model")}
+ {i18n.t("bench.list.table.score")}
+ {(id) => {id} }
+
+
+
+
+ {(row) => (
+
+ {row.agent}
+ {row.model}
+ {row.averageScore.toFixed(3)}
+
+ {(id) => (
+
+
+
+ {row.taskScores[id]?.toFixed(3)}
+
+
+
+ )}
+
+
+ )}
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/bench/submission.ts b/packages/console/app/src/routes/bench/submission.ts
new file mode 100644
index 0000000..969ff16
--- /dev/null
+++ b/packages/console/app/src/routes/bench/submission.ts
@@ -0,0 +1,32 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { Database } from "@opencode-ai/console-core/drizzle/index.js"
+import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js"
+import { Identifier } from "@opencode-ai/console-core/identifier.js"
+import { i18n } from "~/i18n"
+import { localeFromRequest } from "~/lib/language"
+
+interface SubmissionBody {
+ model: string
+ agent: string
+ result: string
+}
+
+export async function POST(event: APIEvent) {
+ const dict = i18n(localeFromRequest(event.request))
+ const body = (await event.request.json()) as SubmissionBody
+
+ if (!body.model || !body.agent || !body.result) {
+ return Response.json({ error: dict["bench.submission.error.allFieldsRequired"] }, { status: 400 })
+ }
+
+ await Database.use((tx) =>
+ tx.insert(BenchmarkTable).values({
+ id: Identifier.create("benchmark"),
+ model: body.model,
+ agent: body.agent,
+ result: body.result,
+ }),
+ )
+
+ return Response.json({ success: true }, { status: 200 })
+}
diff --git a/packages/console/app/src/routes/black.css b/packages/console/app/src/routes/black.css
new file mode 100644
index 0000000..648a79c
--- /dev/null
+++ b/packages/console/app/src/routes/black.css
@@ -0,0 +1,843 @@
+::view-transition-group(*) {
+ animation-duration: 250ms;
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+::view-transition-old(root),
+::view-transition-new(root) {
+ animation-duration: 250ms;
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+::view-transition-image-pair(root) {
+ isolation: isolate;
+}
+
+::view-transition-old(root) {
+ animation: none;
+ mix-blend-mode: normal;
+}
+
+::view-transition-new(root) {
+ animation: none;
+ mix-blend-mode: normal;
+}
+
+@keyframes fade-in {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes fade-out {
+ from {
+ opacity: 1;
+ }
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes fade-in-up {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes reveal-terms {
+ from {
+ mask-position: 0% 200%;
+ }
+ to {
+ mask-position: 0% 50%;
+ }
+}
+
+@keyframes hide-terms {
+ from {
+ mask-position: 0% 50%;
+ }
+ to {
+ mask-position: 0% 200%;
+ }
+}
+
+::view-transition-old(terms-20),
+::view-transition-old(terms-100),
+::view-transition-old(terms-200) {
+ mask-image: linear-gradient(to bottom, transparent, black 25% 75%, transparent);
+ mask-repeat: no-repeat;
+ mask-size: 100% 200%;
+ animation: hide-terms 200ms cubic-bezier(0.25, 0, 0.5, 1) forwards;
+}
+
+::view-transition-new(terms-20),
+::view-transition-new(terms-100),
+::view-transition-new(terms-200) {
+ mask-image: linear-gradient(to bottom, transparent, black 25% 75%, transparent);
+ mask-repeat: no-repeat;
+ mask-position: 0% 200%;
+ mask-size: 100% 200%;
+ animation: reveal-terms 300ms cubic-bezier(0.25, 0, 0.5, 1) 50ms forwards;
+}
+
+::view-transition-old(actions-20),
+::view-transition-old(actions-100),
+::view-transition-old(actions-200) {
+ animation: fade-out 80ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
+}
+
+::view-transition-new(actions-20),
+::view-transition-new(actions-100),
+::view-transition-new(actions-200) {
+ animation: fade-in-up 300ms cubic-bezier(0.16, 1, 0.3, 1) 300ms forwards;
+ opacity: 0;
+}
+
+::view-transition-group(card-20),
+::view-transition-group(card-100),
+::view-transition-group(card-200) {
+ animation-duration: 250ms;
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+[data-page="black"] {
+ background: #000;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: stretch;
+ font-family: var(--font-mono);
+ color: #fff;
+
+ [data-component="header-logo"] {
+ filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.25)) drop-shadow(0 4px 16px rgba(0, 0, 0, 0.1));
+ position: relative;
+ z-index: 1;
+ }
+
+ .header-light-rays {
+ position: absolute;
+ inset: 0 0 auto 0;
+ height: 30dvh;
+ pointer-events: none;
+ z-index: 0;
+ }
+
+ [data-component="header"] {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding-top: 40px;
+ flex-shrink: 0;
+ }
+
+ [data-component="content"] {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ flex-grow: 1;
+
+ [data-slot="hero"] {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ gap: 8px;
+ margin-top: 40px;
+ padding: 0 20px;
+
+ @media (min-width: 768px) {
+ margin-top: 60px;
+ }
+
+ h1 {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.45;
+ margin: 0;
+
+ @media (min-width: 768px) {
+ font-size: 20px;
+ }
+
+ @media (max-width: 480px) {
+ font-size: 14px;
+ }
+ }
+
+ p {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.45;
+ margin: 0;
+
+ @media (min-width: 768px) {
+ font-size: 20px;
+ }
+
+ @media (max-width: 480px) {
+ font-size: 14px;
+ }
+ }
+ }
+
+ [data-slot="hero-black"] {
+ margin-top: 40px;
+ padding: 0 20px;
+ position: relative;
+
+ @media (min-width: 768px) {
+ margin-top: 60px;
+ }
+
+ svg {
+ width: 100%;
+ max-width: 590px;
+ height: auto;
+ overflow: visible;
+ filter: drop-shadow(0 0 20px rgba(255, 255, 255, calc(0.1 + var(--hero-black-glow-intensity, 0) * 0.15)))
+ drop-shadow(0 -5px 30px rgba(255, 255, 255, calc(var(--hero-black-glow-intensity, 0) * 0.2)));
+ mask-image: linear-gradient(to bottom, black, transparent);
+ stroke-width: 1.5;
+
+ [data-slot="black-base"] {
+ fill: url(#hero-black-fill-gradient);
+ stroke: url(#hero-black-stroke-gradient);
+ }
+
+ [data-slot="black-glow"] {
+ fill: url(#hero-black-top-glow);
+ pointer-events: none;
+ }
+
+ [data-slot="black-shimmer"] {
+ fill: url(#hero-black-shimmer-gradient);
+ pointer-events: none;
+ mix-blend-mode: overlay;
+ }
+ }
+ }
+
+ [data-slot="cta"] {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ align-items: center;
+ text-align: center;
+ margin-top: -40px;
+ width: 100%;
+
+ @media (min-width: 768px) {
+ margin-top: -20px;
+ }
+
+ [data-slot="heading"] {
+ color: rgba(255, 255, 255, 0.92);
+ text-align: center;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%;
+
+ span {
+ display: inline-block;
+ }
+ }
+ [data-slot="subheading"] {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%;
+
+ @media (min-width: 768px) {
+ font-size: 18px;
+ line-height: 160%;
+ }
+ }
+ [data-slot="button"] {
+ display: inline-flex;
+ height: 40px;
+ padding: 0 12px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ border-radius: 4px;
+ background: rgba(255, 255, 255, 0.92);
+ text-decoration: none;
+ color: #000;
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: normal;
+
+ &:hover {
+ background: #e0e0e0;
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+ }
+ [data-slot="back-soon"] {
+ color: rgba(255, 255, 255, 0.59);
+ text-align: center;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%; /* 20.8px */
+ }
+ [data-slot="follow-us"] {
+ display: inline-flex;
+ height: 40px;
+ padding: 0 12px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ border-radius: 4px;
+ border: 1px solid rgba(255, 255, 255, 0.17);
+ color: rgba(255, 255, 255, 0.59);
+ font-family: var(--font-mono);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ }
+
+ [data-slot="pricing"] {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ width: 100%;
+ max-width: 660px;
+ padding: 0 20px;
+
+ @media (min-width: 768px) {
+ padding: 0;
+ }
+ }
+
+ [data-slot="paused"] {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%;
+ padding: 120px 20px;
+ }
+
+ [data-slot="pricing-card"] {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 24px;
+ border: 1px solid rgba(255, 255, 255, 0.17);
+ background: black;
+ background-clip: padding-box;
+ border-radius: 4px;
+ text-decoration: none;
+ transition: border-color 0.15s ease;
+ cursor: pointer;
+ text-align: left;
+
+ @media (max-width: 480px) {
+ padding: 16px;
+ }
+
+ &:hover:not(:active) {
+ border-color: rgba(255, 255, 255, 0.35);
+ }
+
+ [data-slot="icon"] {
+ color: rgba(255, 255, 255, 0.59);
+ }
+
+ [data-slot="price"] {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 8px;
+ }
+
+ [data-slot="amount"] {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 24px;
+ font-weight: 500;
+ }
+
+ [data-slot="period"] {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 14px;
+ }
+
+ [data-slot="multiplier"] {
+ color: rgba(255, 255, 255, 0.39);
+ font-size: 14px;
+
+ &::before {
+ content: "·";
+ margin-right: 8px;
+ }
+ }
+ }
+
+ [data-slot="selected-plan"] {
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ width: 100%;
+ max-width: 660px;
+ margin: 0 auto;
+ position: relative;
+ background-color: rgba(0, 0, 0, 0.75);
+ z-index: 1;
+
+ @media (max-width: 480px) {
+ margin: 0 20px;
+ width: calc(100% - 40px);
+ }
+ }
+
+ [data-slot="selected-card"] {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 24px;
+ border: 1px solid rgba(255, 255, 255, 0.17);
+ border-radius: 4px;
+ width: 100%;
+
+ [data-slot="icon"] {
+ color: rgba(255, 255, 255, 0.59);
+ }
+
+ [data-slot="price"] {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 8px;
+ }
+
+ [data-slot="amount"] {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 24px;
+ font-weight: 500;
+ }
+
+ [data-slot="period"] {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 14px;
+ }
+
+ [data-slot="multiplier"] {
+ color: rgba(255, 255, 255, 0.39);
+ font-size: 14px;
+
+ &::before {
+ content: "·";
+ margin-right: 8px;
+ }
+ }
+
+ [data-slot="terms"] {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ text-align: left;
+
+ li {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 14px;
+ line-height: 1.5;
+ padding-left: 16px;
+ position: relative;
+
+ &::before {
+ content: "▪";
+ position: absolute;
+ left: 0;
+ color: rgba(255, 255, 255, 0.39);
+ }
+
+ @media (max-width: 768px) {
+ font-size: 12px;
+ }
+ }
+ }
+
+ [data-slot="actions"] {
+ display: flex;
+ gap: 16px;
+ margin-top: 8px;
+
+ button,
+ a {
+ flex: 1;
+ display: inline-flex;
+ height: 48px;
+ padding: 0 16px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 4px;
+ font-family: var(--font-mono);
+ font-size: 16px;
+ font-weight: 400;
+ text-decoration: none;
+ cursor: pointer;
+ }
+
+ [data-slot="cancel"] {
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.17);
+ color: rgba(255, 255, 255, 0.92);
+ transition-property: background-color, border-color;
+ transition-duration: 150ms;
+ transition-timing-function: cubic-bezier(0.25, 0, 0.5, 1);
+
+ &:hover {
+ background-color: rgba(255, 255, 255, 0.08);
+ border-color: rgba(255, 255, 255, 0.25);
+ }
+ }
+
+ [data-slot="continue"] {
+ background: rgb(255, 255, 255);
+ color: rgb(0, 0, 0);
+ transition: background-color 150ms cubic-bezier(0.25, 0, 0.5, 1);
+
+ &:hover {
+ background: rgba(255, 255, 255, 0.9);
+ }
+ }
+ }
+ }
+
+ [data-slot="fine-print"] {
+ color: rgba(255, 255, 255, 0.39);
+ text-align: center;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%; /* 20.8px */
+ font-style: italic;
+
+ a {
+ color: rgba(255, 255, 255, 0.39);
+ text-decoration: underline;
+ }
+ }
+ }
+
+ /* Subscribe page styles */
+ [data-slot="subscribe-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ align-items: center;
+ margin-top: -18px;
+ width: 100%;
+ max-width: 660px;
+ padding: 0 20px;
+
+ @media (min-width: 768px) {
+ margin-top: 40px;
+ padding: 0;
+ }
+
+ [data-slot="form-card"] {
+ width: 100%;
+ border: 1px solid rgba(255, 255, 255, 0.17);
+ border-radius: 4px;
+ padding: 24px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ }
+
+ [data-slot="plan-header"] {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ [data-slot="title"] {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 16px;
+ font-weight: 400;
+ margin-bottom: 8px;
+ }
+
+ [data-slot="icon"] {
+ color: rgba(255, 255, 255, 0.59);
+ isolation: isolate;
+ transform: translateZ(0);
+ }
+
+ [data-slot="price"] {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 8px;
+ }
+
+ [data-slot="amount"] {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 24px;
+ font-weight: 500;
+ }
+
+ [data-slot="period"] {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 14px;
+ }
+
+ [data-slot="multiplier"] {
+ color: rgba(255, 255, 255, 0.39);
+ font-size: 14px;
+
+ &::before {
+ content: "·";
+ margin: 0 8px;
+ }
+ }
+
+ [data-slot="divider"] {
+ height: 1px;
+ background: rgba(255, 255, 255, 0.17);
+ }
+
+ [data-slot="section-title"] {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 16px;
+ font-weight: 400;
+ }
+
+ [data-slot="checkout-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ }
+
+ [data-slot="error"] {
+ color: #ff6b6b;
+ font-size: 14px;
+ }
+
+ [data-slot="submit-button"] {
+ width: 100%;
+ height: 48px;
+ background: rgba(255, 255, 255, 0.92);
+ border: none;
+ border-radius: 4px;
+ color: #000;
+ font-family: var(--font-mono);
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: background 0.15s ease;
+
+ &:hover:not(:disabled) {
+ background: #e0e0e0;
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+
+ [data-slot="charge-notice"] {
+ color: #d4a500;
+ font-size: 14px;
+ text-align: center;
+ }
+
+ [data-slot="loading"] {
+ display: flex;
+ justify-content: center;
+ padding: 40px 0;
+
+ p {
+ color: rgba(255, 255, 255, 0.59);
+ font-size: 14px;
+ }
+ }
+
+ [data-slot="fine-print"] {
+ color: rgba(255, 255, 255, 0.39);
+ text-align: center;
+ font-size: 13px;
+ font-style: italic;
+ view-transition-name: fine-print;
+
+ a {
+ color: rgba(255, 255, 255, 0.39);
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ gap: 24px;
+ flex-shrink: 0;
+
+ @media (min-width: 768px) {
+ height: 120px;
+ }
+
+ [data-slot="footer-content"] {
+ display: flex;
+ gap: 24px;
+ align-items: center;
+ justify-content: center;
+
+ @media (min-width: 768px) {
+ gap: 40px;
+ }
+
+ span,
+ a {
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ }
+
+ [data-slot="github-stars"] {
+ color: rgba(255, 255, 255, 0.25);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ }
+
+ [data-slot="anomaly"] {
+ display: none;
+
+ @media (min-width: 768px) {
+ display: block;
+ }
+ }
+ }
+ [data-slot="anomaly-alt"] {
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ margin-bottom: 24px;
+
+ a {
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ }
+
+ @media (min-width: 768px) {
+ display: none;
+ }
+ }
+ }
+}
+
+[data-component="black-workspace-picker-modal"] {
+ font-family: var(--font-mono);
+
+ [data-slot="workspace-list"] {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ align-self: stretch;
+ outline: none;
+ overflow-y: auto;
+ max-height: 240px;
+ scrollbar-width: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+
+ [data-slot="workspace-item"] {
+ width: 100%;
+ display: flex;
+ padding: 8px 12px;
+ align-items: center;
+ gap: 8px;
+ align-self: stretch;
+ cursor: pointer;
+
+ [data-slot="selected-icon"] {
+ visibility: hidden;
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "IBM Plex Mono", monospace;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%;
+ }
+
+ span:last-child {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%;
+ }
+
+ &:hover,
+ &[data-active="true"] {
+ background: #161616;
+
+ [data-slot="selected-icon"] {
+ visibility: visible;
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/black.tsx b/packages/console/app/src/routes/black.tsx
new file mode 100644
index 0000000..243ae68
--- /dev/null
+++ b/packages/console/app/src/routes/black.tsx
@@ -0,0 +1,283 @@
+import { A, createAsync, RouteSectionProps } from "@solidjs/router"
+import { Title, Meta } from "@solidjs/meta"
+import { createMemo, createSignal } from "solid-js"
+import { github } from "~/lib/github"
+import { config } from "~/config"
+import { useLanguage } from "~/context/language"
+import { LanguagePicker } from "~/component/language-picker"
+import { useI18n } from "~/context/i18n"
+import Spotlight, { defaultConfig, type SpotlightAnimationState } from "~/component/spotlight"
+import { LocaleLinks } from "~/component/locale-links"
+import "./black.css"
+
+export default function BlackLayout(props: RouteSectionProps) {
+ const language = useLanguage()
+ const i18n = useI18n()
+ const githubData = createAsync(() => github())
+ const starCount = createMemo(() =>
+ githubData()?.stars
+ ? new Intl.NumberFormat(language.tag(language.locale()), {
+ notation: "compact",
+ compactDisplay: "short",
+ }).format(githubData()!.stars!)
+ : config.github.starsFormatted.compact,
+ )
+
+ const [spotlightAnimationState, setSpotlightAnimationState] = createSignal({
+ time: 0,
+ intensity: 0.5,
+ pulseValue: 1,
+ })
+
+ const svgLightingValues = createMemo(() => {
+ const state = spotlightAnimationState()
+ const t = state.time
+
+ const wave1 = Math.sin(t * 1.5) * 0.5 + 0.5
+ const wave2 = Math.sin(t * 2.3 + 1.2) * 0.5 + 0.5
+ const wave3 = Math.sin(t * 0.8 + 2.5) * 0.5 + 0.5
+
+ const shimmerPos = Math.sin(t * 0.7) * 0.5 + 0.5
+ const glowIntensity = Math.max(state.intensity * state.pulseValue * 0.35, 0.15)
+ const fillOpacity = Math.max(0.1 + wave1 * 0.08 * state.pulseValue, 0.12)
+ const strokeBrightness = Math.max(55 + wave2 * 25 * state.pulseValue, 60)
+
+ const shimmerIntensity = Math.max(wave3 * 0.15 * state.pulseValue, 0.08)
+
+ return {
+ glowIntensity,
+ fillOpacity,
+ strokeBrightness,
+ shimmerPos,
+ shimmerIntensity,
+ }
+ })
+
+ const svgLightingStyle = createMemo(() => {
+ const values = svgLightingValues()
+ return {
+ "--hero-black-glow-intensity": values.glowIntensity.toFixed(3),
+ "--hero-black-stroke-brightness": `${values.strokeBrightness.toFixed(0)}%`,
+ } as Record
+ })
+
+ const handleAnimationFrame = (state: SpotlightAnimationState) => {
+ setSpotlightAnimationState(state)
+ }
+
+ const spotlightConfig = () => defaultConfig
+
+ return (
+
+
{i18n.t("black.meta.title")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{i18n.t("black.hero.title")}
+
{i18n.t("black.hero.subtitle")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {props.children}
+
+
+
+
+ ©{new Date().getFullYear()} Anomaly
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/black/common.tsx b/packages/console/app/src/routes/black/common.tsx
new file mode 100644
index 0000000..8932a96
--- /dev/null
+++ b/packages/console/app/src/routes/black/common.tsx
@@ -0,0 +1,65 @@
+import { Match, Switch } from "solid-js"
+import { useI18n } from "~/context/i18n"
+
+export const plans = [
+ { id: "20", multiplier: null },
+ { id: "100", multiplier: "black.plan.multiplier100" },
+ { id: "200", multiplier: "black.plan.multiplier200" },
+] as const
+
+export type PlanID = (typeof plans)[number]["id"]
+export type Plan = (typeof plans)[number]
+
+export function PlanIcon(props: { plan: string }) {
+ const i18n = useI18n()
+
+ return (
+
+
+
+ {i18n.t("black.plan.icon20")}
+
+
+
+
+
+ {i18n.t("black.plan.icon100")}
+
+
+
+
+
+
+
+
+ {i18n.t("black.plan.icon200")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/black/index.tsx b/packages/console/app/src/routes/black/index.tsx
new file mode 100644
index 0000000..8bce3cd
--- /dev/null
+++ b/packages/console/app/src/routes/black/index.tsx
@@ -0,0 +1,125 @@
+import { A, createAsync, query, useSearchParams } from "@solidjs/router"
+import { Title } from "@solidjs/meta"
+import { createMemo, createSignal, For, Match, onMount, Show, Switch } from "solid-js"
+import { PlanIcon, plans } from "./common"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { Resource } from "@opencode-ai/console-resource"
+
+const getPaused = query(async () => {
+ "use server"
+ return Resource.App.stage === "production"
+}, "black.paused")
+
+export default function Black() {
+ const [params] = useSearchParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const paused = createAsync(() => getPaused())
+ const [selected, setSelected] = createSignal((params.plan as string) || null)
+ const [mounted, setMounted] = createSignal(false)
+ const selectedPlan = createMemo(() => plans.find((p) => p.id === selected()))
+
+ onMount(() => {
+ requestAnimationFrame(() => setMounted(true))
+ })
+
+ const transition = (action: () => void) => {
+ if (mounted() && "startViewTransition" in document) {
+ ;(document as any).startViewTransition(action)
+ return
+ }
+
+ action()
+ }
+
+ const select = (planId: string) => {
+ if (selected() === planId) {
+ return
+ }
+
+ transition(() => setSelected(planId))
+ }
+
+ const cancel = () => {
+ transition(() => setSelected(null))
+ }
+
+ return (
+ <>
+ {i18n.t("black.title")}
+
+ {i18n.t("black.paused")}
}>
+
+
+
+
+ {(plan) => (
+ select(plan.id)}
+ data-slot="pricing-card"
+ style={{ "view-transition-name": `card-${plan.id}` }}
+ >
+
+
+ ${plan.id} {" "}
+ {i18n.t("black.price.perMonth")}
+
+ {(multiplier) => {i18n.t(multiplier())} }
+
+
+
+ )}
+
+
+
+
+ {(plan) => (
+
+
+
+
+ ${plan().id} {" "}
+ {i18n.t("black.price.perPersonBilledMonthly")}
+
+ {(multiplier) => {i18n.t(multiplier())} }
+
+
+
+ {i18n.t("black.terms.1")}
+ {i18n.t("black.terms.2")}
+ {i18n.t("black.terms.3")}
+ {i18n.t("black.terms.4")}
+ {i18n.t("black.terms.5")}
+ {i18n.t("black.terms.6")}
+ {i18n.t("black.terms.7")}
+
+
+
+
+ )}
+
+
+
+
+
+ {i18n.t("black.finePrint.beforeTerms")} ·{" "}
+ {i18n.t("black.finePrint.terms")}
+
+
+
+ >
+ )
+}
diff --git a/packages/console/app/src/routes/black/subscribe/[plan].tsx b/packages/console/app/src/routes/black/subscribe/[plan].tsx
new file mode 100644
index 0000000..c29c5fa
--- /dev/null
+++ b/packages/console/app/src/routes/black/subscribe/[plan].tsx
@@ -0,0 +1,489 @@
+import { A, createAsync, query, redirect, useParams } from "@solidjs/router"
+import { Title } from "@solidjs/meta"
+import { createEffect, createSignal, For, Match, Show, Switch } from "solid-js"
+import { type Stripe, type PaymentMethod, loadStripe } from "@stripe/stripe-js"
+import { Elements, PaymentElement, useStripe, useElements, AddressElement } from "solid-stripe"
+import { PlanID, plans } from "../common"
+import { getActor, useAuthSession } from "~/context/auth"
+import { withActor } from "~/context/auth.withActor"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+import { createList } from "solid-list"
+import { Modal } from "~/component/modal"
+import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { formError } from "~/lib/form-error"
+import { Resource } from "@opencode-ai/console-resource"
+
+const getEnabled = query(async () => {
+ "use server"
+ return Resource.App.stage !== "production"
+}, "black.subscribe.enabled")
+
+const plansMap = Object.fromEntries(plans.map((p) => [p.id, p])) as Record
+const stripePromise = loadStripe(import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY!)
+
+const getWorkspaces = query(async (plan: string) => {
+ "use server"
+ const actor = await getActor()
+ if (actor.type === "public") throw redirect("/auth/authorize?continue=/black/subscribe/" + plan)
+ return withActor(async () => {
+ return Database.use((tx) =>
+ tx
+ .select({
+ id: WorkspaceTable.id,
+ name: WorkspaceTable.name,
+ slug: WorkspaceTable.slug,
+ billing: {
+ customerID: BillingTable.customerID,
+ paymentMethodID: BillingTable.paymentMethodID,
+ paymentMethodType: BillingTable.paymentMethodType,
+ paymentMethodLast4: BillingTable.paymentMethodLast4,
+ subscriptionID: BillingTable.subscriptionID,
+ timeSubscriptionBooked: BillingTable.timeSubscriptionBooked,
+ },
+ })
+ .from(UserTable)
+ .innerJoin(WorkspaceTable, eq(UserTable.workspaceID, WorkspaceTable.id))
+ .innerJoin(BillingTable, eq(WorkspaceTable.id, BillingTable.workspaceID))
+ .where(
+ and(
+ eq(UserTable.accountID, Actor.account()),
+ isNull(WorkspaceTable.timeDeleted),
+ isNull(UserTable.timeDeleted),
+ ),
+ ),
+ )
+ })
+}, "black.subscribe.workspaces")
+
+const createSetupIntent = async (input: { plan: string; workspaceID: string }) => {
+ "use server"
+ const { plan, workspaceID } = input
+
+ if (!plan || !["20", "100", "200"].includes(plan)) return { error: formError.invalidPlan }
+ if (!workspaceID) return { error: formError.workspaceRequired }
+
+ return withActor(async () => {
+ const session = await useAuthSession()
+ const account = session.data.account?.[session.data.current ?? ""]
+ const email = account?.email
+
+ const customer = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: BillingTable.customerID,
+ subscriptionID: BillingTable.subscriptionID,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0]),
+ )
+ if (customer?.subscriptionID) {
+ return { error: formError.alreadySubscribed }
+ }
+
+ let customerID = customer?.customerID
+ if (!customerID) {
+ const customer = await Billing.stripe().customers.create({
+ email,
+ metadata: {
+ workspaceID,
+ },
+ })
+ customerID = customer.id
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ customerID,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+ )
+ }
+
+ const intent = await Billing.stripe().setupIntents.create({
+ customer: customerID,
+ payment_method_types: ["card"],
+ metadata: {
+ workspaceID,
+ },
+ })
+
+ return { clientSecret: intent.client_secret ?? undefined }
+ }, workspaceID)
+}
+
+const bookSubscription = async (input: {
+ workspaceID: string
+ plan: PlanID
+ paymentMethodID: string
+ paymentMethodType: string
+ paymentMethodLast4?: string
+}) => {
+ "use server"
+ return withActor(
+ () =>
+ Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ paymentMethodID: input.paymentMethodID,
+ paymentMethodType: input.paymentMethodType,
+ paymentMethodLast4: input.paymentMethodLast4,
+ subscriptionPlan: input.plan,
+ timeSubscriptionBooked: new Date(),
+ })
+ .where(eq(BillingTable.workspaceID, input.workspaceID)),
+ ),
+ input.workspaceID,
+ )
+}
+
+interface SuccessData {
+ plan: string
+ paymentMethodType: string
+ paymentMethodLast4?: string
+}
+
+function Failure(props: { message: string }) {
+ const i18n = useI18n()
+
+ return (
+
+
+ {i18n.t("black.subscribe.failurePrefix")} {props.message}
+
+
+ )
+}
+
+function Success(props: SuccessData) {
+ const i18n = useI18n()
+
+ return (
+
+
{i18n.t("black.subscribe.success.title")}
+
+
+
{i18n.t("black.subscribe.success.subscriptionPlan")}
+ {i18n.t("black.subscribe.success.planName", { plan: props.plan })}
+
+
+
{i18n.t("black.subscribe.success.amount")}
+ {i18n.t("black.subscribe.success.amountValue", { plan: props.plan })}
+
+
+
{i18n.t("black.subscribe.success.paymentMethod")}
+
+ {props.paymentMethodType}}>
+
+ {props.paymentMethodType} - {props.paymentMethodLast4}
+
+
+
+
+
+
{i18n.t("black.subscribe.success.dateJoined")}
+ {new Date().toLocaleDateString(undefined, { month: "short", day: "numeric", year: "numeric" })}
+
+
+
{i18n.t("black.subscribe.success.chargeNotice")}
+
+ )
+}
+
+function IntentForm(props: { plan: PlanID; workspaceID: string; onSuccess: (data: SuccessData) => void }) {
+ const i18n = useI18n()
+ const stripe = useStripe()
+ const elements = useElements()
+ const [error, setError] = createSignal(undefined)
+ const [loading, setLoading] = createSignal(false)
+
+ const handleSubmit = async (e: Event) => {
+ e.preventDefault()
+ if (!stripe() || !elements()) return
+
+ setLoading(true)
+ setError(undefined)
+
+ const result = await elements()!.submit()
+ if (result.error) {
+ setError(result.error.message ?? i18n.t("black.subscribe.error.generic"))
+ setLoading(false)
+ return
+ }
+
+ const { error: confirmError, setupIntent } = await stripe()!.confirmSetup({
+ elements: elements()!,
+ confirmParams: {
+ expand: ["payment_method"],
+ payment_method_data: {
+ allow_redisplay: "always",
+ },
+ },
+ redirect: "if_required",
+ })
+
+ if (confirmError) {
+ setError(confirmError.message ?? i18n.t("black.subscribe.error.generic"))
+ setLoading(false)
+ return
+ }
+
+ if (setupIntent?.status === "succeeded") {
+ const pm = setupIntent.payment_method as PaymentMethod
+
+ await bookSubscription({
+ workspaceID: props.workspaceID,
+ plan: props.plan,
+ paymentMethodID: pm.id,
+ paymentMethodType: pm.type,
+ paymentMethodLast4: pm.card?.last4,
+ })
+
+ props.onSuccess({
+ plan: props.plan,
+ paymentMethodType: pm.type,
+ paymentMethodLast4: pm.card?.last4,
+ })
+ }
+
+ setLoading(false)
+ }
+
+ return (
+
+ )
+}
+
+export default function BlackSubscribe() {
+ const params = useParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const enabled = createAsync(() => getEnabled())
+ const planData = plansMap[(params.plan as PlanID) ?? "20"] ?? plansMap["20"]
+ const plan = planData.id
+
+ const workspaces = createAsync(() => getWorkspaces(plan))
+ const [selectedWorkspace, setSelectedWorkspace] = createSignal(undefined)
+ const [success, setSuccess] = createSignal(undefined)
+ const [failure, setFailure] = createSignal(undefined)
+ const [clientSecret, setClientSecret] = createSignal(undefined)
+ const [stripe, setStripe] = createSignal(undefined)
+
+ const formatError = (error: string) => {
+ if (error === formError.invalidPlan) return i18n.t("black.subscribe.error.invalidPlan")
+ if (error === formError.workspaceRequired) return i18n.t("black.subscribe.error.workspaceRequired")
+ if (error === formError.alreadySubscribed) return i18n.t("black.subscribe.error.alreadySubscribed")
+ if (error === "Invalid plan") return i18n.t("black.subscribe.error.invalidPlan")
+ if (error === "Workspace ID is required") return i18n.t("black.subscribe.error.workspaceRequired")
+ if (error === "This workspace already has a subscription") return i18n.t("black.subscribe.error.alreadySubscribed")
+ return error
+ }
+
+ // Resolve stripe promise once
+ createEffect(() => {
+ void stripePromise.then((s) => {
+ if (s) setStripe(s)
+ })
+ })
+
+ // Auto-select if only one workspace
+ createEffect(() => {
+ const ws = workspaces()
+ if (ws?.length === 1 && !selectedWorkspace()) {
+ setSelectedWorkspace(ws[0].id)
+ }
+ })
+
+ // Fetch setup intent when workspace is selected (unless workspace already has payment method)
+ createEffect(async () => {
+ const id = selectedWorkspace()
+ if (!id) return
+
+ const ws = workspaces()?.find((w) => w.id === id)
+ if (ws?.billing?.subscriptionID) {
+ setFailure(i18n.t("black.subscribe.error.alreadySubscribed"))
+ return
+ }
+ if (ws?.billing?.paymentMethodID) {
+ if (!ws?.billing?.timeSubscriptionBooked) {
+ await bookSubscription({
+ workspaceID: id,
+ plan: planData.id,
+ paymentMethodID: ws.billing.paymentMethodID!,
+ paymentMethodType: ws.billing.paymentMethodType!,
+ paymentMethodLast4: ws.billing.paymentMethodLast4 ?? undefined,
+ })
+ }
+ setSuccess({
+ plan: planData.id,
+ paymentMethodType: ws.billing.paymentMethodType!,
+ paymentMethodLast4: ws.billing.paymentMethodLast4 ?? undefined,
+ })
+ return
+ }
+
+ const result = await createSetupIntent({ plan, workspaceID: id })
+ if (result.error) {
+ setFailure(formatError(result.error))
+ } else if ("clientSecret" in result) {
+ setClientSecret(result.clientSecret)
+ }
+ })
+
+ // Keyboard navigation for workspace picker
+ const { active, setActive, onKeyDown } = createList({
+ items: () => workspaces()?.map((w) => w.id) ?? [],
+ initialActive: null,
+ })
+
+ const handleSelectWorkspace = (id: string) => {
+ setSelectedWorkspace(id)
+ }
+
+ let listRef: HTMLUListElement | undefined
+
+ // Show workspace picker if multiple workspaces and none selected
+ const showWorkspacePicker = () => {
+ const ws = workspaces()
+ return ws && ws.length > 1 && !selectedWorkspace()
+ }
+
+ return (
+
+ {i18n.t("black.subscribe.title")}
+
+
+
+ {(data) => }
+ {(data) => }
+
+ <>
+
+
{i18n.t("black.subscribe.title")}
+
+ ${planData.id} {" "}
+ {i18n.t("black.price.perMonth")}
+
+ {(multiplier) => {i18n.t(multiplier())} }
+
+
+
+
+ {i18n.t("black.subscribe.paymentMethod")}
+
+
+
+ {selectedWorkspace()
+ ? i18n.t("black.subscribe.loadingPaymentForm")
+ : i18n.t("black.subscribe.selectWorkspaceToContinue")}
+
+
+ }
+ >
+
+
+
+
+ >
+
+
+
+
+ {/* Workspace picker modal */}
+ {}}
+ title={i18n.t("black.workspace.selectPlan")}
+ variant="black"
+ >
+
+
{
+ if (e.key === "Enter" && active()) {
+ handleSelectWorkspace(active()!)
+ } else {
+ onKeyDown(e)
+ }
+ }}
+ >
+
+ {(workspace) => (
+ setActive(workspace.id)}
+ onClick={() => handleSelectWorkspace(workspace.id)}
+ >
+ [*]
+ {workspace.name || workspace.slug}
+
+ )}
+
+
+
+
+
+ {i18n.t("black.finePrint.beforeTerms")} ·{" "}
+ {i18n.t("black.finePrint.terms")}
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/black/workspace.css b/packages/console/app/src/routes/black/workspace.css
new file mode 100644
index 0000000..bf9d948
--- /dev/null
+++ b/packages/console/app/src/routes/black/workspace.css
@@ -0,0 +1,214 @@
+[data-page="black"] {
+ background: #000;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: stretch;
+ font-family: var(--font-mono);
+ color: #fff;
+
+ [data-component="header-gradient"] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 288px;
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(0, 0, 0, 0) 100%);
+ }
+
+ [data-component="header"] {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding-top: 40px;
+ flex-shrink: 0;
+
+ /* [data-component="header-logo"] { */
+ /* } */
+ }
+
+ [data-component="content"] {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ flex-grow: 1;
+
+ [data-slot="hero-black"] {
+ margin-top: 110px;
+
+ @media (min-width: 768px) {
+ margin-top: 150px;
+ }
+ }
+
+ [data-slot="select-workspace"] {
+ display: flex;
+ margin-top: -24px;
+ width: 100%;
+ max-width: 480px;
+ height: 305px;
+ padding: 32px 20px 0 20px;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 24px;
+
+ border: 1px solid #303030;
+ background: #0a0a0a;
+ box-shadow:
+ 0 100px 80px 0 rgba(0, 0, 0, 0.04),
+ 0 41.778px 33.422px 0 rgba(0, 0, 0, 0.05),
+ 0 22.336px 17.869px 0 rgba(0, 0, 0, 0.06),
+ 0 12.522px 10.017px 0 rgba(0, 0, 0, 0.08),
+ 0 6.65px 5.32px 0 rgba(0, 0, 0, 0.09),
+ 0 2.767px 2.214px 0 rgba(0, 0, 0, 0.13);
+
+ [data-slot="select-workspace-title"] {
+ flex-shrink: 0;
+ align-self: stretch;
+ color: rgba(255, 255, 255, 0.59);
+ text-align: center;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%; /* 25.6px */
+ }
+
+ [data-slot="workspaces"] {
+ width: 100%;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ align-self: stretch;
+ outline: none;
+ overflow-y: auto;
+ flex: 1;
+ min-height: 0;
+
+ scrollbar-width: none;
+ &::-webkit-scrollbar {
+ display: none;
+ }
+
+ [data-slot="workspace"] {
+ width: 100%;
+ display: flex;
+ padding: 8px 12px;
+ align-items: center;
+ gap: 8px;
+ align-self: stretch;
+ cursor: pointer;
+
+ [data-slot="selected-icon"] {
+ visibility: hidden;
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "IBM Plex Mono";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%; /* 25.6px */
+ }
+
+ a {
+ color: rgba(255, 255, 255, 0.92);
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 160%; /* 25.6px */
+ text-decoration: none;
+ }
+ }
+
+ [data-slot="workspace"]:hover,
+ [data-slot="workspace"][data-active="true"] {
+ background: #161616;
+
+ [data-slot="selected-icon"] {
+ visibility: visible;
+ }
+ }
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ gap: 24px;
+ flex-shrink: 0;
+
+ @media (min-width: 768px) {
+ height: 120px;
+ }
+
+ [data-slot="footer-content"] {
+ display: flex;
+ gap: 24px;
+ align-items: center;
+ justify-content: center;
+
+ @media (min-width: 768px) {
+ gap: 40px;
+ }
+
+ span,
+ a {
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ }
+
+ [data-slot="github-stars"] {
+ color: rgba(255, 255, 255, 0.25);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ }
+
+ [data-slot="anomaly"] {
+ display: none;
+
+ @media (min-width: 768px) {
+ display: block;
+ }
+ }
+ }
+ [data-slot="anomaly-alt"] {
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ margin-bottom: 24px;
+
+ a {
+ color: rgba(255, 255, 255, 0.39);
+ font-family: "JetBrains Mono Nerd Font";
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ text-decoration: none;
+ }
+
+ @media (min-width: 768px) {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/black/workspace.tsx b/packages/console/app/src/routes/black/workspace.tsx
new file mode 100644
index 0000000..106e8a2
--- /dev/null
+++ b/packages/console/app/src/routes/black/workspace.tsx
@@ -0,0 +1,238 @@
+import { A, createAsync, useNavigate } from "@solidjs/router"
+import "./workspace.css"
+import { Title } from "@solidjs/meta"
+import { github } from "~/lib/github"
+import { createEffect, createMemo, For, onMount } from "solid-js"
+import { config } from "~/config"
+import { createList } from "solid-list"
+import { useLanguage } from "~/context/language"
+import { LanguagePicker } from "~/component/language-picker"
+import { useI18n } from "~/context/i18n"
+
+export default function BlackWorkspace() {
+ const navigate = useNavigate()
+ const language = useLanguage()
+ const i18n = useI18n()
+ const githubData = createAsync(() => github())
+ const starCount = createMemo(() =>
+ githubData()?.stars
+ ? new Intl.NumberFormat(language.tag(language.locale()), {
+ notation: "compact",
+ compactDisplay: "short",
+ }).format(githubData()!.stars!)
+ : config.github.starsFormatted.compact,
+ )
+
+ // TODO: Frank, replace with real workspaces
+ const workspaces = [
+ { id: "wrk_123", n: 1 },
+ { id: "wrk_456", n: 2 },
+ { id: "wrk_789", n: 3 },
+ { id: "wrk_111", n: 4 },
+ { id: "wrk_222", n: 5 },
+ { id: "wrk_333", n: 6 },
+ { id: "wrk_444", n: 7 },
+ { id: "wrk_555", n: 8 },
+ ].map((workspace) => ({
+ ...workspace,
+ name: i18n.t("black.workspace.name", { n: workspace.n }),
+ }))
+
+ let listRef: HTMLUListElement | undefined
+
+ const { active, setActive, onKeyDown } = createList({
+ items: () => workspaces.map((w) => w.id),
+ initialActive: workspaces[0]?.id ?? null,
+ handleTab: true,
+ })
+
+ onMount(() => {
+ listRef?.focus()
+ })
+
+ createEffect(() => {
+ const id = active()
+ if (!id || !listRef) return
+ const el = listRef.querySelector(`[data-id="${id}"]`)
+ el?.scrollIntoView({ block: "nearest" })
+ })
+
+ return (
+
+
{i18n.t("black.workspace.title")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("black.workspace.selectPlan")}
+ {
+ if (e.key === "Enter" && active()) {
+ navigate(`/black/workspace/${active()}`)
+ } else if (e.key === "Tab") {
+ e.preventDefault()
+ onKeyDown(e)
+ } else {
+ onKeyDown(e)
+ }
+ }}
+ >
+
+ {(workspace) => (
+ setActive(workspace.id)}
+ onClick={() => navigate(`/black/workspace/${workspace.id}`)}
+ >
+ [*]
+ {workspace.name}
+
+ )}
+
+
+
+
+
+
+
+ ©{new Date().getFullYear()} Anomaly
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/brand/index.css b/packages/console/app/src/routes/brand/index.css
new file mode 100644
index 0000000..8a32651
--- /dev/null
+++ b/packages/console/app/src/routes/brand/index.css
@@ -0,0 +1,556 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+[data-page="enterprise"],
+[data-page="legal"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-weak-hover: hsl(0, 8%, 94%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 60%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+ --color-text-success: hsl(119, 100%, 35%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+ --color-success: hsl(142, 76%, 36%);
+
+ background: var(--color-background);
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-weak-hover: hsl(0, 6%, 15%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+ --color-text-success: hsl(119, 60%, 72%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ --color-success: hsl(142, 76%, 46%);
+ }
+
+ /* Header and Footer styles - copied from index.css */
+ [data-component="top"] {
+ padding: 24px 5rem;
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+ z-index: 10;
+
+ @media (max-width: 60rem) {
+ padding: 24px 1.5rem;
+ }
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px 8px 10px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ margin-right: -8px;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ /* Mobile: third column on its own row */
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ }
+
+ [data-component="brand-content"] {
+ padding: 4rem 5rem;
+
+ h1 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 1rem;
+ }
+
+ h3 {
+ font-size: 1.25rem;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin: 2rem 0 1rem 0;
+ }
+
+ p {
+ line-height: 1.6;
+ margin-bottom: 2.5rem;
+ color: var(--color-text);
+ }
+
+ [data-component="download-button"] {
+ padding: 8px 12px 8px 20px;
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ display: flex;
+ width: fit-content;
+ align-items: center;
+ gap: 12px;
+ transition: all 0.2s ease;
+ text-decoration: none;
+
+ &:hover:not(:disabled) {
+ background: var(--color-background-strong-hover);
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ }
+ }
+
+ [data-component="brand-grid"] {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 2rem;
+ margin-top: 4rem;
+ margin-bottom: 2rem;
+ }
+
+ [data-component="brand-grid"] img {
+ width: 100%;
+ height: auto;
+ display: block;
+ border-radius: 4px;
+ border: 1px solid var(--color-border-weak);
+ }
+
+ [data-component="brand-grid"] > div {
+ position: relative;
+ }
+
+ [data-component="actions"] {
+ position: absolute;
+ background: rgba(4, 0, 0, 0.08);
+ border-radius: 4px;
+ bottom: 0;
+ right: 0;
+ top: 0;
+ left: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ opacity: 0;
+ transition: opacity 0.2s ease;
+
+ @media (max-width: 40rem) {
+ position: static;
+ opacity: 1;
+ background: none;
+ margin-top: 1rem;
+ justify-content: start;
+ }
+ }
+
+ [data-component="brand-grid"] > div:hover [data-component="actions"] {
+ opacity: 1;
+
+ @media (max-width: 40rem) {
+ opacity: 1;
+ }
+ }
+
+ [data-component="actions"] button {
+ padding: 6px 12px;
+ background: var(--color-background);
+ color: var(--color-text);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ transition: all 0.2s ease;
+ cursor: pointer;
+ box-shadow:
+ 0 0 0 1px rgba(19, 16, 16, 0.08),
+ 0 6px 8px -4px rgba(19, 16, 16, 0.12),
+ 0 4px 3px -2px rgba(19, 16, 16, 0.12),
+ 0 1px 2px -1px rgba(19, 16, 16, 0.12);
+
+ @media (max-width: 40rem) {
+ box-shadow: 0 0 0 1px rgba(19, 16, 16, 0.16);
+ }
+
+ &:hover {
+ background: var(--color-background);
+ }
+
+ &:active {
+ transform: scale(0.98);
+ box-shadow:
+ 0 0 0 1px rgba(19, 16, 16, 0.08),
+ 0 6px 8px -8px rgba(19, 16, 16, 0.5);
+ }
+ }
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+ }
+
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: 4rem 5rem;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+
+ h3 {
+ font-size: 16px;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ p {
+ margin-bottom: 12px;
+ color: var(--color-text);
+ }
+ }
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+ color: var(--color-text);
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ padding: 2rem 5rem;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+
+ &:hover {
+ text-decoration-thickness: 2px;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/brand/index.tsx b/packages/console/app/src/routes/brand/index.tsx
new file mode 100644
index 0000000..af89f49
--- /dev/null
+++ b/packages/console/app/src/routes/brand/index.tsx
@@ -0,0 +1,315 @@
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { useI18n } from "~/context/i18n"
+import { LocaleLinks } from "~/component/locale-links"
+import previewLogoLight from "../../asset/brand/preview-opencode-logo-light.png"
+import previewLogoDark from "../../asset/brand/preview-opencode-logo-dark.png"
+import previewLogoLightSquare from "../../asset/brand/preview-opencode-logo-light-square.png"
+import previewLogoDarkSquare from "../../asset/brand/preview-opencode-logo-dark-square.png"
+import previewWordmarkLight from "../../asset/brand/preview-opencode-wordmark-light.png"
+import previewWordmarkDark from "../../asset/brand/preview-opencode-wordmark-dark.png"
+import previewWordmarkSimpleLight from "../../asset/brand/preview-opencode-wordmark-simple-light.png"
+import previewWordmarkSimpleDark from "../../asset/brand/preview-opencode-wordmark-simple-dark.png"
+import logoLightPng from "../../asset/brand/opencode-logo-light.png"
+import logoDarkPng from "../../asset/brand/opencode-logo-dark.png"
+import logoLightSquarePng from "../../asset/brand/opencode-logo-light-square.png"
+import logoDarkSquarePng from "../../asset/brand/opencode-logo-dark-square.png"
+import wordmarkLightPng from "../../asset/brand/opencode-wordmark-light.png"
+import wordmarkDarkPng from "../../asset/brand/opencode-wordmark-dark.png"
+import wordmarkSimpleLightPng from "../../asset/brand/opencode-wordmark-simple-light.png"
+import wordmarkSimpleDarkPng from "../../asset/brand/opencode-wordmark-simple-dark.png"
+import logoLightSvg from "../../asset/brand/opencode-logo-light.svg"
+import logoDarkSvg from "../../asset/brand/opencode-logo-dark.svg"
+import logoLightSquareSvg from "../../asset/brand/opencode-logo-light-square.svg"
+import logoDarkSquareSvg from "../../asset/brand/opencode-logo-dark-square.svg"
+import wordmarkLightSvg from "../../asset/brand/opencode-wordmark-light.svg"
+import wordmarkDarkSvg from "../../asset/brand/opencode-wordmark-dark.svg"
+import wordmarkSimpleLightSvg from "../../asset/brand/opencode-wordmark-simple-light.svg"
+import wordmarkSimpleDarkSvg from "../../asset/brand/opencode-wordmark-simple-dark.svg"
+const brandAssets = "/opencode-brand-assets.zip"
+
+export default function Brand() {
+ const i18n = useI18n()
+ const alt = i18n.t("brand.meta.description")
+ const downloadFile = async (url: string, filename: string) => {
+ try {
+ const response = await fetch(url)
+ const blob = await response.blob()
+ const blobUrl = window.URL.createObjectURL(blob)
+
+ const link = document.createElement("a")
+ link.href = blobUrl
+ link.download = filename
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+
+ window.URL.revokeObjectURL(blobUrl)
+ } catch (error) {
+ console.error("Download failed:", error)
+ const link = document.createElement("a")
+ link.href = url
+ link.target = "_blank"
+ link.rel = "noopener noreferrer"
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ }
+ }
+
+ return (
+
+ {i18n.t("brand.title")}
+
+
+
+
+
+
+
+ {i18n.t("brand.heading")}
+ {i18n.t("brand.subtitle")}
+ downloadFile(brandAssets, "opencode-brand-assets.zip")}
+ >
+ {i18n.t("brand.downloadAll")}
+
+
+
+
+
+
+
+
+
+
downloadFile(logoLightPng, "opencode-logo-light.png")}>
+ PNG
+
+
+
+
+
downloadFile(logoLightSvg, "opencode-logo-light.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(logoDarkPng, "opencode-logo-dark.png")}>
+ PNG
+
+
+
+
+
downloadFile(logoDarkSvg, "opencode-logo-dark.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(logoLightSquarePng, "opencode-logo-light-square.png")}>
+ PNG
+
+
+
+
+
downloadFile(logoLightSquareSvg, "opencode-logo-light-square.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(logoDarkSquarePng, "opencode-logo-dark-square.png")}>
+ PNG
+
+
+
+
+
downloadFile(logoDarkSquareSvg, "opencode-logo-dark-square.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(wordmarkLightPng, "opencode-wordmark-light.png")}>
+ PNG
+
+
+
+
+
downloadFile(wordmarkLightSvg, "opencode-wordmark-light.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(wordmarkDarkPng, "opencode-wordmark-dark.png")}>
+ PNG
+
+
+
+
+
downloadFile(wordmarkDarkSvg, "opencode-wordmark-dark.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(wordmarkSimpleLightPng, "opencode-wordmark-simple-light.png")}>
+ PNG
+
+
+
+
+
downloadFile(wordmarkSimpleLightSvg, "opencode-wordmark-simple-light.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
downloadFile(wordmarkSimpleDarkPng, "opencode-wordmark-simple-dark.png")}>
+ PNG
+
+
+
+
+
downloadFile(wordmarkSimpleDarkSvg, "opencode-wordmark-simple-dark.svg")}>
+ SVG
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/changelog.json.ts b/packages/console/app/src/routes/changelog.json.ts
new file mode 100644
index 0000000..f06c1be
--- /dev/null
+++ b/packages/console/app/src/routes/changelog.json.ts
@@ -0,0 +1,30 @@
+import { loadChangelog } from "~/lib/changelog"
+
+const cors = {
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
+}
+
+const ok = "public, max-age=1, s-maxage=300, stale-while-revalidate=86400, stale-if-error=86400"
+const error = "public, max-age=1, s-maxage=60, stale-while-revalidate=600, stale-if-error=86400"
+
+export async function GET() {
+ const result = await loadChangelog().catch(() => ({ ok: false, releases: [] }))
+
+ return new Response(JSON.stringify({ releases: result.releases }), {
+ status: result.ok ? 200 : 503,
+ headers: {
+ "Content-Type": "application/json",
+ "Cache-Control": result.ok ? ok : error,
+ ...cors,
+ },
+ })
+}
+
+export async function OPTIONS() {
+ return new Response(null, {
+ status: 200,
+ headers: cors,
+ })
+}
diff --git a/packages/console/app/src/routes/changelog/index.css b/packages/console/app/src/routes/changelog/index.css
new file mode 100644
index 0000000..27b44f0
--- /dev/null
+++ b/packages/console/app/src/routes/changelog/index.css
@@ -0,0 +1,604 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+[data-page="changelog"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-weak-hover: hsl(0, 8%, 94%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 60%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+
+ background: var(--color-background);
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-weak-hover: hsl(0, 6%, 15%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ }
+
+ /* Header styles - copied from download */
+ [data-component="top"] {
+ padding: 24px 5rem;
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+ z-index: 10;
+
+ @media (max-width: 60rem) {
+ padding: 24px 1.5rem;
+ }
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px 8px 10px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ margin-right: -8px;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+ margin-top: 4rem;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ padding: 6rem 5rem;
+
+ @media (max-width: 60rem) {
+ padding: 4rem 1.5rem;
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ padding: 2rem 5rem;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+
+ /* Changelog Hero */
+ [data-component="changelog-hero"] {
+ margin-bottom: 4rem;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid var(--color-border-weak);
+
+ @media (max-width: 50rem) {
+ margin-bottom: 2rem;
+ padding-bottom: 1.5rem;
+ }
+
+ h1 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 8px;
+ }
+
+ p {
+ color: var(--color-text);
+ }
+ }
+
+ /* Releases */
+ [data-component="releases"] {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ }
+
+ [data-component="release"] {
+ display: grid;
+ grid-template-columns: 180px 1fr;
+ gap: 3rem;
+ padding: 2rem 0;
+ border-bottom: 1px solid var(--color-border-weak);
+
+ @media (max-width: 50rem) {
+ grid-template-columns: 1fr;
+ gap: 1rem;
+ }
+
+ &:first-child {
+ padding-top: 0;
+ }
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ header {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ position: sticky;
+ top: 80px;
+ align-self: start;
+ background: var(--color-background);
+ padding: 44px 0 8px;
+
+ @media (max-width: 50rem) {
+ position: static;
+ flex-direction: row;
+ align-items: center;
+ gap: 12px;
+ padding: 0;
+ }
+
+ [data-slot="version"] {
+ a {
+ font-weight: 600;
+ color: var(--color-text-strong);
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+ }
+
+ time {
+ color: var(--color-text-weak);
+ font-size: 14px;
+ }
+ }
+
+ [data-slot="content"] {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+ }
+
+ [data-component="section"] {
+ h3 {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-bottom: 6px;
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ padding-left: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+
+ li {
+ color: var(--color-text);
+ font-size: 13px;
+ line-height: 1.5;
+ padding-left: 12px;
+ position: relative;
+
+ &::before {
+ content: "-";
+ position: absolute;
+ left: 0;
+ color: var(--color-text-weak);
+ }
+
+ [data-slot="author"] {
+ color: var(--color-text-weak);
+ font-size: 12px;
+ margin-left: 4px;
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+ }
+ }
+ }
+
+ [data-component="contributors"] {
+ font-size: 13px;
+ color: var(--color-text-weak);
+ padding-top: 0.5rem;
+
+ span {
+ color: var(--color-text-weak);
+ }
+
+ a {
+ color: var(--color-text);
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+ }
+
+ [data-component="highlights"] {
+ display: flex;
+ flex-direction: column;
+ gap: 3rem;
+ margin-bottom: 0.75rem;
+ }
+
+ [data-component="collapsible-sections"] {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ }
+
+ [data-component="collapsible-section"] {
+ [data-slot="toggle"] {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ background: none;
+ border: none;
+ padding: 6px 0;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--color-text-weak);
+
+ &:hover {
+ color: var(--color-text);
+ }
+
+ [data-slot="icon"] {
+ font-size: 10px;
+ }
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ padding-left: 16px;
+ padding-bottom: 8px;
+
+ li {
+ color: var(--color-text);
+ font-size: 13px;
+ line-height: 1.5;
+ padding-left: 12px;
+ position: relative;
+
+ &::before {
+ content: "-";
+ position: absolute;
+ left: 0;
+ color: var(--color-text-weak);
+ }
+
+ [data-slot="author"] {
+ color: var(--color-text-weak);
+ font-size: 12px;
+ margin-left: 4px;
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+ }
+ }
+ }
+
+ [data-component="highlight"] {
+ h4 {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-bottom: 8px;
+ }
+
+ hr {
+ border: none;
+ border-top: 1px solid var(--color-border-weak);
+ margin-bottom: 16px;
+ }
+
+ [data-slot="highlight-item"] {
+ margin-bottom: 48px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ p[data-slot="title"] {
+ font-weight: 600;
+ font-size: 16px;
+ margin-bottom: 4px;
+ }
+
+ p {
+ font-size: 14px;
+ margin-bottom: 12px;
+ }
+ }
+
+ img,
+ video {
+ max-width: 100%;
+ height: auto;
+ border-radius: 4px;
+ }
+ }
+ }
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+
+ &:hover {
+ text-decoration-thickness: 2px;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/changelog/index.tsx b/packages/console/app/src/routes/changelog/index.tsx
new file mode 100644
index 0000000..54f0374
--- /dev/null
+++ b/packages/console/app/src/routes/changelog/index.tsx
@@ -0,0 +1,176 @@
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+import { createAsync } from "@solidjs/router"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { changelog } from "~/lib/changelog"
+import type { HighlightGroup } from "~/lib/changelog"
+import { For, Show, createSignal } from "solid-js"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { LocaleLinks } from "~/component/locale-links"
+
+function formatDate(dateString: string, locale: string) {
+ const date = new Date(dateString)
+ return date.toLocaleDateString(locale, {
+ year: "numeric",
+ month: "short",
+ day: "numeric",
+ })
+}
+
+function ReleaseItem(props: { item: string }) {
+ const parts = () => {
+ const match = props.item.match(/^(.+?)(\s*\(@([\w-]+)\))?$/)
+ if (match) {
+ return {
+ text: match[1],
+ username: match[3],
+ }
+ }
+ return { text: props.item, username: undefined }
+ }
+
+ return (
+
+ {parts().text}
+
+
+ (@{parts().username})
+
+
+
+ )
+}
+
+function HighlightSection(props: { group: HighlightGroup }) {
+ return (
+
+
{props.group.source}
+
+
+ {(item) => (
+
+
{item.title}
+
{item.description}
+
+
+
+
+
+
+
+ )}
+
+
+ )
+}
+
+function CollapsibleSection(props: { section: { title: string; items: string[] } }) {
+ const [open, setOpen] = createSignal(false)
+
+ return (
+
+
setOpen(!open())}>
+ {open() ? "▾" : "▸"}
+ {props.section.title}
+
+
+
+
+
+ )
+}
+
+function CollapsibleSections(props: { sections: { title: string; items: string[] }[] }) {
+ return (
+
+ {(section) => }
+
+ )
+}
+
+export default function Changelog() {
+ const i18n = useI18n()
+ const language = useLanguage()
+ const data = createAsync(() => changelog())
+ const releases = () => data() ?? []
+
+ return (
+
+ {i18n.t("changelog.title")}
+
+
+
+
+
+
+
+
+ {i18n.t("changelog.hero.title")}
+ {i18n.t("changelog.hero.subtitle")}
+
+
+
+
+
+ {i18n.t("changelog.empty")}{" "}
+ {i18n.t("changelog.viewJson")}
+
+
+
+ {(release) => {
+ return (
+
+
+
+ {formatDate(release.date, language.tag(language.locale()))}
+
+
+
0}>
+
+ {(group) => }
+
+
+
0 && release.sections.length > 0}>
+
+
+
+
+ {(section) => (
+
+ )}
+
+
+
+
+ )
+ }}
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/data/[...path].ts b/packages/console/app/src/routes/data/[...path].ts
new file mode 100644
index 0000000..d189921
--- /dev/null
+++ b/packages/console/app/src/routes/data/[...path].ts
@@ -0,0 +1,8 @@
+import { statsProxy } from "~/lib/stats-proxy"
+
+export const GET = statsProxy
+export const POST = statsProxy
+export const PUT = statsProxy
+export const DELETE = statsProxy
+export const OPTIONS = statsProxy
+export const PATCH = statsProxy
diff --git a/packages/console/app/src/routes/data/index.ts b/packages/console/app/src/routes/data/index.ts
new file mode 100644
index 0000000..d189921
--- /dev/null
+++ b/packages/console/app/src/routes/data/index.ts
@@ -0,0 +1,8 @@
+import { statsProxy } from "~/lib/stats-proxy"
+
+export const GET = statsProxy
+export const POST = statsProxy
+export const PUT = statsProxy
+export const DELETE = statsProxy
+export const OPTIONS = statsProxy
+export const PATCH = statsProxy
diff --git a/packages/console/app/src/routes/desktop-feedback.ts b/packages/console/app/src/routes/desktop-feedback.ts
new file mode 100644
index 0000000..1916cdb
--- /dev/null
+++ b/packages/console/app/src/routes/desktop-feedback.ts
@@ -0,0 +1,5 @@
+import { redirect } from "@solidjs/router"
+
+export async function GET() {
+ return redirect("https://discord.gg/h5TNnkFVNy")
+}
diff --git a/packages/console/app/src/routes/discord.ts b/packages/console/app/src/routes/discord.ts
new file mode 100644
index 0000000..7088295
--- /dev/null
+++ b/packages/console/app/src/routes/discord.ts
@@ -0,0 +1,5 @@
+import { redirect } from "@solidjs/router"
+
+export async function GET() {
+ return redirect("https://discord.gg/opencode")
+}
diff --git a/packages/console/app/src/routes/docs/[...path].ts b/packages/console/app/src/routes/docs/[...path].ts
new file mode 100644
index 0000000..164bd28
--- /dev/null
+++ b/packages/console/app/src/routes/docs/[...path].ts
@@ -0,0 +1,30 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { Resource } from "@opencode-ai/console-resource"
+import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
+
+async function handler(evt: APIEvent) {
+ const req = evt.request.clone()
+ const url = new URL(req.url)
+ const locale = localeFromRequest(req)
+ const host = Resource.App.stage === "production" ? "docs.opencode.ai" : "docs.dev.opencode.ai"
+ const targetUrl = `https://${host}${docs(locale, url.pathname)}${url.search}`
+
+ const headers = new Headers(req.headers)
+ headers.set("accept-language", tag(locale))
+
+ const response = await fetch(targetUrl, {
+ method: req.method,
+ headers,
+ body: req.body,
+ })
+ const next = new Response(response.body, response)
+ next.headers.append("set-cookie", cookie(locale))
+ return next
+}
+
+export const GET = handler
+export const POST = handler
+export const PUT = handler
+export const DELETE = handler
+export const OPTIONS = handler
+export const PATCH = handler
diff --git a/packages/console/app/src/routes/docs/index.ts b/packages/console/app/src/routes/docs/index.ts
new file mode 100644
index 0000000..164bd28
--- /dev/null
+++ b/packages/console/app/src/routes/docs/index.ts
@@ -0,0 +1,30 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { Resource } from "@opencode-ai/console-resource"
+import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
+
+async function handler(evt: APIEvent) {
+ const req = evt.request.clone()
+ const url = new URL(req.url)
+ const locale = localeFromRequest(req)
+ const host = Resource.App.stage === "production" ? "docs.opencode.ai" : "docs.dev.opencode.ai"
+ const targetUrl = `https://${host}${docs(locale, url.pathname)}${url.search}`
+
+ const headers = new Headers(req.headers)
+ headers.set("accept-language", tag(locale))
+
+ const response = await fetch(targetUrl, {
+ method: req.method,
+ headers,
+ body: req.body,
+ })
+ const next = new Response(response.body, response)
+ next.headers.append("set-cookie", cookie(locale))
+ return next
+}
+
+export const GET = handler
+export const POST = handler
+export const PUT = handler
+export const DELETE = handler
+export const OPTIONS = handler
+export const PATCH = handler
diff --git a/packages/console/app/src/routes/download/[channel]/[platform].ts b/packages/console/app/src/routes/download/[channel]/[platform].ts
new file mode 100644
index 0000000..7a4b5ef
--- /dev/null
+++ b/packages/console/app/src/routes/download/[channel]/[platform].ts
@@ -0,0 +1,43 @@
+import type { APIEvent } from "@solidjs/start"
+import type { DownloadPlatform } from "../types"
+
+const prodAssetNames: Record = {
+ "darwin-aarch64-dmg": "opencode-desktop-mac-arm64.dmg",
+ "darwin-x64-dmg": "opencode-desktop-mac-x64.dmg",
+ "windows-x64-nsis": "opencode-desktop-win-x64.exe",
+ "linux-x64-deb": "opencode-desktop-linux-amd64.deb",
+ "linux-x64-appimage": "opencode-desktop-linux-x86_64.AppImage",
+ "linux-x64-rpm": "opencode-desktop-linux-x86_64.rpm",
+} satisfies Record
+
+const betaAssetNames: Record = {
+ "darwin-aarch64-dmg": "opencode-desktop-mac-arm64.dmg",
+ "darwin-x64-dmg": "opencode-desktop-mac-x64.dmg",
+ "windows-x64-nsis": "opencode-desktop-win-x64.exe",
+ "linux-x64-deb": "opencode-desktop-linux-amd64.deb",
+ "linux-x64-appimage": "opencode-desktop-linux-x86_64.AppImage",
+ "linux-x64-rpm": "opencode-desktop-linux-x86_64.rpm",
+} satisfies Record
+
+// Doing this on the server lets us preserve the original name for platforms we don't care to rename for
+const downloadNames: Record = {
+ "darwin-aarch64-dmg": "OpenCode Desktop.dmg",
+ "darwin-x64-dmg": "OpenCode Desktop.dmg",
+ "windows-x64-nsis": "OpenCode Desktop Installer.exe",
+} satisfies { [K in DownloadPlatform]?: string }
+
+export async function GET({ params: { platform, channel } }: APIEvent) {
+ const assetName = channel === "stable" ? prodAssetNames[platform] : betaAssetNames[platform]
+ if (!assetName) return new Response(null, { status: 404 })
+
+ const resp = await fetch(
+ `https://github.com/anomalyco/${channel === "stable" ? "opencode" : "opencode-beta"}/releases/latest/download/${assetName}`,
+ )
+
+ const downloadName = downloadNames[platform]
+
+ const headers = new Headers(resp.headers)
+ if (downloadName) headers.set("content-disposition", `attachment; filename="${downloadName}"`)
+
+ return new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers })
+}
diff --git a/packages/console/app/src/routes/download/index.css b/packages/console/app/src/routes/download/index.css
new file mode 100644
index 0000000..b2176c3
--- /dev/null
+++ b/packages/console/app/src/routes/download/index.css
@@ -0,0 +1,752 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+[data-page="download"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-weak-hover: hsl(0, 8%, 94%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 60%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+ --color-text-success: hsl(119, 100%, 35%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+ --color-success: hsl(142, 76%, 36%);
+
+ background: var(--color-background);
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-weak-hover: hsl(0, 6%, 15%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+ --color-text-success: hsl(119, 60%, 72%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ --color-success: hsl(142, 76%, 46%);
+ }
+
+ /* Header and Footer styles - copied from enterprise */
+ [data-component="top"] {
+ padding: 24px 5rem;
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+ z-index: 10;
+
+ @media (max-width: 60rem) {
+ padding: 24px 1.5rem;
+ }
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ margin-right: -8px;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ padding: 6rem 5rem;
+
+ @media (max-width: 60rem) {
+ padding: 4rem 1.5rem;
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ padding: 2rem 5rem;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+
+ /* Download Hero Section */
+ [data-component="download-hero"] {
+ /* display: grid; */
+ display: none;
+ grid-template-columns: 260px 1fr;
+ gap: 4rem;
+ padding-bottom: 2rem;
+ margin-bottom: 4rem;
+
+ @media (max-width: 50rem) {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ padding-bottom: 2rem;
+ margin-bottom: 2rem;
+ }
+
+ [data-component="hero-icon"] {
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+
+ [data-slot="icon-placeholder"] {
+ width: 120px;
+ height: 120px;
+ background: var(--color-background-weak);
+ border: 1px solid var(--color-border-weak);
+ border-radius: 24px;
+
+ @media (max-width: 50rem) {
+ width: 80px;
+ height: 80px;
+ }
+ }
+
+ img {
+ width: 120px;
+ height: 120px;
+ border-radius: 24px;
+ box-shadow:
+ 0 1.467px 2.847px 0 rgba(0, 0, 0, 0.42),
+ 0 0.779px 1.512px 0 rgba(0, 0, 0, 0.34),
+ 0 0.324px 0.629px 0 rgba(0, 0, 0, 0.24);
+
+ @media (max-width: 50rem) {
+ width: 80px;
+ height: 80px;
+ border-radius: 16px;
+ }
+ }
+
+ @media (max-width: 50rem) {
+ justify-content: flex-start;
+ }
+ }
+
+ [data-component="hero-text"] {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+
+ h1 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 4px;
+
+ @media (max-width: 40rem) {
+ margin-bottom: 1rem;
+ }
+ }
+
+ p {
+ color: var(--color-text);
+ margin-bottom: 12px;
+
+ @media (max-width: 40rem) {
+ margin-bottom: 2.5rem;
+ line-height: 1.6;
+ }
+ }
+
+ [data-component="download-button"] {
+ padding: 8px 20px 8px 16px;
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ transition: all 0.2s ease;
+ text-decoration: none;
+ width: fit-content;
+
+ &:hover:not(:disabled) {
+ background: var(--color-background-strong-hover);
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ }
+ }
+ }
+ }
+
+ /* Download Sections */
+ [data-component="download-section"] {
+ display: grid;
+ grid-template-columns: 260px 1fr;
+ gap: 4rem;
+ margin-bottom: 4rem;
+
+ @media (max-width: 50rem) {
+ grid-template-columns: 1fr;
+ gap: 1rem;
+ margin-bottom: 3rem;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ [data-component="section-label"] {
+ font-weight: 500;
+ color: var(--color-text-strong);
+ padding-top: 1rem;
+
+ span {
+ color: var(--color-text-weaker);
+ }
+
+ @media (max-width: 50rem) {
+ padding-top: 0;
+ padding-bottom: 0.5rem;
+ }
+ }
+
+ [data-component="section-content"] {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ }
+ }
+
+ /* CLI Rows */
+ button[data-component="cli-row"] {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 1rem 0.5rem 1rem 1.5rem;
+ margin: 0 -0.5rem 0 -1.5rem;
+ background: none;
+ border: none;
+ border-radius: 4px;
+ width: calc(100% + 2rem);
+ text-align: left;
+ cursor: pointer;
+ transition: background 0.15s ease;
+
+ &:hover {
+ background: var(--color-background-weak);
+ }
+
+ code {
+ font-family: var(--font-mono);
+ color: var(--color-text-weak);
+
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+ }
+
+ [data-component="copy-status"] {
+ display: flex;
+ align-items: center;
+ opacity: 0;
+ transition: opacity 0.15s ease;
+ color: var(--color-icon);
+
+ svg {
+ width: 18px;
+ height: 18px;
+ }
+
+ [data-slot="copy"] {
+ display: block;
+ }
+
+ [data-slot="check"] {
+ display: none;
+ }
+ }
+
+ &:hover [data-component="copy-status"] {
+ opacity: 1;
+ }
+
+ &[data-copied] [data-component="copy-status"] {
+ opacity: 1;
+
+ [data-slot="copy"] {
+ display: none;
+ }
+
+ [data-slot="check"] {
+ display: block;
+ }
+ }
+ }
+
+ /* Download Rows */
+ [data-component="download-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0.75rem 0.5rem 0.75rem 1.5rem;
+ margin: 0 -0.5rem 0 -1.5rem;
+ border-radius: 4px;
+ transition: background 0.15s ease;
+
+ &:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="download-info"] {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+
+ [data-slot="icon"] {
+ width: 20px;
+ height: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: var(--color-icon);
+
+ svg {
+ width: 20px;
+ height: 20px;
+ }
+
+ img {
+ width: 20px;
+ height: 20px;
+ }
+ }
+
+ span {
+ color: var(--color-text);
+ }
+ }
+
+ [data-component="action-button"] {
+ padding: 6px 16px;
+ background: var(--color-background);
+ color: var(--color-text);
+ border: 1px solid var(--color-border);
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ text-decoration: none;
+ transition: all 0.2s ease;
+
+ &:hover {
+ background: var(--color-background-weak);
+ border-color: var(--color-border);
+ text-decoration: none;
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+ }
+ }
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+
+ &:hover {
+ text-decoration-thickness: 2px;
+ }
+ }
+
+ /* Narrow screen font sizes */
+ @media (max-width: 40rem) {
+ [data-component="download-section"] {
+ [data-component="section-label"] {
+ font-size: 14px;
+ }
+ }
+
+ button[data-component="cli-row"] {
+ margin: 0;
+ padding: 1rem 0;
+ width: 100%;
+ overflow: hidden;
+
+ code {
+ font-size: 14px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: block;
+ max-width: calc(100vw - 80px);
+ }
+
+ [data-component="copy-status"] {
+ opacity: 1 !important;
+ flex-shrink: 0;
+ }
+ }
+
+ [data-component="download-row"] {
+ margin: 0;
+ padding: 0.75rem 0;
+
+ [data-component="download-info"] span {
+ font-size: 14px;
+ }
+
+ [data-component="action-button"] {
+ font-size: 14px;
+ padding-left: 8px;
+ padding-right: 8px;
+ }
+ }
+ }
+
+ @media (max-width: 22.5rem) {
+ [data-slot="hide-narrow"] {
+ display: none;
+ }
+ }
+
+ /* FAQ Section */
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: 4rem 5rem;
+ margin-top: 4rem;
+
+ @media (max-width: 60rem) {
+ padding: 3rem 1.5rem;
+ margin-top: 3rem;
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+ }
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+ align-items: start;
+ min-height: 24px;
+
+ svg {
+ margin-top: 2px;
+ }
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+ line-height: 200%;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx
new file mode 100644
index 0000000..b5c202a
--- /dev/null
+++ b/packages/console/app/src/routes/download/index.tsx
@@ -0,0 +1,486 @@
+import "./index.css"
+import { Meta, Title } from "@solidjs/meta"
+import { A } from "@solidjs/router"
+import { createSignal, type JSX, onMount, Show } from "solid-js"
+import { Faq } from "~/component/faq"
+import { Footer } from "~/component/footer"
+import { Header } from "~/component/header"
+import { IconCheck, IconCopy } from "~/component/icon"
+import { Legal } from "~/component/legal"
+import { LocaleLinks } from "~/component/locale-links"
+import { config } from "~/config"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import desktopAppIcon from "../../asset/lander/opencode-desktop-icon.png"
+import type { DownloadPlatform } from "./types"
+
+type OS = "macOS" | "Windows" | "Linux" | null
+
+function detectOS(): OS {
+ if (typeof navigator === "undefined") return null
+ const platform = navigator.platform.toLowerCase()
+ const userAgent = navigator.userAgent.toLowerCase()
+
+ if (platform.includes("mac") || userAgent.includes("mac")) return "macOS"
+ if (platform.includes("win") || userAgent.includes("win")) return "Windows"
+ if (platform.includes("linux") || userAgent.includes("linux")) return "Linux"
+ return null
+}
+
+function getDownloadPlatform(os: OS): DownloadPlatform {
+ switch (os) {
+ case "macOS":
+ return "darwin-aarch64-dmg"
+ case "Windows":
+ return "windows-x64-nsis"
+ case "Linux":
+ return "linux-x64-deb"
+ default:
+ return "darwin-aarch64-dmg"
+ }
+}
+
+function getDownloadHref(platform: DownloadPlatform, channel: "stable" | "beta" = "stable") {
+ return `/download/${channel}/${platform}`
+}
+
+function IconDownload(props: JSX.SvgSVGAttributes) {
+ return (
+
+
+
+ )
+}
+
+function CopyStatus() {
+ return (
+
+
+
+
+ )
+}
+
+export default function Download() {
+ const i18n = useI18n()
+ const language = useLanguage()
+ const [detectedOS, setDetectedOS] = createSignal(null)
+
+ onMount(() => {
+ setDetectedOS(detectOS())
+ })
+
+ const handleCopyClick = (command: string) => (event: Event) => {
+ const button = event.currentTarget as HTMLButtonElement
+ void navigator.clipboard.writeText(command)
+ button.setAttribute("data-copied", "")
+ setTimeout(() => {
+ button.removeAttribute("data-copied")
+ }, 1500)
+ }
+ return (
+
+ {i18n.t("download.title")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [1] {i18n.t("download.section.terminal")}
+
+
+
+
+ curl -fsSL https://opencode.ai/install | bash
+
+
+
+
+
+ npm i -g opencode-ai
+
+
+
+
+
+ bun add -g opencode-ai
+
+
+
+
+
+ brew install anomalyco/tap/opencode
+
+
+
+
+
+ paru -S opencode
+
+
+
+
+
+
+
+
+ [2] {i18n.t("download.section.desktop")}
+
+
+
+
+ brew install --cask opencode-desktop
+
+
+
+
+
+
+
+
+ {/* Disabled temporarily as it doesn't work */}
+ {/*
*/}
+
+
+
+
+
+ [3] {i18n.t("download.section.extensions")}
+
+
+
+
+
+
+ [4] {i18n.t("download.section.integrations")}
+
+
+
+
+
+
+
+
{i18n.t("common.faq")}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/download/types.ts b/packages/console/app/src/routes/download/types.ts
new file mode 100644
index 0000000..916f970
--- /dev/null
+++ b/packages/console/app/src/routes/download/types.ts
@@ -0,0 +1,4 @@
+export type DownloadPlatform =
+ | `darwin-${"x64" | "aarch64"}-dmg`
+ | "windows-x64-nsis"
+ | `linux-x64-${"deb" | "rpm" | "appimage"}`
diff --git a/packages/console/app/src/routes/enterprise/index.css b/packages/console/app/src/routes/enterprise/index.css
new file mode 100644
index 0000000..5c594bb
--- /dev/null
+++ b/packages/console/app/src/routes/enterprise/index.css
@@ -0,0 +1,588 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+[data-page="enterprise"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-weak-hover: hsl(0, 8%, 94%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 60%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+ --color-text-success: hsl(119, 100%, 35%);
+ --color-text-error: hsl(4, 72%, 45%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+ --color-success: hsl(142, 76%, 36%);
+
+ background: var(--color-background);
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-weak-hover: hsl(0, 6%, 15%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+ --color-text-success: hsl(119, 60%, 72%);
+ --color-text-error: hsl(4, 76%, 72%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ --color-success: hsl(142, 76%, 46%);
+ }
+
+ /* Header and Footer styles - copied from index.css */
+ [data-component="top"] {
+ padding: 24px 5rem;
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+ z-index: 10;
+
+ @media (max-width: 60rem) {
+ padding: 24px 1.5rem;
+ }
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px 8px 10px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ margin-right: -8px;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ /* Mobile: third column on its own row */
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ }
+
+ [data-component="enterprise-content"] {
+ padding: 4rem 0;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 0;
+ }
+ }
+
+ [data-component="enterprise-columns"] {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 4rem;
+ padding: 4rem 5rem;
+
+ @media (max-width: 80rem) {
+ gap: 3rem;
+ }
+
+ @media (max-width: 60rem) {
+ grid-template-columns: 1fr;
+ gap: 3rem;
+ padding: 2rem 1.5rem;
+ }
+ }
+
+ [data-component="enterprise-column-1"] {
+ h1 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 1rem;
+ }
+
+ h3 {
+ font-size: 1.25rem;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin: 2rem 0 1rem 0;
+ }
+
+ p {
+ line-height: 1.6;
+ margin-bottom: 1.5rem;
+ color: var(--color-text);
+ }
+
+ [data-component="testimonial"] {
+ margin-top: 4rem;
+ font-weight: 500;
+ color: var(--color-text-strong);
+
+ [data-component="quotation"] {
+ svg {
+ margin-bottom: 1rem;
+ opacity: 20%;
+ }
+ }
+
+ [data-component="testimonial-logo"] {
+ svg {
+ margin-top: 1.5rem;
+ }
+ }
+ }
+ }
+
+ [data-component="enterprise-column-2"] {
+ [data-component="enterprise-form"] {
+ padding: 0;
+
+ h2 {
+ font-size: 1.5rem;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin-bottom: 1.5rem;
+ }
+
+ [data-component="form-group"] {
+ margin-bottom: 1.5rem;
+
+ label {
+ display: block;
+ font-weight: 500;
+ color: var(--color-text-weak);
+ margin-bottom: 0.5rem;
+ font-size: 0.875rem;
+ }
+
+ input:-webkit-autofill,
+ input:-webkit-autofill:hover,
+ input:-webkit-autofill:focus,
+ input:-webkit-autofill:active {
+ transition: background-color 5000000s ease-in-out 0s;
+ }
+
+ input:-webkit-autofill {
+ -webkit-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ input:-moz-autofill {
+ -moz-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ input,
+ textarea {
+ width: 100%;
+ padding: 0.75rem;
+ border: 1px solid var(--color-border-weak);
+ border-radius: 4px;
+ background: var(--color-background-weak);
+ color: var(--color-text-strong);
+ font-family: inherit;
+
+ &::placeholder {
+ color: var(--color-text-weak);
+ }
+
+ &:focus {
+ background: var(--color-background-interactive-weaker);
+ outline: none;
+ border: none;
+ color: var(--color-text-strong);
+ border: 1px solid var(--color-background-strong);
+ box-shadow: 0 0 0 3px var(--color-background-interactive);
+
+ @media (prefers-color-scheme: dark) {
+ box-shadow: none;
+ border: 1px solid var(--color-background-interactive);
+ }
+ }
+ }
+
+ textarea {
+ resize: vertical;
+ min-height: 120px;
+ }
+ }
+
+ [data-component="submit-button"] {
+ padding: 0.5rem 1.5rem;
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+
+ &:hover:not(:disabled) {
+ background: var(--color-background-strong-hover);
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ }
+ }
+
+ [data-component="success-message"] {
+ margin-top: 1rem;
+ padding: 1rem 0;
+ color: var(--color-text-success);
+ text-align: left;
+ }
+
+ [data-component="error-message"] {
+ margin-top: 1rem;
+ padding: 1rem 0;
+ color: var(--color-text-error);
+ text-align: left;
+ }
+ }
+ }
+
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: 4rem 5rem;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ p {
+ margin-bottom: 12px;
+ color: var(--color-text);
+ }
+ }
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+ color: var(--color-text);
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ padding: 2rem 5rem;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+
+ &:hover {
+ text-decoration-thickness: 2px;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/enterprise/index.tsx b/packages/console/app/src/routes/enterprise/index.tsx
new file mode 100644
index 0000000..9e3d034
--- /dev/null
+++ b/packages/console/app/src/routes/enterprise/index.tsx
@@ -0,0 +1,284 @@
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+import { createSignal, Show } from "solid-js"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { Faq } from "~/component/faq"
+import { useI18n } from "~/context/i18n"
+import { LocaleLinks } from "~/component/locale-links"
+
+export default function Enterprise() {
+ const i18n = useI18n()
+ const [formData, setFormData] = createSignal({
+ name: "",
+ role: "",
+ company: "",
+ email: "",
+ phone: "",
+ alias: "",
+ message: "",
+ })
+ const [isSubmitting, setIsSubmitting] = createSignal(false)
+ const [showSuccess, setShowSuccess] = createSignal(false)
+ const [error, setError] = createSignal("")
+
+ const handleInputChange = (field: string) => (e: Event) => {
+ const target = e.target as HTMLInputElement | HTMLTextAreaElement
+ setFormData((prev) => ({ ...prev, [field]: target.value }))
+ }
+
+ const handleSubmit = async (e: Event) => {
+ e.preventDefault()
+ setError("")
+ setShowSuccess(false)
+ setIsSubmitting(true)
+
+ try {
+ const response = await fetch("/api/enterprise", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(formData()),
+ })
+
+ if (response.ok) {
+ setShowSuccess(true)
+ setFormData({
+ name: "",
+ role: "",
+ company: "",
+ email: "",
+ phone: "",
+ alias: "",
+ message: "",
+ })
+ setTimeout(() => setShowSuccess(false), 5000)
+ return
+ }
+
+ const data = (await response.json().catch(() => null)) as { error?: string } | null
+ setError(data?.error ?? i18n.t("enterprise.form.error.internalServer"))
+ } catch (error) {
+ console.error("Failed to submit form:", error)
+ setError(i18n.t("enterprise.form.error.internalServer"))
+ } finally {
+ setIsSubmitting(false)
+ }
+ }
+
+ return (
+
+ {i18n.t("enterprise.title")}
+
+
+
+
+
+
+
+
+
+
{i18n.t("enterprise.hero.title")}
+
{i18n.t("enterprise.hero.body1")}
+
{i18n.t("enterprise.hero.body2")}
+
+
+
+
+ Thanks to OpenCode, we found a way to create software to track all our assets — even the imaginary
+ ones.
+
+
+
+
+
+
+
+
+
+ {showSuccess() &&
{i18n.t("enterprise.form.success")}
}
+ {error() &&
{error()}
}
+
+
+
+
+
+
+
+
{i18n.t("enterprise.faq.title")}
+
+
+
+ {i18n.t("enterprise.faq.a1")}
+
+
+ {i18n.t("enterprise.faq.a2")}
+
+
+ {i18n.t("enterprise.faq.a3")}
+
+
+ {i18n.t("enterprise.faq.a4")}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/feishu.ts b/packages/console/app/src/routes/feishu.ts
new file mode 100644
index 0000000..3366e72
--- /dev/null
+++ b/packages/console/app/src/routes/feishu.ts
@@ -0,0 +1,7 @@
+import { redirect } from "@solidjs/router"
+
+export async function GET() {
+ return redirect(
+ "https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=738j8655-cd59-4633-a30a-1124e0096789&qr_code=true",
+ )
+}
diff --git a/packages/console/app/src/routes/go/index.css b/packages/console/app/src/routes/go/index.css
new file mode 100644
index 0000000..45b61d2
--- /dev/null
+++ b/packages/console/app/src/routes/go/index.css
@@ -0,0 +1,1161 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+@keyframes go-graph-line {
+ to {
+ stroke-dashoffset: 0;
+ }
+}
+
+@keyframes go-graph-point {
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+@keyframes go-graph-bar {
+ to {
+ opacity: 1;
+ transform: scaleX(1);
+ }
+}
+
+[data-page="go"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-go-1: hsl(61.9, 82.6%, 77.5%);
+ --color-go-2: hsl(62.4, 78.6%, 56.1%);
+ --color-go-3: hsl(62.1, 100%, 39.8%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 74%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+}
+
+[data-page="go"] {
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-go-1: hsl(62.1, 64.9%, 25.7%);
+ --color-go-2: hsl(61.7, 46.4%, 53.9%);
+ --color-go-3: hsl(61.9, 100%, 50%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ }
+}
+
+body {
+ background: var(--color-background);
+}
+
+@supports (background: -webkit-named-image(i)) {
+ [data-page="opencode"] {
+ border-top: 1px solid var(--color-border-weak);
+ }
+}
+
+[data-page="go"] {
+ background: var(--color-background);
+ overflow-x: clip;
+ --padding: 5rem;
+ --vertical-padding: 4rem;
+
+ @media (max-width: 60rem) {
+ --padding: 1.5rem;
+ --vertical-padding: 3rem;
+ }
+
+ display: flex;
+ gap: var(--vertical-padding);
+ flex-direction: column;
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+
+ p {
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+
+ @media (max-width: 60rem) {
+ font-size: 15px;
+ }
+
+ input:-webkit-autofill,
+ input:-webkit-autofill:hover,
+ input:-webkit-autofill:focus,
+ input:-webkit-autofill:active {
+ transition: background-color 5000000s ease-in-out 0s;
+ }
+
+ input:-webkit-autofill {
+ -webkit-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ input:-moz-autofill {
+ -moz-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ }
+
+ [data-component="top"] {
+ padding: 24px var(--padding);
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+
+ z-index: 10;
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="hero"] {
+ display: flex;
+ flex-direction: column;
+ padding: calc(var(--vertical-padding) * 1.5) var(--padding);
+
+ [data-slot="zen logo dark"] {
+ display: none;
+ }
+
+ @media (max-width: 30rem) {
+ padding: var(--vertical-padding) var(--padding);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="zen logo light"] {
+ display: none;
+ }
+ [data-slot="zen logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-slot="hero-copy"] {
+ img {
+ margin-bottom: 24px;
+ }
+
+ h1 {
+ font-size: 28px;
+ color: var(--color-text-strong);
+ font-weight: 700;
+ margin-bottom: 16px;
+ display: block;
+
+ @media (max-width: 60rem) {
+ font-size: 22px;
+ }
+ }
+
+ p {
+ color: var(--color-text);
+ margin-bottom: 24px;
+ max-width: 82%;
+
+ @media (max-width: 50rem) {
+ max-width: 100%;
+ }
+ }
+
+ a {
+ background: var(--color-background-strong);
+ padding: 8px 12px 8px 20px;
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ margin-bottom: 40px;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ text-decoration: none;
+
+ [data-slot="cta-price"] {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ }
+
+ [data-slot="cta-price-old"] {
+ opacity: 0.45;
+ text-decoration: line-through;
+ }
+
+ [data-slot="cta-price-new"] {
+ opacity: 1;
+ }
+
+ svg {
+ opacity: 0.6;
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-strong-hover);
+ }
+ }
+ [data-slot="model-logos"] {
+ display: flex;
+ gap: 24px;
+ margin-bottom: 56px;
+
+ svg {
+ color: var(--color-background-strong);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ svg {
+ color: var(--color-background-strong);
+ }
+ }
+ }
+
+ [data-slot="pricing-copy"] {
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+
+ p:first-child {
+ margin-bottom: 0;
+ color: var(--color-text);
+ display: flex;
+ gap: 8px;
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: 4px;
+ }
+ }
+ }
+
+ [data-component="comparison"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: 0;
+ background:
+ radial-gradient(1200px 400px at 15% 0%, rgba(0, 0, 0, 0.035), transparent 55%),
+ radial-gradient(900px 320px at 85% 15%, rgba(0, 0, 0, 0.02), transparent 60%), var(--color-background-weak);
+
+ @media (prefers-color-scheme: dark) {
+ background:
+ radial-gradient(1200px 400px at 15% 0%, rgba(255, 255, 255, 0.03), transparent 55%),
+ radial-gradient(900px 320px at 85% 15%, rgba(255, 255, 255, 0.02), transparent 60%),
+ var(--color-background-weak);
+
+ [data-component="limit-graph"] {
+ --bar-go: #f7ff00;
+ }
+ }
+
+ [data-component="limit-graph"] {
+ margin: 0 auto;
+ width: calc(100% - 120px);
+ max-width: calc(100% - 120px);
+ border: none;
+ background: transparent;
+ padding: 58px var(--padding) 56px;
+ --bar-go: var(--color-go-2);
+
+ @media (max-width: 60rem) {
+ width: 50%;
+ max-width: 50%;
+ }
+
+ [data-slot="plot"] {
+ position: relative;
+ overflow: visible;
+ width: 100%;
+ margin: 0 auto;
+ margin-left: -56px;
+ }
+
+ [data-slot="ylabels"] {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ }
+
+ [data-slot="xlabels"] {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ }
+
+ [data-slot="xlabels"] [data-xlabel] {
+ position: absolute;
+ left: var(--x);
+ top: var(--y);
+ transform: translate(-50%, -50%);
+ color: var(--color-text-weak);
+ font-size: 12px;
+ line-height: 1;
+ white-space: nowrap;
+
+ @media (prefers-color-scheme: light) {
+ color: color-mix(in srgb, var(--color-text-weak) 82%, var(--color-text-strong));
+ }
+ }
+
+ [data-slot="ylabels"] [data-ylabel] {
+ position: absolute;
+ left: var(--x);
+ top: var(--y);
+ transform: translate(-100%, -50%);
+ color: var(--color-text-strong);
+ font-size: 16px;
+ font-weight: 700;
+ line-height: 1;
+ white-space: nowrap;
+
+ @media (max-width: 60rem) {
+ font-size: 13px;
+ }
+ }
+
+ [data-slot="pills"] {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+
+ [data-item] {
+ position: absolute;
+ left: var(--x);
+ top: var(--y);
+ transform: translate(12px, -50%);
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ border: none;
+ background: transparent;
+ height: 20px;
+ padding: 0 8px;
+ border-radius: 2px;
+ max-width: calc(100% - 12px);
+ font-size: 13px;
+ line-height: 20px;
+ box-sizing: border-box;
+ opacity: 0;
+ }
+
+ [data-name] {
+ color: var(--color-text);
+ white-space: nowrap;
+ }
+
+ [data-value] {
+ color: var(--color-text-strong);
+ font-weight: 600;
+ white-space: nowrap;
+ }
+
+ [data-bonus] {
+ color: var(--color-text-weak);
+ font-size: 12px;
+ font-weight: 400;
+ line-height: 1;
+ white-space: nowrap;
+ }
+ }
+
+ [data-slot="plot-labels"] {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ }
+
+ [data-row-label] {
+ position: absolute;
+ left: 0;
+ top: var(--y);
+ transform: translateY(-50%);
+ color: var(--color-text-strong);
+ font-size: 16px;
+ font-weight: 700;
+ }
+
+ svg {
+ width: 100%;
+ height: 260px;
+ display: block;
+ }
+
+ [data-grid] {
+ stroke: var(--color-border);
+ stroke-width: 1;
+ opacity: 0.6;
+ }
+
+ [data-tick] {
+ fill: var(--color-text-weak);
+ font-size: 12px;
+ }
+
+ @media (prefers-color-scheme: light) {
+ [data-tick] {
+ fill: color-mix(in srgb, var(--color-text-weak) 82%, var(--color-text-strong));
+ }
+ }
+
+ [data-row] {
+ fill: var(--color-text-strong);
+ font-size: 13px;
+ font-weight: 600;
+ }
+
+ [data-row],
+ [data-val] {
+ opacity: 0;
+ }
+
+ &[data-visible] [data-row],
+ &[data-visible] [data-val] {
+ opacity: 1;
+ transition: opacity 240ms ease;
+ transition-delay: var(--d, 0ms);
+ }
+
+ [data-stub] {
+ stroke: var(--color-border);
+ stroke-width: 1;
+ stroke-linecap: round;
+ opacity: 0.55;
+ }
+
+ [data-bar] {
+ transform-box: fill-box;
+ transform-origin: left center;
+ opacity: 0;
+ transform: scaleX(0.02);
+ fill: var(--bar-go);
+ stroke: none;
+ }
+
+ [data-bar][data-kind="free"] {
+ fill: var(--color-text-strong);
+ }
+
+ [data-val] {
+ fill: var(--color-text-strong);
+ font-size: 13px;
+ font-weight: 650;
+ }
+
+ [data-range] {
+ stroke: var(--color-text-strong);
+ stroke-width: 2;
+ stroke-linecap: round;
+ opacity: 0.65;
+ }
+
+ [data-point] {
+ vector-effect: non-scaling-stroke;
+ stroke-width: 1;
+ transform-box: fill-box;
+ transform-origin: center;
+ }
+
+ [data-point][data-kind="free"] {
+ fill: var(--color-background);
+ stroke: var(--color-text-strong);
+ }
+
+ [data-point][data-kind="go"] {
+ fill: var(--color-background-interactive);
+ stroke: var(--color-text-strong);
+ }
+
+ [data-point][data-kind="go"][data-model="glm"] {
+ fill: var(--color-go-1);
+ }
+
+ [data-point][data-kind="go"][data-model="kimi"] {
+ fill: var(--color-go-2);
+ }
+
+ [data-point][data-kind="go"][data-model="minimax"] {
+ fill: var(--color-go-3);
+ }
+
+ [data-animate="line"] {
+ stroke-dasharray: 900;
+ stroke-dashoffset: 900;
+ }
+
+ &[data-visible] [data-animate="line"] {
+ animation: go-graph-line 1000ms cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
+ animation-delay: 80ms;
+ }
+
+ [data-point] {
+ opacity: 0;
+ transform: scale(0.85);
+ }
+
+ &[data-visible] [data-point] {
+ animation: go-graph-point 520ms cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
+ animation-delay: var(--d, 0ms);
+ }
+
+ &[data-visible] [data-bar] {
+ animation: go-graph-bar 560ms cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
+ animation-delay: var(--d, 0ms);
+ }
+
+ &[data-visible] [data-slot="pills"] [data-item] {
+ opacity: 1;
+ transition: opacity 240ms ease;
+ transition-delay: var(--d, 0ms);
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ [data-animate="line"] {
+ stroke-dashoffset: 0;
+ animation: none;
+ }
+ [data-point] {
+ opacity: 1;
+ transform: none;
+ animation: none;
+ }
+ [data-bar] {
+ opacity: 1;
+ transform: none;
+ animation: none;
+ }
+ [data-row],
+ [data-val] {
+ opacity: 1;
+ transition: none;
+ }
+
+ [data-slot="pills"] [data-item] {
+ opacity: 1;
+ transition: none;
+ }
+ }
+
+ figcaption {
+ margin-top: 34px;
+ display: flex;
+ justify-content: center;
+ font-size: 13px;
+ text-align: center;
+ }
+
+ [data-slot="caption-row"] {
+ display: flex;
+ width: 100%;
+ justify-content: center;
+ }
+
+ [data-slot="caption-left"] {
+ display: flex;
+ width: 100%;
+ min-width: 0;
+ justify-content: center;
+ }
+
+ [data-slot="caption-meta"] {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ gap: 16px;
+ align-items: baseline;
+ width: 100%;
+ max-width: none;
+ justify-content: center;
+ }
+
+ [data-slot="caption-label"] {
+ color: var(--color-text-strong);
+ font-weight: 650;
+ white-space: nowrap;
+ line-height: 1;
+ }
+
+ [data-slot="caption-link"] {
+ color: var(--color-text-strong);
+ text-decoration-thickness: 1px;
+ width: fit-content;
+ line-height: 1;
+ white-space: nowrap;
+ }
+
+ [data-slot="caption-note"] {
+ color: var(--color-text-weak);
+ font-size: 12px;
+ }
+
+ @media (max-width: 56.25rem) {
+ [data-slot="caption-meta"] {
+ gap: 14px;
+ }
+ }
+ }
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ p {
+ margin-bottom: 12px;
+ color: var(--color-text);
+ }
+ }
+
+ [data-component="problem"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ p {
+ margin-bottom: 24px;
+ }
+
+ ul {
+ padding: 0;
+ li {
+ list-style: none;
+ margin-bottom: 16px;
+ display: flex;
+ gap: 12px;
+
+ span {
+ color: var(--color-icon);
+ }
+ }
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ [data-component="how"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ ul {
+ padding: 0;
+ li {
+ list-style: none;
+ margin-bottom: 16px;
+ display: flex;
+ gap: 12px;
+
+ span {
+ color: var(--color-icon);
+ }
+ strong {
+ font-weight: 500;
+ color: var(--color-text-strong);
+ }
+ }
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ [data-component="email"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ [data-slot="dock"] {
+ border-radius: 14px;
+ border: 0.5px solid rgba(176, 176, 176, 0.6);
+ background: #f2f1f0;
+ margin-bottom: 32px;
+ overflow: hidden;
+ height: 64px;
+ width: 185px;
+ box-shadow:
+ 0 6px 80px 0 rgba(0, 0, 0, 0.05),
+ 0 2.507px 33.422px 0 rgba(0, 0, 0, 0.04),
+ 0 1.34px 17.869px 0 rgba(0, 0, 0, 0.03),
+ 0 0.751px 10.017px 0 rgba(0, 0, 0, 0.03),
+ 0 0.399px 5.32px 0 rgba(0, 0, 0, 0.02),
+ 0 0.166px 2.214px 0 rgba(0, 0, 0, 0.01);
+
+ img {
+ width: 100%;
+ height: auto;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ background: #312d2d;
+ }
+ }
+
+ [data-slot="form"] {
+ position: relative;
+
+ input {
+ background: var(--color-background-weak);
+ border-radius: 6px;
+ border: 1px solid var(--color-border-weak);
+ padding: 20px;
+ width: 100%;
+
+ /* Use color, not -moz-text-fill-color, for normal text */
+ color: var(--color-text-strong);
+
+ @media (max-width: 30rem) {
+ padding-bottom: 80px;
+ }
+
+ &:not(:focus) {
+ color: var(--color-text-strong);
+ }
+
+ &::placeholder {
+ color: var(--color-text-weak);
+ opacity: 1;
+ }
+
+ /* Optional legacy */
+ &::-moz-placeholder {
+ color: var(--color-text-weak);
+ opacity: 1;
+ }
+ }
+
+ input:focus {
+ background: var(--color-background-interactive-weaker);
+ outline: none;
+ border: none;
+ color: var(--color-text-strong);
+
+ border: 1px solid var(--color-background-strong); /* Tailwind blue-600 as example */
+
+ /* Tailwind-style ring */
+ box-shadow: 0 0 0 3px var(--color-background-interactive);
+ /* mimics "ring-2 ring-blue-600/50" */
+ }
+
+ button {
+ position: absolute;
+ height: 40px;
+ right: 12px;
+ background: var(--color-background-strong);
+ padding: 4px 20px;
+ color: var(--color-text-inverted);
+ border-radius: 4px;
+ font-weight: 500;
+ border: none;
+ outline: none;
+ cursor: pointer;
+ top: 50%;
+ margin-top: -20px;
+
+ @media (max-width: 30rem) {
+ left: 20px;
+ right: 20px;
+ bottom: 20px;
+ top: auto;
+ }
+ }
+ }
+ }
+
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+
+ [data-slot="faq-models"] {
+ margin-top: 16px;
+ overflow-x: auto;
+
+ table {
+ width: 100%;
+ min-width: 28rem;
+ border-collapse: collapse;
+ }
+
+ th,
+ td {
+ padding: 12px 16px;
+ text-align: left;
+ white-space: nowrap;
+ }
+
+ th {
+ background: var(--color-background-weak);
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+ }
+ }
+ }
+
+ [data-component="copy-status"] {
+ @media (max-width: 38rem) {
+ display: none;
+ }
+
+ [data-slot="copy"] {
+ display: block;
+ width: var(--space-4);
+ height: var(--space-4);
+ color: var(--color-text-weaker);
+
+ [data-copied] & {
+ display: none;
+ }
+ }
+
+ [data-slot="check"] {
+ display: none;
+ width: var(--space-4);
+ height: var(--space-4);
+ color: var(--color-text-strong);
+
+ [data-copied] & {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ /* Mobile: third column on its own row */
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/go/index.tsx b/packages/console/app/src/routes/go/index.tsx
new file mode 100644
index 0000000..fee2dec
--- /dev/null
+++ b/packages/console/app/src/routes/go/index.tsx
@@ -0,0 +1,513 @@
+import "./index.css"
+import { createAsync, query } from "@solidjs/router"
+import { Title, Meta } from "@solidjs/meta"
+import { For, createMemo, createSignal, onCleanup, onMount } from "solid-js"
+//import { HttpHeader } from "@solidjs/start"
+import goLogoLight from "../../asset/go-ornate-light.svg"
+import goLogoDark from "../../asset/go-ornate-dark.svg"
+import { EmailSignup } from "~/component/email-signup"
+import { Faq } from "~/component/faq"
+import { Legal } from "~/component/legal"
+import { Footer } from "~/component/footer"
+import { Header } from "~/component/header"
+import { config } from "~/config"
+import { getLastSeenWorkspaceID } from "../workspace/common"
+import { IconMiniMax, IconMiMo, IconZai, IconAlibaba, IconDeepSeek } from "~/component/icon"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { LocaleLinks } from "~/component/locale-links"
+
+const checkLoggedIn = query(async () => {
+ "use server"
+ return await getLastSeenWorkspaceID().catch(() => undefined)
+}, "checkLoggedIn.get")
+
+const models = [
+ { name: "GLM-5.1", provider: "DeepInfra, Fireworks AI, Z.ai" },
+ { name: "GLM-5", provider: "DeepInfra, Fireworks AI, Z.ai" },
+ { name: "Kimi K2.5", provider: "Moonshot AI" },
+ { name: "Kimi K2.6", provider: "Moonshot AI" },
+ { name: "MiMo-V2.5-Pro", provider: "Xiaomi MiMo" },
+ { name: "MiMo-V2.5", provider: "Xiaomi MiMo" },
+ { name: "Qwen3.7 Max", provider: "Alibaba Cloud Model Studio" },
+ { name: "Qwen3.7 Plus", provider: "Alibaba Cloud Model Studio" },
+ { name: "Qwen3.6 Plus", provider: "Alibaba Cloud Model Studio" },
+ { name: "MiniMax M3", provider: "MiniMax" },
+ { name: "MiniMax M2.7", provider: "MiniMax" },
+ { name: "MiniMax M2.5", provider: "MiniMax" },
+ { name: "DeepSeek V4 Pro", provider: "DeepSeek" },
+ { name: "DeepSeek V4 Flash", provider: "DeepSeek" },
+]
+
+function LimitsGraph(props: { href: string }) {
+ let root!: HTMLElement
+ const [visible, setVisible] = createSignal(false)
+
+ const i18n = useI18n()
+
+ onMount(() => {
+ if (typeof IntersectionObserver === "undefined") return setVisible(true)
+ const observer = new IntersectionObserver(
+ (entries) => {
+ const entry = entries[0]
+ if (!entry?.isIntersecting) return
+ setVisible(true)
+ observer.disconnect()
+ },
+ { threshold: 0.35 },
+ )
+ observer.observe(root)
+ onCleanup(() => observer.disconnect())
+ })
+
+ const free = 200
+ const graph = [
+ { id: "glm-5.1", name: "GLM-5.1", req: 880, d: "100ms" },
+ { id: "qwen3.7-max", name: "Qwen3.7 Max", req: 950, d: "110ms" },
+ { id: "kimi-k2.6", name: "Kimi K2.6", req: 1150, d: "150ms" },
+ { id: "minimax-m3", name: "MiniMax M3", req: 3200, d: "200ms" },
+ { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", req: 3250, d: "210ms" },
+ { id: "qwen3.6-plus", name: "Qwen3.6 Plus", req: 3300, d: "220ms" },
+ { id: "minimax-m2.7", name: "MiniMax M2.7", req: 3400, d: "230ms" },
+ { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", req: 3450, d: "240ms" },
+ { id: "qwen3.7-plus", name: "Qwen3.7 Plus", req: 4300, d: "250ms" },
+ { id: "mimo-v2.5", name: "MiMo-V2.5", req: 30100, d: "340ms" },
+ { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", req: 31650, d: "340ms" },
+ ]
+
+ const w = 720
+ const left = 40
+ const right = 60
+ const top = 18
+ const bottom = 44
+ const plot = w - left - right
+
+ const ratio = (n: number) => n / free
+ const rmax = Math.max(1, ...graph.map((m) => ratio(m.req)))
+ const log = (n: number) => Math.log10(Math.max(n, 1))
+ const base = 24
+ const p = 2.2
+ const x = (r: number) => left + base + Math.pow(log(r) / log(rmax), p) * (plot - base)
+ const start = (x(1) / w) * 100
+
+ const ticks = [1, 5, 10, 25, 50, 100].filter((t) => t <= rmax)
+ const labels = (() => {
+ const set = new Set()
+ let last = -Infinity
+ for (const t of ticks) {
+ if (t === 1) {
+ set.add(t)
+ last = x(t)
+ continue
+ }
+ const pos = x(t)
+ if (pos - last < 44) continue
+ set.add(t)
+ last = pos
+ }
+ return set
+ })()
+ const shown = ticks.filter((t) => labels.has(t))
+ const bh = 8
+ const gap = 20
+ const step = bh + gap
+ const h = 330 + Math.max(0, graph.length - 8) * step
+ const sep = bh + 40
+ const fy = top + 22
+ const gy = (i: number) => fy + sep + step * i
+ const my = graph.length < 2 ? gy(0) : (gy(0) + gy(graph.length - 1)) / 2
+ const px = (n: number) => `${(n / w) * 100}%`
+ const py = (n: number) => `${(n / h) * 100}%`
+ const lx = px(left - 16)
+ const ty = py(h - 18)
+
+ return (
+
+
+
+
+
+ {(t) => (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+ {(m, i) => (
+
+
+
+ )}
+
+
+
+
+
+
+ {i18n.t("go.graph.free")}
+
+
+ {i18n.t("go.graph.go")}
+
+
+
+
+
+ {(t) => (
+
+ {i18n.t("go.graph.tick", { n: t })}
+
+ )}
+
+
+
+
+
+ {free.toLocaleString()}
+ {i18n.t("go.graph.freePill")}
+
+
+ {(m, i) => (
+
+ {m.req.toLocaleString()}
+ {m.name}
+
+ )}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default function Home() {
+ const workspaceID = createAsync(() => checkLoggedIn())
+ const subscribeUrl = createMemo(() => (workspaceID() ? `/workspace/${workspaceID()}/go` : "/auth"))
+ const i18n = useI18n()
+ const language = useLanguage()
+ return (
+
+ {/* */}
+ {i18n.t("go.title")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{i18n.t("go.pricing.body")}
+
+
+
+
+
+
+
+
{i18n.t("go.problem.title")}
+
{i18n.t("go.problem.body")}
+
+ {i18n.t("go.problem.subtitle")}
+
+
+ [*] {i18n.t("go.problem.item1")}
+
+
+ [*] {i18n.t("go.problem.item2")}
+
+
+ [*] {i18n.t("go.problem.item3")}
+
+
+ [*] {i18n.t("go.problem.item4")}
+
+
+
+
+
+
+
{i18n.t("go.how.title")}
+
{i18n.t("go.how.body")}
+
+
+
+
+
+
+
{i18n.t("common.faq")}
+
+
+
+ {i18n.t("go.faq.a1")}
+
+
+
+ {i18n.t("go.faq.a2")}
+
+
+
+
+ {i18n.t("workspace.models.table.model")}
+ {i18n.t("workspace.providers.table.provider")}
+
+
+
+
+ {(m) => (
+
+ {m.name}
+ {m.provider}
+
+ )}
+
+
+
+
+
+
+
+ {i18n.t("go.faq.a9")}
+
+
+ {i18n.t("go.faq.a3")}
+
+
+
+ {i18n.t("go.faq.a4.p1.beforePricing")}{" "}
+ {i18n.t("go.faq.a4.p1.pricingLink")} {" "}
+ {i18n.t("go.faq.a4.p1.afterPricing")} {i18n.t("go.faq.a4.p2.beforeAccount")}{" "}
+ {i18n.t("go.faq.a4.p2.accountLink")} . {i18n.t("go.faq.a4.p3")}
+
+
+
+ {i18n.t("go.faq.a5.body")}
+
+
+ {i18n.t("go.faq.a6")}
+
+
+ {i18n.t("go.faq.a7")}
+
+
+ {i18n.t("go.faq.a8")}
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/honeycomb/webhook.ts b/packages/console/app/src/routes/honeycomb/webhook.ts
new file mode 100644
index 0000000..05be683
--- /dev/null
+++ b/packages/console/app/src/routes/honeycomb/webhook.ts
@@ -0,0 +1,105 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { z } from "zod"
+import { Resource } from "@opencode-ai/console-resource"
+import { safeEqual } from "@opencode-ai/console-core/util/crypto.js"
+
+const DISCORD_ALERT_ROLE_ID = "1501447160175136838"
+
+const basePayload = z.object({
+ name: z.string().optional(),
+ status: z.string().optional(),
+ isTest: z.boolean().optional(),
+ url: z.string(),
+})
+
+const groups = z
+ .object({
+ result: z.union([z.number(), z.string()]).nullish(),
+ group: z.object({ key: z.string(), value: z.string() }).array(),
+ })
+ .array()
+
+const honeycombWebhookPayload = z.discriminatedUnion("type", [
+ basePayload.extend({
+ type: z.literal("model_http_errors"),
+ groups,
+ }),
+ basePayload.extend({
+ type: z.literal("model_low_tps"),
+ groups,
+ }),
+ basePayload.extend({
+ type: z.literal("provider_http_errors"),
+ groups,
+ }),
+ basePayload.extend({
+ type: z.literal("custom"),
+ }),
+])
+
+const postDiscordMessage = async (payload: z.infer) => {
+ const names =
+ payload.type === "custom"
+ ? []
+ : payload.groups.flatMap((item) =>
+ item.group.map((g) => {
+ const result = item.result == null ? undefined : Number(item.result)
+ return `- ${g.value}${
+ result !== undefined && Number.isFinite(result)
+ ? payload.type === "model_low_tps"
+ ? ` (${Math.round(result)} TPS)`
+ : ` (${Math.round(result * 100)}% errors)`
+ : ""
+ }`
+ }),
+ )
+
+ const content = [
+ `[**${payload.isTest ? "[TEST] " : ""}${payload.name ?? "Honeycomb alert"}**](${payload.url})`,
+ ...names,
+ "",
+ `<@&${DISCORD_ALERT_ROLE_ID}>`,
+ ]
+ .filter((line) => line !== undefined)
+ .join("\n")
+
+ return fetch(Resource.DISCORD_INCIDENT_WEBHOOK_URL.value, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ content,
+ allowed_mentions: { roles: [DISCORD_ALERT_ROLE_ID] },
+ flags: 4,
+ }),
+ })
+}
+
+export async function POST(input: APIEvent) {
+ const token = input.request.headers.get("X-Honeycomb-Webhook-Token")
+ if (!safeEqual(token ?? "", Resource.HoneycombWebhookSecret.value)) {
+ console.debug("Invalid Honeycomb webhook token")
+ return Response.json({ message: "invalid token" }, { status: 401 })
+ }
+
+ const body = await input.request.json()
+ console.log(body, JSON.stringify(body, null, 2))
+
+ const parsed = honeycombWebhookPayload.safeParse(body)
+
+ if (!parsed.success) {
+ console.error(parsed.error)
+ return Response.json({ message: "invalid payload" }, { status: 400 })
+ }
+
+ if (parsed.data.status !== "TRIGGERED") {
+ console.debug("Skipping resolved alert Honeycomb webhook")
+ return Response.json({ message: "ignored" }, { status: 200 })
+ }
+
+ const response = await postDiscordMessage(parsed.data)
+ if (!response.ok) {
+ return Response.json({ message: "discord webhook failed" }, { status: 502 })
+ }
+
+ return Response.json({ message: "sent" }, { status: 200 })
+}
diff --git a/packages/console/app/src/routes/index.css b/packages/console/app/src/routes/index.css
new file mode 100644
index 0000000..d06e265
--- /dev/null
+++ b/packages/console/app/src/routes/index.css
@@ -0,0 +1,1254 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+[data-page="opencode"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-weak-hover: hsl(0, 8%, 94%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+ --color-surface-raised-base: hsla(0, 100%, 3%, 0.01);
+ --color-surface-raised-base-active: hsla(0, 100%, 17%, 0.06);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 60%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsla(0, 100%, 3%, 0.12);
+
+ --color-icon: hsl(0, 1%, 55%);
+}
+
+body {
+ background: var(--color-background);
+}
+
+[data-page="opencode"] {
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-weak-hover: hsl(0, 6%, 15%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ }
+}
+
+@supports (background: -webkit-named-image(i)) {
+ [data-page="opencode"] {
+ border-top: 1px solid var(--color-border-weak);
+ }
+}
+
+[data-slot="br"] {
+ display: block;
+
+ @media (max-width: 60rem) {
+ display: none;
+ }
+}
+
+[data-page="opencode"] {
+ background: var(--color-background);
+ --padding: 5rem;
+ --vertical-padding: 4rem;
+ --heading-font-size: 1.375rem;
+
+ @media (max-width: 60rem) {
+ --padding: 1.5rem;
+ --vertical-padding: 3rem;
+ }
+
+ display: flex;
+ gap: var(--vertical-padding);
+ flex-direction: column;
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+
+ p {
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+
+ @media (max-width: 60rem) {
+ font-size: 15px;
+ }
+
+ [data-component="growth-stats"] {
+ margin-top: 48px;
+ margin-left: 40px;
+ display: flex;
+ gap: 64px !important;
+
+ @media (max-width: 60rem) {
+ gap: 56px !important;
+ }
+
+ @media (max-width: 50rem) {
+ gap: 48px !important;
+ }
+
+ @media (max-width: 40rem) {
+ display: none !important;
+ }
+
+ [data-component="growth-stat"] {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ text-align: left;
+ width: 100%;
+
+ span {
+ display: flex;
+ align-items: center;
+ justify-content: left;
+ width: 100%;
+ gap: 10px;
+ font-size: 14px;
+
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+
+ figure {
+ font-size: 14px;
+ color: var(--color-text-weak);
+ padding: 0;
+ margin: 0;
+
+ @media (max-width: 70rem) {
+ display: none;
+ }
+ }
+ }
+
+ [data-component="stat-illustration"] {
+ width: 100%;
+ height: 100%;
+ display: block;
+
+ svg {
+ margin: 0;
+ width: auto;
+ height: auto;
+ display: block;
+ }
+ }
+ }
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ }
+
+ [data-component="top"] {
+ padding: 24px var(--padding);
+ height: 80px;
+ min-height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+
+ z-index: 10;
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px 8px 10px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ margin-right: -8px;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="hero"] {
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ padding: calc(var(--vertical-padding) * 1.5) var(--padding);
+
+ @media (max-width: 30rem) {
+ padding: var(--vertical-padding) var(--padding);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="zen logo light"] {
+ display: none;
+ }
+ [data-slot="zen logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-slot="installation-instructions"] {
+ color: var(--color-text-strong);
+ margin-bottom: 8px;
+ }
+
+ [data-slot="installation"] {
+ width: 100%;
+ max-width: 100%;
+ overflow: hidden;
+
+ @media (max-width: 550px) {
+ width: calc(100vw - 48px);
+ }
+ }
+
+ [data-slot="installation-options"] {
+ font-size: 13px;
+ margin-top: 12px;
+ }
+
+ [data-component="tabs"] {
+ [data-slot="tablist"] {
+ display: flex;
+ gap: 40px;
+ align-items: center;
+ border: 1px solid var(--color-border-weak);
+ border-bottom: none;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--color-background-weak);
+ padding: 0 20px;
+
+ @media (max-width: 60rem) {
+ gap: 32px;
+ overflow-x: auto;
+ width: 100%;
+ }
+ }
+
+ [data-slot="tab"] {
+ appearance: none;
+ background: transparent;
+ border: 0;
+ padding: 16px 0;
+ margin: 0;
+ cursor: pointer;
+ color: var(--color-text-weak);
+ line-height: 1;
+ border-bottom: 2px solid transparent;
+ }
+
+ [data-slot="tab"][aria-selected="true"] {
+ color: var(--color-text-strong);
+ border-bottom-color: var(--color-background-strong);
+ }
+
+ [data-slot="tab"]:focus-visible {
+ }
+
+ [data-slot="panels"] {
+ background: var(--color-background-weak);
+ border: 1px solid var(--color-border-weak);
+ border-bottom-left-radius: 6px;
+ border-bottom-right-radius: 6px;
+ padding: 16px;
+ }
+
+ [data-slot="panel"] {
+ display: block;
+ margin: 0;
+ overflow: auto;
+ white-space: pre-wrap;
+ transition: opacity 0.18s ease;
+ font-size: 16px;
+ font-family: var(--font-mono);
+ width: 100%;
+
+ button {
+ max-width: 100%;
+ }
+
+ [data-slot="command"] {
+ all: unset;
+ display: flex;
+ max-width: 100%;
+ cursor: pointer;
+ align-items: center;
+ color: var(--color-text);
+ gap: 16px;
+ color: var(--color-text);
+ padding: 8px 16px 8px 8px;
+ border-radius: 4px;
+
+ [data-slot="command-script"] {
+ display: inline-block;
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ vertical-align: middle;
+
+ @media (prefers-color-scheme: dark) {
+ color: var(--color-text-weak);
+ }
+
+ @media (max-width: 35rem) {
+ width: calc(100% - 40px) !important;
+ }
+ }
+
+ [data-slot="highlight"] {
+ font-weight: 500;
+ color: var(--color-text-strong);
+ }
+ }
+
+ [data-slot="command"]:hover {
+ background: var(--color-background-weak-hover);
+
+ @media (prefers-color-scheme: dark) {
+ color: var(--color-text-weak);
+ background: var(--color-background-weak-hover);
+ }
+ }
+ }
+ }
+
+ [data-component="desktop-app-banner"] {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 32px;
+
+ [data-slot="badge"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ font-weight: 500;
+ padding: 4px 8px;
+ line-height: 1;
+ flex-shrink: 0;
+ }
+
+ [data-slot="content"] {
+ display: flex;
+ align-items: center;
+ gap: 1ch;
+ }
+
+ [data-slot="text"] {
+ color: var(--color-text-strong);
+ line-height: 1.4;
+
+ @media (max-width: 30.625rem) {
+ display: none;
+ }
+ }
+
+ [data-slot="platforms"] {
+ @media (max-width: 49.125rem) {
+ display: none;
+ }
+ }
+
+ [data-slot="link"] {
+ color: var(--color-text-weak);
+ white-space: nowrap;
+ text-decoration: none;
+
+ @media (max-width: 30.625rem) {
+ display: none;
+ }
+ }
+
+ [data-slot="link"]:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+
+ [data-slot="link-mobile"] {
+ display: none;
+ color: var(--color-text-strong);
+ white-space: nowrap;
+ text-decoration: none;
+
+ @media (max-width: 30.625rem) {
+ display: inline;
+ }
+ }
+
+ [data-slot="link-mobile"]:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="hero-copy"] {
+ [data-slot="releases"] {
+ background: none;
+ color: var(--color-text-weak);
+ padding: 0;
+ border: none;
+ font-weight: 400;
+ cursor: pointer;
+ margin-bottom: 14px;
+ border-radius: 0;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ text-decoration: none;
+ padding-bottom: 2px;
+ border-bottom: 1px solid transparent;
+ }
+
+ [data-slot="releases"]:hover {
+ background: none;
+ padding-bottom: 2px;
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ h1 {
+ font-size: 38px;
+ color: var(--color-text-strong);
+ font-weight: 700;
+ margin-bottom: 8px;
+
+ @media (max-width: 60rem) {
+ font-size: 22px;
+ }
+ }
+
+ p {
+ color: var(--color-text);
+ margin-bottom: 32px;
+ max-width: 82%;
+
+ @media (max-width: 50rem) {
+ max-width: 100%;
+ }
+ }
+
+ a {
+ background: var(--color-background-strong);
+ padding: 8px 12px 8px 20px;
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ text-decoration: none;
+ }
+
+ a:hover {
+ background: var(--color-background-strong-hover);
+ }
+ }
+ [data-slot="model-logos"] {
+ display: flex;
+ gap: 24px;
+ margin-bottom: 56px;
+
+ svg {
+ color: var(--color-background-strong);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ svg {
+ color: var(--color-background-strong);
+ }
+ }
+ }
+
+ [data-slot="pricing-copy"] {
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+
+ p:first-child {
+ margin-bottom: 24px;
+ color: var(--color-text);
+ display: flex;
+ gap: 8px;
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: 4px;
+ }
+ }
+ }
+
+ [data-component="video"] {
+ border-top: 1px solid var(--color-border-weak);
+
+ video {
+ width: 100%;
+ height: auto;
+ max-width: none;
+ max-height: none;
+ display: block;
+ aspect-ratio: 16 / 9;
+ object-fit: cover;
+ }
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+ max-width: 100%;
+
+ div {
+ display: flex;
+ gap: 12px;
+ }
+
+ span {
+ color: var(--color-icon);
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ p {
+ margin-bottom: 12px;
+ color: var(--color-text);
+ }
+
+ div > p > strong {
+ font-weight: 500;
+ color: var(--color-text-strong);
+ }
+ }
+
+ [data-component="what"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ a {
+ background: var(--color-background-strong);
+ padding: 8px 12px 8px 20px;
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ margin-top: 40px;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ text-decoration: none;
+ }
+
+ a:hover {
+ background: var(--color-background-strong-hover);
+ }
+
+ ul {
+ padding: 0;
+ li {
+ list-style: none;
+ margin-bottom: 16px;
+ display: flex;
+ gap: 12px;
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+
+ span {
+ color: var(--color-icon);
+ }
+ strong {
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin-right: 12px;
+ }
+ }
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ [data-component="growth"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+
+ svg {
+ margin-top: 32px;
+ width: 100%;
+ height: 100%;
+ margin-left: 40px;
+
+ @media (max-width: 60rem) {
+ display: none;
+ }
+ }
+
+ figure {
+ margin-top: 16px;
+ font-size: 13px;
+ margin-left: 40px;
+
+ span {
+ color: var(--color-text-strong);
+ }
+
+ @media (max-width: 60rem) {
+ display: none;
+ }
+ }
+ }
+
+ [data-component="privacy"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+
+ [data-slot="privacy-title"] {
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ div {
+ display: flex;
+ gap: 12px;
+ }
+
+ span {
+ color: var(--color-icon);
+ line-height: 200%;
+ }
+ }
+ }
+
+ [data-component="zen-cta"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ padding: var(--vertical-padding) var(--padding);
+ }
+
+ [data-slot="zen-cta-copy"] {
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 700;
+ margin-bottom: 16px;
+ display: block;
+ }
+
+ p {
+ color: var(--color-text);
+ margin-bottom: 24px;
+ max-width: 90%;
+
+ @media (max-width: 50rem) {
+ max-width: 100%;
+ }
+ }
+
+ a {
+ background: var(--color-background);
+ padding: 8px 12px 8px 20px;
+ color: var(--color-text-strong);
+ border: none;
+ border-radius: 4px;
+ border: 1px solid var(--color-border-weak);
+ font-weight: 500;
+ cursor: pointer;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ text-decoration: none;
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ [data-slot="model-logos"] {
+ display: flex;
+ gap: 24px;
+ margin-bottom: 40px;
+
+ svg {
+ color: var(--color-background-strong);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ svg {
+ color: var(--color-background-strong);
+ }
+ }
+ }
+
+ [data-component="email"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ [data-slot="dock"] {
+ border-radius: 14px;
+ border: 0.5px solid rgba(176, 176, 176, 0.6);
+ background: #f2f1f0;
+ margin-bottom: 32px;
+ overflow: hidden;
+ height: 64px;
+ width: 185px;
+ box-shadow:
+ 0 6px 80px 0 rgba(0, 0, 0, 0.05),
+ 0 2.507px 33.422px 0 rgba(0, 0, 0, 0.04),
+ 0 1.34px 17.869px 0 rgba(0, 0, 0, 0.03),
+ 0 0.751px 10.017px 0 rgba(0, 0, 0, 0.03),
+ 0 0.399px 5.32px 0 rgba(0, 0, 0, 0.02),
+ 0 0.166px 2.214px 0 rgba(0, 0, 0, 0.01);
+
+ img {
+ width: 100%;
+ height: auto;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ background: #312d2d;
+ }
+ }
+
+ [data-slot="form"] {
+ position: relative;
+
+ input {
+ background: var(--color-background-weak);
+ border-radius: 6px;
+ border: 1px solid var(--color-border-weak);
+ padding: 20px;
+ width: 100%;
+
+ /* Use color, not -moz-text-fill-color, for normal text */
+ color: var(--color-text-strong);
+
+ @media (max-width: 30rem) {
+ padding-bottom: 80px;
+ }
+
+ &:not(:focus) {
+ color: var(--color-text-strong);
+ }
+
+ &::placeholder {
+ color: var(--color-text-weak);
+ opacity: 1;
+ }
+
+ /* Optional legacy */
+ &::-moz-placeholder {
+ color: var(--color-text-weak);
+ opacity: 1;
+ }
+ }
+
+ input:focus {
+ background: var(--color-background-interactive-weaker);
+ outline: none;
+ border: none;
+ color: var(--color-text-strong);
+ border: 1px solid var(--color-background-strong);
+ box-shadow: 0 0 0 3px var(--color-background-interactive);
+
+ @media (prefers-color-scheme: dark) {
+ box-shadow: none;
+ border: 1px solid var(--color-background-interactive);
+ }
+ }
+
+ button {
+ position: absolute;
+ height: 40px;
+ right: 12px;
+ background: var(--color-background-strong);
+ padding: 4px 20px;
+ color: var(--color-text-inverted);
+ border-radius: 4px;
+ border: none;
+ outline: none;
+ font-weight: 500;
+ cursor: pointer;
+ top: 50%;
+ margin-top: -20px;
+
+ @media (max-width: 30rem) {
+ left: 20px;
+ right: 20px;
+ bottom: 20px;
+ top: auto;
+ }
+ }
+ }
+ }
+
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+ align-items: start;
+ min-height: 24px;
+
+ svg {
+ margin-top: 2px;
+ }
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+ line-height: 200%;
+ }
+ }
+
+ [data-component="testimonials"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+
+ @media (max-width: 60rem) {
+ --padding: 1rem;
+ --vertical-padding: 1rem;
+ }
+
+ a {
+ text-decoration: none;
+ }
+ [data-slot="testimonial"] {
+ background: var(--color-background-weak);
+ border-radius: 6px;
+ border: 1px solid var(--color-border-weak);
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+
+ @media (max-width: 60rem) {
+ flex-direction: column-reverse;
+ gap: 24px;
+ }
+
+ [data-slot="name"] {
+ display: flex;
+ gap: 16px;
+
+ @media (max-width: 60rem) {
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ span {
+ display: inline-block;
+ }
+
+ img {
+ height: 24px;
+ width: 24px;
+ border-radius: 24px;
+ }
+ }
+
+ [data-slot="quote"] {
+ margin-left: 40px;
+
+ @media (max-width: 60rem) {
+ margin-left: 0;
+ }
+ span {
+ color: var(--color-text);
+ text-decoration: none;
+ }
+ }
+ }
+
+ [data-slot="button"] {
+ all: unset;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ color: var(--color-text);
+ gap: var(--space-2-5);
+ font-size: 1rem;
+
+ @media (max-width: 24rem) {
+ font-size: 0.875rem;
+ }
+
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+
+ @media (max-width: 40rem) {
+ justify-content: flex-start;
+ }
+
+ @media (max-width: 30rem) {
+ justify-content: center;
+ }
+ }
+ }
+
+ [data-component="copy-status"] {
+ [data-slot="copy"] {
+ display: block;
+ width: var(--space-4);
+ height: var(--space-4);
+ color: var(--color-text-weaker);
+
+ [data-copied] & {
+ display: none;
+ }
+ }
+
+ [data-slot="check"] {
+ display: none;
+ width: var(--space-4);
+ height: var(--space-4);
+ color: var(--color-text-strong);
+
+ [data-copied] & {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ /* Mobile: third column on its own row */
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+
+ input:-webkit-autofill,
+ input:-webkit-autofill:hover,
+ input:-webkit-autofill:focus,
+ input:-webkit-autofill:active {
+ transition: background-color 5000000s ease-in-out 0s;
+ }
+
+ input:-webkit-autofill {
+ -webkit-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ input:-moz-autofill {
+ -moz-text-fill-color: var(--color-text-strong) !important;
+ }
+}
diff --git a/packages/console/app/src/routes/index.tsx b/packages/console/app/src/routes/index.tsx
new file mode 100644
index 0000000..c046a56
--- /dev/null
+++ b/packages/console/app/src/routes/index.tsx
@@ -0,0 +1,837 @@
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+//import { HttpHeader } from "@solidjs/start"
+import video from "../asset/lander/opencode-min.mp4"
+import videoPoster from "../asset/lander/opencode-poster.png"
+import { IconCopy, IconCheck } from "../component/icon"
+import { A, createAsync } from "@solidjs/router"
+import { EmailSignup } from "~/component/email-signup"
+import { Tabs } from "@kobalte/core/tabs"
+import { Faq } from "~/component/faq"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { github } from "~/lib/github"
+import { config } from "~/config"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { LocaleLinks } from "~/component/locale-links"
+
+function CopyStatus() {
+ return (
+
+
+
+
+ )
+}
+
+export default function Home() {
+ const i18n = useI18n()
+ const language = useLanguage()
+ const _githubData = createAsync(() => github())
+ const handleCopyClick = (event: Event) => {
+ const button = event.currentTarget as HTMLButtonElement
+ const text = button.textContent
+ if (text) {
+ void navigator.clipboard.writeText(text)
+ button.setAttribute("data-copied", "")
+ setTimeout(() => {
+ button.removeAttribute("data-copied")
+ }, 1500)
+ }
+ }
+
+ return (
+
+ {/* */}
+ {i18n.t("home.title")}
+
+
+
+
+
+
+
+
+
+
{i18n.t("home.banner.badge")}
+
+
+
+
+
+
+
+
+ curl
+
+
+ npm
+
+
+ bun
+
+
+ brew
+
+
+ paru
+
+
+
+
+
+
+
+ curl -fsSL
+ https://
+ opencode.ai/install
+ | bash
+
+
+
+
+
+
+
+ npm i -g
+ opencode-ai
+
+
+
+
+
+
+
+ bun add -g
+ opencode-ai
+
+
+
+
+
+
+
+ brew install
+ anomalyco/tap/opencode
+
+
+
+
+
+
+
+ paru -S
+ opencode
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("common.videoUnsupported")}
+
+
+
+
+
+
{i18n.t("home.what.title")}
+
{i18n.t("home.what.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.lsp.title")} {i18n.t("home.what.lsp.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.multiSession.title")} {i18n.t("home.what.multiSession.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.shareLinks.title")} {i18n.t("home.what.shareLinks.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.copilot.title")} {i18n.t("home.what.copilot.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.chatgptPlus.title")} {i18n.t("home.what.chatgptPlus.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.anyModel.title")} {i18n.t("home.what.anyModel.body")}
+
+
+
+ [*]
+
+ {i18n.t("home.what.anyEditor.title")} {i18n.t("home.what.anyEditor.body")}
+
+
+
+
+ {i18n.t("home.what.readDocs")}
+
+
+
+
+
+
+
+
+
{i18n.t("home.growth.title")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("common.figure", { n: 1 })} {" "}
+ {config.github.starsFormatted.compact} {i18n.t("home.growth.githubStars")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("common.figure", { n: 2 })} {config.stats.contributors} {" "}
+ {i18n.t("home.growth.contributors")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("common.figure", { n: 3 })} {config.stats.monthlyUsers} {" "}
+ {i18n.t("home.growth.monthlyDevs")}
+
+
+
+
+
+
+
+
+
{i18n.t("home.privacy.title")}
+
+
+
+
+
+
+
{i18n.t("common.faq")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/legal/privacy-policy/index.css b/packages/console/app/src/routes/legal/privacy-policy/index.css
new file mode 100644
index 0000000..dbc9f2a
--- /dev/null
+++ b/packages/console/app/src/routes/legal/privacy-policy/index.css
@@ -0,0 +1,343 @@
+[data-component="privacy-policy"] {
+ max-width: 800px;
+ margin: 0 auto;
+ line-height: 1.7;
+}
+
+[data-component="privacy-policy"] h1 {
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 0.5rem;
+ margin-top: 0;
+}
+
+[data-component="privacy-policy"] .effective-date {
+ font-size: 0.95rem;
+ color: var(--color-text-weak);
+ margin-bottom: 2rem;
+}
+
+[data-component="privacy-policy"] h2 {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-top: 3rem;
+ margin-bottom: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid var(--color-border-weak);
+}
+
+[data-component="privacy-policy"] h2:first-of-type {
+ margin-top: 2rem;
+}
+
+[data-component="privacy-policy"] h3 {
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+}
+
+[data-component="privacy-policy"] h4 {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-top: 1.5rem;
+ margin-bottom: 0.75rem;
+}
+
+[data-component="privacy-policy"] p {
+ margin-bottom: 1rem;
+ color: var(--color-text);
+}
+
+[data-component="privacy-policy"] ul,
+[data-component="privacy-policy"] ol {
+ margin-bottom: 1rem;
+ padding-left: 1.5rem;
+ color: var(--color-text);
+}
+
+[data-component="privacy-policy"] li {
+ margin-bottom: 0.5rem;
+ line-height: 1.7;
+}
+
+[data-component="privacy-policy"] ul ul,
+[data-component="privacy-policy"] ul ol,
+[data-component="privacy-policy"] ol ul,
+[data-component="privacy-policy"] ol ol {
+ margin-top: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+[data-component="privacy-policy"] a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ word-break: break-word;
+}
+
+[data-component="privacy-policy"] a:hover {
+ text-decoration-thickness: 2px;
+}
+
+[data-component="privacy-policy"] strong {
+ font-weight: 600;
+ color: var(--color-text-strong);
+}
+
+[data-component="privacy-policy"] .table-wrapper {
+ overflow-x: auto;
+ margin: 1.5rem 0;
+}
+
+[data-component="privacy-policy"] table {
+ width: 100%;
+ border-collapse: collapse;
+ border: 1px solid var(--color-border);
+}
+
+[data-component="privacy-policy"] th,
+[data-component="privacy-policy"] td {
+ padding: 0.75rem 1rem;
+ text-align: left;
+ border: 1px solid var(--color-border);
+ vertical-align: top;
+}
+
+[data-component="privacy-policy"] th {
+ background: var(--color-background-weak);
+ font-weight: 600;
+ color: var(--color-text-strong);
+}
+
+[data-component="privacy-policy"] td {
+ color: var(--color-text);
+}
+
+[data-component="privacy-policy"] td ul {
+ margin: 0;
+ padding-left: 1.25rem;
+}
+
+[data-component="privacy-policy"] td li {
+ margin-bottom: 0.25rem;
+}
+
+/* Mobile responsiveness */
+@media (max-width: 60rem) {
+ [data-component="privacy-policy"] {
+ padding: 0;
+ }
+
+ [data-component="privacy-policy"] h1 {
+ font-size: 1.75rem;
+ }
+
+ [data-component="privacy-policy"] h2 {
+ font-size: 1.35rem;
+ margin-top: 2.5rem;
+ }
+
+ [data-component="privacy-policy"] h3 {
+ font-size: 1.15rem;
+ }
+
+ [data-component="privacy-policy"] h4 {
+ font-size: 1rem;
+ }
+
+ [data-component="privacy-policy"] table {
+ font-size: 0.9rem;
+ }
+
+ [data-component="privacy-policy"] th,
+ [data-component="privacy-policy"] td {
+ padding: 0.5rem 0.75rem;
+ }
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+[data-component="privacy-policy"] [id] {
+ scroll-margin-top: 100px;
+}
+
+@media print {
+ @page {
+ margin: 2cm;
+ size: letter;
+ }
+
+ [data-component="top"],
+ [data-component="footer"],
+ [data-component="legal"] {
+ display: none !important;
+ }
+
+ [data-page="legal"] {
+ background: white !important;
+ padding: 0 !important;
+ }
+
+ [data-component="container"] {
+ max-width: none !important;
+ border: none !important;
+ margin: 0 !important;
+ }
+
+ [data-component="content"],
+ [data-component="brand-content"] {
+ padding: 0 !important;
+ margin: 0 !important;
+ }
+
+ [data-component="privacy-policy"] {
+ max-width: none !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ }
+
+ [data-component="privacy-policy"] * {
+ color: black !important;
+ background: transparent !important;
+ }
+
+ [data-component="privacy-policy"] h1 {
+ font-size: 24pt;
+ margin-top: 0;
+ margin-bottom: 12pt;
+ page-break-after: avoid;
+ }
+
+ [data-component="privacy-policy"] h2 {
+ font-size: 18pt;
+ border-top: 2pt solid black !important;
+ padding-top: 12pt;
+ margin-top: 24pt;
+ margin-bottom: 8pt;
+ page-break-after: avoid;
+ page-break-before: auto;
+ }
+
+ [data-component="privacy-policy"] h2:first-of-type {
+ margin-top: 16pt;
+ }
+
+ [data-component="privacy-policy"] h3 {
+ font-size: 14pt;
+ margin-top: 16pt;
+ margin-bottom: 8pt;
+ page-break-after: avoid;
+ }
+
+ [data-component="privacy-policy"] h4 {
+ font-size: 12pt;
+ margin-top: 12pt;
+ margin-bottom: 6pt;
+ page-break-after: avoid;
+ }
+
+ [data-component="privacy-policy"] p {
+ font-size: 11pt;
+ line-height: 1.5;
+ margin-bottom: 8pt;
+ orphans: 3;
+ widows: 3;
+ }
+
+ [data-component="privacy-policy"] .effective-date {
+ font-size: 10pt;
+ margin-bottom: 16pt;
+ }
+
+ [data-component="privacy-policy"] ul,
+ [data-component="privacy-policy"] ol {
+ margin-bottom: 8pt;
+ page-break-inside: auto;
+ }
+
+ [data-component="privacy-policy"] li {
+ font-size: 11pt;
+ line-height: 1.5;
+ margin-bottom: 4pt;
+ page-break-inside: avoid;
+ }
+
+ [data-component="privacy-policy"] a {
+ color: black !important;
+ text-decoration: underline;
+ }
+
+ [data-component="privacy-policy"] .table-wrapper {
+ overflow: visible !important;
+ margin: 12pt 0;
+ }
+
+ [data-component="privacy-policy"] table {
+ border: 2pt solid black !important;
+ page-break-inside: avoid;
+ width: 100% !important;
+ font-size: 10pt;
+ }
+
+ [data-component="privacy-policy"] th,
+ [data-component="privacy-policy"] td {
+ border: 1pt solid black !important;
+ padding: 6pt 8pt !important;
+ background: white !important;
+ }
+
+ [data-component="privacy-policy"] th {
+ background: #f0f0f0 !important;
+ font-weight: bold;
+ page-break-after: avoid;
+ }
+
+ [data-component="privacy-policy"] tr {
+ page-break-inside: avoid;
+ }
+
+ [data-component="privacy-policy"] td ul {
+ margin: 2pt 0;
+ padding-left: 12pt;
+ }
+
+ [data-component="privacy-policy"] td li {
+ margin-bottom: 2pt;
+ font-size: 9pt;
+ }
+
+ [data-component="privacy-policy"] strong {
+ font-weight: bold;
+ color: black !important;
+ }
+
+ [data-component="privacy-policy"] h1,
+ [data-component="privacy-policy"] h2,
+ [data-component="privacy-policy"] h3,
+ [data-component="privacy-policy"] h4 {
+ page-break-inside: avoid;
+ page-break-after: avoid;
+ }
+
+ [data-component="privacy-policy"] h2 + p,
+ [data-component="privacy-policy"] h3 + p,
+ [data-component="privacy-policy"] h4 + p,
+ [data-component="privacy-policy"] h2 + ul,
+ [data-component="privacy-policy"] h3 + ul,
+ [data-component="privacy-policy"] h4 + ul {
+ page-break-before: avoid;
+ }
+
+ [data-component="privacy-policy"] table,
+ [data-component="privacy-policy"] .table-wrapper {
+ page-break-inside: avoid;
+ }
+}
diff --git a/packages/console/app/src/routes/legal/privacy-policy/index.tsx b/packages/console/app/src/routes/legal/privacy-policy/index.tsx
new file mode 100644
index 0000000..4426e0d
--- /dev/null
+++ b/packages/console/app/src/routes/legal/privacy-policy/index.tsx
@@ -0,0 +1,1516 @@
+import "../../brand/index.css"
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { LocaleLinks } from "~/component/locale-links"
+import { useLanguage } from "~/context/language"
+
+export default function PrivacyPolicy() {
+ const language = useLanguage()
+ return (
+
+ OpenCode | Privacy Policy
+
+
+
+
+
+
+
+
+ Privacy Policy
+ Effective date: Mar 6, 2026
+
+
+ At OpenCode, we take your privacy seriously. Please read this Privacy Policy to learn how we treat your
+ personal data.{" "}
+
+ By using or accessing our Services in any manner, you acknowledge that you accept the practices and
+ policies outlined below, and you hereby consent that we will collect, use and disclose your
+ information as described in this Privacy Policy.
+ {" "}
+ For clarity, our open source software that is not provided to you on a hosted basis is subject to the
+ open source license and terms set forth on the applicable repository where you access such open source
+ software, and such license and terms will exclusively govern your use of such open source software.
+
+
+
+ Remember that your use of OpenCode is at all times subject to our Terms of Use,{" "}
+ https://opencode.ai/legal/terms-of-service ,
+ which incorporates this Privacy Policy. Any terms we use in this Policy without defining them have the
+ definitions given to them in the Terms of Use.
+
+
+ You may print a copy of this Privacy Policy by clicking the print button in your browser.
+
+
+ As we continually work to improve our Services, we may need to change this Privacy Policy from time to
+ time. We will alert you of material changes by placing a notice on the OpenCode website, by sending you
+ an email and/or by some other means. Please note that if you've opted not to receive legal notice emails
+ from us (or you haven't provided us with your email address), those legal notices will still govern your
+ use of the Services, and you are still responsible for reading and understanding them. If you use the
+ Services after any changes to the Privacy Policy have been posted, that means you agree to all of the
+ changes.
+
+
+ Privacy Policy Table of Contents
+
+
+ What this Privacy Policy Covers
+
+ This Privacy Policy covers how we treat Personal Data that we gather when you access or use our
+ Services. "Personal Data" means any information that identifies or relates to a particular individual
+ and also includes information referred to as "personally identifiable information" or "personal
+ information" under applicable data privacy laws, rules or regulations. This Privacy Policy does not
+ cover the practices of companies we don't own or control or people we don't manage.
+
+
+ Personal Data
+
+ Categories of Personal Data We Collect
+
+ This chart details the categories of Personal Data that we collect and have collected over the past 12
+ months:
+
+
+
+
+
+
+ Category of Personal Data (and Examples)
+ Business or Commercial Purpose(s) for Collection
+ Categories of Third Parties With Whom We Disclose this Personal Data
+
+
+
+
+
+ Profile or Contact Data such as first and last name, email, phone number and
+ mailing address.
+
+
+
+ Providing, Customizing and Improving the Services
+ Marketing the Services
+ Corresponding with You
+
+
+
+
+ Service Providers
+ Business Partners
+ Parties You Authorize, Access or Authenticate
+
+
+
+
+
+ Payment Data such as financial account information, payment card type, full
+ number of payment card, last 4 digits of payment card, bank account information, billing
+ address, billing phone number and billing email
+
+
+
+ Providing, Customizing and Improving the Services
+ Marketing the Services
+ Corresponding with You
+
+
+
+
+ Service Providers (specifically our payment processing partner)
+ Business Partners
+ Parties You Authorize, Access or Authenticate
+
+
+
+
+
+ Device/IP Data such as IP address, device ID, domain server, type of
+ device/operating system/browser used to access the Services.
+
+
+
+ Providing, Customizing and Improving the Services
+ Marketing the Services
+ Corresponding with You
+
+
+
+
+ None
+ Service Providers
+ Business Partners
+ Parties You Authorize, Access or Authenticate
+
+
+
+
+
+ Other Identifying Information that You Voluntarily Choose to Provide such as
+ information included in conversations or prompts that you submit to AI
+
+
+
+ Providing, Customizing and Improving the Services
+ Marketing the Services
+ Corresponding with You
+
+
+
+
+ Service Providers
+ Business Partners
+ Parties You Authorize, Access or Authenticate
+
+
+
+
+
+
+
+ Our Commercial or Business Purposes for Collecting Personal Data
+
+ Providing, Customizing and Improving the Services
+
+ Creating and managing your account or other user profiles.
+ Providing you with the products, services or information you request.
+ Meeting or fulfilling the reason you provided the information to us.
+ Providing support and assistance for the Services.
+
+ Improving the Services, including testing, research, internal analytics and product development.
+
+ Doing fraud protection, security and debugging.
+
+ Carrying out other business purposes stated when collecting your Personal Data or as otherwise set
+ forth in applicable data privacy laws, such as the California Consumer Privacy Act, as amended by the
+ California Privacy Rights Act of 2020 (the "CCPA"), the Colorado Privacy Act (the "CPA"), the
+ Connecticut Data Privacy Act (the "CTDPA"), the Delaware Personal Data Privacy Act (the "DPDPA"), the
+ Iowa Consumer Data Protection Act (the "ICDPA"), the Montana Consumer Data Privacy Act ("MCDPA"), the
+ Nebraska Data Privacy Act (the "NDPA"), the New Hampshire Privacy Act (the "NHPA"), the New Jersey
+ Privacy Act (the "NJPA"), the Oregon Consumer Privacy Act ("OCPA"), the Texas Data Privacy and
+ Security Act ("TDPSA"), the Utah Consumer Privacy Act (the "UCPA"), or the Virginia Consumer Data
+ Protection Act (the "VCDPA") (collectively, the "State Privacy Laws").
+
+
+
+ Marketing the Services
+
+ Marketing and selling the Services.
+
+
+ Corresponding with You
+
+
+ Responding to correspondence that we receive from you, contacting you when necessary or requested, and
+ sending you information about OpenCode.
+
+ Sending emails and other communications according to your preferences.
+
+
+ Other Permitted Purposes for Processing Personal Data
+
+ In addition, each of the above referenced categories of Personal Data may be collected, used, and
+ disclosed with the government, including law enforcement, or other parties to meet certain legal
+ requirements and enforcing legal terms including: fulfilling our legal obligations under applicable law,
+ regulation, court order or other legal process, such as preventing, detecting and investigating security
+ incidents and potentially illegal or prohibited activities; protecting the rights, property or safety of
+ you, OpenCode or another party; enforcing any agreements with you; responding to claims that any posting
+ or other content violates third-party rights; and resolving disputes.
+
+
+
+ We will not collect additional categories of Personal Data or use the Personal Data we collected for
+ materially different, unrelated or incompatible purposes without providing you notice or obtaining your
+ consent.
+
+
+ Categories of Sources of Personal Data
+ We collect Personal Data about you from the following categories of sources:
+
+ You
+
+
+ When you provide such information directly to us.
+
+ When you create an account or use our interactive tools and Services.
+
+ When you voluntarily provide information in free-form text boxes through the Services or through
+ responses to surveys or questionnaires.
+
+ When you send us an email or otherwise contact us.
+
+
+
+ When you use the Services and such information is collected automatically.
+
+ Through Cookies (defined in the "Tracking Tools and Opt-Out" section below).
+
+ If you download and install certain applications and software we make available, we may receive
+ and collect information transmitted from your computing device for the purpose of providing you
+ the relevant Services, such as information regarding when you are logged on and available to
+ receive updates or alert notices.
+
+
+
+
+
+ Public Records
+
+
+ Third Parties
+
+
+ Vendors
+
+
+ We may use analytics providers to analyze how you interact and engage with the Services, or third
+ parties may help us provide you with customer support.
+
+ We may use vendors to obtain information to generate leads and create user profiles.
+
+
+
+
+ How We Disclose Your Personal Data
+
+ We disclose your Personal Data to the categories of service providers and other parties listed in this
+ section. Depending on state laws that may be applicable to you, some of these disclosures may constitute
+ a "sale" of your Personal Data. For more information, please refer to the state-specific sections below.
+
+
+ Service Providers
+
+ These parties help us provide the Services or perform business functions on our behalf. They include:
+
+
+ Hosting, technology and communication providers.
+ Analytics providers for web traffic or usage of the site.
+ Security and fraud prevention consultants.
+ Support and customer service vendors.
+
+
+ Business Partners
+ These parties partner with us in offering various services. They include:
+
+ Businesses that you have a relationship with.
+ Companies that we partner with to offer joint promotional offers or opportunities.
+
+
+ Parties You Authorize, Access or Authenticate
+ Parties You Authorize, Access or Authenticate.
+
+ Legal Obligations
+
+ We may disclose any Personal Data that we collect with third parties in conjunction with any of the
+ activities set forth under "Other Permitted Purposes for Processing Personal Data" section above.
+
+
+ Business Transfers
+
+ All of your Personal Data that we collect may be transferred to a third party if we undergo a merger,
+ acquisition, bankruptcy or other transaction in which that third party assumes control of our business
+ (in whole or in part).
+
+
+ Data that is Not Personal Data
+
+ We may create aggregated, de-identified or anonymized data from the Personal Data we collect, including
+ by removing information that makes the data personally identifiable to a particular user. We may use
+ such aggregated, de-identified or anonymized data and disclose it with third parties for our lawful
+ business purposes, including to analyze, build and improve the Services and promote our business,
+ provided that we will not disclose such data in a manner that could identify you.
+
+
+
+
+ The Services use cookies and similar technologies such as pixel tags, web beacons, clear GIFs and
+ JavaScript (collectively, "Cookies") to enable our servers to recognize your web browser, tell us how
+ and when you visit and use our Services, analyze trends, learn about our user base and operate and
+ improve our Services. Cookies are small pieces of data– usually text files – placed on your computer,
+ tablet, phone or similar device when you use that device to access our Services. We may also supplement
+ the information we collect from you with information received from third parties, including third
+ parties that have placed their own Cookies on your device(s).
+
+
+
+ Please note that because of our use of Cookies, the Services do not support "Do Not Track" requests sent
+ from a browser at this time.
+
+
+ We use the following types of Cookies:
+
+
+
+ Essential Cookies. Essential Cookies are required for providing you with features or
+ services that you have requested. For example, certain Cookies enable you to log into secure areas of
+ our Services. Disabling these Cookies may make certain features and services unavailable.
+
+
+ Functional Cookies. Functional Cookies are used to record your choices and settings
+ regarding our Services, maintain your preferences over time and recognize you when you return to our
+ Services. These Cookies help us to personalize our content for you, greet you by name and remember
+ your preferences (for example, your choice of language or region).
+
+
+ Performance/Analytical Cookies. Performance/Analytical Cookies allow us to understand
+ how visitors use our Services. They do this by collecting information about the number of visitors to
+ the Services, what pages visitors view on our Services and how long visitors are viewing pages on the
+ Services. Performance/Analytical Cookies also help us measure the performance of our advertising
+ campaigns in order to help us improve our campaigns and the Services' content for those who engage
+ with our advertising. For example, Google LLC ("Google") uses cookies in connection with its Google
+ Analytics services. Google's ability to use and disclose information collected by Google Analytics
+ about your visits to the Services is subject to the Google Analytics Terms of Use and the Google
+ Privacy Policy. You have the option to opt-out of Google's use of Cookies by visiting the Google
+ advertising opt-out page at{" "}
+ www.google.com/privacy_ads.html or the Google
+ Analytics Opt-out Browser Add-on at{" "}
+ https://tools.google.com/dlpage/gaoptout/ .
+
+
+
+
+ You can decide whether or not to accept Cookies through your internet browser's settings. Most browsers
+ have an option for turning off the Cookie feature, which will prevent your browser from accepting new
+ Cookies, as well as (depending on the sophistication of your browser software) allow you to decide on
+ acceptance of each new Cookie in a variety of ways. You can also delete all Cookies that are already on
+ your device. If you do this, however, you may have to manually adjust some preferences every time you
+ visit our website and some of the Services and functionalities may not work.
+
+
+
+ To find out more information about Cookies generally, including information about how to manage and
+ delete Cookies, please visit{" "}
+ http://www.allaboutcookies.org/ .
+
+
+ Data Security
+
+ We seek to protect your Personal Data from unauthorized access, use and disclosure using appropriate
+ physical, technical, organizational and administrative security measures based on the type of Personal
+ Data and how we are processing that data. You should also help protect your data by appropriately
+ selecting and protecting your password and/or other sign-on mechanism; limiting access to your computer
+ or device and browser; and signing off after you have finished accessing your account. Although we work
+ to protect the security of your account and other data that we hold in our records, please be aware that
+ no method of transmitting data over the internet or storing data is completely secure.
+
+
+ Data Retention
+
+ We retain Personal Data about you for as long as necessary to provide you with our Services or to
+ perform our business or commercial purposes for collecting your Personal Data. When establishing a
+ retention period for specific categories of data, we consider who we collected the data from, our need
+ for the Personal Data, why we collected the Personal Data, and the sensitivity of the Personal Data. In
+ some cases we retain Personal Data for longer, if doing so is necessary to comply with our legal
+ obligations, resolve disputes or collect fees owed, or is otherwise permitted or required by applicable
+ law, rule or regulation. We may further retain information in an anonymous or aggregated form where that
+ information would not identify you personally.
+
+
+ Personal Data of Children
+
+ As noted in the Terms of Use, we do not knowingly collect or solicit Personal Data from children under
+ 18 years of age; if you are a child under the age of 18, please do not attempt to register for or
+ otherwise use the Services or send us any Personal Data. If we learn we have collected Personal Data
+ from a child under 18 years of age, we will delete that information as quickly as possible. If you
+ believe that a child under 18 years of age may have provided Personal Data to us, please contact us at{" "}
+ help@anoma.ly .
+
+
+ California Resident Rights
+
+ If you are a California resident, you have the rights set forth in this section. Please see the
+ "Exercising Your Rights under the State Privacy Laws" section below for instructions regarding how to
+ exercise these rights. Please note that we may process Personal Data of our customers' end users or
+ employees in connection with our provision of certain services to our customers. If we are processing
+ your Personal Data as a service provider, you should contact the entity that collected your Personal
+ Data in the first instance to address your rights with respect to such data. Additionally, please note
+ that these rights are subject to certain conditions and exceptions under applicable law, which may
+ permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a California resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access
+
+ You have the right to request certain information about our collection and use of your Personal Data. In
+ response, we will provide you with the following information in the past 12 months:
+
+
+ The categories of Personal Data that we have collected about you.
+ The categories of sources from which that Personal Data was collected.
+ The business or commercial purpose for collecting or selling your Personal Data.
+ The categories of third parties with whom we have shared your Personal Data.
+ The specific pieces of Personal Data that we have collected about you.
+
+
+
+ If we have disclosed your Personal Data to any third parties for a business purpose over the past 12
+ months, we will identify the categories of Personal Data shared with each category of third party
+ recipient. If we have sold your Personal Data over the past 12 months, we will identify the categories
+ of Personal Data sold to each category of third party recipient.
+
+
+
+ You may request the above information beyond the 12-month period, but no earlier than January 1, 2022.
+ If you do make such a request, we are required to provide that information unless doing so proves
+ impossible or would involve disproportionate effort.
+
+
+ Deletion
+
+ You have the right to request that we delete the Personal Data that we have collected from you. Under
+ the CCPA, this right is subject to certain exceptions: for example, we may need to retain your Personal
+ Data to provide you with the Services or complete a transaction or other action you have requested, or
+ if deletion of your Personal Data involves disproportionate effort. If your deletion request is subject
+ to one of these exceptions, we may deny your deletion request.
+
+
+ Correction
+
+ You have the right to request that we correct any inaccurate Personal Data we have collected about you.
+ Under the CCPA, this right is subject to certain exceptions: for example, if we decide, based on the
+ totality of circumstances related to your Personal Data, that such data is correct. If your correction
+ request is subject to one of these exceptions, we may deny your request.
+
+
+ Personal Data Sales Opt-Out
+
+ We will not sell or share your Personal Data, and have not done so over the last 12 months. To our
+ knowledge, we do not sell or share the Personal Data of minors under 13 years of age or of consumers
+ under 16 years of age.
+
+
+ Limit the Use of Sensitive Personal Information
+
+ Consumers have certain rights over the processing of their Sensitive Personal Information. However, we
+ do not collect Sensitive Personal Information.
+
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the CCPA
+
+ We will not discriminate against you for exercising your rights under the CCPA. We will not deny you our
+ goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the CCPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the CCPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Colorado Resident Rights
+
+ If you are a Colorado resident, you have the rights set forth under the Colorado Privacy Act ("CPA").
+ Please see the "Exercising Your Rights under the State Privacy Laws" section below for instructions
+ regarding how to exercise these rights. Please note that we may process Personal Data of our customers'
+ end users or employees in connection with our provision of certain services to our customers. If we are
+ processing your Personal Data as a service provider, you should contact the entity that collected your
+ Personal Data in the first instance to address your rights with respect to such data. Additionally,
+ please note that these rights are subject to certain conditions and exceptions under applicable law,
+ which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Colorado resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access and request a copy of your Personal Data in a machine-readable format, to the extent technically
+ feasible, twice within a calendar year.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data concerning you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the CPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the CPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic situation, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ CPA that concern you.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, 2)
+ Personal Data from a known child under 13 years of age, 3) to sell, or process Personal Data for
+ Targeted Advertising or Profiling after you exercise your right to opt-out, or 4) Personal Data for
+ Secondary Use.
+
+
+
+ If you would like to withdraw your consent, please follow the instructions under the "Exercising Your
+ Rights under the State Privacy Laws" section.
+
+
+ We Will Not Discriminate Against You
+
+ We will not process your personal data in violation of state and federal laws that prohibit unlawful
+ discrimination against consumers.
+
+
+ Connecticut Resident Rights
+
+ If you are a Connecticut resident, you have the rights set forth under the Connecticut Data Privacy Act
+ ("CTDPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Connecticut resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the CTDPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" as defined under the CTDPA. "Profiling" means any
+ form of automated processing performed on personal data to evaluate, analyze or predict personal aspects
+ related to an identified or identifiable individual's economic situation, health, personal preferences,
+ interests, reliability, behavior, location or movements.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, 2)
+ Sensitive Data from a known child under 13 years of age, or 3) to sell, or process Personal Data for
+ Targeted Advertising of a consumer at least 13 years of age but younger than 16 years of age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the CTDPA
+
+ We will not discriminate against you for exercising your rights under the CTDPA. We will not deny you
+ our goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the CTDPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the CTDPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Delaware Resident Rights
+
+ If you are a Delaware resident, you have the rights set forth under the Delaware Personal Data Privacy
+ Act ("DPDPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Delaware resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access and request a copy of your Personal Data in a machine-readable format, to the extent technically
+ feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the DPDPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the DPDPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic circumstances, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ DPDPA that concern you. To our knowledge, we do not process the Personal Data of consumers under 18
+ years of age for the purpose of Profiling.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, 2)
+ Sensitive Data from a known child under 13 years of age, 3) or to sell, or process Personal Data for
+ Targeted Advertising, or Profiling of a consumer at least 13 years of age but younger than 18 years of
+ age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You
+
+ We will not discriminate against you for exercising your rights under the DPDPA. We will not deny you
+ our goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the DPDPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the DPDPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Iowa Resident Rights
+
+ If you are an Iowa resident, you have the rights set forth under the Iowa Consumer Data Protection Act
+ ("ICDPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are an Iowa resident, the portion that is more protective of Personal Data shall control to the extent
+ of such conflict. If you have any questions about this section or whether any of the following rights
+ apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access and request a copy of your Personal Data in a machine-readable format, to the extent technically
+ feasible, twice within a calendar year.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us.
+
+ Opt-Out of Certain Processing Activities
+
+ Targeted Advertising: We do not process your Personal Data for targeted advertising purposes.
+ Sale of Personal Data: We do not currently sell your Personal Data as defined under the ICDPA.
+ Processing of Sensitive Personal Data: We do not process Sensitive Personal Data.
+
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the ICDPA
+
+ We will not discriminate against you for exercising your rights under the ICDPA. We will not deny you
+ our goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the ICDPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the ICDPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Montana Resident Rights
+
+ If you are a Montana resident, you have the rights set forth under the Montana Consumer Data Privacy Act
+ ("MCDPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Montana resident, the portion that is more protective of Personal Data shall control to the extent
+ of such conflict. If you have any questions about this section or whether any of the following rights
+ apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the MCDPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the MCDPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic circumstances, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ MCDPA that concern you. To our knowledge, we do not process the Personal Data of consumers under 16
+ years of age for the purpose of Profiling.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, 2)
+ Sensitive Data from a known child under 13 years of age, or 3) to sell, or process Personal Data for
+ Targeted Advertising or Profiling of a consumer at least 13 years of age but younger than 16 years of
+ age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the MCDPA
+
+ We will not discriminate against you for exercising your rights under the MCDPA. We will not deny you
+ our goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the MCDPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the MCDPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Nebraska Resident Rights
+
+ If you are a Nebraska resident, you have the rights set forth under the Nebraska Data Privacy Act
+ ("NDPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Nebraska resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible, twice within a calendar year.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the NDPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the NDPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic circumstances, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ NDPA that concern you.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data and
+ 2) Sensitive Data from a known child under 13 years of age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the NDPA
+
+ We will not discriminate against you for exercising your rights under the NDPA. We will not deny you our
+ goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the NDPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the NDPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ New Hampshire Resident Rights
+
+ If you are a New Hampshire resident, you have the rights set forth under the New Hampshire Privacy Act
+ ("NHPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a New Hampshire resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the NHPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the NHPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic circumstances, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ NHPA that concern you.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data and
+ 2) Sensitive Data from a known child under 13 years of age, 3) or to sell or process Personal Data for
+ Targeted Advertising of a consumer at least 13 years of age but younger than 16 years of age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the NHPA
+
+ We will not discriminate against you for exercising your rights under the NHPA. We will not deny you our
+ goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the NHPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the NHPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ New Jersey Resident Rights
+
+ If you are a New Jersey resident, you have the rights set forth under the New Jersey Privacy Act
+ ("NJPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a New Jersey resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access and request a copy of your Personal Data in a machine-readable format, to the extent technically
+ feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data concerning you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the NJPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the NJPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic circumstances, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ NJPA that concern you. To our knowledge, we do not process the Personal Data of consumers under 17 years
+ of age for the purpose of Profiling.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, 2)
+ Sensitive Data from a known child under 13 years of age, 3) or to sell, or process Personal Data for
+ Targeted Advertising, or Profiling of a consumer at least 13 years of age but younger than 17 years of
+ age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You
+
+ We will not discriminate against you for exercising your rights under the NJPA. We will not deny you our
+ goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the NJPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the NJPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Oregon Resident Rights
+
+ If you are an Oregon resident, you have the rights set forth under the Oregon Consumer Privacy Act
+ ("OCPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are an Oregon resident, the portion that is more protective of Personal Data shall control to the extent
+ of such conflict. If you have any questions about this section or whether any of the following rights
+ apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access and request a copy of your Personal Data, including a list of specific third parties, other than
+ natural persons, to which we have disclosed your Personal Data or any Personal Data, in a
+ machine-readable format, to the extent technically feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the OCPA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" to make "Decisions" under the OCPA. "Profiling"
+ means any form of automated processing performed on personal data to evaluate, analyze or predict
+ personal aspects related to an identified or identifiable individual's economic circumstances, health,
+ personal preferences, interests, reliability, behavior, location or movements. "Decision" means any
+ "Decisions that produce legal or similarly significant effects concerning a Consumer," as defined in the
+ OCPA that concern you. To our knowledge, we do not process the Personal Data of consumers under 16 years
+ of age for the purpose of Profiling.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, 2)
+ Sensitive Data from a known child under 13 years of age, or 3) to sell, or process Personal Data for
+ Targeted Advertising, or Profiling of a consumer at least 13 years of age but younger than 16 years of
+ age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You
+
+ We will not discriminate against you for exercising your rights under the OCPA. We will not deny you our
+ goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the OCPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the OCPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Texas Resident Rights
+
+ If you are a Texas resident, you have the rights set forth under the Texas Data Privacy and Security Act
+ ("TDPSA"). Please see the "Exercising Your Rights under the State Privacy Laws" section below for
+ instructions regarding how to exercise these rights. Please note that we may process Personal Data of
+ our customers' end users or employees in connection with our provision of certain services to our
+ customers. If we are processing your Personal Data as a service provider, you should contact the entity
+ that collected your Personal Data in the first instance to address your rights with respect to such
+ data. Additionally, please note that these rights are subject to certain conditions and exceptions under
+ applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Texas resident, the portion that is more protective of Personal Data shall control to the extent
+ of such conflict. If you have any questions about this section or whether any of the following rights
+ apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible, twice within a calendar year.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Personal Data Sales Opt-Out
+
+ We do not currently sell or process for the purposes of targeted advertising your Personal Data as
+ defined under the TDPSA.
+
+
+ Profiling Opt-Out
+
+ We do not process your Personal Data for "Profiling" as defined under the TDPSA. "Profiling" means any
+ form of solely automated processing performed on personal data to evaluate, analyze, or predict personal
+ aspects related to an identified or identifiable individual's economic situation, health, personal
+ preferences, interests, reliability, behavior, location, or movements.
+
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, or
+ 2) Sensitive Data from a known child under 13 years of age.
+
+
+ However, we currently do not collect or process your Personal Data as described above.
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the TDPSA
+
+ We will not discriminate against you for exercising your rights under the TDPSA. We will not deny you
+ our goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the TDPSA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the TDPSA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Utah Resident Rights
+
+ If you are a Utah resident, you have the rights set forth under the Utah Consumer Privacy Act ("UCPA").
+ Please see the "Exercising Your Rights under the State Privacy Laws" section below for instructions
+ regarding how to exercise these rights. Please note that we may process Personal Data of our customers'
+ end users or employees in connection with our provision of certain services to our customers. If we are
+ processing your Personal Data as a service provider, you should contact the entity that collected your
+ Personal Data in the first instance to address your rights with respect to such data. Additionally,
+ please note that these rights are subject to certain conditions and exceptions under applicable law,
+ which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Utah resident, the portion that is more protective of Personal Data shall control to the extent of
+ such conflict. If you have any questions about this section or whether any of the following rights apply
+ to you, please contact us at help@anoma.ly.
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible.
+
+
+ Deletion
+ You have the right to delete Personal Data that you have provided to us.
+
+ Opt-Out of Certain Processing Activities
+
+ Targeted Advertising: We do not process your Personal Data for targeted advertising purposes.
+ Sale of Personal Data: We do not currently sell your Personal Data as defined under the UCPA.
+ Processing of Sensitive Personal Data: We do not process Sensitive Personal Data.
+
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the UCPA
+
+ We will not discriminate against you for exercising your rights under the UCPA. We will not deny you our
+ goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the UCPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the UCPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Virginia Resident Rights
+
+ If you are a Virginia resident, you have the rights set forth under the Virginia Consumer Data
+ Protection Act ("VCDPA"). Please see the "Exercising Your Rights under the State Privacy Laws" section
+ below for instructions regarding how to exercise these rights. Please note that we may process Personal
+ Data of our customers' end users or employees in connection with our provision of certain services to
+ our customers. If we are processing your Personal Data as a service provider, you should contact the
+ entity that collected your Personal Data in the first instance to address your rights with respect to
+ such data. Additionally, please note that these rights are subject to certain conditions and exceptions
+ under applicable law, which may permit or require us to deny your request.
+
+
+
+ If there are any conflicts between this section and any other provision of this Privacy Policy and you
+ are a Virginia resident, the portion that is more protective of Personal Data shall control to the
+ extent of such conflict. If you have any questions about this section or whether any of the following
+ rights apply to you, please contact us at help@anoma.ly .
+
+
+ Access and Portability
+
+ You have the right to request confirmation of whether or not we are processing your Personal Data and to
+ access your Personal Data, and request a copy of your Personal Data in a machine-readable format, to the
+ extent technically feasible.
+
+
+ Correction
+
+ You have the right to correct inaccuracies in your Personal Data, to the extent such correction is
+ appropriate in consideration of the nature of such data and our purposes of processing your Personal
+ Data.
+
+
+ Deletion
+ You have the right to delete Personal Data you have provided to us or we have obtained about you.
+
+ Consent or "Opt-in" Required and How to Withdraw
+
+ We may seek your consent to collect or process certain Personal Data, including: 1) Sensitive Data, or
+ 2) Sensitive Data from a known child under 13 years of age.
+
+
+ However, we currently do not collect or process Personal data as described above.
+
+ Opt-Out of Certain Processing Activities
+
+ Targeted Advertising: We do not process your Personal Data for targeted advertising purposes.
+ Sale of Personal Data: We do not currently sell your Personal Data as defined under the VDCPA.
+
+ Processing for Profiling Purposes: We do not currently process your Personal Data for the purposes of
+ profiling.
+
+
+
+
+ To exercise any of your rights for these certain processing activities, please follow the instructions
+ under the "Exercising Your Rights under the State Privacy Laws" section.
+
+
+ We Will Not Discriminate Against You for Exercising Your Rights Under the VCDPA
+
+ We will not discriminate against you for exercising your rights under the VCDPA. We will not deny you
+ our goods or services, charge you different prices or rates, or provide you a lower quality of goods and
+ services if you exercise your rights under the VCDPA. However, we may offer different tiers of our
+ Services as allowed by applicable data privacy laws (including the VCDPA) with varying prices, rates or
+ levels of quality of the goods or services you receive related to the value of Personal Data that we
+ receive from you.
+
+
+ Exercising Your Rights under the State Privacy Laws
+
+ To exercise the rights described in this Privacy Policy, you or, if you are a California, Colorado,
+ Connecticut, Delaware, Montana, Nebraska, New Hampshire, New Jersey, Oregon or Texas resident, your
+ Authorized Agent (defined below) must send us a request that (1) provides sufficient information to
+ allow us to verify that you are the person about whom we have collected Personal Data, and (2) describes
+ your request in sufficient detail to allow us to understand, evaluate and respond to it. Each request
+ that meets both of these criteria will be considered a "Valid Request." We may not respond to requests
+ that do not meet these criteria. We will only use Personal Data provided in a Valid Request to verify
+ your identity and complete your request. You do not need an account to submit a Valid Request.
+
+
+
+ We will work to respond to your Valid Request within the time period required by applicable law. We will
+ not charge you a fee for making a Valid Request unless your Valid Request(s) is excessive, repetitive or
+ manifestly unfounded. If we determine that your Valid Request warrants a fee, we will notify you of the
+ fee and explain that decision before completing your request.
+
+
+ Request to Withdraw Consent to Certain Processing Activities
+
+ If you are a California resident, you may withdraw your consent allowing us: 1) to sell or share your
+ Personal Data, by using the following method:
+
+
+
+ Request to Access, Delete, or Correct
+
+ You may submit a Valid Request for any other rights afforded to you in this Privacy Policy by using the
+ following methods:
+
+
+
+
+ If you are a California, Colorado, Connecticut, Delaware, Montana, Nebraska, New Hampshire, New Jersey,
+ Oregon or Texas resident, you may also authorize an agent (an "Authorized Agent") to exercise your
+ rights on your behalf. To do this, you must provide your Authorized Agent with written permission to
+ exercise your rights on your behalf, and we may request a copy of this written permission from your
+ Authorized Agent when they make a request on your behalf.
+
+
+ Appealing a Denial
+
+ If you are a Colorado, Connecticut, Delaware, Iowa, Montana, Nebraska, New Hampshire, New Jersey,
+ Oregon, Texas or Virginia resident and we refuse to take action on your request within a reasonable
+ period of time after receiving your request in accordance with this section, you may appeal our
+ decision. In such appeal, you must (1) provide sufficient information to allow us to verify that you are
+ the person about whom the original request pertains and to identify the original request, and (2)
+ provide a description of the basis of your appeal. Please note that your appeal will be subject to your
+ rights and obligations afforded to you under the State Privacy Laws (as applicable). We will respond to
+ your appeal within the time period required under the applicable law. You can submit a Verified Request
+ to appeal by the following methods:
+
+
+
+
+ If we deny your appeal, you have the right to contact the Attorney General of your State, including by
+ the following links: Colorado, Connecticut, Delaware, Iowa, Montana, Nebraska, New Hampshire, New
+ Jersey, Oregon, Texas and Virginia.
+
+
+ Other State Law Privacy Rights
+
+ California Resident Rights
+
+ Under California Civil Code Sections 1798.83-1798.84, California residents are entitled to contact us to
+ prevent disclosure of Personal Data to third parties for such third parties' direct marketing purposes;
+ in order to submit such a request, please contact us at help@anoma.ly
+ .
+
+
+
+ Your browser may offer you a "Do Not Track" option, which allows you to signal to operators of websites
+ and web applications and services that you do not wish such operators to track certain of your online
+ activities over time and across different websites. Our Services do not support Do Not Track requests at
+ this time. To find out more about "Do Not Track," you can visit{" "}
+ www.allaboutdnt.com .
+
+
+ Nevada Resident Rights
+
+ Please note that we do not currently sell your Personal Data as sales are defined in Nevada Revised
+ Statutes Chapter 603A.
+
+
+
+
+ If you have any questions or comments about this Privacy Policy, the ways in which we collect and use
+ your Personal Data or your choices and rights regarding such collection and use, please do not hesitate
+ to contact us at:
+
+
+
+ Email: help@anoma.ly
+
+ Phone: +1 415 794-0209
+ Address: 2443 Fillmore St #380-6343, San Francisco, CA 94115, United States
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/legal/terms-of-service/index.css b/packages/console/app/src/routes/legal/terms-of-service/index.css
new file mode 100644
index 0000000..709b3a9
--- /dev/null
+++ b/packages/console/app/src/routes/legal/terms-of-service/index.css
@@ -0,0 +1,254 @@
+[data-component="terms-of-service"] {
+ max-width: 800px;
+ margin: 0 auto;
+ line-height: 1.7;
+}
+
+[data-component="terms-of-service"] h1 {
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 0.5rem;
+ margin-top: 0;
+}
+
+[data-component="terms-of-service"] .effective-date {
+ font-size: 0.95rem;
+ color: var(--color-text-weak);
+ margin-bottom: 2rem;
+}
+
+[data-component="terms-of-service"] h2 {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-top: 3rem;
+ margin-bottom: 1rem;
+ padding-top: 1rem;
+ border-top: 1px solid var(--color-border-weak);
+}
+
+[data-component="terms-of-service"] h2:first-of-type {
+ margin-top: 2rem;
+}
+
+[data-component="terms-of-service"] h3 {
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+}
+
+[data-component="terms-of-service"] h4 {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--color-text-strong);
+ margin-top: 1.5rem;
+ margin-bottom: 0.75rem;
+}
+
+[data-component="terms-of-service"] p {
+ margin-bottom: 1rem;
+ color: var(--color-text);
+}
+
+[data-component="terms-of-service"] ul,
+[data-component="terms-of-service"] ol {
+ margin-bottom: 1rem;
+ padding-left: 1.5rem;
+ color: var(--color-text);
+}
+
+[data-component="terms-of-service"] li {
+ margin-bottom: 0.5rem;
+ line-height: 1.7;
+}
+
+[data-component="terms-of-service"] ul ul,
+[data-component="terms-of-service"] ul ol,
+[data-component="terms-of-service"] ol ul,
+[data-component="terms-of-service"] ol ol {
+ margin-top: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+[data-component="terms-of-service"] a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ word-break: break-word;
+}
+
+[data-component="terms-of-service"] a:hover {
+ text-decoration-thickness: 2px;
+}
+
+[data-component="terms-of-service"] strong {
+ font-weight: 600;
+ color: var(--color-text-strong);
+}
+
+@media (max-width: 60rem) {
+ [data-component="terms-of-service"] {
+ padding: 0;
+ }
+
+ [data-component="terms-of-service"] h1 {
+ font-size: 1.75rem;
+ }
+
+ [data-component="terms-of-service"] h2 {
+ font-size: 1.35rem;
+ margin-top: 2.5rem;
+ }
+
+ [data-component="terms-of-service"] h3 {
+ font-size: 1.15rem;
+ }
+
+ [data-component="terms-of-service"] h4 {
+ font-size: 1rem;
+ }
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+[data-component="terms-of-service"] [id] {
+ scroll-margin-top: 100px;
+}
+
+@media print {
+ @page {
+ margin: 2cm;
+ size: letter;
+ }
+
+ [data-component="top"],
+ [data-component="footer"],
+ [data-component="legal"] {
+ display: none !important;
+ }
+
+ [data-page="legal"] {
+ background: white !important;
+ padding: 0 !important;
+ }
+
+ [data-component="container"] {
+ max-width: none !important;
+ border: none !important;
+ margin: 0 !important;
+ }
+
+ [data-component="content"],
+ [data-component="brand-content"] {
+ padding: 0 !important;
+ margin: 0 !important;
+ }
+
+ [data-component="terms-of-service"] {
+ max-width: none !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ }
+
+ [data-component="terms-of-service"] * {
+ color: black !important;
+ background: transparent !important;
+ }
+
+ [data-component="terms-of-service"] h1 {
+ font-size: 24pt;
+ margin-top: 0;
+ margin-bottom: 12pt;
+ page-break-after: avoid;
+ }
+
+ [data-component="terms-of-service"] h2 {
+ font-size: 18pt;
+ border-top: 2pt solid black !important;
+ padding-top: 12pt;
+ margin-top: 24pt;
+ margin-bottom: 8pt;
+ page-break-after: avoid;
+ page-break-before: auto;
+ }
+
+ [data-component="terms-of-service"] h2:first-of-type {
+ margin-top: 16pt;
+ }
+
+ [data-component="terms-of-service"] h3 {
+ font-size: 14pt;
+ margin-top: 16pt;
+ margin-bottom: 8pt;
+ page-break-after: avoid;
+ }
+
+ [data-component="terms-of-service"] h4 {
+ font-size: 12pt;
+ margin-top: 12pt;
+ margin-bottom: 6pt;
+ page-break-after: avoid;
+ }
+
+ [data-component="terms-of-service"] p {
+ font-size: 11pt;
+ line-height: 1.5;
+ margin-bottom: 8pt;
+ orphans: 3;
+ widows: 3;
+ }
+
+ [data-component="terms-of-service"] .effective-date {
+ font-size: 10pt;
+ margin-bottom: 16pt;
+ }
+
+ [data-component="terms-of-service"] ul,
+ [data-component="terms-of-service"] ol {
+ margin-bottom: 8pt;
+ page-break-inside: auto;
+ }
+
+ [data-component="terms-of-service"] li {
+ font-size: 11pt;
+ line-height: 1.5;
+ margin-bottom: 4pt;
+ page-break-inside: avoid;
+ }
+
+ [data-component="terms-of-service"] a {
+ color: black !important;
+ text-decoration: underline;
+ }
+
+ [data-component="terms-of-service"] strong {
+ font-weight: bold;
+ color: black !important;
+ }
+
+ [data-component="terms-of-service"] h1,
+ [data-component="terms-of-service"] h2,
+ [data-component="terms-of-service"] h3,
+ [data-component="terms-of-service"] h4 {
+ page-break-inside: avoid;
+ page-break-after: avoid;
+ }
+
+ [data-component="terms-of-service"] h2 + p,
+ [data-component="terms-of-service"] h3 + p,
+ [data-component="terms-of-service"] h4 + p,
+ [data-component="terms-of-service"] h2 + ul,
+ [data-component="terms-of-service"] h3 + ul,
+ [data-component="terms-of-service"] h4 + ul,
+ [data-component="terms-of-service"] h2 + ol,
+ [data-component="terms-of-service"] h3 + ol,
+ [data-component="terms-of-service"] h4 + ol {
+ page-break-before: avoid;
+ }
+}
diff --git a/packages/console/app/src/routes/legal/terms-of-service/index.tsx b/packages/console/app/src/routes/legal/terms-of-service/index.tsx
new file mode 100644
index 0000000..7847c44
--- /dev/null
+++ b/packages/console/app/src/routes/legal/terms-of-service/index.tsx
@@ -0,0 +1,518 @@
+import "../../brand/index.css"
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { LocaleLinks } from "~/component/locale-links"
+import { useLanguage } from "~/context/language"
+
+export default function TermsOfService() {
+ const language = useLanguage()
+ return (
+
+ OpenCode | Terms of Service
+
+
+
+
+
+
+
+
+ Terms of Use
+ Effective date: Mar 6, 2026
+
+
+ Welcome to OpenCode. Please read on to learn the rules and restrictions that govern your use of
+ OpenCode's website, inference product and hosted software offering (the "Services"). If you have
+ any questions, comments, or concerns regarding these terms or the Services, please contact us at:
+
+
+
+ Email: help@anoma.ly
+
+
+
+ These Terms of Use (the "Terms") are a binding contract between you and{" "}
+ ANOMALY INNOVATIONS, INC. ("OpenCode," "we" and "us"). Your use of the Services in any
+ way means that you agree to all of these Terms, and these Terms will remain in effect while you use the
+ Services. These Terms include the provisions in this document as well as those in the Privacy Policy{" "}
+ https://opencode.ai/legal/privacy-policy .{" "}
+
+ Your use of or participation in certain Services may also be subject to additional policies, rules
+ and/or conditions ("Additional Terms"), which are incorporated herein by reference, and you understand
+ and agree that by using or participating in any such Services, you agree to also comply with these
+ Additional Terms.
+ {" "}
+ For clarity, our open source software that is not provided to you on a hosted basis is subject to the
+ open source license and terms set forth on the applicable repository where you access such open source
+ software, and such license and terms will exclusively govern your use of such open source software.
+
+
+
+ Please read these Terms carefully. They cover important information about Services provided to you and
+ any charges, taxes, and fees we bill you. These Terms include information about{" "}
+ future changes to these Terms ,{" "}
+ automatic renewals ,{" "}
+ limitations of liability ,{" "}
+ a class action waiver and{" "}
+ resolution of disputes by arbitration instead of in court .{" "}
+
+ PLEASE NOTE THAT YOUR USE OF AND ACCESS TO OUR SERVICES ARE SUBJECT TO THE FOLLOWING TERMS; IF YOU DO
+ NOT AGREE TO ALL OF THE FOLLOWING, YOU MAY NOT USE OR ACCESS THE SERVICES IN ANY MANNER.
+
+
+
+
+ ARBITRATION NOTICE AND CLASS ACTION WAIVER: EXCEPT FOR CERTAIN TYPES OF DISPUTES
+ DESCRIBED IN THE ARBITRATION AGREEMENT SECTION BELOW , YOU AGREE
+ THAT DISPUTES BETWEEN YOU AND US WILL BE RESOLVED BY BINDING, INDIVIDUAL ARBITRATION AND YOU WAIVE YOUR
+ RIGHT TO PARTICIPATE IN A CLASS ACTION LAWSUIT OR CLASS-WIDE ARBITRATION.
+
+
+ What is OpenCode?
+
+ OpenCode is an AI-powered coding agent that helps you write, understand, and modify code using large
+ language models. Certain of these large language models are provided by third parties ("Third Party
+ Models") and certain of these models are provided directly by us if you use the OpenCode Zen paid
+ offering ("Zen"). Regardless of whether you use Third Party Models or Zen, OpenCode enables you to
+ access the functionality of models through a coding agent running within your terminal.
+
+
+ Will these Terms ever change?
+
+ We are constantly trying to improve our Services, so these Terms may need to change along with our
+ Services. We reserve the right to change the Terms at any time, but if we do, we will place a notice on
+ our site located at opencode.ai, send you an email, and/or notify you by some other means.
+
+
+
+ If you don't agree with the new Terms, you are free to reject them; unfortunately, that means you will
+ no longer be able to use the Services. If you use the Services in any way after a change to the Terms is
+ effective, that means you agree to all of the changes.
+
+
+
+ Except for changes by us as described here, no other amendment or modification of these Terms will be
+ effective unless in writing and signed by both you and us.
+
+
+ What about my privacy?
+
+ OpenCode takes the privacy of its users very seriously. For the current OpenCode Privacy Policy, please
+ click here{" "}
+ https://opencode.ai/legal/privacy-policy .
+
+
+ Children's Online Privacy Protection Act
+
+ The Children's Online Privacy Protection Act ("COPPA") requires that online service providers obtain
+ parental consent before they knowingly collect personally identifiable information online from children
+ who are under 13 years of age. We do not knowingly collect or solicit personally identifiable
+ information from children under 13 years of age; if you are a child under 13 years of age, please do not
+ attempt to register for or otherwise use the Services or send us any personal information. If we learn
+ we have collected personal information from a child under 13 years of age, we will delete that
+ information as quickly as possible. If you believe that a child under 13 years of age may have provided
+ us personal information, please contact us at help@anoma.ly .
+
+
+ What are the basics of using OpenCode?
+
+ You represent and warrant that you are an individual of legal age to form a binding contract (or if not,
+ you've received your parent's or guardian's permission to use the Services and have gotten your parent
+ or guardian to agree to these Terms on your behalf). If you're agreeing to these Terms on behalf of an
+ organization or entity, you represent and warrant that you are authorized to agree to these Terms on
+ that organization's or entity's behalf and bind them to these Terms (in which case, the references to
+ "you" and "your" in these Terms, except for in this sentence, refer to that organization or entity).
+
+
+
+ You will only use the Services for your own internal use, and not on behalf of or for the benefit of any
+ third party, and only in a manner that complies with all laws that apply to you. If your use of the
+ Services is prohibited by applicable laws, then you aren't authorized to use the Services. We can't and
+ won't be responsible for your using the Services in a way that breaks the law.
+
+
+ Are there restrictions in how I can use the Services?
+
+ You represent, warrant, and agree that you will not provide or contribute anything, including any
+ Content (as that term is defined below), to the Services, or otherwise use or interact with the
+ Services, in a manner that:
+
+
+
+
+ infringes or violates the intellectual property rights or any other rights of anyone else (including
+ OpenCode);
+
+
+ violates any law or regulation, including, without limitation, any applicable export control laws,
+ privacy laws or any other purpose not reasonably intended by OpenCode;
+
+
+ is dangerous, harmful, fraudulent, deceptive, threatening, harassing, defamatory, obscene, or
+ otherwise objectionable;
+
+ automatically or programmatically extracts data or Output (defined below);
+ Represent that the Output was human-generated when it was not;
+
+ uses Output to develop artificial intelligence models that compete with the Services or any Third
+ Party Models;
+
+
+ attempts, in any manner, to obtain the password, account, or other security information from any other
+ user;
+
+
+ violates the security of any computer network, or cracks any passwords or security encryption codes;
+
+
+ runs Maillist, Listserv, any form of auto-responder or "spam" on the Services, or any processes that
+ run or are activated while you are not logged into the Services, or that otherwise interfere with the
+ proper working of the Services (including by placing an unreasonable load on the Services'
+ infrastructure);
+
+
+ "crawls," "scrapes," or "spiders" any page, data, or portion of or relating to the Services or Content
+ (through use of manual or automated means);
+
+ copies or stores any significant portion of the Content; or
+
+ decompiles, reverse engineers, or otherwise attempts to obtain the source code or underlying ideas or
+ information of or relating to the Services.
+
+
+
+
+ A violation of any of the foregoing is grounds for termination of your right to use or access the
+ Services.
+
+
+ Who Owns the Services and Content?
+
+ Our IP
+
+ We retain all right, title and interest in and to the Services. Except as expressly set forth herein, no
+ rights to the Services or Third Party Models are granted to you.
+
+
+ Your IP
+
+ You may provide input to the Services ("Input"), and receive output from the Services based on the Input
+ ("Output"). Input and Output are collectively "Content." You are responsible for Content, including
+ ensuring that it does not violate any applicable law or these Terms. You represent and warrant that you
+ have all rights, licenses, and permissions needed to provide Input to our Services.
+
+
+
+ As between you and us, and to the extent permitted by applicable law, you (a) retain your ownership
+ rights in Input and (b) own the Output. We hereby assign to you all our right, title, and interest, if
+ any, in and to Output.
+
+
+
+ Due to the nature of our Services and artificial intelligence generally, output may not be unique and
+ other users may receive similar output from our Services. Our assignment above does not extend to other
+ users' output.
+
+
+
+ We use Content to provide our Services, comply with applicable law, enforce our terms and policies, and
+ keep our Services safe. In addition, if you are using the Services through an unpaid account, we may use
+ Content to further develop and improve our Services.
+
+
+
+ If you use OpenCode with Third Party Models, then your Content will be subject to the data retention
+ policies of the providers of such Third Party Models. Although we will not retain your Content, we
+ cannot and do not control the retention practices of Third Party Model providers. You should review the
+ terms and conditions applicable to any Third Party Model for more information about the data use and
+ retention policies applicable to such Third Party Models.
+
+
+ What about Third Party Models?
+
+ The Services enable you to access and use Third Party Models, which are not owned or controlled by
+ OpenCode. Your ability to access Third Party Models is contingent on you having API keys or otherwise
+ having the right to access such Third Party Models.
+
+
+
+ OpenCode has no control over, and assumes no responsibility for, the content, accuracy, privacy
+ policies, or practices of any providers of Third Party Models. We encourage you to read the terms and
+ conditions and privacy policy of each provider of a Third Party Model that you choose to utilize. By
+ using the Services, you release and hold us harmless from any and all liability arising from your use of
+ any Third Party Model.
+
+
+ Will OpenCode ever change the Services?
+
+ We're always trying to improve our Services, so they may change over time. We may suspend or discontinue
+ any part of the Services, or we may introduce new features or impose limits on certain features or
+ restrict access to parts or all of the Services.
+
+
+ Do the Services cost anything?
+
+ The Services may be free or we may charge a fee for using the Services. If you are using a free version
+ of the Services, we will notify you before any Services you are then using begin carrying a fee, and if
+ you wish to continue using such Services, you must pay all applicable fees for such Services. Any and
+ all such charges, fees or costs are your sole responsibility. You should consult with your
+
+
+ Paid Services
+
+ Certain of our Services, including Zen, may be subject to payments now or in the future (the "Paid
+ Services"). Please see our Paid Services page{" "}
+ https://opencode.ai/zen for a description of the current Paid
+ Services. Please note that any payment terms presented to you in the process of using or signing up for
+ a Paid Service are deemed part of these Terms.
+
+
+ Billing
+
+ We use a third-party payment processor (the "Payment Processor") to bill you through a payment account
+ linked to your account on the Services (your "Billing Account") for use of the Paid Services. The
+ processing of payments will be subject to the terms, conditions and privacy policies of the Payment
+ Processor in addition to these Terms. Currently, we use Stripe, Inc. as our Payment Processor. You can
+ access Stripe's Terms of Service at{" "}
+ https://stripe.com/us/checkout/legal and their
+ Privacy Policy at https://stripe.com/us/privacy . We are not
+ responsible for any error by, or other acts or omissions of, the Payment Processor. By choosing to use
+ Paid Services, you agree to pay us, through the Payment Processor, all charges at the prices then in
+ effect for any use of such Paid Services in accordance with the applicable payment terms, and you
+ authorize us, through the Payment Processor, to charge your chosen payment provider (your "Payment
+ Method"). You agree to make payment using that selected Payment Method. We reserve the right to correct
+ any errors or mistakes that the Payment Processor makes even if it has already requested or received
+ payment.
+
+
+ Payment Method
+
+ The terms of your payment will be based on your Payment Method and may be determined by agreements
+ between you and the financial institution, credit card issuer or other provider of your chosen Payment
+ Method. If we, through the Payment Processor, do not receive payment from you, you agree to pay all
+ amounts due on your Billing Account upon demand.
+
+
+ Recurring Billing
+
+ Some of the Paid Services may consist of an initial period, for which there is a one-time charge,
+ followed by recurring period charges as agreed to by you. By choosing a recurring payment plan, you
+ acknowledge that such Services have an initial and recurring payment feature and you accept
+ responsibility for all recurring charges prior to cancellation. WE MAY SUBMIT PERIODIC CHARGES (E.G.,
+ MONTHLY) WITHOUT FURTHER AUTHORIZATION FROM YOU, UNTIL YOU PROVIDE PRIOR NOTICE (RECEIPT OF WHICH IS
+ CONFIRMED BY US) THAT YOU HAVE TERMINATED THIS AUTHORIZATION OR WISH TO CHANGE YOUR PAYMENT METHOD. SUCH
+ NOTICE WILL NOT AFFECT CHARGES SUBMITTED BEFORE WE REASONABLY COULD ACT. TO TERMINATE YOUR AUTHORIZATION
+ OR CHANGE YOUR PAYMENT METHOD, GO TO ACCOUNT SETTINGS{" "}
+ https://opencode.ai/auth .
+
+
+ Free Trials and Other Promotions
+
+ Any free trial or other promotion that provides access to a Paid Service must be used within the
+ specified time of the trial. You must stop using a Paid Service before the end of the trial period in
+ order to avoid being charged for that Paid Service. If you cancel prior to the end of the trial period
+ and are inadvertently charged for a Paid Service, please contact us at{" "}
+ help@anoma.ly .
+
+
+ What if I want to stop using the Services?
+
+ You're free to do that at any time; please refer to our Privacy Policy{" "}
+ https://opencode.ai/legal/privacy-policy , as well
+ as the licenses above, to understand how we treat information you provide to us after you have stopped
+ using our Services.
+
+
+
+ OpenCode is also free to terminate (or suspend access to) your use of the Services for any reason in our
+ discretion, including your breach of these Terms. OpenCode has the sole right to decide whether you are
+ in violation of any of the restrictions set forth in these Terms.
+
+
+
+ Provisions that, by their nature, should survive termination of these Terms shall survive termination.
+ By way of example, all of the following will survive termination: any obligation you have to pay us or
+ indemnify us, any limitations on our liability, any terms regarding ownership or intellectual property
+ rights, and terms regarding disputes between us, including without limitation the arbitration agreement.
+
+
+ What else do I need to know?
+
+ Warranty Disclaimer
+
+ OpenCode and its licensors, suppliers, partners, parent, subsidiaries or affiliated entities, and each
+ of their respective officers, directors, members, employees, consultants, contract employees,
+ representatives and agents, and each of their respective successors and assigns (OpenCode and all such
+ parties together, the "OpenCode Parties") make no representations or warranties concerning the Services,
+ including without limitation regarding any Content contained in or accessed through the Services, and
+ the OpenCode Parties will not be responsible or liable for the accuracy, copyright compliance, legality,
+ or decency of material contained in or accessed through the Services or any claims, actions, suits
+ procedures, costs, expenses, damages or liabilities arising out of use of, or in any way related to your
+ participation in, the Services. The OpenCode Parties make no representations or warranties regarding
+ suggestions or recommendations of services or products offered or purchased through or in connection
+ with the Services. THE SERVICES AND CONTENT ARE PROVIDED BY OPENCODE (AND ITS LICENSORS AND SUPPLIERS)
+ ON AN "AS-IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT
+ LIMITATION, IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT,
+ OR THAT USE OF THE SERVICES WILL BE UNINTERRUPTED OR ERROR-FREE. SOME STATES DO NOT ALLOW LIMITATIONS ON
+ HOW LONG AN IMPLIED WARRANTY LASTS, SO THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU.
+
+
+ Limitation of Liability
+
+ TO THE FULLEST EXTENT ALLOWED BY APPLICABLE LAW, UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY
+ (INCLUDING, WITHOUT LIMITATION, TORT, CONTRACT, STRICT LIABILITY, OR OTHERWISE) SHALL ANY OF THE
+ OPENCODE PARTIES BE LIABLE TO YOU OR TO ANY OTHER PERSON FOR (A) ANY INDIRECT, SPECIAL, INCIDENTAL,
+ PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING DAMAGES FOR LOST PROFITS, BUSINESS
+ INTERRUPTION, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, ACCURACY OF RESULTS, OR COMPUTER FAILURE OR
+ MALFUNCTION, (B) ANY SUBSTITUTE GOODS, SERVICES OR TECHNOLOGY, (C) ANY AMOUNT, IN THE AGGREGATE, IN
+ EXCESS OF THE GREATER OF (I) ONE-HUNDRED ($100) DOLLARS OR (II) THE AMOUNTS PAID AND/OR PAYABLE BY YOU
+ TO OPENCODE IN CONNECTION WITH THE SERVICES IN THE TWELVE (12) MONTH PERIOD PRECEDING THIS APPLICABLE
+ CLAIM OR (D) ANY MATTER BEYOND OUR REASONABLE CONTROL. SOME STATES DO NOT ALLOW THE EXCLUSION OR
+ LIMITATION OF INCIDENTAL OR CONSEQUENTIAL OR CERTAIN OTHER DAMAGES, SO THE ABOVE LIMITATION AND
+ EXCLUSIONS MAY NOT APPLY TO YOU.
+
+
+ Indemnity
+
+ You agree to indemnify and hold the OpenCode Parties harmless from and against any and all claims,
+ liabilities, damages (actual and consequential), losses and expenses (including attorneys' fees) arising
+ from or in any way related to any claims relating to (a) your use of the Services, and (b) your
+ violation of these Terms. In the event of such a claim, suit, or action ("Claim"), we will attempt to
+ provide notice of the Claim to the contact information we have for your account (provided that failure
+ to deliver such notice shall not eliminate or reduce your indemnification obligations hereunder).
+
+
+ Assignment
+
+ You may not assign, delegate or transfer these Terms or your rights or obligations hereunder, or your
+ Services account, in any way (by operation of law or otherwise) without OpenCode's prior written
+ consent. We may transfer, assign, or delegate these Terms and our rights and obligations without
+ consent.
+
+
+ Choice of Law
+
+ These Terms are governed by and will be construed under the Federal Arbitration Act, applicable federal
+ law, and the laws of the State of Delaware, without regard to the conflicts of laws provisions thereof.
+
+
+ Arbitration Agreement
+
+ Please read the following ARBITRATION AGREEMENT carefully because it requires you to arbitrate certain
+ disputes and claims with OpenCode and limits the manner in which you can seek relief from OpenCode. Both
+ you and OpenCode acknowledge and agree that for the purposes of any dispute arising out of or relating
+ to the subject matter of these Terms, OpenCode's officers, directors, employees and independent
+ contractors ("Personnel") are third-party beneficiaries of these Terms, and that upon your acceptance of
+ these Terms, Personnel will have the right (and will be deemed to have accepted the right) to enforce
+ these Terms against you as the third-party beneficiary hereof.
+
+
+ Arbitration Rules; Applicability of Arbitration Agreement
+
+ The parties shall use their best efforts to settle any dispute, claim, question, or disagreement arising
+ out of or relating to the subject matter of these Terms directly through good-faith negotiations, which
+ shall be a precondition to either party initiating arbitration. If such negotiations do not resolve the
+ dispute, it shall be finally settled by binding arbitration in New Castle County, Delaware. The
+ arbitration will proceed in the English language, in accordance with the JAMS Streamlined Arbitration
+ Rules and Procedures (the "Rules") then in effect, by one commercial arbitrator with substantial
+ experience in resolving intellectual property and commercial contract disputes. The arbitrator shall be
+ selected from the appropriate list of JAMS arbitrators in accordance with such Rules. Judgment upon the
+ award rendered by such arbitrator may be entered in any court of competent jurisdiction.
+
+
+ Costs of Arbitration
+
+ The Rules will govern payment of all arbitration fees. OpenCode will pay all arbitration fees for claims
+ less than seventy-five thousand ($75,000) dollars. OpenCode will not seek its attorneys' fees and costs
+ in arbitration unless the arbitrator determines that your claim is frivolous.
+
+
+ Small Claims Court; Infringement
+
+ Either you or OpenCode may assert claims, if they qualify, in small claims court in New Castle County,
+ Delaware or any United States county where you live or work. Furthermore, notwithstanding the foregoing
+ obligation to arbitrate disputes, each party shall have the right to pursue injunctive or other
+ equitable relief at any time, from any court of competent jurisdiction, to prevent the actual or
+ threatened infringement, misappropriation or violation of a party's copyrights, trademarks, trade
+ secrets, patents or other intellectual property rights.
+
+
+ Waiver of Jury Trial
+
+ YOU AND OPENCODE WAIVE ANY CONSTITUTIONAL AND STATUTORY RIGHTS TO GO TO COURT AND HAVE A TRIAL IN FRONT
+ OF A JUDGE OR JURY. You and OpenCode are instead choosing to have claims and disputes resolved by
+ arbitration. Arbitration procedures are typically more limited, more efficient, and less costly than
+ rules applicable in court and are subject to very limited review by a court. In any litigation between
+ you and OpenCode over whether to vacate or enforce an arbitration award, YOU AND OPENCODE WAIVE ALL
+ RIGHTS TO A JURY TRIAL, and elect instead to have the dispute be resolved by a judge.
+
+
+ Waiver of Class or Consolidated Actions
+
+ ALL CLAIMS AND DISPUTES WITHIN THE SCOPE OF THIS ARBITRATION AGREEMENT MUST BE ARBITRATED OR LITIGATED
+ ON AN INDIVIDUAL BASIS AND NOT ON A CLASS BASIS. CLAIMS OF MORE THAN ONE CUSTOMER OR USER CANNOT BE
+ ARBITRATED OR LITIGATED JOINTLY OR CONSOLIDATED WITH THOSE OF ANY OTHER CUSTOMER OR USER. If however,
+ this waiver of class or consolidated actions is deemed invalid or unenforceable, neither you nor
+ OpenCode is entitled to arbitration; instead all claims and disputes will be resolved in a court as set
+ forth in (g) below.
+
+
+ Opt-out
+
+ You have the right to opt out of the provisions of this Section by sending written notice of your
+ decision to opt out to the following address: 2443 Fillmore St #380-6343, San Francisco, CA 94115,
+ United States postmarked within thirty (30) days of first accepting these Terms. You must include (i)
+ your name and residence address, (ii) the email address and/or telephone number associated with your
+ account, and (iii) a clear statement that you want to opt out of these Terms' arbitration agreement.
+
+
+ Exclusive Venue
+
+ If you send the opt-out notice in (f), and/or in any circumstances where the foregoing arbitration
+ agreement permits either you or OpenCode to litigate any dispute arising out of or relating to the
+ subject matter of these Terms in court, then the foregoing arbitration agreement will not apply to
+ either party, and both you and OpenCode agree that any judicial proceeding (other than small claims
+ actions) will be brought in the state or federal courts located in, respectively, New Castle County,
+ Delaware, or the federal district in which that county falls.
+
+
+ Severability
+
+ If the prohibition against class actions and other claims brought on behalf of third parties contained
+ above is found to be unenforceable, then all of the preceding language in this Arbitration Agreement
+ section will be null and void. This arbitration agreement will survive the termination of your
+ relationship with OpenCode.
+
+
+ Miscellaneous
+
+ You will be responsible for paying, withholding, filing, and reporting all taxes, duties, and other
+ governmental assessments associated with your activity in connection with the Services, provided that
+ the OpenCode may, in its sole discretion, do any of the foregoing on your behalf or for itself as it
+ sees fit. The failure of either you or us to exercise, in any way, any right herein shall not be deemed
+ a waiver of any further rights hereunder. If any provision of these Terms are found to be unenforceable
+ or invalid, that provision will be limited or eliminated, to the minimum extent necessary, so that these
+ Terms shall otherwise remain in full force and effect and enforceable. You and OpenCode agree that these
+ Terms are the complete and exclusive statement of the mutual understanding between you and OpenCode, and
+ that these Terms supersede and cancel all previous written and oral agreements, communications and other
+ understandings relating to the subject matter of these Terms. You hereby acknowledge and agree that you
+ are not an employee, agent, partner, or joint venture of OpenCode, and you do not have any authority of
+ any kind to bind OpenCode in any respect whatsoever.
+
+
+
+ Except as expressly set forth in the section above regarding the arbitration agreement, you and OpenCode
+ agree there are no third-party beneficiaries intended under these Terms.
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/openapi.json.ts b/packages/console/app/src/routes/openapi.json.ts
new file mode 100644
index 0000000..2789e85
--- /dev/null
+++ b/packages/console/app/src/routes/openapi.json.ts
@@ -0,0 +1,7 @@
+export async function GET() {
+ const response = await fetch(
+ "https://raw.githubusercontent.com/anomalyco/opencode/refs/heads/dev/packages/sdk/openapi.json",
+ )
+ const json = await response.json()
+ return json
+}
diff --git a/packages/console/app/src/routes/s/[id].ts b/packages/console/app/src/routes/s/[id].ts
new file mode 100644
index 0000000..374fd79
--- /dev/null
+++ b/packages/console/app/src/routes/s/[id].ts
@@ -0,0 +1,30 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { Resource } from "@opencode-ai/console-resource"
+import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
+
+async function handler(evt: APIEvent) {
+ const req = evt.request.clone()
+ const url = new URL(req.url)
+ const locale = localeFromRequest(req)
+ const host = Resource.App.stage === "production" ? "docs.opencode.ai" : "docs.dev.opencode.ai"
+ const targetUrl = `https://${host}${docs(locale, `/docs${url.pathname}`)}${url.search}`
+
+ const headers = new Headers(req.headers)
+ headers.set("accept-language", tag(locale))
+
+ const response = await fetch(targetUrl, {
+ method: req.method,
+ headers,
+ body: req.body,
+ })
+ const next = new Response(response.body, response)
+ next.headers.append("set-cookie", cookie(locale))
+ return next
+}
+
+export const GET = handler
+export const POST = handler
+export const PUT = handler
+export const DELETE = handler
+export const OPTIONS = handler
+export const PATCH = handler
diff --git a/packages/console/app/src/routes/stats/[...path].ts b/packages/console/app/src/routes/stats/[...path].ts
new file mode 100644
index 0000000..4a387c0
--- /dev/null
+++ b/packages/console/app/src/routes/stats/[...path].ts
@@ -0,0 +1,8 @@
+import { statsRedirect } from "~/lib/stats-proxy"
+
+export const GET = statsRedirect
+export const POST = statsRedirect
+export const PUT = statsRedirect
+export const DELETE = statsRedirect
+export const OPTIONS = statsRedirect
+export const PATCH = statsRedirect
diff --git a/packages/console/app/src/routes/stats/index.ts b/packages/console/app/src/routes/stats/index.ts
new file mode 100644
index 0000000..4a387c0
--- /dev/null
+++ b/packages/console/app/src/routes/stats/index.ts
@@ -0,0 +1,8 @@
+import { statsRedirect } from "~/lib/stats-proxy"
+
+export const GET = statsRedirect
+export const POST = statsRedirect
+export const PUT = statsRedirect
+export const DELETE = statsRedirect
+export const OPTIONS = statsRedirect
+export const PATCH = statsRedirect
diff --git a/packages/console/app/src/routes/stripe/webhook.ts b/packages/console/app/src/routes/stripe/webhook.ts
new file mode 100644
index 0000000..e1e4e6c
--- /dev/null
+++ b/packages/console/app/src/routes/stripe/webhook.ts
@@ -0,0 +1,380 @@
+import type { Stripe } from "stripe"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import type { APIEvent } from "@solidjs/start/server"
+import { and, Database, eq, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { BillingTable, LiteTable, PaymentTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import { Identifier } from "@opencode-ai/console-core/identifier.js"
+import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { Resource } from "@opencode-ai/console-resource"
+import { LiteData } from "@opencode-ai/console-core/lite.js"
+import { BlackData } from "@opencode-ai/console-core/black.js"
+import { Referral } from "@opencode-ai/console-core/referral.js"
+
+export async function POST(input: APIEvent) {
+ const body = await Billing.stripe().webhooks.constructEventAsync(
+ await input.request.text(),
+ input.request.headers.get("stripe-signature")!,
+ Resource.STRIPE_WEBHOOK_SECRET.value,
+ )
+ console.log(body.type, JSON.stringify(body, null, 2))
+
+ return (async () => {
+ if (body.type === "customer.updated") {
+ // check default payment method changed
+ const prevInvoiceSettings = body.data.previous_attributes?.invoice_settings ?? {}
+ if (!("default_payment_method" in prevInvoiceSettings)) return "ignored"
+
+ const customerID = body.data.object.id
+ const paymentMethodID = body.data.object.invoice_settings.default_payment_method as string
+
+ if (!customerID) throw new Error("Customer ID not found")
+ if (!paymentMethodID) throw new Error("Payment method ID not found")
+
+ const paymentMethod = await Billing.stripe().paymentMethods.retrieve(paymentMethodID)
+ await Database.use(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ paymentMethodID,
+ paymentMethodLast4: paymentMethod.card?.last4 ?? null,
+ paymentMethodType: paymentMethod.type,
+ })
+ .where(eq(BillingTable.customerID, customerID))
+ })
+ }
+ if (body.type === "checkout.session.completed" && body.data.object.mode === "payment") {
+ const workspaceID = body.data.object.metadata?.workspaceID
+ const amountInCents = body.data.object.metadata?.amount && parseInt(body.data.object.metadata?.amount)
+ const customerID = body.data.object.customer as string
+ const paymentID = body.data.object.payment_intent as string
+ const invoiceID = body.data.object.invoice as string
+
+ if (!workspaceID) throw new Error("Workspace ID not found")
+ if (!customerID) throw new Error("Customer ID not found")
+ if (!amountInCents) throw new Error("Amount not found")
+ if (!paymentID) throw new Error("Payment ID not found")
+ if (!invoiceID) throw new Error("Invoice ID not found")
+
+ await Actor.provide("system", { workspaceID }, async () => {
+ const customer = await Billing.get()
+ if (customer?.customerID && customer.customerID !== customerID) throw new Error("Customer ID mismatch")
+
+ // set customer metadata
+ if (!customer?.customerID) {
+ await Billing.stripe().customers.update(customerID, {
+ metadata: {
+ workspaceID,
+ },
+ })
+ }
+
+ // get payment method for the payment intent
+ const paymentIntent = await Billing.stripe().paymentIntents.retrieve(paymentID, {
+ expand: ["payment_method"],
+ })
+ const paymentMethod = paymentIntent.payment_method
+ if (!paymentMethod || typeof paymentMethod === "string") throw new Error("Payment method not expanded")
+
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ balance: sql`${BillingTable.balance} + ${centsToMicroCents(amountInCents)}`,
+ customerID,
+ paymentMethodID: paymentMethod.id,
+ paymentMethodLast4: paymentMethod.card?.last4 ?? null,
+ paymentMethodType: paymentMethod.type,
+ // enable reload if first time enabling billing
+ ...(customer?.customerID
+ ? {}
+ : {
+ reloadError: null,
+ timeReloadError: null,
+ }),
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ await tx.insert(PaymentTable).values({
+ workspaceID,
+ id: Identifier.create("payment"),
+ amount: centsToMicroCents(amountInCents),
+ paymentID,
+ invoiceID,
+ customerID,
+ })
+ })
+ })
+ }
+ if (body.type === "customer.subscription.created") {
+ const type = body.data.object.metadata?.type
+ if (type === "lite") {
+ const workspaceID = body.data.object.metadata?.workspaceID
+ const userID = body.data.object.metadata?.userID
+ const userEmail = body.data.object.metadata?.userEmail
+ const coupon = body.data.object.metadata?.coupon
+ const customerID = body.data.object.customer as string
+ const invoiceID = body.data.object.latest_invoice as string
+ const subscriptionID = body.data.object.id as string
+ const paymentMethodID = body.data.object.default_payment_method as string
+
+ if (!workspaceID) throw new Error("Workspace ID not found")
+ if (!userID) throw new Error("User ID not found")
+ if (!customerID) throw new Error("Customer ID not found")
+ if (!invoiceID) throw new Error("Invoice ID not found")
+ if (!subscriptionID) throw new Error("Subscription ID not found")
+ if (!paymentMethodID) throw new Error("Payment method ID not found")
+
+ // get payment method for the payment intent
+ const paymentMethod = await Billing.stripe().paymentMethods.retrieve(paymentMethodID)
+ await Actor.provide("system", { workspaceID }, async () => {
+ // look up current billing
+ const billing = await Billing.get()
+ if (!billing) throw new Error(`Workspace with ID ${workspaceID} not found`)
+ if (billing.customerID && billing.customerID !== customerID) throw new Error("Customer ID mismatch")
+
+ // set customer metadata
+ if (!billing?.customerID) {
+ await Billing.stripe().customers.update(customerID, {
+ metadata: {
+ workspaceID,
+ },
+ })
+ }
+
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ customerID,
+ liteSubscriptionID: subscriptionID,
+ lite: {},
+ paymentMethodID: paymentMethod.id,
+ paymentMethodLast4: paymentMethod.card?.last4 ?? null,
+ paymentMethodType: paymentMethod.type,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+
+ await tx.insert(LiteTable).values({
+ workspaceID,
+ id: Identifier.create("lite"),
+ userID: userID,
+ })
+
+ if (userEmail) {
+ if (coupon === LiteData.firstMonth50Coupon) {
+ await Billing.redeemCoupon(userEmail, "GO1MONTH50")
+ } else if (coupon === LiteData.firstMonth100Coupon) {
+ await Billing.redeemCoupon(userEmail, "GOFREEMONTH")
+ } else if (coupon === LiteData.threeMonths100Coupon) {
+ await Billing.redeemCoupon(userEmail, "GO3MONTHS100")
+ } else if (coupon === LiteData.sixMonths100Coupon) {
+ await Billing.redeemCoupon(userEmail, "GO6MONTHS100")
+ } else if (coupon === LiteData.twelveMonths100Coupon) {
+ await Billing.redeemCoupon(userEmail, "GO12MONTHS100")
+ }
+ }
+ })
+
+ await Referral.completeFromLiteSubscription({
+ workspaceID,
+ userID,
+ }).catch((error) => {
+ console.error("Referral sync failed", error)
+ })
+ })
+ }
+ }
+ if (body.type === "customer.subscription.updated" && body.data.object.status === "incomplete_expired") {
+ const subscriptionID = body.data.object.id
+ if (!subscriptionID) throw new Error("Subscription ID not found")
+
+ const productID = body.data.object.items.data[0].price.product as string
+ if (productID === LiteData.productID()) {
+ await Billing.unsubscribeLite({ subscriptionID })
+ } else if (productID === BlackData.productID()) {
+ await Billing.unsubscribeBlack({ subscriptionID })
+ }
+ }
+ if (body.type === "customer.subscription.deleted") {
+ const subscriptionID = body.data.object.id
+ if (!subscriptionID) throw new Error("Subscription ID not found")
+
+ const productID = body.data.object.items.data[0].price.product as string
+ if (productID === LiteData.productID()) {
+ await Billing.unsubscribeLite({ subscriptionID })
+ } else if (productID === BlackData.productID()) {
+ await Billing.unsubscribeBlack({ subscriptionID })
+ }
+ }
+ if (body.type === "invoice.payment_succeeded") {
+ if (
+ body.data.object.billing_reason === "subscription_create" ||
+ body.data.object.billing_reason === "subscription_cycle"
+ ) {
+ const invoiceID = body.data.object.id as string
+ const amountInCents = body.data.object.amount_paid
+ const customerID = body.data.object.customer as string
+ const subscriptionID = body.data.object.parent?.subscription_details?.subscription as string
+ const productID = body.data.object.lines?.data[0].pricing?.price_details?.product as string
+
+ if (!customerID) throw new Error("Customer ID not found")
+ if (!invoiceID) throw new Error("Invoice ID not found")
+ if (!subscriptionID) throw new Error("Subscription ID not found")
+
+ // get coupon id from subscription
+ const invoice = await Billing.stripe().invoices.retrieve(invoiceID, {
+ expand: ["discounts", "payments"],
+ })
+ const paymentID = invoice.payments?.data[0]?.payment.payment_intent as string
+ const couponID = (invoice.discounts[0] as Stripe.Discount)?.coupon?.id as string
+ if (!paymentID) {
+ // payment id can be undefined when using coupon
+ if (!couponID) throw new Error("Payment ID not found")
+ }
+
+ const workspaceID = await Database.use((tx) =>
+ tx
+ .select({ workspaceID: BillingTable.workspaceID })
+ .from(BillingTable)
+ .where(eq(BillingTable.customerID, customerID))
+ .then((rows) => rows[0]?.workspaceID),
+ )
+ if (!workspaceID) throw new Error("Workspace ID not found for customer")
+
+ await Database.use((tx) =>
+ tx.insert(PaymentTable).values({
+ workspaceID,
+ id: Identifier.create("payment"),
+ amount: centsToMicroCents(amountInCents),
+ paymentID,
+ invoiceID,
+ customerID,
+ enrichment: {
+ type: productID === LiteData.productID() ? "lite" : "subscription",
+ currency: body.data.object.currency === "inr" ? "inr" : undefined,
+ couponID,
+ },
+ }),
+ )
+ } else if (body.data.object.billing_reason === "manual") {
+ const workspaceID = body.data.object.metadata?.workspaceID
+ const amountInCents = body.data.object.metadata?.amount && parseInt(body.data.object.metadata?.amount)
+ const invoiceID = body.data.object.id as string
+ const customerID = body.data.object.customer as string
+
+ if (!workspaceID) throw new Error("Workspace ID not found")
+ if (!customerID) throw new Error("Customer ID not found")
+ if (!amountInCents) throw new Error("Amount not found")
+ if (!invoiceID) throw new Error("Invoice ID not found")
+
+ await Actor.provide("system", { workspaceID }, async () => {
+ // get payment id from invoice
+ const invoice = await Billing.stripe().invoices.retrieve(invoiceID, {
+ expand: ["payments"],
+ })
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ balance: sql`${BillingTable.balance} + ${centsToMicroCents(amountInCents)}`,
+ reloadError: null,
+ timeReloadError: null,
+ })
+ .where(eq(BillingTable.workspaceID, Actor.workspace()))
+ await tx.insert(PaymentTable).values({
+ workspaceID: Actor.workspace(),
+ id: Identifier.create("payment"),
+ amount: centsToMicroCents(amountInCents),
+ invoiceID,
+ paymentID: invoice.payments?.data[0].payment.payment_intent as string,
+ customerID,
+ })
+ })
+ })
+ }
+ }
+ if (body.type === "invoice.payment_failed" || body.type === "invoice.payment_action_required") {
+ if (body.data.object.billing_reason === "manual") {
+ const workspaceID = body.data.object.metadata?.workspaceID
+ const invoiceID = body.data.object.id
+
+ if (!workspaceID) throw new Error("Workspace ID not found")
+ if (!invoiceID) throw new Error("Invoice ID not found")
+
+ const paymentIntent = await Billing.stripe().paymentIntents.retrieve(invoiceID)
+ console.log(JSON.stringify(paymentIntent))
+ const errorMessage =
+ typeof paymentIntent === "object" && paymentIntent !== null
+ ? paymentIntent.last_payment_error?.message
+ : undefined
+
+ await Actor.provide("system", { workspaceID }, async () => {
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ reload: false,
+ reloadError: errorMessage ?? "workspace.reload.error.paymentFailed",
+ timeReloadError: sql`now()`,
+ })
+ .where(eq(BillingTable.workspaceID, Actor.workspace())),
+ )
+ })
+ }
+ }
+ if (body.type === "charge.refunded") {
+ const customerID = body.data.object.customer as string
+ const paymentIntentID = body.data.object.payment_intent as string
+ if (!customerID) throw new Error("Customer ID not found")
+ if (!paymentIntentID) throw new Error("Payment ID not found")
+
+ const workspaceID = await Database.use((tx) =>
+ tx
+ .select({
+ workspaceID: BillingTable.workspaceID,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.customerID, customerID))
+ .then((rows) => rows[0]?.workspaceID),
+ )
+ if (!workspaceID) throw new Error("Workspace ID not found")
+
+ const payment = await Database.use((tx) =>
+ tx
+ .select({
+ amount: PaymentTable.amount,
+ enrichment: PaymentTable.enrichment,
+ })
+ .from(PaymentTable)
+ .where(and(eq(PaymentTable.paymentID, paymentIntentID), eq(PaymentTable.workspaceID, workspaceID)))
+ .then((rows) => rows[0]),
+ )
+ if (!payment) throw new Error("Payment not found")
+
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(PaymentTable)
+ .set({
+ timeRefunded: new Date(body.created * 1000),
+ })
+ .where(and(eq(PaymentTable.paymentID, paymentIntentID), eq(PaymentTable.workspaceID, workspaceID)))
+
+ // deduct balance only for top up
+ if (!payment.enrichment?.type) {
+ await tx
+ .update(BillingTable)
+ .set({
+ balance: sql`${BillingTable.balance} - ${payment.amount}`,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ }
+ })
+ }
+ })()
+ .then((message) => {
+ return Response.json({ message: message ?? "done" }, { status: 200 })
+ })
+ .catch((error: any) => {
+ return Response.json({ message: error.message }, { status: 500 })
+ })
+}
diff --git a/packages/console/app/src/routes/t/[...path].tsx b/packages/console/app/src/routes/t/[...path].tsx
new file mode 100644
index 0000000..3f65c68
--- /dev/null
+++ b/packages/console/app/src/routes/t/[...path].tsx
@@ -0,0 +1,26 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { LOCALE_HEADER, localeFromCookieHeader, parseLocale, tag } from "~/lib/language"
+
+async function handler(evt: APIEvent) {
+ const req = evt.request.clone()
+ const url = new URL(req.url)
+ const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
+
+ const headers = new Headers(req.headers)
+ const locale = parseLocale(req.headers.get(LOCALE_HEADER)) ?? localeFromCookieHeader(req.headers.get("cookie"))
+ if (locale) headers.set("accept-language", tag(locale))
+
+ const response = await fetch(targetUrl, {
+ method: req.method,
+ headers,
+ body: req.body,
+ })
+ return response
+}
+
+export const GET = handler
+export const POST = handler
+export const PUT = handler
+export const DELETE = handler
+export const OPTIONS = handler
+export const PATCH = handler
diff --git a/packages/console/app/src/routes/temp.tsx b/packages/console/app/src/routes/temp.tsx
new file mode 100644
index 0000000..6bbabc9
--- /dev/null
+++ b/packages/console/app/src/routes/temp.tsx
@@ -0,0 +1,179 @@
+import "./index.css"
+import { Title } from "@solidjs/meta"
+import { onCleanup, onMount } from "solid-js"
+import logoLight from "../asset/logo-ornate-light.svg"
+import logoDark from "../asset/logo-ornate-dark.svg"
+import IMG_SPLASH from "../asset/lander/screenshot-splash.png"
+import { IconCopy, IconCheck } from "../component/icon"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+
+function CopyStatus() {
+ return (
+
+
+
+
+ )
+}
+
+export default function Home() {
+ const i18n = useI18n()
+ const language = useLanguage()
+
+ onMount(() => {
+ const commands = document.querySelectorAll("[data-copy]")
+ for (const button of commands) {
+ const callback = () => {
+ const text = button.textContent
+ if (text) {
+ void navigator.clipboard.writeText(text)
+ button.setAttribute("data-copied", "")
+ setTimeout(() => {
+ button.removeAttribute("data-copied")
+ }, 1500)
+ }
+ }
+ button.addEventListener("click", callback)
+ onCleanup(() => {
+ button.removeEventListener("click", callback)
+ })
+ }
+ })
+
+ return (
+
+ {i18n.t("temp.title")}
+
+
+
+
+
+ {i18n.t("temp.hero.title")}
+
+
+
+
+
+
+
+
+
+ curl -fsSL
+ https://
+ opencode.ai/install
+ | bash
+
+
+
+
+
+
+
+
+
+ {i18n.t("temp.feature.native.title")} {i18n.t("temp.feature.native.body")}
+
+
+ {i18n.t("home.what.lsp.title")} {i18n.t("home.what.lsp.body")}
+
+
+ {i18n.t("temp.zen")} {i18n.t("temp.feature.zen.beforeLink")}{" "}
+ {i18n.t("temp.feature.zen.link")} {" "}
+ {i18n.t("temp.feature.zen.afterLink")} {i18n.t("home.banner.badge")}
+
+
+ {i18n.t("home.what.multiSession.title")} {i18n.t("home.what.multiSession.body")}
+
+
+ {i18n.t("home.what.shareLinks.title")} {i18n.t("home.what.shareLinks.body")}
+
+
+ {i18n.t("home.what.copilot.title")} {i18n.t("home.what.copilot.body")}
+
+
+ {i18n.t("home.what.chatgptPlus.title")} {i18n.t("home.what.chatgptPlus.body")}
+
+
+ {i18n.t("home.what.anyModel.title")} {i18n.t("temp.feature.models.beforeLink")}{" "}
+ Models.dev
+ {i18n.t("temp.feature.models.afterLink")}
+
+
+
+
+
+
+
npm
+
+
+ npm install -g opencode-ai
+
+
+
+
+
+
bun
+
+
+ bun install -g opencode-ai
+
+
+
+
+
+
homebrew
+
+
+ brew install opencode
+
+
+
+
+
+
paru
+
+
+ paru -S opencode-bin
+
+
+
+
+
+
+
+
+ {i18n.t("temp.screenshot.caption")}
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/user-menu.css b/packages/console/app/src/routes/user-menu.css
new file mode 100644
index 0000000..0afc269
--- /dev/null
+++ b/packages/console/app/src/routes/user-menu.css
@@ -0,0 +1,18 @@
+[data-component="user-menu"] {
+ [data-component="dropdown"] {
+ [data-slot="trigger"] span {
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="dropdown"] {
+ form {
+ width: 100%;
+ }
+ }
+
+ [data-slot="item"] {
+ color: var(--color-danger);
+ text-decoration: none;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/user-menu.tsx b/packages/console/app/src/routes/user-menu.tsx
new file mode 100644
index 0000000..7b305d8
--- /dev/null
+++ b/packages/console/app/src/routes/user-menu.tsx
@@ -0,0 +1,36 @@
+import { action } from "@solidjs/router"
+import { getRequestEvent } from "solid-js/web"
+import { useAuthSession } from "~/context/auth"
+import { Dropdown } from "~/component/dropdown"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import "./user-menu.css"
+
+const _logout = action(async () => {
+ "use server"
+ const auth = await useAuthSession()
+ const event = getRequestEvent()
+ const current = auth.data.current
+ if (current)
+ await auth.update((val) => {
+ delete val.account?.[current]
+ const first = Object.keys(val.account ?? {})[0]
+ val.current = first
+ event!.locals.actor = undefined
+ return val
+ })
+}, "auth.logout")
+
+export function UserMenu(props: { email: string | null | undefined }) {
+ const i18n = useI18n()
+ const language = useLanguage()
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace-picker.css b/packages/console/app/src/routes/workspace-picker.css
new file mode 100644
index 0000000..df7552f
--- /dev/null
+++ b/packages/console/app/src/routes/workspace-picker.css
@@ -0,0 +1,78 @@
+[data-component="workspace-picker"] {
+ [data-component="dropdown"] {
+ [data-slot="trigger"] {
+ /* Override blue accent colors with neutral colors for dropdown trigger */
+ --color-accent: var(--color-border);
+ --color-accent-hover: var(--color-border);
+ --color-accent-active: var(--color-border);
+ --color-primary: var(--color-border);
+ --color-primary-hover: var(--color-border);
+ --color-primary-active: var(--color-border);
+ --color-primary-alpha-20: transparent;
+ }
+
+ [data-slot="dropdown"] {
+ max-height: 240px;
+ overflow-y: auto;
+ min-width: 200px;
+ }
+ }
+
+ [data-slot="create-item"] {
+ width: 100%;
+ padding: var(--space-2-5) var(--space-3);
+ border: none;
+ background: none;
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-sans);
+ text-align: left;
+ cursor: pointer;
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--color-bg-surface);
+ }
+ }
+}
+
+[data-component="workspace-create-modal"] {
+ width: 100%;
+
+ [data-slot="create-form"] {
+ width: 100%;
+ }
+
+ [data-slot="create-input-group"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ }
+
+ [data-slot="button-group"] {
+ display: flex;
+ gap: var(--space-2);
+ justify-content: flex-end;
+ }
+
+ [data-slot="create-input"] {
+ flex: 1;
+ padding: var(--space-2-5) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-sans);
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-border);
+ box-shadow: none;
+ }
+
+ &::placeholder {
+ color: var(--color-text-muted);
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace-picker.tsx b/packages/console/app/src/routes/workspace-picker.tsx
new file mode 100644
index 0000000..83f5582
--- /dev/null
+++ b/packages/console/app/src/routes/workspace-picker.tsx
@@ -0,0 +1,119 @@
+import { query, useParams, action, createAsync, redirect, useSubmission } from "@solidjs/router"
+import { For, createEffect, createSignal } from "solid-js"
+import { withActor } from "~/context/auth.withActor"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+import { Workspace } from "@opencode-ai/console-core/workspace.js"
+import { Dropdown, DropdownItem } from "~/component/dropdown"
+import { Modal } from "~/component/modal"
+import { useI18n } from "~/context/i18n"
+import "./workspace-picker.css"
+
+const getWorkspaces = query(async () => {
+ "use server"
+ return withActor(async () => {
+ return Database.use((tx) =>
+ tx
+ .select({
+ id: WorkspaceTable.id,
+ name: WorkspaceTable.name,
+ slug: WorkspaceTable.slug,
+ })
+ .from(UserTable)
+ .innerJoin(WorkspaceTable, eq(UserTable.workspaceID, WorkspaceTable.id))
+ .where(
+ and(
+ eq(UserTable.accountID, Actor.account()),
+ isNull(WorkspaceTable.timeDeleted),
+ isNull(UserTable.timeDeleted),
+ ),
+ ),
+ )
+ })
+}, "workspaces")
+
+const createWorkspace = action(async (form: FormData) => {
+ "use server"
+ const name = form.get("workspaceName") as string
+ if (name?.trim()) {
+ return withActor(async () => {
+ const workspaceID = await Workspace.create({ name: name.trim() })
+ return redirect(`/workspace/${workspaceID}`)
+ })
+ }
+}, "createWorkspace")
+
+export function WorkspacePicker() {
+ const params = useParams()
+ const i18n = useI18n()
+ const workspaces = createAsync(() => getWorkspaces())
+ const submission = useSubmission(createWorkspace)
+ const [showForm, setShowForm] = createSignal(false)
+ let inputRef: HTMLInputElement | undefined
+
+ const currentWorkspace = () => {
+ const ws = workspaces()?.find((w) => w.id === params.id)
+ return ws ? ws.name : i18n.t("workspace.select")
+ }
+
+ createEffect(() => {
+ if (showForm() && inputRef) {
+ setTimeout(() => inputRef?.focus(), 0)
+ }
+ })
+
+ const handleSelectWorkspace = (workspaceID: string) => {
+ if (workspaceID === params.id) return
+ window.location.href = `/workspace/${workspaceID}`
+ }
+
+ // Reset signals when workspace ID changes
+ createEffect(() => {
+ params.id
+ setShowForm(false)
+ })
+
+ return (
+
+
+
+ {(workspace) => (
+ handleSelectWorkspace(workspace.id)}>
+ {workspace.name || workspace.slug}
+
+ )}
+
+ setShowForm(true)}>
+ {i18n.t("workspace.createNew")}
+
+
+
+
setShowForm(false)} title={i18n.t("workspace.modal.title")}>
+
+
+
+
+
+ setShowForm(false)}>
+ {i18n.t("common.cancel")}
+
+
+ {submission.pending ? i18n.t("common.creating") : i18n.t("common.create")}
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace.css b/packages/console/app/src/routes/workspace.css
new file mode 100644
index 0000000..7bd7e1e
--- /dev/null
+++ b/packages/console/app/src/routes/workspace.css
@@ -0,0 +1,108 @@
+[data-page="workspace"] {
+ line-height: 1;
+
+ /* Common elements */
+ button {
+ padding: var(--space-3) var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-sans);
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.15s ease;
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-surface-hover);
+ border-color: var(--color-accent);
+ }
+
+ &:active {
+ transform: translateY(1px);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ transform: none;
+ }
+
+ &[data-color="primary"] {
+ background-color: var(--color-primary);
+ border-color: var(--color-primary);
+ color: var(--color-primary-text);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-primary-hover);
+ border-color: var(--color-primary-hover);
+ }
+ }
+
+ &[data-color="ghost"] {
+ background-color: transparent;
+ border-color: transparent;
+ color: var(--color-text-muted);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-surface-hover);
+ border-color: var(--color-border);
+ color: var(--color-text);
+ }
+ }
+ }
+
+ a {
+ color: var(--color-text);
+ }
+
+ /* Workspace Header */
+ [data-component="workspace-header"] {
+ position: sticky;
+ top: 0;
+ z-index: 100;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: var(--space-4) var(--space-4);
+ border-bottom: 1px solid var(--color-border);
+ background-color: var(--color-bg);
+
+ @media (max-width: 30rem) {
+ padding: var(--space-4) var(--space-4);
+ }
+ }
+
+ [data-slot="header-brand"] {
+ flex: 0 0 auto;
+ padding-top: 4px;
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+
+ [data-component="site-title"] {
+ font-size: var(--font-size-lg);
+ font-weight: 600;
+ color: var(--color-text);
+ letter-spacing: -0.02em;
+ }
+ }
+
+ [data-slot="header-actions"] {
+ display: flex;
+ gap: var(--space-4);
+ align-items: center;
+ font-size: var(--font-size-sm);
+
+ [data-slot="user"] {
+ color: var(--color-text-muted);
+ }
+
+ @media (max-width: 30rem) {
+ [data-slot="user"] {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace.tsx b/packages/console/app/src/routes/workspace.tsx
new file mode 100644
index 0000000..10e503a
--- /dev/null
+++ b/packages/console/app/src/routes/workspace.tsx
@@ -0,0 +1,40 @@
+import { query, createAsync, RouteSectionProps, useParams, A } from "@solidjs/router"
+import "./workspace.css"
+import { IconWorkspaceLogo } from "../component/icon"
+import { WorkspacePicker } from "./workspace-picker"
+import { UserMenu } from "./user-menu"
+import { withActor } from "~/context/auth.withActor"
+import { User } from "@opencode-ai/console-core/user.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { useLanguage } from "~/context/language"
+
+const getUserEmail = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ const actor = Actor.assert("user")
+ const email = await User.getAuthEmail(actor.properties.userID)
+ return email
+ }, workspaceID)
+}, "userEmail")
+
+export default function WorkspaceLayout(props: RouteSectionProps) {
+ const params = useParams()
+ const language = useLanguage()
+ const userEmail = createAsync(() => getUserEmail(params.id!))
+ return (
+
+
+ {props.children}
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id].css b/packages/console/app/src/routes/workspace/[id].css
new file mode 100644
index 0000000..5d19988
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id].css
@@ -0,0 +1,337 @@
+[data-page="workspace"] {
+ line-height: 1;
+}
+
+/* Workspace Layout */
+[data-component="workspace-container"] {
+ display: flex;
+ height: calc(100vh - 73px);
+}
+
+[data-component="workspace-nav"] {
+ width: 240px;
+ flex-shrink: 0;
+ padding: var(--space-6) var(--space-4);
+ display: flex;
+ justify-content: flex-end;
+}
+
+/* Desktop Navigation */
+[data-component="nav-desktop"] {
+ display: block;
+
+ @media (max-width: 48rem) {
+ display: none;
+ }
+
+ [data-component="workspace-nav-items"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+
+ [data-nav-button] {
+ padding: var(--space-3) var(--space-4);
+ border-radius: var(--border-radius-sm);
+ color: var(--color-text-muted);
+ text-decoration: none;
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ transition: all 0.15s ease;
+
+ &:hover {
+ color: var(--color-text);
+ }
+
+ &.active {
+ color: var(--color-text);
+ font-weight: 700;
+ position: relative;
+
+ &::before {
+ content: "";
+ position: absolute;
+ left: calc(-1 * var(--space-0-5));
+ top: 0;
+ bottom: 0;
+ width: 2px;
+ background-color: var(--color-text);
+ border-radius: 0 2px 2px 0;
+ }
+ }
+ }
+ }
+}
+
+/* Mobile Navigation */
+[data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 48rem) {
+ display: flex;
+ align-items: stretch;
+ justify-content: flex-start;
+ width: 100%;
+ overflow-x: auto;
+ overflow-y: hidden;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+
+ [data-component="workspace-nav-items"] {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--space-1);
+ min-width: max-content;
+ height: 100%;
+
+ [data-nav-button] {
+ padding: var(--space-2) var(--space-3);
+ padding-bottom: calc(var(--space-2) + 4px);
+ border-radius: var(--border-radius-sm);
+ color: var(--color-text-muted);
+ text-decoration: none;
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ transition: all 0.15s ease;
+ white-space: nowrap;
+ flex-shrink: 0;
+ position: relative;
+
+ &:hover {
+ color: var(--color-text);
+ }
+
+ &.active {
+ color: var(--color-text);
+ font-weight: 700;
+
+ &::after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background-color: var(--color-text);
+ border-radius: 2px 2px 0 0;
+ }
+ }
+ }
+ }
+}
+
+[data-component="workspace-content"] {
+ flex: 1;
+ padding: var(--space-6) var(--space-8);
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+
+ @media (max-width: 48rem) {
+ padding: var(--space-6) var(--space-4);
+ }
+}
+
+[data-component="workspace-main"] {
+ flex: 1;
+}
+
+[data-component="workspace-content"] > [data-component="legal"] {
+ margin-top: var(--space-16);
+ padding-top: var(--space-8);
+ border-top: 1px solid var(--color-border);
+ color: var(--color-text-weak);
+ display: flex;
+ gap: var(--space-8);
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+
+ @media (max-width: 48rem) {
+ gap: var(--space-4);
+ }
+}
+
+[data-page="workspace-[id]"] {
+ max-width: 64rem;
+ padding: var(--space-2) var(--space-4);
+ margin: 0;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-10);
+
+ @media (max-width: 30rem) {
+ padding-top: var(--space-4);
+ padding-bottom: var(--space-4);
+
+ gap: var(--space-8);
+ }
+
+ [data-slot="sections"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+
+ @media (max-width: 30rem) {
+ gap: var(--space-8);
+ }
+
+ section {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+
+ @media (max-width: 30rem) {
+ gap: var(--space-6);
+ }
+
+ [data-slot="section-title"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+
+ h2 {
+ font-size: var(--font-size-md);
+ font-weight: 600;
+ line-height: 1.2;
+ letter-spacing: -0.03125rem;
+ margin: 0;
+ color: var(--color-text);
+
+ @media (max-width: 30rem) {
+ font-size: var(--font-size-md);
+ }
+ }
+
+ p {
+ line-height: 1.5;
+ font-size: var(--font-size-md);
+ color: var(--color-text-muted);
+
+ a {
+ color: var(--color-text-muted);
+ }
+
+ @media (max-width: 30rem) {
+ font-size: var(--font-size-sm);
+ }
+ }
+ }
+
+ [data-slot="section-content"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ margin-top: var(--space-8);
+ }
+ }
+
+ section:not(:last-child) {
+ border-bottom: 1px solid var(--color-border);
+ padding-bottom: var(--space-16);
+
+ @media (max-width: 30rem) {
+ padding-bottom: var(--space-8);
+ }
+ }
+ }
+
+ /* Title section */
+ [data-component="header-section"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ padding-bottom: var(--space-8);
+ border-bottom: 1px solid var(--color-border);
+
+ @media (max-width: 30rem) {
+ padding-bottom: var(--space-6);
+ }
+
+ h1 {
+ font-size: var(--font-size-2xl);
+ font-weight: 500;
+ line-height: 1.2;
+ letter-spacing: -0.03125rem;
+ margin: 0;
+ text-transform: uppercase;
+
+ @media (max-width: 30rem) {
+ font-size: var(--font-size-xl);
+ }
+ }
+
+ p {
+ line-height: 1.5;
+ font-size: var(--font-size-md);
+ color: var(--color-text);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-4);
+
+ @media (max-width: 48rem) {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: var(--space-3);
+ }
+
+ a {
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="billing-info"] {
+ flex-shrink: 0;
+ margin-left: auto;
+ }
+
+ [data-slot="balance"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+
+ b {
+ font-weight: 600;
+ color: var(--color-text);
+ }
+ }
+ }
+ }
+}
+
+@media (max-width: 48rem) {
+ [data-component="workspace-container"] {
+ flex-direction: column;
+ }
+
+ [data-component="workspace-nav"] {
+ width: 100%;
+ flex-direction: row;
+ border-right: none;
+ border-bottom: 1px solid var(--color-border);
+ padding: var(--space-4);
+ justify-content: flex-start;
+ overflow-x: auto;
+ overflow-y: hidden;
+ flex-shrink: 0;
+ min-height: fit-content;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id].tsx b/packages/console/app/src/routes/workspace/[id].tsx
new file mode 100644
index 0000000..7a8e161
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id].tsx
@@ -0,0 +1,80 @@
+import { Show } from "solid-js"
+import { createAsync, RouteSectionProps, useParams, A } from "@solidjs/router"
+import { querySessionInfo } from "./common"
+import "./[id].css"
+import { useI18n } from "~/context/i18n"
+import { Legal } from "~/component/legal"
+
+export default function WorkspaceLayout(props: RouteSectionProps) {
+ const params = useParams()
+ const i18n = useI18n()
+ const userInfo = createAsync(() => querySessionInfo(params.id!))
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/billing-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/billing-section.module.css
new file mode 100644
index 0000000..24b4053
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/billing-section.module.css
@@ -0,0 +1,185 @@
+.root {
+ [data-slot="reload-error"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-4);
+
+ p {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ margin: 0;
+ flex: 1;
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ gap: var(--space-2);
+ margin: 0;
+ flex-shrink: 0;
+ }
+ }
+
+ [data-slot="section-content"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ }
+
+ [data-slot="balance-display"] {
+ display: flex;
+ align-items: flex-start;
+ gap: var(--space-3);
+
+ @media (max-width: 30rem) {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: var(--space-2);
+ }
+
+ [data-slot="balance-amount"] {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg-surface);
+ align-self: stretch;
+
+ [data-slot="balance-label"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ margin-top: var(--space-2);
+ font-weight: 400;
+ }
+
+ [data-slot="balance-value"] {
+ font-size: var(--font-size-2xl);
+ font-weight: 600;
+ color: var(--color-text);
+ }
+ }
+
+ [data-slot="balance-right-section"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ flex: 1;
+ }
+
+ [data-slot="add-balance-form-container"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+
+ [data-slot="add-balance-form"] {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--space-3);
+
+ label {
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ color: var(--color-text-muted);
+ white-space: nowrap;
+ }
+
+ input[data-component="input"] {
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+
+ [data-slot="form-actions"] {
+ display: flex;
+ gap: var(--space-2);
+ }
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ }
+
+ [data-slot="credit-card"] {
+ padding: var(--space-2) var(--space-4);
+ background-color: var(--color-bg-surface);
+ border-radius: var(--border-radius-sm);
+ display: flex;
+ align-items: center;
+ gap: var(--space-3);
+ min-width: 150px;
+ align-self: flex-start;
+
+ [data-slot="card-icon"] {
+ display: flex;
+ align-items: center;
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="card-details"] {
+ display: flex;
+ align-items: baseline;
+ gap: var(--space-1);
+ flex: 1;
+ justify-content: flex-end;
+
+ [data-slot="secret"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ font-weight: 400;
+ }
+
+ [data-slot="number"] {
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="type"] {
+ font-size: var(--font-size-sm);
+ font-weight: 400;
+ color: var(--color-text-muted);
+ }
+ }
+
+ button {
+ white-space: nowrap;
+ flex-shrink: 0;
+ }
+ }
+
+ button {
+ align-self: flex-start;
+ white-space: nowrap;
+ flex-shrink: 0;
+ }
+ }
+
+ [data-slot="enable-billing-button"] {
+ align-self: flex-start;
+ padding: var(--space-4);
+ min-width: 150px;
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx
new file mode 100644
index 0000000..9028063
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx
@@ -0,0 +1,266 @@
+import { action, useParams, useAction, createAsync, useSubmission, json } from "@solidjs/router"
+import { createMemo, Match, Show, Switch, createEffect } from "solid-js"
+import { createStore } from "solid-js/store"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { withActor } from "~/context/auth.withActor"
+import { IconAlipay, IconCreditCard, IconStripe, IconUpi, IconWechat } from "~/component/icon"
+import styles from "./billing-section.module.css"
+import { createCheckoutUrl, formatBalance, queryBillingInfo } from "../../common"
+import { useI18n } from "~/context/i18n"
+import { localizeError } from "~/lib/form-error"
+
+const createSessionUrl = action(async (workspaceID: string, returnUrl: string) => {
+ "use server"
+ return json(
+ await withActor(
+ () =>
+ Billing.generateSessionUrl({ returnUrl })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({
+ error: e.message as string,
+ data: undefined,
+ })),
+ workspaceID,
+ ),
+ { revalidate: queryBillingInfo.key },
+ )
+}, "sessionUrl")
+
+export function BillingSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ // ORIGINAL CODE - COMMENTED OUT FOR TESTING
+ const billingInfo = createAsync(() => queryBillingInfo(params.id!))
+ const checkoutAction = useAction(createCheckoutUrl)
+ const checkoutSubmission = useSubmission(createCheckoutUrl)
+ const sessionAction = useAction(createSessionUrl)
+ const sessionSubmission = useSubmission(createSessionUrl)
+ const [store, setStore] = createStore({
+ showAddBalanceForm: false,
+ addBalanceAmount: billingInfo()?.reloadAmount.toString() ?? "",
+ checkoutRedirecting: false,
+ sessionRedirecting: false,
+ })
+
+ createEffect(() => {
+ const info = billingInfo()
+ if (info) {
+ setStore("addBalanceAmount", info.reloadAmount.toString())
+ }
+ })
+ const balance = createMemo(() => formatBalance(billingInfo()?.balance ?? 0))
+
+ async function onClickCheckout() {
+ const amount = parseInt(store.addBalanceAmount)
+ const baseUrl = window.location.href
+
+ const checkout = await checkoutAction(params.id!, amount, baseUrl, baseUrl)
+ if (checkout && checkout.data) {
+ setStore("checkoutRedirecting", true)
+ window.location.href = checkout.data
+ }
+ }
+
+ async function onClickSession() {
+ const baseUrl = window.location.href
+ const sessionUrl = await sessionAction(params.id!, baseUrl)
+ if (sessionUrl && sessionUrl.data) {
+ setStore("sessionRedirecting", true)
+ window.location.href = sessionUrl.data
+ }
+ }
+
+ function showAddBalanceForm() {
+ while (true) {
+ checkoutSubmission.clear()
+ if (!checkoutSubmission.result) break
+ }
+ setStore({
+ showAddBalanceForm: true,
+ })
+ }
+
+ function hideAddBalanceForm() {
+ setStore("showAddBalanceForm", false)
+ checkoutSubmission.clear()
+ }
+
+ // DUMMY DATA FOR TESTING - UNCOMMENT ONE OF THE SCENARIOS BELOW
+
+ // Scenario 1: User has not added billing details and has no balance
+ // const balanceInfo = () => ({
+ // balance: 0,
+ // paymentMethodType: null as string | null,
+ // paymentMethodLast4: null as string | null,
+ // reload: false,
+ // reloadError: null as string | null,
+ // timeReloadError: null as Date | null,
+ // })
+
+ // Scenario 2: User has not added billing details but has a balance
+ // const balanceInfo = () => ({
+ // balance: 1500000000, // $15.00
+ // paymentMethodType: null as string | null,
+ // paymentMethodLast4: null as string | null,
+ // reload: false,
+ // reloadError: null as string | null,
+ // timeReloadError: null as Date | null
+ // })
+
+ // Scenario 3: User has added billing details (reload enabled)
+ // const balanceInfo = () => ({
+ // balance: 750000000, // $7.50
+ // paymentMethodType: "card",
+ // paymentMethodLast4: "4242",
+ // reload: true,
+ // reloadError: null as string | null,
+ // timeReloadError: null as Date | null
+ // })
+
+ // Scenario 4: User has billing details but reload failed
+ // const balanceInfo = () => ({
+ // balance: 250000000, // $2.50
+ // paymentMethodType: "card",
+ // paymentMethodLast4: "4242",
+ // reload: true,
+ // reloadError: "Your card was declined." as string,
+ // timeReloadError: new Date(Date.now() - 3600000) as Date // 1 hour ago
+ // })
+
+ // Scenario 5: User has Link payment method
+ // const balanceInfo = () => ({
+ // balance: 500000000, // $5.00
+ // paymentMethodType: "link",
+ // paymentMethodLast4: null as string | null,
+ // reload: true,
+ // reloadError: null as string | null,
+ // timeReloadError: null as Date | null
+ // })
+
+ return (
+
+
+
{i18n.t("workspace.billing.title")}
+
+ {i18n.t("workspace.billing.subtitle.beforeLink")}{" "}
+ {i18n.t("workspace.billing.contactUs")} {" "}
+ {i18n.t("workspace.billing.subtitle.afterLink")}
+
+
+
+
+
+ ${balance()}
+ {i18n.t("workspace.billing.currentBalance")}
+
+
+
+
+
+
{i18n.t("workspace.billing.add")}
+
{
+ setStore("addBalanceAmount", e.currentTarget.value)
+ checkoutSubmission.clear()
+ }}
+ placeholder={i18n.t("workspace.billing.enterAmount")}
+ />
+
+ hideAddBalanceForm()}>
+ {i18n.t("common.cancel")}
+
+
+ {checkoutSubmission.pending || store.checkoutRedirecting
+ ? i18n.t("workspace.billing.loading")
+ : i18n.t("workspace.billing.addAction")}
+
+
+
+
+ {(err: any) => {localizeError(i18n.t, err())}
}
+
+
+ }
+ >
+ showAddBalanceForm()}>
+ {i18n.t("workspace.billing.addBalance")}
+
+
+
+
+ }>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ----}>
+ ••••
+ {billingInfo()?.paymentMethodLast4}
+
+
+
+ {i18n.t("workspace.billing.linkedToStripe")}
+
+
+ {i18n.t("workspace.billing.alipay")}
+
+
+ {i18n.t("workspace.billing.wechat")}
+
+
+
+
+ {sessionSubmission.pending || store.sessionRedirecting
+ ? i18n.t("workspace.billing.loading")
+ : i18n.t("workspace.billing.manage")}
+
+
+
+
+
+
+
+ {checkoutSubmission.pending || store.checkoutRedirecting
+ ? i18n.t("workspace.billing.loading")
+ : i18n.t("workspace.billing.enable")}
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/black-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/black-section.module.css
new file mode 100644
index 0000000..f9dc0cb
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/black-section.module.css
@@ -0,0 +1,142 @@
+.root {
+ [data-slot="title-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ [data-slot="usage"] {
+ display: flex;
+ gap: var(--space-6);
+ margin-top: var(--space-4);
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: var(--space-4);
+ }
+ }
+
+ [data-slot="usage-item"] {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+
+ [data-slot="usage-header"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ }
+
+ [data-slot="usage-label"] {
+ font-size: var(--font-size-md);
+ font-weight: 500;
+ color: var(--color-text);
+ }
+
+ [data-slot="usage-value"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="progress"] {
+ height: 8px;
+ background-color: var(--color-bg-surface);
+ border-radius: var(--border-radius-sm);
+ overflow: hidden;
+ }
+
+ [data-slot="progress-bar"] {
+ height: 100%;
+ background-color: var(--color-accent);
+ border-radius: var(--border-radius-sm);
+ transition: width 0.3s ease;
+ }
+
+ [data-slot="reset-time"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="setting-row"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-3);
+ margin-top: var(--space-4);
+
+ p {
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ color: var(--color-text-secondary);
+ margin: 0;
+ }
+ }
+
+ [data-slot="toggle-label"] {
+ position: relative;
+ display: inline-block;
+ width: 2.5rem;
+ height: 1.5rem;
+ cursor: pointer;
+ flex-shrink: 0;
+
+ input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+ }
+
+ span {
+ position: absolute;
+ inset: 0;
+ background-color: #ccc;
+ border: 1px solid #bbb;
+ border-radius: 1.5rem;
+ transition: all 0.3s ease;
+ cursor: pointer;
+
+ &::before {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 0.125rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ background-color: white;
+ border: 1px solid #ddd;
+ border-radius: 50%;
+ transform: translateY(-50%);
+ transition: all 0.3s ease;
+ }
+ }
+
+ input:checked + span {
+ background-color: #21ad0e;
+ border-color: #148605;
+
+ &::before {
+ transform: translateX(1rem) translateY(-50%);
+ }
+ }
+
+ &:hover span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.2);
+ }
+
+ input:checked:hover + span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.3);
+ }
+
+ &:has(input:disabled) {
+ cursor: not-allowed;
+ }
+
+ input:disabled + span {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx
new file mode 100644
index 0000000..ee3c1fc
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx
@@ -0,0 +1,277 @@
+import { action, useParams, useAction, useSubmission, json, query, createAsync } from "@solidjs/router"
+import { createStore } from "solid-js/store"
+import { Show } from "solid-js"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { Database, eq, and, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { BillingTable, SubscriptionTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { Subscription } from "@opencode-ai/console-core/subscription.js"
+import { BlackData } from "@opencode-ai/console-core/black.js"
+import { withActor } from "~/context/auth.withActor"
+import { queryBillingInfo } from "../../common"
+import styles from "./black-section.module.css"
+import waitlistStyles from "./black-waitlist-section.module.css"
+import { useI18n } from "~/context/i18n"
+import { formError } from "~/lib/form-error"
+import { blackResetTimeKeys, formatResetTime } from "~/lib/format-reset-time"
+
+const querySubscription = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ const row = await Database.use((tx) =>
+ tx
+ .select({
+ rollingUsage: SubscriptionTable.rollingUsage,
+ fixedUsage: SubscriptionTable.fixedUsage,
+ timeRollingUpdated: SubscriptionTable.timeRollingUpdated,
+ timeFixedUpdated: SubscriptionTable.timeFixedUpdated,
+ subscription: BillingTable.subscription,
+ })
+ .from(BillingTable)
+ .innerJoin(SubscriptionTable, eq(SubscriptionTable.workspaceID, BillingTable.workspaceID))
+ .where(and(eq(SubscriptionTable.workspaceID, Actor.workspace()), isNull(SubscriptionTable.timeDeleted)))
+ .then((r) => r[0]),
+ )
+ if (!row?.subscription) return null
+ const blackData = BlackData.getLimits({ plan: row.subscription.plan })
+
+ return {
+ plan: row.subscription.plan,
+ useBalance: row.subscription.useBalance ?? false,
+ rollingUsage: Subscription.analyzeRollingUsage({
+ limit: blackData.rollingLimit,
+ window: blackData.rollingWindow,
+ usage: row.rollingUsage ?? 0,
+ timeUpdated: row.timeRollingUpdated ?? new Date(),
+ }),
+ weeklyUsage: Subscription.analyzeWeeklyUsage({
+ limit: blackData.fixedLimit,
+ usage: row.fixedUsage ?? 0,
+ timeUpdated: row.timeFixedUpdated ?? new Date(),
+ }),
+ }
+ }, workspaceID)
+}, "subscription.get")
+
+const cancelWaitlist = action(async (workspaceID: string) => {
+ "use server"
+ return json(
+ await withActor(async () => {
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ subscriptionPlan: null,
+ timeSubscriptionBooked: null,
+ timeSubscriptionSelected: null,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+ )
+ return { error: undefined }
+ }, workspaceID).catch((e) => ({ error: e.message as string })),
+ { revalidate: [queryBillingInfo.key, querySubscription.key] },
+ )
+}, "cancelWaitlist")
+
+const enroll = action(async (workspaceID: string) => {
+ "use server"
+ return json(
+ await withActor(async () => {
+ await Billing.subscribeBlack({ seats: 1 })
+ return { error: undefined }
+ }, workspaceID).catch((e) => ({ error: e.message as string })),
+ { revalidate: [queryBillingInfo.key, querySubscription.key] },
+ )
+}, "enroll")
+
+const createSessionUrl = action(async (workspaceID: string, returnUrl: string) => {
+ "use server"
+ return json(
+ await withActor(
+ () =>
+ Billing.generateSessionUrl({ returnUrl })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({
+ error: e.message as string,
+ data: undefined,
+ })),
+ workspaceID,
+ ),
+ { revalidate: [queryBillingInfo.key, querySubscription.key] },
+ )
+}, "sessionUrl")
+
+const setUseBalance = action(async (form: FormData) => {
+ "use server"
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const useBalance = (form.get("useBalance") as string | null) === "true"
+
+ return json(
+ await withActor(async () => {
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ subscription: useBalance
+ ? sql`JSON_SET(subscription, '$.useBalance', true)`
+ : sql`JSON_REMOVE(subscription, '$.useBalance')`,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+ )
+ return { error: undefined }
+ }, workspaceID).catch((e) => ({ error: e.message as string })),
+ { revalidate: [queryBillingInfo.key, querySubscription.key] },
+ )
+}, "setUseBalance")
+
+export function BlackSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const billing = createAsync(() => queryBillingInfo(params.id!))
+ const subscription = createAsync(() => querySubscription(params.id!))
+ const sessionAction = useAction(createSessionUrl)
+ const sessionSubmission = useSubmission(createSessionUrl)
+ const cancelAction = useAction(cancelWaitlist)
+ const cancelSubmission = useSubmission(cancelWaitlist)
+ const enrollAction = useAction(enroll)
+ const enrollSubmission = useSubmission(enroll)
+ const useBalanceSubmission = useSubmission(setUseBalance)
+ const [store, setStore] = createStore({
+ sessionRedirecting: false,
+ cancelled: false,
+ enrolled: false,
+ })
+
+ async function onClickSession() {
+ const result = await sessionAction(params.id!, window.location.href)
+ if (result.data) {
+ setStore("sessionRedirecting", true)
+ window.location.href = result.data
+ }
+ }
+
+ async function onClickCancel() {
+ const result = await cancelAction(params.id!)
+ if (!result.error) {
+ setStore("cancelled", true)
+ }
+ }
+
+ async function onClickEnroll() {
+ const result = await enrollAction(params.id!)
+ if (!result.error) {
+ setStore("enrolled", true)
+ }
+ }
+
+ return (
+ <>
+
+ {(sub) => (
+
+
+
{i18n.t("workspace.black.subscription.title")}
+
+
{i18n.t("workspace.black.subscription.message", { plan: sub().plan })}
+
+ {sessionSubmission.pending || store.sessionRedirecting
+ ? i18n.t("workspace.black.loading")
+ : i18n.t("workspace.black.subscription.manage")}
+
+
+
+
+
+
+ {i18n.t("workspace.black.subscription.rollingUsage")}
+ {sub().rollingUsage.usagePercent}%
+
+
+
+ {i18n.t("workspace.black.subscription.resetsIn")}{" "}
+ {formatResetTime(sub().rollingUsage.resetInSec, i18n, blackResetTimeKeys)}
+
+
+
+
+ {i18n.t("workspace.black.subscription.weeklyUsage")}
+ {sub().weeklyUsage.usagePercent}%
+
+
+
+ {i18n.t("workspace.black.subscription.resetsIn")}{" "}
+ {formatResetTime(sub().weeklyUsage.resetInSec, i18n, blackResetTimeKeys)}
+
+
+
+
+ {i18n.t("workspace.black.subscription.useBalance")}
+
+
+
+ e.currentTarget.form?.requestSubmit()}
+ />
+
+
+
+
+ )}
+
+
+
+
+
{i18n.t("workspace.black.waitlist.title")}
+
+
+ {billing()?.timeSubscriptionSelected
+ ? i18n.t("workspace.black.waitlist.ready", { plan: billing()?.subscriptionPlan ?? "" })
+ : i18n.t("workspace.black.waitlist.joined", { plan: billing()?.subscriptionPlan ?? "" })}
+
+
+ {cancelSubmission.pending
+ ? i18n.t("workspace.black.waitlist.leaving")
+ : store.cancelled
+ ? i18n.t("workspace.black.waitlist.left")
+ : i18n.t("workspace.black.waitlist.leave")}
+
+
+
+
+
+
+ {enrollSubmission.pending
+ ? i18n.t("workspace.black.waitlist.enrolling")
+ : store.enrolled
+ ? i18n.t("workspace.black.waitlist.enrolled")
+ : i18n.t("workspace.black.waitlist.enroll")}
+
+
{i18n.t("workspace.black.waitlist.enrollNote")}
+
+
+
+
+ >
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/black-waitlist-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/black-waitlist-section.module.css
new file mode 100644
index 0000000..685d62c
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/black-waitlist-section.module.css
@@ -0,0 +1,23 @@
+.root {
+ [data-slot="title-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ [data-slot="enroll-section"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ }
+
+ [data-slot="enroll-button"] {
+ align-self: flex-start;
+ }
+
+ [data-slot="enroll-note"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/index.tsx b/packages/console/app/src/routes/workspace/[id]/billing/index.tsx
new file mode 100644
index 0000000..e6c11c1
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/index.tsx
@@ -0,0 +1,35 @@
+import { MonthlyLimitSection } from "./monthly-limit-section"
+import { BillingSection } from "./billing-section"
+import { ReloadSection } from "./reload-section"
+import { PaymentSection } from "./payment-section"
+import { BlackSection } from "./black-section"
+import { RedeemSection } from "./redeem-section"
+import { createMemo, Show } from "solid-js"
+import { createAsync, useParams } from "@solidjs/router"
+import { queryBillingInfo, querySessionInfo } from "../../common"
+
+export default function () {
+ const params = useParams()
+ const sessionInfo = createAsync(() => querySessionInfo(params.id!))
+ const billingInfo = createAsync(() => queryBillingInfo(params.id!))
+ const isBlack = createMemo(() => billingInfo()?.subscriptionID || billingInfo()?.timeSubscriptionBooked)
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.module.css
new file mode 100644
index 0000000..a45bbf1
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.module.css
@@ -0,0 +1,96 @@
+.root {
+ [data-slot="balance"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ min-width: 15rem;
+ width: fit-content;
+
+ @media (max-width: 30rem) {
+ width: 100%;
+ }
+
+ [data-slot="amount"] {
+ padding: var(--space-3-5) var(--space-4);
+ background-color: var(--color-bg-surface);
+ border-radius: var(--border-radius-sm);
+ display: flex;
+ align-items: baseline;
+ gap: var(--space-1);
+ justify-content: flex-end;
+
+ [data-slot="currency"] {
+ position: relative;
+ bottom: 2px;
+ font-size: var(--font-size-lg);
+ color: var(--color-text-muted);
+ font-weight: 400;
+ }
+
+ [data-slot="value"] {
+ font-size: var(--font-size-3xl);
+ font-weight: 500;
+ color: var(--color-text);
+ }
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ margin-top: var(--space-1);
+
+ [data-slot="input-container"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+ }
+
+ @media (max-width: 30rem) {
+ gap: var(--space-2);
+ }
+
+ input {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-mono);
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+
+ [data-slot="form-actions"] {
+ display: flex;
+ gap: var(--space-2);
+ justify-content: flex-end;
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ }
+ }
+ }
+
+ [data-slot="usage-status"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-secondary);
+ margin: 0;
+ line-height: 1.4;
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx
new file mode 100644
index 0000000..7da1de2
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx
@@ -0,0 +1,145 @@
+import { json, action, useParams, createAsync, useSubmission } from "@solidjs/router"
+import { createEffect, Show } from "solid-js"
+import { createStore } from "solid-js/store"
+import { withActor } from "~/context/auth.withActor"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import styles from "./monthly-limit-section.module.css"
+import { queryBillingInfo } from "../../common"
+import { useI18n } from "~/context/i18n"
+import { formError, localizeError } from "~/lib/form-error"
+
+const setMonthlyLimit = action(async (form: FormData) => {
+ "use server"
+ const limit = form.get("limit") as string | null
+ if (!limit) return { error: formError.limitRequired }
+ const numericLimit = parseInt(limit)
+ if (numericLimit < 0) return { error: formError.monthlyLimitInvalid }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(
+ await withActor(
+ () =>
+ Billing.setMonthlyLimit(numericLimit)
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ { revalidate: queryBillingInfo.key },
+ )
+}, "billing.setMonthlyLimit")
+
+export function MonthlyLimitSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const submission = useSubmission(setMonthlyLimit)
+ const [store, setStore] = createStore({ show: false })
+ const billingInfo = createAsync(() => queryBillingInfo(params.id!))
+
+ let input: HTMLInputElement
+
+ createEffect(() => {
+ if (!submission.pending && submission.result && !submission.result.error) {
+ hide()
+ }
+ })
+
+ function show() {
+ // submission.clear() does not clear the result in some cases, ie.
+ // 1. Create key with empty name => error shows
+ // 2. Put in a key name and creates the key => form hides
+ // 3. Click add key button again => form shows with the same error if
+ // submission.clear() is called only once
+ while (true) {
+ submission.clear()
+ if (!submission.result) break
+ }
+ setStore("show", true)
+ input.focus()
+ }
+
+ function hide() {
+ setStore("show", false)
+ }
+
+ return (
+
+
+
{i18n.t("workspace.monthlyLimit.title")}
+
{i18n.t("workspace.monthlyLimit.subtitle")}
+
+
+
+
+ {billingInfo()?.monthlyLimit ? $ : null}
+ {billingInfo()?.monthlyLimit ?? "-"}
+
+
+
+
(input = r)}
+ data-component="input"
+ name="limit"
+ type="number"
+ placeholder={i18n.t("workspace.monthlyLimit.placeholder")}
+ />
+
+ {(err) => {localizeError(i18n.t, err())}
}
+
+
+
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+ {submission.pending
+ ? i18n.t("workspace.monthlyLimit.setting")
+ : i18n.t("workspace.monthlyLimit.set")}
+
+
+
+ }
+ >
+ show()}>
+ {billingInfo()?.monthlyLimit
+ ? i18n.t("workspace.monthlyLimit.edit")
+ : i18n.t("workspace.monthlyLimit.set")}
+
+
+
+
{i18n.t("workspace.monthlyLimit.noLimit")}}
+ >
+
+ {i18n.t("workspace.monthlyLimit.currentUsage.beforeMonth")}{" "}
+ {new Date().toLocaleDateString(undefined, { month: "long", timeZone: "UTC" })}{" "}
+ {i18n.t("workspace.monthlyLimit.currentUsage.beforeAmount")}
+ {(() => {
+ const dateLastUsed = billingInfo()?.timeMonthlyUsageUpdated
+ if (!dateLastUsed) return "0"
+
+ const current = new Date().toLocaleDateString(undefined, {
+ year: "numeric",
+ month: "long",
+ timeZone: "UTC",
+ })
+ const lastUsed = dateLastUsed.toLocaleDateString(undefined, {
+ year: "numeric",
+ month: "long",
+ timeZone: "UTC",
+ })
+ if (current !== lastUsed) return "0"
+ return ((billingInfo()?.monthlyUsage ?? 0) / 100000000).toFixed(2)
+ })()}
+ .
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/payment-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/payment-section.module.css
new file mode 100644
index 0000000..6452484
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/payment-section.module.css
@@ -0,0 +1,93 @@
+.root {
+ [data-slot="payments-table"] {
+ overflow-x: auto;
+ }
+
+ [data-slot="payments-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="payment-date"] {
+ color: var(--color-text);
+ }
+
+ &[data-slot="payment-id"] {
+ font-family: var(--font-mono);
+ font-weight: 400;
+ color: var(--color-text-muted);
+ max-width: 200px;
+ word-break: break-word;
+ }
+
+ &[data-slot="payment-amount"] {
+ color: var(--color-text);
+
+ &[data-refunded="true"] {
+ text-decoration: line-through;
+ }
+ }
+
+ &[data-slot="payment-receipt"] {
+ span {
+ display: inline-block;
+ padding: var(--space-3) var(--space-4);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ }
+
+ button {
+ font-size: var(--font-size-sm);
+ }
+ }
+ }
+
+ tbody tr {
+ &:last-child td {
+ border-bottom: none;
+ }
+ }
+
+ @media (max-width: 40rem) {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+
+ th {
+ &:nth-child(2)
+
+ /* Payment ID */ {
+ display: none;
+ }
+ }
+
+ td {
+ &:nth-child(2)
+
+ /* Payment ID */ {
+ display: none;
+ }
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx
new file mode 100644
index 0000000..6da5c42
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx
@@ -0,0 +1,141 @@
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { query, action, useParams, createAsync, useAction } from "@solidjs/router"
+import { For, Match, Show, Switch } from "solid-js"
+import { withActor } from "~/context/auth.withActor"
+import { formatDateUTC, formatDateForTable } from "../../common"
+import styles from "./payment-section.module.css"
+import { useI18n } from "~/context/i18n"
+
+function money(amount: number, currency?: string) {
+ const formatter =
+ currency === "inr"
+ ? new Intl.NumberFormat("en-IN", { style: "currency", currency: "INR" })
+ : new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" })
+ return formatter.format(amount / 100_000_000)
+}
+
+const getPaymentsInfo = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ return await Billing.payments()
+ }, workspaceID)
+}, "payment.list")
+
+const downloadReceipt = action(async (workspaceID: string, paymentID: string) => {
+ "use server"
+ return withActor(() => Billing.generateReceiptUrl({ paymentID }), workspaceID)
+}, "receipt.download")
+
+export function PaymentSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const payments = createAsync(() => getPaymentsInfo(params.id!))
+ const downloadReceiptAction = useAction(downloadReceipt)
+
+ // DUMMY DATA FOR TESTING
+ // const payments = () => [
+ // {
+ // id: "pi_3QK1x2FT9vXn4A6r1234567890",
+ // paymentID: "pi_3QK1x2FT9vXn4A6r1234567890",
+ // timeCreated: new Date(Date.now() - 86400000 * 1).toISOString(), // 1 day ago
+ // amount: 2100000000, // $21.00 ($20 + $1 fee)
+ // },
+ // {
+ // id: "pi_3QJ8k7FT9vXn4A6r0987654321",
+ // paymentID: "pi_3QJ8k7FT9vXn4A6r0987654321",
+ // timeCreated: new Date(Date.now() - 86400000 * 15).toISOString(), // 15 days ago
+ // amount: 2100000000, // $21.00
+ // },
+ // {
+ // id: "pi_3QI5m1FT9vXn4A6r5678901234",
+ // paymentID: "pi_3QI5m1FT9vXn4A6r5678901234",
+ // timeCreated: new Date(Date.now() - 86400000 * 32).toISOString(), // 32 days ago
+ // amount: 2100000000, // $21.00
+ // },
+ // {
+ // id: "pi_3QH2n9FT9vXn4A6r3456789012",
+ // paymentID: "pi_3QH2n9FT9vXn4A6r3456789012",
+ // timeCreated: new Date(Date.now() - 86400000 * 47).toISOString(), // 47 days ago
+ // amount: 2100000000, // $21.00
+ // },
+ // {
+ // id: "pi_3QG7p4FT9vXn4A6r7890123456",
+ // paymentID: "pi_3QG7p4FT9vXn4A6r7890123456",
+ // timeCreated: new Date(Date.now() - 86400000 * 63).toISOString(), // 63 days ago
+ // amount: 2100000000, // $21.00
+ // },
+ // ]
+
+ return (
+ 0}>
+
+
+
{i18n.t("workspace.payments.title")}
+
{i18n.t("workspace.payments.subtitle")}
+
+
+
+
+
+ {i18n.t("workspace.payments.table.date")}
+ {i18n.t("workspace.payments.table.paymentId")}
+ {i18n.t("workspace.payments.table.amount")}
+ {i18n.t("workspace.payments.table.receipt")}
+
+
+
+
+ {(payment) => {
+ const date = new Date(payment.timeCreated)
+ const amount =
+ payment.enrichment?.type === "subscription" && payment.enrichment.couponID ? 0 : payment.amount
+ const currency =
+ payment.enrichment?.type === "subscription" || payment.enrichment?.type === "lite"
+ ? payment.enrichment.currency
+ : undefined
+ return (
+
+
+ {formatDateForTable(date)}
+
+ {payment.id}
+
+ {money(amount, currency)}
+
+
+ {" "}
+ ({i18n.t("workspace.payments.type.credit")})
+
+
+ ({i18n.t("workspace.payments.type.subscription")})
+
+
+
+
+ {payment.paymentID ? (
+ {
+ const receiptUrl = await downloadReceiptAction(params.id!, payment.paymentID!)
+ if (receiptUrl) {
+ window.open(receiptUrl, "_blank")
+ }
+ }}
+ data-slot="receipt-button"
+ >
+ {i18n.t("workspace.payments.view")}
+
+ ) : (
+ -
+ )}
+
+
+ )
+ }}
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/redeem-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/redeem-section.module.css
new file mode 100644
index 0000000..42140e4
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/redeem-section.module.css
@@ -0,0 +1,61 @@
+.root {
+ [data-slot="redeem-container"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ min-width: 20rem;
+ width: fit-content;
+
+ @media (max-width: 30rem) {
+ width: 100%;
+ }
+ }
+
+ [data-slot="redeem-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+
+ [data-slot="input-row"] {
+ display: flex;
+ gap: var(--space-2);
+ align-items: stretch;
+
+ @media (max-width: 30rem) {
+ flex-direction: column;
+ }
+ }
+
+ input {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-mono);
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ }
+
+ [data-slot="form-success"] {
+ color: var(--color-success, var(--color-accent));
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/redeem-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/redeem-section.tsx
new file mode 100644
index 0000000..872e895
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/redeem-section.tsx
@@ -0,0 +1,71 @@
+import { json, action, useParams, useSubmission } from "@solidjs/router"
+import { Show } from "solid-js"
+import { withActor } from "~/context/auth.withActor"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { User } from "@opencode-ai/console-core/user.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { CouponType } from "@opencode-ai/console-core/schema/billing.sql.js"
+import styles from "./redeem-section.module.css"
+import { queryBillingInfo } from "../../common"
+import { useI18n } from "~/context/i18n"
+import { formError, localizeError } from "~/lib/form-error"
+
+const redeem = action(async (form: FormData) => {
+ "use server"
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const code = (form.get("code") as string | null)?.trim().toUpperCase()
+ if (!code) return { error: "Coupon code is required." }
+ if (!(CouponType as readonly string[]).includes(code)) return { error: "Invalid coupon code." }
+
+ return json(
+ await withActor(async () => {
+ const actor = Actor.assert("user")
+ const email = await User.getAuthEmail(actor.properties.userID)
+ if (!email) return { error: "No email on account." }
+ return Billing.redeemCoupon(email, code as (typeof CouponType)[number])
+ .then(() => ({ error: undefined, data: true }))
+ .catch((e) => ({ error: e.message as string }))
+ }, workspaceID),
+ { revalidate: queryBillingInfo.key },
+ )
+}, "billing.redeemCoupon")
+
+export function RedeemSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const submission = useSubmission(redeem)
+
+ return (
+
+
+
{i18n.t("workspace.redeem.title")}
+
{i18n.t("workspace.redeem.subtitle")}
+
+
+
+
+
+
+ {submission.pending ? i18n.t("workspace.redeem.redeeming") : i18n.t("workspace.redeem.redeem")}
+
+
+
+ {(err: any) => {localizeError(i18n.t, err())}
}
+
+
+ {i18n.t("workspace.redeem.success")}
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/reload-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/reload-section.module.css
new file mode 100644
index 0000000..e37bad6
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/reload-section.module.css
@@ -0,0 +1,261 @@
+.root {
+ [data-slot="title-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ [data-slot="section-content"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ }
+
+ [data-slot="setting-row"] {
+ display: flex;
+ align-items: center;
+ gap: var(--space-3);
+
+ p {
+ flex: 1;
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ color: var(--color-text-secondary);
+ margin: 0;
+
+ b {
+ font-weight: 600;
+ }
+ }
+
+ [data-slot="create-form"] {
+ margin: 0;
+ }
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ margin-top: var(--space-4);
+
+ [data-slot="form-field"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+
+ label {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+
+ [data-slot="field-label"] {
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="toggle-container"] {
+ display: flex;
+ align-items: center;
+ }
+
+ input[data-component="input"] {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-mono);
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+ }
+
+ [data-slot="input-row"] {
+ display: flex;
+ flex-direction: row;
+ gap: var(--space-3);
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+ }
+
+ [data-slot="input-field"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+ flex: 1;
+
+ p {
+ line-height: 1.2;
+ margin: 0;
+ color: var(--color-text-muted);
+ font-size: var(--font-size-sm);
+ }
+
+ input[data-component="input"] {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ min-width: 0;
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ background-color: var(--color-bg-surface);
+ }
+ }
+
+ [data-slot="field-with-connector"] {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+
+ [data-slot="field-connector"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ white-space: nowrap;
+ }
+
+ input[data-component="input"] {
+ flex: 1;
+ min-width: 80px;
+ }
+ }
+ }
+
+ [data-slot="form-actions"] {
+ display: flex;
+ gap: var(--space-2);
+ margin-top: var(--space-1);
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ margin-top: calc(var(--space-1) * -1);
+ }
+
+ [data-slot="model-toggle-label"] {
+ position: relative;
+ display: inline-block;
+ width: 2.5rem;
+ height: 1.5rem;
+ cursor: pointer;
+
+ input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+ }
+
+ span {
+ position: absolute;
+ inset: 0;
+ background-color: #ccc;
+ border: 1px solid #bbb;
+ border-radius: 1.5rem;
+ transition: all 0.3s ease;
+ cursor: pointer;
+
+ &::before {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 0.125rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ background-color: white;
+ border: 1px solid #ddd;
+ border-radius: 50%;
+ transform: translateY(-50%);
+ transition: all 0.3s ease;
+ }
+ }
+
+ input:checked + span {
+ background-color: #21ad0e;
+ border-color: #148605;
+
+ &::before {
+ transform: translateX(1rem) translateY(-50%);
+ }
+ }
+
+ &:hover span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.2);
+ }
+
+ input:checked:hover + span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.3);
+ }
+
+ &:has(input:disabled) {
+ cursor: not-allowed;
+ }
+
+ input:disabled + span {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+ }
+
+ [data-slot="reload-error"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-4);
+ margin-top: var(--space-4);
+
+ p {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ margin: 0;
+ flex: 1;
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ gap: var(--space-2);
+ margin: 0;
+ flex-shrink: 0;
+ padding: 0;
+ border: none;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx
new file mode 100644
index 0000000..c9a72c0
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx
@@ -0,0 +1,220 @@
+import { json, action, useParams, createAsync, useSubmission } from "@solidjs/router"
+import { createEffect, Show, createMemo } from "solid-js"
+import { createStore } from "solid-js/store"
+import { withActor } from "~/context/auth.withActor"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js"
+import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import styles from "./reload-section.module.css"
+import { queryBillingInfo } from "../../common"
+import { useI18n } from "~/context/i18n"
+import { formError, formErrorReloadAmountMin, formErrorReloadTriggerMin, localizeError } from "~/lib/form-error"
+
+const reload = action(async (form: FormData) => {
+ "use server"
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(await withActor(() => Billing.reload(), workspaceID), {
+ revalidate: queryBillingInfo.key,
+ })
+}, "billing.reload")
+
+const setReload = action(async (form: FormData) => {
+ "use server"
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const reloadValue = (form.get("reload") as string | null) === "true"
+ const amountStr = form.get("reloadAmount") as string | null
+ const triggerStr = form.get("reloadTrigger") as string | null
+
+ const reloadAmount = amountStr && amountStr.trim() !== "" ? parseInt(amountStr) : null
+ const reloadTrigger = triggerStr && triggerStr.trim() !== "" ? parseInt(triggerStr) : null
+
+ if (reloadValue) {
+ if (reloadAmount === null || reloadAmount < Billing.RELOAD_AMOUNT_MIN)
+ return { error: formErrorReloadAmountMin(Billing.RELOAD_AMOUNT_MIN) }
+ if (reloadTrigger === null || reloadTrigger < Billing.RELOAD_TRIGGER_MIN)
+ return { error: formErrorReloadTriggerMin(Billing.RELOAD_TRIGGER_MIN) }
+ }
+
+ return json(
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ reload: reloadValue,
+ ...(reloadAmount !== null ? { reloadAmount } : {}),
+ ...(reloadTrigger !== null ? { reloadTrigger } : {}),
+ ...(reloadValue
+ ? {
+ reloadError: null,
+ timeReloadError: null,
+ }
+ : {}),
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+ ),
+ { revalidate: queryBillingInfo.key },
+ )
+}, "billing.setReload")
+
+export function ReloadSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const billingInfo = createAsync(() => queryBillingInfo(params.id!))
+ const setReloadSubmission = useSubmission(setReload)
+ const reloadSubmission = useSubmission(reload)
+ const [store, setStore] = createStore({
+ show: false,
+ reload: false,
+ reloadAmount: "",
+ reloadTrigger: "",
+ })
+
+ const processingFee = createMemo(() => {
+ const reloadAmount = billingInfo()?.reloadAmount
+ if (!reloadAmount) return "0.00"
+ return (((reloadAmount + 0.3) / 0.956) * 0.044 + 0.3).toFixed(2)
+ })
+
+ createEffect(() => {
+ if (!setReloadSubmission.pending && setReloadSubmission.result && !(setReloadSubmission.result as any).error) {
+ setStore("show", false)
+ }
+ })
+
+ function show() {
+ while (true) {
+ setReloadSubmission.clear()
+ if (!setReloadSubmission.result) break
+ }
+ const info = billingInfo()!
+ setStore("show", true)
+ setStore("reload", true)
+ setStore("reloadAmount", String(info.reloadAmount))
+ setStore("reloadTrigger", String(info.reloadTrigger))
+ }
+
+ function hide() {
+ setStore("show", false)
+ }
+
+ return (
+
+
+
{i18n.t("workspace.reload.title")}
+
+
+ {i18n.t("workspace.reload.disabled.before")} {i18n.t("workspace.reload.disabled.state")} .{" "}
+ {i18n.t("workspace.reload.disabled.after")}
+
+ }
+ >
+
+ {i18n.t("workspace.reload.enabled.before")} {i18n.t("workspace.reload.enabled.state")} .{" "}
+ {i18n.t("workspace.reload.enabled.middle")} ${billingInfo()?.reloadAmount} (+${processingFee()}{" "}
+ {i18n.t("workspace.reload.processingFee")}) {i18n.t("workspace.reload.enabled.after")}{" "}
+ ${billingInfo()?.reloadTrigger} .
+
+
+
show()}>
+ {billingInfo()?.reload ? i18n.t("workspace.reload.edit") : i18n.t("workspace.reload.enable")}
+
+
+
+
+
+
+
+ {i18n.t("workspace.reload.enableAutoReload")}
+
+
+ setStore("reload", e.currentTarget.checked)}
+ />
+
+
+
+
+
+
+
+
+
{i18n.t("workspace.reload.reloadAmount")}
+
setStore("reloadAmount", e.currentTarget.value)}
+ placeholder={String(billingInfo()?.reloadAmount ?? "")}
+ disabled={!store.reload}
+ />
+
+
+
{i18n.t("workspace.reload.whenBalanceReaches")}
+
setStore("reloadTrigger", e.currentTarget.value)}
+ placeholder={String(billingInfo()?.reloadTrigger ?? "")}
+ disabled={!store.reload}
+ />
+
+
+
+
+ {(err: any) => {localizeError(i18n.t, err())}
}
+
+
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+ {setReloadSubmission.pending ? i18n.t("workspace.reload.saving") : i18n.t("workspace.reload.save")}
+
+
+
+
+
+
+
+
+ {i18n.t("workspace.reload.failedAt")}{" "}
+ {billingInfo()?.timeReloadError!.toLocaleString(undefined, {
+ month: "short",
+ day: "numeric",
+ hour: "numeric",
+ minute: "2-digit",
+ second: "2-digit",
+ })}
+ . {i18n.t("workspace.reload.reason")}{" "}
+ {localizeError(i18n.t, billingInfo()?.reloadError ?? undefined).replace(/\.$/, "")}.{" "}
+ {i18n.t("workspace.reload.updatePaymentMethod")}
+
+
+
+
+ {reloadSubmission.pending ? i18n.t("workspace.reload.retrying") : i18n.t("workspace.reload.retry")}
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/go/index.tsx b/packages/console/app/src/routes/workspace/[id]/go/index.tsx
new file mode 100644
index 0000000..c73aae7
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/go/index.tsx
@@ -0,0 +1,39 @@
+import { createAsync, useParams } from "@solidjs/router"
+import { Show } from "solid-js"
+import { IconGo } from "~/component/icon"
+import { GoReferralSection, queryGoReferral } from "~/component/go-referral"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { LiteSection, queryLiteSubscription } from "./lite-section"
+
+export default function () {
+ const params = useParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const referral = createAsync(() => queryGoReferral(params.id!))
+ const lite = createAsync(() => queryLiteSubscription(params.id!))
+
+ return (
+
+
+
+
+
+ {i18n.t("workspace.lite.loading")}}>
+ {(summary) => }
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/go/lite-section.module.css b/packages/console/app/src/routes/workspace/[id]/go/lite-section.module.css
new file mode 100644
index 0000000..5e598ee
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/go/lite-section.module.css
@@ -0,0 +1,234 @@
+.root {
+ [data-slot="title-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ [data-slot="usage"] {
+ display: flex;
+ gap: var(--space-6);
+ margin-top: var(--space-4);
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: var(--space-4);
+ }
+ }
+
+ [data-slot="usage-item"] {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+
+ [data-slot="usage-header"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ }
+
+ [data-slot="usage-label"] {
+ font-size: var(--font-size-md);
+ font-weight: 500;
+ color: var(--color-text);
+ }
+
+ [data-slot="usage-value"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="progress"] {
+ height: 8px;
+ background-color: var(--color-bg-surface);
+ border-radius: var(--border-radius-sm);
+ overflow: hidden;
+ }
+
+ [data-slot="progress-bar"] {
+ height: 100%;
+ background-color: var(--color-accent);
+ border-radius: var(--border-radius-sm);
+ transition: width 0.3s ease;
+ }
+
+ [data-slot="reset-time"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="setting-row"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-3);
+ margin-top: var(--space-4);
+
+ p {
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ color: var(--color-text-secondary);
+ margin: 0;
+ }
+ }
+
+ [data-slot="toggle-label"] {
+ position: relative;
+ display: inline-block;
+ width: 2.5rem;
+ height: 1.5rem;
+ cursor: pointer;
+ flex-shrink: 0;
+
+ input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+ }
+
+ span {
+ position: absolute;
+ inset: 0;
+ background-color: #ccc;
+ border: 1px solid #bbb;
+ border-radius: 1.5rem;
+ transition: all 0.3s ease;
+ cursor: pointer;
+
+ &::before {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 0.125rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ background-color: white;
+ border: 1px solid #ddd;
+ border-radius: 50%;
+ transform: translateY(-50%);
+ transition: all 0.3s ease;
+ }
+ }
+
+ input:checked + span {
+ background-color: #21ad0e;
+ border-color: #148605;
+
+ &::before {
+ transform: translateX(1rem) translateY(-50%);
+ }
+ }
+
+ &:hover span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.2);
+ }
+
+ input:checked:hover + span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.3);
+ }
+
+ &:has(input:disabled) {
+ cursor: not-allowed;
+ }
+
+ input:disabled + span {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+
+ [data-slot="beta-notice"] {
+ padding: var(--space-3) var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg-surface);
+ font-size: var(--font-size-sm);
+ color: var(--color-text-secondary);
+ line-height: 1.5;
+ margin-top: var(--space-3);
+
+ a {
+ color: var(--color-accent);
+ text-decoration: none;
+ }
+ }
+
+ [data-slot="other-message"] {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ line-height: 1.5;
+ }
+
+ [data-slot="promo-description"] {
+ font-size: var(--font-size-md);
+ color: var(--color-text-secondary);
+ line-height: 1.5;
+ margin-top: var(--space-2);
+
+ strong {
+ color: var(--color-text);
+ font-weight: 600;
+ }
+ }
+
+ [data-slot="promo-models-title"] {
+ font-size: var(--font-size-md);
+ font-weight: 600;
+ margin-top: var(--space-4);
+ }
+
+ [data-slot="promo-models"] {
+ margin: var(--space-2) 0 0 var(--space-4);
+ padding: 0;
+ font-size: var(--font-size-md);
+ color: var(--color-text-secondary);
+ line-height: 1.4;
+ }
+
+ [data-slot="subscribe-actions"] {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+ margin-top: var(--space-4);
+ }
+
+ [data-slot="subscribe-button"] {
+ align-self: stretch;
+ }
+
+ [data-slot="other-methods"] {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--space-2);
+ }
+
+ [data-slot="other-methods-icons"] {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ }
+}
+
+.paymentMethodModal {
+ [data-slot="modal-actions"] {
+ display: flex;
+ gap: var(--space-3);
+ margin-top: var(--space-4);
+
+ button {
+ flex: 1;
+ }
+ }
+
+ [data-slot="method-button"] {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ gap: var(--space-2);
+ height: 48px;
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx b/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx
new file mode 100644
index 0000000..553ff10
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx
@@ -0,0 +1,340 @@
+import { action, useParams, useAction, useSubmission, json, query, createAsync } from "@solidjs/router"
+import { createStore } from "solid-js/store"
+import { createMemo, For, Show } from "solid-js"
+import { Modal } from "~/component/modal"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { Database, eq, and, isNull } from "@opencode-ai/console-core/drizzle/index.js"
+import { BillingTable, LiteTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { Subscription } from "@opencode-ai/console-core/subscription.js"
+import { LiteData } from "@opencode-ai/console-core/lite.js"
+import { withActor } from "~/context/auth.withActor"
+import { queryBillingInfo } from "../../common"
+import styles from "./lite-section.module.css"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { formError } from "~/lib/form-error"
+import { formatResetTime, liteResetTimeKeys } from "~/lib/format-reset-time"
+import { createReferralFromCookie } from "~/lib/referral-invite"
+
+import { IconAlipay, IconUpi } from "~/component/icon"
+
+export const queryLiteSubscription = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ const row = await Database.use((tx) =>
+ tx
+ .select({
+ userID: LiteTable.userID,
+ rollingUsage: LiteTable.rollingUsage,
+ weeklyUsage: LiteTable.weeklyUsage,
+ monthlyUsage: LiteTable.monthlyUsage,
+ timeRollingUpdated: LiteTable.timeRollingUpdated,
+ timeWeeklyUpdated: LiteTable.timeWeeklyUpdated,
+ timeMonthlyUpdated: LiteTable.timeMonthlyUpdated,
+ timeCreated: LiteTable.timeCreated,
+ lite: BillingTable.lite,
+ })
+ .from(BillingTable)
+ .innerJoin(LiteTable, eq(LiteTable.workspaceID, BillingTable.workspaceID))
+ .where(and(eq(LiteTable.workspaceID, Actor.workspace()), isNull(LiteTable.timeDeleted)))
+ .then((r) => r[0]),
+ )
+ if (!row) return null
+
+ const limits = LiteData.getLimits()
+ const mine = row.userID === Actor.userID()
+
+ return {
+ mine,
+ useBalance: row.lite?.useBalance ?? false,
+ rollingUsage: Subscription.analyzeRollingUsage({
+ limit: limits.rollingLimit,
+ window: limits.rollingWindow,
+ usage: row.rollingUsage ?? 0,
+ timeUpdated: row.timeRollingUpdated ?? new Date(),
+ }),
+ weeklyUsage: Subscription.analyzeWeeklyUsage({
+ limit: limits.weeklyLimit,
+ usage: row.weeklyUsage ?? 0,
+ timeUpdated: row.timeWeeklyUpdated ?? new Date(),
+ }),
+ monthlyUsage: Subscription.analyzeMonthlyUsage({
+ limit: limits.monthlyLimit,
+ usage: row.monthlyUsage ?? 0,
+ timeUpdated: row.timeMonthlyUpdated ?? new Date(),
+ timeSubscribed: row.timeCreated,
+ }),
+ }
+ }, workspaceID)
+}, "lite.subscription.get")
+
+type LiteSubscription = Awaited>
+
+const createLiteCheckoutUrl = action(
+ async (workspaceID: string, successUrl: string, cancelUrl: string, method?: "alipay" | "upi") => {
+ "use server"
+ return json(
+ await withActor(async () => {
+ const data = await Billing.generateLiteCheckoutUrl({ successUrl, cancelUrl, method })
+ await createReferralFromCookie()
+ return { error: undefined, data }
+ }, workspaceID).catch((e) => ({
+ error: e.message as string,
+ data: undefined,
+ })),
+ { revalidate: [queryBillingInfo.key, queryLiteSubscription.key] },
+ )
+ },
+ "liteCheckoutUrl",
+)
+
+const createSessionUrl = action(async (workspaceID: string, returnUrl: string) => {
+ "use server"
+ return json(
+ await withActor(
+ () =>
+ Billing.generateSessionUrl({ returnUrl })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({
+ error: e.message as string,
+ data: undefined,
+ })),
+ workspaceID,
+ ),
+ { revalidate: [queryBillingInfo.key, queryLiteSubscription.key] },
+ )
+}, "liteSessionUrl")
+
+const setLiteUseBalance = action(async (form: FormData) => {
+ "use server"
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const useBalance = (form.get("useBalance") as string | null) === "true"
+
+ return json(
+ await withActor(async () => {
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ lite: useBalance ? { useBalance: true } : {},
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+ )
+ return { error: undefined }
+ }, workspaceID).catch((e) => ({ error: e.message as string })),
+ { revalidate: [queryBillingInfo.key, queryLiteSubscription.key] },
+ )
+}, "setLiteUseBalance")
+
+function LiteUsageItem(props: { label: string; usage: { usagePercent: number; resetInSec: number } }) {
+ const i18n = useI18n()
+
+ return (
+
+
+ {props.label}
+ {props.usage.usagePercent}%
+
+
+
+ {i18n.t("workspace.lite.subscription.resetsIn")}{" "}
+ {formatResetTime(props.usage.resetInSec, i18n, liteResetTimeKeys)}
+
+
+ )
+}
+
+export function LiteSection(props: { lite: LiteSubscription | undefined }) {
+ const params = useParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const billingInfo = createAsync(() => queryBillingInfo(params.id!))
+ const isBlack = createMemo(() => billingInfo()?.subscriptionID || billingInfo()?.timeSubscriptionBooked)
+ const sessionAction = useAction(createSessionUrl)
+ const sessionSubmission = useSubmission(createSessionUrl)
+ const checkoutAction = useAction(createLiteCheckoutUrl)
+ const checkoutSubmission = useSubmission(createLiteCheckoutUrl)
+ const useBalanceSubmission = useSubmission(setLiteUseBalance)
+ const [store, setStore] = createStore({
+ loading: undefined as undefined | "session" | "checkout" | "alipay" | "upi",
+ showModal: false,
+ })
+
+ const busy = createMemo(() => !!store.loading)
+
+ async function onClickSession() {
+ setStore("loading", "session")
+ const result = await sessionAction(params.id!, window.location.href)
+ if (result.data) {
+ window.location.href = result.data
+ return
+ }
+ setStore("loading", undefined)
+ }
+
+ async function onClickSubscribe(method?: "alipay" | "upi") {
+ setStore("loading", method ?? "checkout")
+ const result = await checkoutAction(params.id!, window.location.href, window.location.href, method)
+ if (result.data) {
+ window.location.href = result.data
+ return
+ }
+ setStore("loading", undefined)
+ }
+
+ return (
+ <>
+
+
+ {i18n.t("workspace.lite.black.message")}
+
+
+
+ {(sub) => (
+
+
+
+
{i18n.t("workspace.lite.subscription.message")}
+
+ {store.loading === "session"
+ ? i18n.t("workspace.lite.loading")
+ : i18n.t("workspace.lite.subscription.manage")}
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("workspace.lite.subscription.useBalance")}
+
+
+
+ e.currentTarget.form?.requestSubmit()}
+ />
+
+
+
+
+ )}
+
+
+
+ {i18n.t("workspace.lite.other.message")}
+
+
+
+
+
+
+ {(part) => {
+ if (part === "{{price}}") return {i18n.t("workspace.lite.promo.price")}
+ return part
+ }}
+
+
+ {i18n.t("workspace.lite.promo.modelsTitle")}
+
+ Kimi K2.5
+ Kimi K2.6
+ GLM-5
+ GLM-5.1
+ MiMo-V2.5-Pro
+ MiMo-V2.5
+ MiniMax M2.5
+ MiniMax M2.7
+ MiniMax M3
+ Qwen3.6 Plus
+ Qwen3.7 Plus
+ Qwen3.7 Max
+ DeepSeek V4 Pro
+ DeepSeek V4 Flash
+
+ {i18n.t("workspace.lite.promo.footer")}
+
+ onClickSubscribe()}
+ >
+ {store.loading === "checkout"
+ ? i18n.t("workspace.lite.promo.subscribing")
+ : i18n.t("workspace.lite.promo.subscribe")}
+
+ setStore("showModal", true)}
+ >
+ {i18n.t("workspace.lite.promo.otherMethods")}
+
+
+
+
+
+
+
+
+ setStore("showModal", false)}
+ title={i18n.t("workspace.lite.promo.selectMethod")}
+ >
+
+
+ onClickSubscribe("alipay")}
+ >
+
+
+
+ {store.loading === "alipay" ? i18n.t("workspace.lite.promo.subscribing") : "Alipay"}
+
+ onClickSubscribe("upi")}
+ >
+
+
+
+ {store.loading === "upi" ? i18n.t("workspace.lite.promo.subscribing") : "UPI"}
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/index.tsx b/packages/console/app/src/routes/workspace/[id]/index.tsx
new file mode 100644
index 0000000..b5c597b
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/index.tsx
@@ -0,0 +1,81 @@
+import { Show, createMemo } from "solid-js"
+import { createStore } from "solid-js/store"
+import { createAsync, useParams, useAction, useSubmission } from "@solidjs/router"
+import { NewUserSection } from "./new-user-section"
+import { ModelSection } from "./model-section"
+import { ProviderSection } from "./provider-section"
+import { IconZen } from "~/component/icon"
+import { querySessionInfo, queryBillingInfo, createCheckoutUrl, formatBalance } from "../common"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+
+export default function () {
+ const params = useParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const userInfo = createAsync(() => querySessionInfo(params.id!))
+ const billingInfo = createAsync(() => queryBillingInfo(params.id!))
+ const checkoutAction = useAction(createCheckoutUrl)
+ const checkoutSubmission = useSubmission(createCheckoutUrl)
+ const [store, setStore] = createStore({
+ checkoutRedirecting: false,
+ })
+ const balance = createMemo(() => formatBalance(billingInfo()?.balance ?? 0))
+
+ async function onClickCheckout() {
+ const baseUrl = window.location.href
+ const checkout = await checkoutAction(params.id!, billingInfo()!.reloadAmount, baseUrl, baseUrl)
+ if (checkout && checkout.data) {
+ setStore("checkoutRedirecting", true)
+ window.location.href = checkout.data
+ }
+ }
+
+ return (
+
+
+
+
+
+ {i18n.t("workspace.home.banner.beforeLink")}{" "}
+
+ {i18n.t("common.learnMore")}
+
+ .
+
+
+
+
+ {checkoutSubmission.pending || store.checkoutRedirecting
+ ? i18n.t("workspace.home.billing.loading")
+ : i18n.t("workspace.home.billing.enable")}
+
+ }
+ >
+
+ {i18n.t("workspace.home.billing.currentBalance")} ${balance()}
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/keys/index.tsx b/packages/console/app/src/routes/workspace/[id]/keys/index.tsx
new file mode 100644
index 0000000..367c4e4
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/keys/index.tsx
@@ -0,0 +1,11 @@
+import { KeySection } from "./key-section"
+
+export default function () {
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/keys/key-section.module.css b/packages/console/app/src/routes/workspace/[id]/keys/key-section.module.css
new file mode 100644
index 0000000..5705549
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/keys/key-section.module.css
@@ -0,0 +1,197 @@
+.root {
+ [data-slot="title-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ [data-component="empty-state"] {
+ padding: var(--space-20) var(--space-6);
+ text-align: center;
+ border: 1px dashed var(--color-border);
+ border-radius: var(--border-radius-sm);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+
+ p {
+ line-height: 1.5;
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+
+ [data-slot="input-container"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+ }
+
+ @media (max-width: 30rem) {
+ gap: var(--space-2);
+ }
+
+ input {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-mono);
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+
+ [data-slot="form-actions"] {
+ display: flex;
+ gap: var(--space-2);
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ margin-top: var(--space-1);
+ line-height: 1.4;
+ }
+ }
+
+ [data-slot="api-keys-table"] {
+ overflow-x: auto;
+ }
+
+ [data-slot="api-keys-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="key-name"] {
+ color: var(--color-text);
+ font-family: var(--font-sans);
+ font-weight: 500;
+ }
+
+ &[data-slot="key-value"] {
+ font-family: var(--font-mono);
+
+ button {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ padding: var(--space-2) var(--space-3);
+ margin-left: calc(-1 * var(--space-3));
+ font-size: var(--font-size-sm);
+ font-weight: 400;
+ border: none;
+ background-color: transparent;
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+ border-radius: var(--border-radius-sm);
+ cursor: pointer;
+ transition: all 0.15s ease;
+ text-transform: none;
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-bg-surface);
+ color: var(--color-text);
+ }
+
+ &:disabled {
+ cursor: default;
+ color: var(--color-text);
+ }
+
+ span {
+ font-family: inherit;
+ }
+ }
+ }
+
+ &[data-slot="key-date"] {
+ color: var(--color-text);
+ }
+
+ &[data-slot="key-actions"] {
+ font-family: var(--font-sans);
+
+ button {
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.15s ease;
+ }
+ }
+ }
+
+ tbody tr {
+ &:hover {
+ [data-slot="key-actions"] button {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ &:last-child td {
+ border-bottom: none;
+ }
+ }
+
+ @media (max-width: 40rem) {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+
+ th {
+ &:nth-child(3)
+
+ /* Date */ {
+ display: none;
+ }
+ }
+
+ td {
+ &:nth-child(3)
+
+ /* Date */ {
+ display: none;
+ }
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx b/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx
new file mode 100644
index 0000000..09c67f2
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx
@@ -0,0 +1,174 @@
+import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router"
+import { createEffect, createSignal, For, Show } from "solid-js"
+import { IconCopy, IconCheck } from "~/component/icon"
+import { Key } from "@opencode-ai/console-core/key.js"
+import { withActor } from "~/context/auth.withActor"
+import { createStore } from "solid-js/store"
+import styles from "./key-section.module.css"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { useI18n } from "~/context/i18n"
+import { formError, localizeError } from "~/lib/form-error"
+
+const removeKey = action(async (form: FormData) => {
+ "use server"
+ const id = form.get("id") as string | null
+ if (!id) return { error: formError.idRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(await withActor(() => Key.remove({ id }), workspaceID), { revalidate: listKeys.key })
+}, "key.remove")
+
+const createKey = action(async (form: FormData) => {
+ "use server"
+ const name = (form.get("name") as string | null)?.trim()
+ if (!name) return { error: formError.nameRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(
+ await withActor(
+ () =>
+ Key.create({
+ userID: Actor.assert("user").properties.userID,
+ name,
+ })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ { revalidate: listKeys.key },
+ )
+}, "key.create")
+
+const listKeys = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(() => Key.list(), workspaceID)
+}, "key.list")
+
+export function KeySection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const keys = createAsync(() => listKeys(params.id!))
+ const submission = useSubmission(createKey)
+ const [store, setStore] = createStore({ show: false })
+
+ let input: HTMLInputElement
+
+ createEffect(() => {
+ if (!submission.pending && submission.result && !submission.result.error) {
+ setStore("show", false)
+ }
+ })
+
+ function show() {
+ while (true) {
+ submission.clear()
+ if (!submission.result) break
+ }
+ setStore("show", true)
+ setTimeout(() => input?.focus(), 0)
+ }
+
+ function hide() {
+ setStore("show", false)
+ }
+
+ return (
+
+
+
{i18n.t("workspace.keys.title")}
+
+
{i18n.t("workspace.keys.subtitle")}
+
show()}>
+ {i18n.t("workspace.keys.create")}
+
+
+
+
+
+
+
(input = r)}
+ data-component="input"
+ name="name"
+ type="text"
+ placeholder={i18n.t("workspace.keys.placeholder")}
+ />
+
+ {(err) => {localizeError(i18n.t, err())}
}
+
+
+
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+ {submission.pending ? i18n.t("common.creating") : i18n.t("common.create")}
+
+
+
+
+
+
+ {i18n.t("workspace.keys.empty")}
+
+ }
+ >
+
+
+
+ {i18n.t("workspace.keys.table.name")}
+ {i18n.t("workspace.keys.table.key")}
+ {i18n.t("workspace.keys.table.createdBy")}
+
+
+
+
+
+ {(key) => {
+ const [copied, setCopied] = createSignal(false)
+ // const submission = useSubmission(removeKey, ([fd]) => fd.get("id")?.toString() === key.id)
+ return (
+
+ {key.name}
+
+ {key.keyDisplay}}>
+ {
+ await navigator.clipboard.writeText(key.key!)
+ setCopied(true)
+ setTimeout(() => setCopied(false), 1000)
+ }}
+ title={i18n.t("workspace.keys.copyApiKey")}
+ >
+ {key.keyDisplay}
+ }>
+
+
+
+
+
+ {key.email}
+
+
+
+
+ {i18n.t("workspace.keys.delete")}
+
+
+
+ )
+ }}
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/members/index.tsx b/packages/console/app/src/routes/workspace/[id]/members/index.tsx
new file mode 100644
index 0000000..51e07b7
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/members/index.tsx
@@ -0,0 +1,11 @@
+import { MemberSection } from "./member-section"
+
+export default function () {
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/members/member-section.module.css b/packages/console/app/src/routes/workspace/[id]/members/member-section.module.css
new file mode 100644
index 0000000..a3ff0c2
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/members/member-section.module.css
@@ -0,0 +1,249 @@
+.root {
+ [data-slot="title-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ [data-component="empty-state"] {
+ padding: var(--space-20) var(--space-6);
+ text-align: center;
+ border: 1px dashed var(--color-border);
+ border-radius: var(--border-radius-sm);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+
+ p {
+ line-height: 1.5;
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+ }
+
+ [data-slot="beta-notice"] {
+ padding: var(--space-3) var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg-surface);
+ font-size: var(--font-size-sm);
+ color: var(--color-text-secondary);
+ line-height: 1.5;
+ margin-bottom: var(--space-3);
+
+ a {
+ color: var(--color-accent);
+ text-decoration: none;
+ }
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+
+ [data-slot="input-row"] {
+ display: flex;
+ flex-direction: row;
+ gap: var(--space-3);
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: var(--space-2);
+ }
+ }
+
+ [data-slot="input-field"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+ flex: 1;
+
+ p {
+ line-height: 1.2;
+ margin: 0;
+ color: var(--color-text-muted);
+ font-size: var(--font-size-sm);
+ }
+
+ input {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ min-width: 0;
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+ }
+
+ [data-slot="form-actions"] {
+ display: flex;
+ gap: var(--space-2);
+
+ > button[type="reset"] {
+ align-self: flex-start;
+ }
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ margin-top: calc(var(--space-1) * -1);
+ }
+ }
+
+ [data-slot="members-table"] {
+ overflow-x: auto;
+ padding-bottom: 200px;
+ margin-bottom: -200px;
+ }
+
+ [data-slot="members-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+
+ &:nth-child(2) {
+ width: 180px;
+ }
+
+ &:nth-child(3) {
+ width: 200px;
+ }
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="member-email"] {
+ color: var(--color-text);
+ font-family: var(--font-sans);
+ font-weight: 500;
+ }
+
+ &[data-slot="member-role"] {
+ font-family: var(--font-mono);
+ text-transform: capitalize;
+ }
+
+ &[data-slot="member-usage"] {
+ input {
+ width: 100%;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ font-family: var(--font-mono);
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+ }
+
+ &[data-slot="member-date"] {
+ color: var(--color-text);
+ }
+
+ &[data-slot="member-actions"] {
+ font-family: var(--font-sans);
+ display: flex;
+ gap: var(--space-2);
+
+ [data-slot="inline-edit-form"] {
+ display: flex;
+ gap: var(--space-2);
+
+ button {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ form:not([data-slot="inline-edit-form"]) button {
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.15s ease;
+ }
+ }
+ }
+
+ tbody tr {
+ &:hover {
+ [data-slot="member-actions"] form:not([data-slot="inline-edit-form"]) button {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ &:last-child td {
+ border-bottom: none;
+ }
+ }
+
+ @media (max-width: 40rem) {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+
+ th {
+ &:nth-child(3)
+
+ /* Date */ {
+ display: none;
+ }
+ }
+
+ td {
+ &:nth-child(3)
+
+ /* Date */ {
+ display: none;
+ }
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx b/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx
new file mode 100644
index 0000000..00edb40
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx
@@ -0,0 +1,368 @@
+import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router"
+import { createEffect, For, Show } from "solid-js"
+import { withActor } from "~/context/auth.withActor"
+import { createStore } from "solid-js/store"
+import styles from "./member-section.module.css"
+import { UserRole } from "@opencode-ai/console-core/schema/user.sql.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { User } from "@opencode-ai/console-core/user.js"
+import { RoleDropdown } from "./role-dropdown"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { formError, localizeError } from "~/lib/form-error"
+
+const listMembers = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ return {
+ members: await User.list(),
+ actorID: Actor.userID(),
+ actorRole: Actor.userRole(),
+ }
+ }, workspaceID)
+}, "member.list")
+
+const inviteMember = action(async (form: FormData) => {
+ "use server"
+ const email = (form.get("email") as string | null)?.trim()
+ if (!email) return { error: formError.emailRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const role = form.get("role") as (typeof UserRole)[number] | null
+ if (!role) return { error: formError.roleRequired }
+ const limit = form.get("limit") as string | null
+ const monthlyLimit = limit && limit.trim() !== "" ? parseInt(limit) : null
+ if (monthlyLimit !== null && monthlyLimit < 0) return { error: formError.monthlyLimitInvalid }
+ return json(
+ await withActor(
+ () =>
+ User.invite({ email, role, monthlyLimit })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ { revalidate: listMembers.key },
+ )
+}, "member.create")
+
+const removeMember = action(async (form: FormData) => {
+ "use server"
+ const id = form.get("id") as string | null
+ if (!id) return { error: formError.idRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(
+ await withActor(
+ () =>
+ User.remove(id)
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ { revalidate: listMembers.key },
+ )
+}, "member.remove")
+
+const updateMember = action(async (form: FormData) => {
+ "use server"
+
+ const id = form.get("id") as string | null
+ if (!id) return { error: formError.idRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const role = form.get("role") as (typeof UserRole)[number] | null
+ if (!role) return { error: formError.roleRequired }
+ const limit = form.get("limit") as string | null
+ const monthlyLimit = limit && limit.trim() !== "" ? parseInt(limit) : null
+ if (monthlyLimit !== null && monthlyLimit < 0) return { error: formError.monthlyLimitInvalid }
+
+ return json(
+ await withActor(
+ () =>
+ User.update({ id, role, monthlyLimit })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ { revalidate: listMembers.key },
+ )
+}, "member.update")
+
+function MemberRow(props: {
+ member: any
+ workspaceID: string
+ actorID: string
+ actorRole: string
+ roleOptions: { value: string; label: string; description: string }[]
+}) {
+ const i18n = useI18n()
+ const submission = useSubmission(updateMember)
+ const isCurrentUser = () => props.actorID === props.member.id
+ const isAdmin = () => props.actorRole === "admin"
+ const [store, setStore] = createStore({
+ editing: false,
+ selectedRole: props.member.role as (typeof UserRole)[number],
+ limit: "",
+ })
+
+ createEffect(() => {
+ if (!submission.pending && submission.result && !submission.result.error) {
+ setStore("editing", false)
+ }
+ })
+
+ function show() {
+ while (true) {
+ submission.clear()
+ if (!submission.result) break
+ }
+ setStore("editing", true)
+ setStore("selectedRole", props.member.role)
+ setStore("limit", props.member.monthlyLimit != null ? String(props.member.monthlyLimit) : "")
+ }
+
+ function hide() {
+ setStore("editing", false)
+ }
+
+ function getUsageDisplay() {
+ const currentUsage = (() => {
+ const dateLastUsed = props.member.timeMonthlyUsageUpdated
+ if (!dateLastUsed) return 0
+
+ const current = new Date().toLocaleDateString(undefined, {
+ year: "numeric",
+ month: "long",
+ timeZone: "UTC",
+ })
+ const lastUsed = dateLastUsed.toLocaleDateString(undefined, {
+ year: "numeric",
+ month: "long",
+ timeZone: "UTC",
+ })
+ return current === lastUsed ? (props.member.monthlyUsage ?? 0) : 0
+ })()
+
+ const limit = props.member.monthlyLimit
+ ? `$${props.member.monthlyLimit}`
+ : i18n.t("workspace.members.noLimitLowercase")
+ return `$${(currentUsage / 100000000).toFixed(2)} / ${limit}`
+ }
+
+ const roleLabel = (value: string) => props.roleOptions.find((option) => option.value === value)?.label ?? value
+
+ return (
+
+ {props.member.authEmail ?? props.member.email}
+
+ {roleLabel(props.member.role)}}>
+ setStore("selectedRole", value as (typeof UserRole)[number])}
+ />
+
+
+
+ {getUsageDisplay()}}>
+ setStore("limit", e.currentTarget.value)}
+ placeholder={i18n.t("workspace.members.noLimit")}
+ min="0"
+ />
+
+
+ {props.member.timeSeen ? "" : i18n.t("workspace.members.invited")}
+
+
+
+ show()}>
+ {i18n.t("workspace.members.edit")}
+
+
+
+
+
+ {i18n.t("workspace.members.delete")}
+
+
+ >
+ }
+ >
+
+
+
+
+
+
+ {submission.pending ? i18n.t("workspace.members.saving") : i18n.t("workspace.members.save")}
+
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+
+
+
+
+
+ )
+}
+
+export function MemberSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const data = createAsync(() => listMembers(params.id!))
+ const submission = useSubmission(inviteMember)
+ const [store, setStore] = createStore({
+ show: false,
+ selectedRole: "member" as (typeof UserRole)[number],
+ limit: "",
+ })
+
+ let input: HTMLInputElement
+
+ const roleOptions = [
+ {
+ value: "admin",
+ label: i18n.t("workspace.members.role.admin"),
+ description: i18n.t("workspace.members.role.adminDescription"),
+ },
+ {
+ value: "member",
+ label: i18n.t("workspace.members.role.member"),
+ description: i18n.t("workspace.members.role.memberDescription"),
+ },
+ ]
+
+ createEffect(() => {
+ if (!submission.pending && submission.result && !submission.result.error) {
+ setStore("show", false)
+ }
+ })
+
+ function show() {
+ while (true) {
+ submission.clear()
+ if (!submission.result) break
+ }
+ setStore("show", true)
+ setStore("selectedRole", "member")
+ setStore("limit", "")
+ setTimeout(() => input?.focus(), 0)
+ }
+
+ function hide() {
+ setStore("show", false)
+ }
+
+ return (
+
+
+
{i18n.t("workspace.members.title")}
+
+
{i18n.t("workspace.members.subtitle")}
+
+ show()}>
+ {i18n.t("workspace.members.invite")}
+
+
+
+
+
+
+
+
+
+
{i18n.t("workspace.members.form.invitee")}
+
(input = r)}
+ data-component="input"
+ name="email"
+ type="text"
+ placeholder={i18n.t("workspace.members.form.emailPlaceholder")}
+ />
+
+
+
{i18n.t("workspace.members.form.role")}
+
setStore("selectedRole", value as (typeof UserRole)[number])}
+ />
+
+
+
{i18n.t("workspace.members.form.monthlyLimit")}
+
setStore("limit", e.currentTarget.value)}
+ min="0"
+ />
+
+
+
+ {(err) => {localizeError(i18n.t, err())}
}
+
+
+
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+ {submission.pending ? i18n.t("workspace.members.inviting") : i18n.t("workspace.members.invite")}
+
+
+
+
+
+
+
+
+ {i18n.t("workspace.members.table.email")}
+ {i18n.t("workspace.members.table.role")}
+ {i18n.t("workspace.members.table.monthLimit")}
+
+
+
+
+
+
+
+ 0}>
+
+ {(member) => (
+
+ )}
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css b/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css
new file mode 100644
index 0000000..7a64fd9
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css
@@ -0,0 +1,72 @@
+.role-dropdown {
+ [data-slot="trigger"] {
+ border: 1px solid var(--color-border);
+ background-color: var(--color-bg);
+ width: 100%;
+ text-transform: capitalize;
+ padding: var(--space-2) var(--space-3);
+ border-radius: var(--border-radius-sm);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ min-width: 0;
+
+ &:hover {
+ border-color: var(--color-accent);
+ background-color: var(--color-bg);
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+ }
+
+ [data-slot="chevron"] {
+ opacity: 0.6;
+ }
+
+ [data-slot="dropdown"] {
+ padding: var(--space-1);
+ min-width: 280px;
+ width: max-content;
+ }
+
+ [data-slot="role-item"] {
+ display: block;
+ width: 100%;
+ padding: var(--space-2) var(--space-3);
+ border: none;
+ background-color: transparent;
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ text-align: left;
+ cursor: pointer;
+ border-radius: var(--border-radius-sm);
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--color-bg-surface);
+ }
+
+ &[data-selected="true"] {
+ background-color: var(--color-accent-alpha);
+ }
+
+ div {
+ strong {
+ display: block;
+ color: var(--color-text);
+ margin-bottom: var(--space-1);
+ text-transform: capitalize;
+ }
+
+ p {
+ font-size: var(--font-size-xs);
+ color: var(--color-text-muted);
+ margin: 0;
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.tsx b/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.tsx
new file mode 100644
index 0000000..0dd254a
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.tsx
@@ -0,0 +1,45 @@
+import { createSignal } from "solid-js"
+import { Dropdown } from "~/component/dropdown"
+import "./role-dropdown.css"
+
+interface RoleOption {
+ value: string
+ label: string
+ description: string
+}
+
+interface RoleDropdownProps {
+ value: string
+ options: RoleOption[]
+ onChange: (value: string) => void
+}
+
+export function RoleDropdown(props: RoleDropdownProps) {
+ const [open, setOpen] = createSignal(false)
+ const selected = () => props.options.find((option) => option.value === props.value)?.label ?? props.value
+
+ const handleSelect = (value: string) => {
+ props.onChange(value)
+ setOpen(false)
+ }
+
+ return (
+
+ <>
+ {props.options.map((option) => (
+ handleSelect(option.value)}
+ >
+
+
{option.label}
+
{option.description}
+
+
+ ))}
+ >
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/model-section.module.css b/packages/console/app/src/routes/workspace/[id]/model-section.module.css
new file mode 100644
index 0000000..fa76848
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/model-section.module.css
@@ -0,0 +1,173 @@
+[data-slot="models-list"] {
+ display: flex;
+ flex-direction: column;
+}
+
+[data-slot="models-table"] {
+ overflow-x: auto;
+}
+
+[data-slot="models-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="model-name"] {
+ color: var(--color-text);
+ font-family: var(--font-mono);
+ font-weight: 500;
+
+ div {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ }
+ }
+
+ &[data-slot="training-data"] {
+ text-align: center;
+ color: var(--color-text);
+ }
+
+ &[data-slot="model-toggle"] {
+ text-align: left;
+ font-family: var(--font-sans);
+ }
+
+ [data-slot="model-toggle-label"] {
+ /* Toggle container */
+ position: relative;
+ display: inline-block;
+ width: 2.5rem;
+ height: 1.5rem;
+ cursor: pointer;
+
+ /* Hidden checkbox input */
+ input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+ }
+
+ /* Toggle track (background) */
+ span {
+ position: absolute;
+ inset: 0;
+ background-color: #ccc;
+ border: 1px solid #bbb;
+ border-radius: 1.5rem;
+ transition: all 0.3s ease;
+ cursor: pointer;
+
+ /* Toggle handle (slider) */
+ &::before {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 0.125rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ background-color: white;
+ border: 1px solid #ddd;
+ border-radius: 50%;
+ transform: translateY(-50%);
+ transition: all 0.3s ease;
+ }
+ }
+
+ /* Checked state - track */
+ input:checked + span {
+ background-color: #21ad0e;
+ border-color: #148605;
+
+ /* Checked state - handle */
+ &::before {
+ transform: translateX(1rem) translateY(-50%);
+ }
+ }
+
+ /* Hover states */
+ &:hover span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.2);
+ }
+
+ input:checked:hover + span {
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.3);
+ }
+
+ /* Disabled state */
+ &:has(input:disabled) {
+ cursor: not-allowed;
+ }
+
+ input:disabled + span {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+
+ input:disabled:checked + span {
+ opacity: 0.5;
+ }
+
+ input:disabled ~ span:hover {
+ box-shadow: none;
+ }
+ }
+ }
+
+ tbody tr {
+ &:last-child td {
+ border-bottom: none;
+ }
+
+ &[data-disabled="true"] {
+ td[data-slot="model-name"] {
+ color: var(--color-text-muted);
+ }
+ }
+ }
+}
+
+@media (max-width: 40rem) {
+ [data-slot="models-table-element"] {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+
+ th {
+ &:nth-child(2)
+
+ /* Training Data */ {
+ display: none;
+ }
+ }
+
+ td {
+ &:nth-child(2)
+
+ /* Training Data */ {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/model-section.tsx b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
new file mode 100644
index 0000000..96c9188
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
@@ -0,0 +1,209 @@
+import { Model } from "@opencode-ai/console-core/model.js"
+import { query, action, useParams, createAsync, json } from "@solidjs/router"
+import { createMemo, For, Show } from "solid-js"
+import { withActor } from "~/context/auth.withActor"
+import { ZenData } from "@opencode-ai/console-core/model.js"
+import styles from "./model-section.module.css"
+import { querySessionInfo } from "../common"
+import {
+ IconAlibaba,
+ IconAnthropic,
+ IconArcee,
+ IconGemini,
+ IconDeepSeek,
+ IconMiniMax,
+ IconMoonshotAI,
+ IconNvidia,
+ IconOpenAI,
+ IconStealth,
+ IconXai,
+ IconXiaomi,
+ IconZai,
+} from "~/component/icon"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { formError } from "~/lib/form-error"
+
+const getModelLab = (modelId: string) => {
+ if (modelId.startsWith("claude")) return "Anthropic"
+ if (modelId.startsWith("gpt")) return "OpenAI"
+ if (modelId.startsWith("gemini")) return "Google"
+ if (modelId.startsWith("deepseek")) return "DeepSeek"
+ if (modelId.startsWith("kimi")) return "Moonshot AI"
+ if (modelId.startsWith("glm")) return "Z.ai"
+ if (modelId.startsWith("qwen")) return "Alibaba"
+ if (modelId.startsWith("minimax")) return "MiniMax"
+ if (modelId.startsWith("grok")) return "xAI"
+ if (modelId.startsWith("mimo")) return "Xiaomi"
+ if (modelId.startsWith("nemotron")) return "NVIDIA"
+ if (modelId.startsWith("trinity")) return "Arcee"
+ return "Stealth"
+}
+
+const getModelsInfo = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ return {
+ all: Object.entries(ZenData.list("full").models)
+ .filter(([id, _model]) => !["claude-3-5-haiku"].includes(id))
+ .filter(([id, _model]) => !id.startsWith("alpha-"))
+ .filter(([id, _model]) => !id.endsWith(":global"))
+ .sort(([idA, modelA], [idB, modelB]) => {
+ const priority = [
+ "big-pickle",
+ "claude",
+ "gpt",
+ "gemini",
+ "deepseek",
+ "glm",
+ "kimi",
+ "qwen",
+ "grok",
+ "minimax",
+ "mimo",
+ ]
+ const getPriority = (id: string) => {
+ const index = priority.findIndex((p) => id.startsWith(p))
+ return index === -1 ? Infinity : index
+ }
+ const pA = getPriority(idA)
+ const pB = getPriority(idB)
+ if (pA !== pB) return pA - pB
+
+ const modelAName = Array.isArray(modelA) ? modelA[0].name : modelA.name
+ const modelBName = Array.isArray(modelB) ? modelB[0].name : modelB.name
+ return modelAName.localeCompare(modelBName)
+ })
+ .map(([id, model]) => ({ id, name: Array.isArray(model) ? model[0].name : model.name })),
+ disabled: await Model.listDisabled(),
+ }
+ }, workspaceID)
+}, "model.info")
+
+const updateModel = action(async (form: FormData) => {
+ "use server"
+ const model = form.get("model") as string | null
+ if (!model) return { error: formError.modelRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ const enabled = (form.get("enabled") as string | null) === "true"
+ return json(
+ withActor(async () => {
+ if (enabled) {
+ await Model.disable({ model })
+ } else {
+ await Model.enable({ model })
+ }
+ }, workspaceID),
+ { revalidate: getModelsInfo.key },
+ )
+}, "model.toggle")
+
+export function ModelSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const language = useLanguage()
+ const modelsInfo = createAsync(() => getModelsInfo(params.id!))
+ const userInfo = createAsync(() => querySessionInfo(params.id!))
+
+ const modelsWithLab = createMemo(() => {
+ const info = modelsInfo()
+ if (!info) return []
+ return info.all.map((model) => ({
+ ...model,
+ lab: getModelLab(model.id),
+ }))
+ })
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css b/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css
new file mode 100644
index 0000000..bb58df7
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css
@@ -0,0 +1,143 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ padding: var(--space-6);
+ background-color: var(--color-bg-surface);
+ border: 1px dashed var(--color-border);
+ border-radius: var(--border-radius-sm);
+
+ @media (max-width: 30rem) {
+ gap: var(--space-8);
+ padding: var(--space-4);
+ }
+
+ [data-component="feature-grid"] {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: var(--space-6);
+
+ @media (max-width: 30rem) {
+ grid-template-columns: 1fr;
+ gap: var(--space-4);
+ }
+
+ [data-slot="feature"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ padding: var(--space-4);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+
+ h3 {
+ font-size: var(--font-size-sm);
+ font-weight: 600;
+ margin: 0;
+ color: var(--color-text);
+ text-transform: uppercase;
+ letter-spacing: -0.025rem;
+ }
+
+ p {
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ margin: 0;
+ color: var(--color-text-muted);
+ }
+ }
+ }
+
+ [data-component="api-key-highlight"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-6);
+
+ [data-slot="key-display"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+
+ [data-slot="key-container"] {
+ display: flex;
+ gap: var(--space-3);
+ padding: var(--space-4);
+ border: 2px solid var(--color-accent);
+ border-radius: var(--border-radius-sm);
+ align-items: center;
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: var(--space-3);
+ align-items: stretch;
+ }
+
+ [data-slot="key-value"] {
+ flex: 1;
+ font-family: var(--font-mono);
+ font-size: var(--font-size-sm);
+ color: var(--color-text);
+ background-color: var(--color-bg);
+ padding: var(--space-3);
+ border-radius: var(--border-radius-sm);
+ border: 1px solid var(--color-border);
+ word-break: break-all;
+ line-height: 1.4;
+
+ @media (max-width: 40rem) {
+ font-size: var(--font-size-xs);
+ padding: var(--space-2-5);
+ }
+ }
+
+ button {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ padding: var(--space-3) var(--space-4);
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ white-space: nowrap;
+ min-width: 130px;
+
+ @media (max-width: 40rem) {
+ justify-content: center;
+ padding: var(--space-2-5) var(--space-3);
+ font-size: var(--font-size-xs);
+ min-width: 96px;
+ }
+ }
+ }
+ }
+ }
+
+ [data-component="next-steps"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-6);
+
+ ol {
+ margin: 0;
+ padding-left: 0;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ list-style-position: inside;
+
+ li {
+ font-size: var(--font-size-md);
+ line-height: 1.5;
+ color: var(--color-text-secondary);
+
+ code {
+ font-family: var(--font-mono);
+ font-size: var(--font-size-sm);
+ padding: var(--space-1) var(--space-2);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ color: var(--color-text);
+ }
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx b/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx
new file mode 100644
index 0000000..a50efc2
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx
@@ -0,0 +1,108 @@
+import { query, useParams, createAsync } from "@solidjs/router"
+import { createMemo, createSignal, Show } from "solid-js"
+import { IconCopy, IconCheck } from "~/component/icon"
+import { Key } from "@opencode-ai/console-core/key.js"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { withActor } from "~/context/auth.withActor"
+import styles from "./new-user-section.module.css"
+import { useI18n } from "~/context/i18n"
+
+const getUsageInfo = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ return await Billing.usages()
+ }, workspaceID)
+}, "usage.list")
+
+const listKeys = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(() => Key.list(), workspaceID)
+}, "key.list")
+
+export function NewUserSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const [copiedKey, setCopiedKey] = createSignal(false)
+ const keys = createAsync(() => listKeys(params.id!))
+ const usage = createAsync(() => getUsageInfo(params.id!))
+ const isNew = createMemo(() => {
+ const keysList = keys()
+ const usageList = usage()
+ return keysList?.length === 1 && (!usageList || usageList.length === 0)
+ })
+ const defaultKey = createMemo(() => {
+ const key = keys()?.at(-1)?.key
+ if (!key) return undefined
+ return {
+ actual: key,
+ masked: key.slice(0, 8) + "*".repeat(key.length - 12) + key.slice(-4),
+ }
+ })
+
+ return (
+
+
+
+
+
{i18n.t("workspace.newUser.feature.tested.title")}
+
{i18n.t("workspace.newUser.feature.tested.body")}
+
+
+
{i18n.t("workspace.newUser.feature.quality.title")}
+
{i18n.t("workspace.newUser.feature.quality.body")}
+
+
+
{i18n.t("workspace.newUser.feature.lockin.title")}
+
{i18n.t("workspace.newUser.feature.lockin.body")}
+
+
+
+
+
+
+
+ {defaultKey()?.masked}
+ {
+ await navigator.clipboard.writeText(defaultKey()?.actual ?? "")
+ setCopiedKey(true)
+ setTimeout(() => setCopiedKey(false), 2000)
+ }}
+ title={i18n.t("workspace.newUser.copyApiKey")}
+ >
+
+ {i18n.t("workspace.newUser.copyKey")}
+ >
+ }
+ >
+ {i18n.t("workspace.newUser.copied")}
+
+
+
+
+
+
+
+
+
+ {i18n.t("workspace.newUser.step.enableBilling")}
+
+ {i18n.t("workspace.newUser.step.login.before")} opencode auth login{" "}
+ {i18n.t("workspace.newUser.step.login.after")}
+
+ {i18n.t("workspace.newUser.step.pasteKey")}
+
+ {i18n.t("workspace.newUser.step.models.before")} /models{" "}
+ {i18n.t("workspace.newUser.step.models.after")}
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.module.css b/packages/console/app/src/routes/workspace/[id]/provider-section.module.css
new file mode 100644
index 0000000..1dc7085
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/provider-section.module.css
@@ -0,0 +1,138 @@
+.root {
+ [data-slot="providers-table"] {
+ overflow-x: auto;
+ }
+
+ [data-slot="providers-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+
+ &:nth-child(1) {
+ width: 180px;
+ }
+
+ &:nth-child(3) {
+ width: 200px;
+ }
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="provider-name"] {
+ color: var(--color-text);
+ font-family: var(--font-mono);
+ font-weight: 500;
+ }
+
+ &[data-slot="provider-key"] {
+ text-align: left;
+ color: var(--color-text-secondary);
+
+ [data-slot="edit-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+ max-width: 100%;
+
+ [data-slot="input-wrapper"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+ max-width: 100%;
+
+ input {
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ font-family: var(--font-mono);
+ width: 100%;
+ box-sizing: border-box;
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ }
+ }
+ }
+ }
+
+ &[data-slot="provider-action"] {
+ text-align: left;
+ font-family: var(--font-sans);
+ white-space: nowrap;
+
+ [data-slot="configured-actions"] {
+ display: flex;
+ gap: var(--space-2);
+
+ [data-slot="delete-form"] {
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.2s;
+ }
+
+ &:hover [data-slot="delete-form"] {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ [data-slot="form-actions"] {
+ display: flex;
+ gap: var(--space-2);
+ }
+ }
+ }
+
+ tbody tr {
+ &:hover {
+ [data-slot="provider-action"] [data-slot="delete-form"] {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ &:last-child td {
+ border-bottom: none;
+ }
+ }
+
+ @media (max-width: 40rem) {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx
new file mode 100644
index 0000000..acdd897
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx
@@ -0,0 +1,199 @@
+import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router"
+import { createEffect, For, Show } from "solid-js"
+import { Provider } from "@opencode-ai/console-core/provider.js"
+import { withActor } from "~/context/auth.withActor"
+import { createStore } from "solid-js/store"
+import styles from "./provider-section.module.css"
+import { useI18n } from "~/context/i18n"
+import { formError, localizeError } from "~/lib/form-error"
+
+const PROVIDERS = [
+ { name: "OpenAI", key: "openai", prefix: "sk-" },
+ { name: "Anthropic", key: "anthropic", prefix: "sk-ant-" },
+ { name: "Google Gemini", key: "google", prefix: "AI" },
+] as const
+
+type Provider = (typeof PROVIDERS)[number]
+
+function maskCredentials(credentials: string) {
+ return `${credentials.slice(0, 8)}...${credentials.slice(-8)}`
+}
+
+const removeProvider = action(async (form: FormData) => {
+ "use server"
+ const provider = form.get("provider") as string | null
+ if (!provider) return { error: formError.providerRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(await withActor(() => Provider.remove({ provider }), workspaceID), {
+ revalidate: listProviders.key,
+ })
+}, "provider.remove")
+
+const saveProvider = action(async (form: FormData) => {
+ "use server"
+ const provider = form.get("provider") as string | null
+ const credentials = form.get("credentials") as string | null
+ if (!provider) return { error: formError.providerRequired }
+ if (!credentials) return { error: formError.apiKeyRequired }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(
+ await withActor(
+ () =>
+ Provider.create({ provider, credentials })
+ .then(() => ({ error: undefined }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ { revalidate: listProviders.key },
+ )
+}, "provider.save")
+
+const listProviders = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(() => Provider.list(), workspaceID)
+}, "provider.list")
+
+function ProviderRow(props: { provider: Provider }) {
+ const params = useParams()
+ const i18n = useI18n()
+ const providers = createAsync(() => listProviders(params.id!))
+ const saveSubmission = useSubmission(
+ saveProvider,
+ ([fd]) => (fd.get("provider") as string | null) === props.provider.key,
+ )
+ const removeSubmission = useSubmission(
+ removeProvider,
+ ([fd]) => (fd.get("provider") as string | null) === props.provider.key,
+ )
+ const [store, setStore] = createStore({ editing: false })
+
+ let input: HTMLInputElement
+
+ const providerData = () => providers()?.find((p) => p.provider === props.provider.key)
+
+ createEffect(() => {
+ if (!saveSubmission.pending && saveSubmission.result && !saveSubmission.result.error) {
+ hide()
+ }
+ })
+
+ function show() {
+ while (true) {
+ saveSubmission.clear()
+ if (!saveSubmission.result) break
+ }
+ setStore("editing", true)
+ setTimeout(() => input?.focus(), 0)
+ }
+
+ function hide() {
+ setStore("editing", false)
+ }
+
+ return (
+
+ {props.provider.name}
+
+ {providerData() ? maskCredentials(providerData()!.credentials) : "-"}}
+ >
+
+
+
(input = r)}
+ name="credentials"
+ type="text"
+ placeholder={i18n.t("workspace.providers.placeholder", {
+ provider: props.provider.name,
+ prefix: props.provider.prefix,
+ })}
+ autocomplete="off"
+ data-form-type="other"
+ data-lpignore="true"
+ />
+
+ {(err) => {localizeError(i18n.t, err())}
}
+
+
+
+
+
+
+
+
+ show()}>
+ {i18n.t("workspace.providers.configure")}
+
+ }
+ >
+
+ show()}>
+ {i18n.t("workspace.providers.edit")}
+
+
+
+
+
+ {i18n.t("workspace.providers.delete")}
+
+
+
+
+ }
+ >
+
+
+ {saveSubmission.pending ? i18n.t("workspace.providers.saving") : i18n.t("workspace.providers.save")}
+
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+
+
+
+
+ )
+}
+
+export function ProviderSection() {
+ const i18n = useI18n()
+
+ return (
+
+
+
{i18n.t("workspace.providers.title")}
+
{i18n.t("workspace.providers.subtitle")}
+
+
+
+
+
+ {i18n.t("workspace.providers.table.provider")}
+ {i18n.t("workspace.providers.table.apiKey")}
+
+
+
+
+ {(provider) => }
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/settings/index.tsx b/packages/console/app/src/routes/workspace/[id]/settings/index.tsx
new file mode 100644
index 0000000..7c8f1fd
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/settings/index.tsx
@@ -0,0 +1,11 @@
+import { SettingsSection } from "./settings-section"
+
+export default function () {
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/settings/settings-section.module.css b/packages/console/app/src/routes/workspace/[id]/settings/settings-section.module.css
new file mode 100644
index 0000000..6764a05
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/settings/settings-section.module.css
@@ -0,0 +1,94 @@
+.root {
+ max-width: 40rem;
+
+ [data-slot="setting"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+
+ p {
+ line-height: 1.2;
+ margin: 0;
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="value-with-action"] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-3);
+
+ @media (max-width: 30rem) {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: var(--space-2);
+ }
+ }
+
+ [data-slot="current-value"] {
+ color: var(--color-text);
+ line-height: 1.4;
+ margin: 0;
+ }
+
+ > button {
+ align-self: flex-start;
+ }
+ }
+
+ [data-slot="create-form"] {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+
+ [data-slot="input-container"] {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--space-2);
+
+ @media (max-width: 30rem) {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ button {
+ white-space: nowrap;
+ flex-shrink: 0;
+ }
+ }
+
+ input {
+ flex: 1;
+ padding: var(--space-2) var(--space-3);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ background-color: var(--color-bg);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+ min-width: 0;
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+
+ &::placeholder {
+ color: var(--color-text-disabled);
+ }
+ }
+
+ > button[type="reset"] {
+ align-self: flex-start;
+ }
+
+ [data-slot="form-error"] {
+ color: var(--color-danger);
+ font-size: var(--font-size-sm);
+ line-height: 1.4;
+ margin-top: calc(var(--space-1) * -1);
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx b/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx
new file mode 100644
index 0000000..a9950c4
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx
@@ -0,0 +1,125 @@
+import { json, action, useParams, useSubmission, createAsync, query } from "@solidjs/router"
+import { createEffect, Show } from "solid-js"
+import { createStore } from "solid-js/store"
+import { withActor } from "~/context/auth.withActor"
+import { Workspace } from "@opencode-ai/console-core/workspace.js"
+import styles from "./settings-section.module.css"
+import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { useI18n } from "~/context/i18n"
+import { formError, localizeError } from "~/lib/form-error"
+
+const getWorkspaceInfo = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(
+ () =>
+ Database.use((tx) =>
+ tx
+ .select({
+ id: WorkspaceTable.id,
+ name: WorkspaceTable.name,
+ slug: WorkspaceTable.slug,
+ })
+ .from(WorkspaceTable)
+ .where(eq(WorkspaceTable.id, workspaceID))
+ .then((rows) => rows[0] || null),
+ ),
+ workspaceID,
+ )
+}, "workspace.get")
+
+const updateWorkspace = action(async (form: FormData) => {
+ "use server"
+ const name = (form.get("name") as string | null)?.trim()
+ if (!name) return { error: formError.workspaceNameRequired }
+ if (name.length > 255) return { error: formError.nameTooLong }
+ const workspaceID = form.get("workspaceID") as string | null
+ if (!workspaceID) return { error: formError.workspaceRequired }
+ return json(
+ await withActor(
+ () =>
+ Workspace.update({ name })
+ .then(() => ({ error: undefined }))
+ .catch((e) => ({ error: e.message as string })),
+ workspaceID,
+ ),
+ )
+}, "workspace.update")
+
+export function SettingsSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const workspaceInfo = createAsync(() => getWorkspaceInfo(params.id!))
+ const submission = useSubmission(updateWorkspace)
+ const [store, setStore] = createStore({ show: false })
+
+ let input: HTMLInputElement
+
+ createEffect(() => {
+ if (!submission.pending && submission.result && !submission.result.error) {
+ hide()
+ }
+ })
+
+ function show() {
+ while (true) {
+ submission.clear()
+ if (!submission.result) break
+ }
+ setStore("show", true)
+ input.focus()
+ }
+
+ function hide() {
+ setStore("show", false)
+ }
+
+ return (
+
+
+
{i18n.t("workspace.settings.title")}
+
{i18n.t("workspace.settings.subtitle")}
+
+
+
+
{i18n.t("workspace.settings.workspaceName")}
+
+
+ (input = r)}
+ data-component="input"
+ name="name"
+ type="text"
+ placeholder={i18n.t("workspace.settings.workspaceName")}
+ value={workspaceInfo()?.name ?? i18n.t("workspace.settings.defaultName")}
+ />
+
+
+ {submission.pending ? i18n.t("workspace.settings.updating") : i18n.t("workspace.settings.save")}
+
+ hide()}>
+ {i18n.t("common.cancel")}
+
+
+
+ {(err) => {localizeError(i18n.t, err())}
}
+
+
+ }
+ >
+
+
{workspaceInfo()?.name}
+
show()}>
+ {i18n.t("workspace.settings.edit")}
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/usage/graph-section.module.css b/packages/console/app/src/routes/workspace/[id]/usage/graph-section.module.css
new file mode 100644
index 0000000..24b85be
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/usage/graph-section.module.css
@@ -0,0 +1,145 @@
+.root {
+ [data-component="empty-state"] {
+ padding: var(--space-20) var(--space-6);
+ text-align: center;
+ border: 1px dashed var(--color-border);
+ border-radius: var(--border-radius-sm);
+ height: 400px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ p {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+ }
+
+ [data-slot="filter-container"] {
+ margin-bottom: 0;
+ display: flex;
+ align-items: center;
+ gap: var(--space-3);
+
+ [data-component="dropdown"] {
+ [data-slot="trigger"] {
+ border: 1px solid var(--color-border);
+ background-color: var(--color-bg);
+ padding: var(--space-2) var(--space-3);
+ border-radius: var(--border-radius-sm);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ line-height: 1.5;
+
+ &:hover {
+ border-color: var(--color-accent);
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var(--color-accent);
+ box-shadow: 0 0 0 3px var(--color-accent-alpha);
+ }
+ }
+
+ [data-slot="chevron"] {
+ opacity: 0.6;
+ }
+
+ [data-slot="dropdown"] {
+ min-width: 200px;
+ max-height: 300px;
+ overflow-y: auto;
+ padding: var(--space-1);
+ }
+ }
+ }
+
+ [data-slot="month-picker"] {
+ display: flex;
+ align-items: center;
+ background-color: var(--color-bg);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ padding: 0;
+ }
+
+ [data-slot="month-button"] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: none;
+ border: none !important;
+ color: var(--color-text);
+ cursor: pointer;
+ padding: var(--space-2) var(--space-3);
+ border-radius: var(--border-radius-xs);
+ transition: background-color 0.2s;
+ line-height: 1;
+
+ &:hover {
+ background-color: var(--color-bg-hover);
+ }
+
+ svg {
+ display: block;
+ width: 16px;
+ height: 16px;
+ stroke-width: 2;
+ }
+ }
+
+ [data-slot="month-label"] {
+ font-size: var(--font-size-sm);
+ font-weight: 500;
+ color: var(--color-text);
+ line-height: 1.5;
+ min-width: 140px;
+ text-align: center;
+ white-space: nowrap;
+ }
+
+ [data-slot="model-item"] {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ padding: var(--space-2) var(--space-3);
+ cursor: pointer;
+ transition: background-color 0.2s;
+ font-size: var(--font-size-sm);
+ color: var(--color-text);
+ border: none !important;
+ background: none;
+ width: 100%;
+ text-align: left;
+ white-space: nowrap;
+
+ &:hover {
+ background: var(--color-bg-hover);
+ }
+
+ span {
+ flex: 1;
+ user-select: none;
+ }
+ }
+
+ [data-slot="chart-container"] {
+ padding: var(--space-6);
+ background: var(--color-bg-secondary);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ height: 400px;
+ }
+
+ @media (max-width: 40rem) {
+ [data-slot="chart-container"] {
+ height: 300px;
+ padding: var(--space-4);
+ }
+
+ [data-component="empty-state"] {
+ height: 300px;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/usage/graph-section.tsx b/packages/console/app/src/routes/workspace/[id]/usage/graph-section.tsx
new file mode 100644
index 0000000..b5033f2
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/usage/graph-section.tsx
@@ -0,0 +1,556 @@
+import { and, Database, eq, gte, inArray, isNull, lt, or, sql, sum } from "@opencode-ai/console-core/drizzle/index.js"
+import { UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js"
+import { useParams } from "@solidjs/router"
+import { createEffect, createMemo, onCleanup, Show, For } from "solid-js"
+import { createStore } from "solid-js/store"
+import { withActor } from "~/context/auth.withActor"
+import { Dropdown } from "~/component/dropdown"
+import { IconChevronLeft, IconChevronRight } from "~/component/icon"
+import styles from "./graph-section.module.css"
+import {
+ Chart,
+ BarController,
+ BarElement,
+ CategoryScale,
+ LinearScale,
+ Tooltip,
+ Legend,
+ type ChartConfiguration,
+} from "chart.js"
+import { useI18n } from "~/context/i18n"
+
+Chart.register(BarController, BarElement, CategoryScale, LinearScale, Tooltip, Legend)
+
+async function getCosts(workspaceID: string, year: number, month: number, tzOffset: string) {
+ "use server"
+ return withActor(async () => {
+ const timezoneOffset = (() => {
+ const m = /^([+-])(\d{2}):(\d{2})$/.exec(tzOffset)
+ if (!m) return 0
+ const sign = m[1] === "-" ? -1 : 1
+ return sign * (Number(m[2]) * 60 + Number(m[3])) * 60_000
+ })()
+
+ const monthStartUTC = new Date(Date.UTC(year, month, 1, 0, 0, 0) - timezoneOffset)
+ const monthEndUTC = new Date(Date.UTC(year, month + 1, 1, 0, 0, 0) - timezoneOffset)
+ const dateExpr = sql`DATE(CONVERT_TZ(${UsageTable.timeCreated}, '+00:00', ${tzOffset}))`
+ const usageData = await Database.use((tx) =>
+ tx
+ .select({
+ date: dateExpr,
+ model: UsageTable.model,
+ totalCost: sum(UsageTable.cost),
+ keyId: UsageTable.keyID,
+ plan: sql`JSON_EXTRACT(${UsageTable.enrichment}, '$.plan')`,
+ })
+ .from(UsageTable)
+ .where(
+ and(
+ eq(UsageTable.workspaceID, workspaceID),
+ gte(UsageTable.timeCreated, monthStartUTC),
+ lt(UsageTable.timeCreated, monthEndUTC),
+ ),
+ )
+ .groupBy(dateExpr, UsageTable.model, UsageTable.keyID, sql`JSON_EXTRACT(${UsageTable.enrichment}, '$.plan')`)
+ .then((x) =>
+ x.map((r) => ({
+ ...r,
+ totalCost: r.totalCost ? parseInt(r.totalCost) : 0,
+ plan: r.plan as "sub" | "lite" | "byok" | null,
+ })),
+ ),
+ )
+
+ // Get unique key IDs from usage
+ const usageKeyIds = new Set(usageData.map((r) => r.keyId).filter((id) => id !== null))
+
+ // Second query: get all existing keys plus any keys from usage
+ const keysData = await Database.use((tx) =>
+ tx
+ .select({
+ keyId: KeyTable.id,
+ keyName: KeyTable.name,
+ userEmail: AuthTable.subject,
+ timeDeleted: KeyTable.timeDeleted,
+ })
+ .from(KeyTable)
+ .innerJoin(UserTable, and(eq(KeyTable.userID, UserTable.id), eq(KeyTable.workspaceID, UserTable.workspaceID)))
+ .innerJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .where(
+ and(
+ eq(KeyTable.workspaceID, workspaceID),
+ usageKeyIds.size > 0
+ ? or(inArray(KeyTable.id, Array.from(usageKeyIds)), isNull(KeyTable.timeDeleted))
+ : isNull(KeyTable.timeDeleted),
+ ),
+ )
+ .orderBy(AuthTable.subject, KeyTable.name),
+ )
+
+ return {
+ usage: usageData,
+ keys: keysData.map((key) => ({
+ id: key.keyId,
+ displayName: `${key.userEmail} - ${key.keyName}`,
+ deleted: key.timeDeleted !== null,
+ })),
+ }
+ }, workspaceID)
+}
+
+const MODEL_COLORS: Record = {
+ "claude-sonnet-4-5": "#D4745C",
+ "claude-sonnet-4": "#E8B4A4",
+ "claude-opus-4": "#C8A098",
+ "claude-haiku-4-5": "#F0D8D0",
+ "claude-3-5-haiku": "#F8E8E0",
+ "gpt-5.1": "#4A90E2",
+ "gpt-5.1-codex": "#6BA8F0",
+ "gpt-5": "#7DB8F8",
+ "gpt-5-codex": "#9FCAFF",
+ "gpt-5-nano": "#B8D8FF",
+ "grok-code": "#8B5CF6",
+ "big-pickle": "#10B981",
+ "kimi-k2": "#F59E0B",
+ "qwen3-coder": "#EC4899",
+ "glm-4.6": "#14B8A6",
+}
+
+function getModelColor(model: string): string {
+ if (MODEL_COLORS[model]) return MODEL_COLORS[model]
+
+ const hash = model.split("").reduce((acc, char) => char.charCodeAt(0) + ((acc << 5) - acc), 0)
+ const hue = Math.abs(hash) % 360
+ return `hsl(${hue}, 50%, 65%)`
+}
+
+function formatDateLabel(dateStr: string): string {
+ const [, m, d] = dateStr.split("-").map(Number)
+ const month = new Date(2000, m - 1, 1).toLocaleDateString(undefined, { month: "short" })
+ return `${month} ${d.toString().padStart(2, "0")}`
+}
+
+// Compute the UTC offset (in MySQL CONVERT_TZ format like "+05:30") for the
+// given IANA timezone at the given instant. Honors DST.
+function getTimezoneOffset(timezone: string, at: Date): string {
+ const parts = new Intl.DateTimeFormat("en-US", {
+ timeZone: timezone,
+ hourCycle: "h23",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ })
+ .formatToParts(at)
+ .reduce>((acc, p) => {
+ if (p.type !== "literal") acc[p.type] = p.value
+ return acc
+ }, {})
+ const asUTC = Date.UTC(
+ Number(parts.year),
+ Number(parts.month) - 1,
+ Number(parts.day),
+ Number(parts.hour),
+ Number(parts.minute),
+ Number(parts.second),
+ )
+ const diffMinutes = Math.round((asUTC - at.getTime()) / 60_000)
+ const sign = diffMinutes < 0 ? "-" : "+"
+ const abs = Math.abs(diffMinutes)
+ const hh = Math.floor(abs / 60)
+ .toString()
+ .padStart(2, "0")
+ const mm = (abs % 60).toString().padStart(2, "0")
+ return `${sign}${hh}:${mm}`
+}
+
+function addOpacityToColor(color: string, opacity: number): string {
+ if (color.startsWith("#")) {
+ const r = parseInt(color.slice(1, 3), 16)
+ const g = parseInt(color.slice(3, 5), 16)
+ const b = parseInt(color.slice(5, 7), 16)
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`
+ }
+ if (color.startsWith("hsl")) return color.replace(")", `, ${opacity})`).replace("hsl", "hsla")
+ return color
+}
+
+export function GraphSection() {
+ let canvasRef: HTMLCanvasElement | undefined
+ let chartInstance: Chart | undefined
+ const params = useParams()
+ const i18n = useI18n()
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone
+ const now = new Date()
+ const [store, setStore] = createStore({
+ data: null as Awaited> | null,
+ year: now.getFullYear(),
+ month: now.getMonth(),
+ key: null as string | null,
+ model: null as string | null,
+ modelDropdownOpen: false,
+ keyDropdownOpen: false,
+ colorScheme: "light" as "light" | "dark",
+ })
+ const onPreviousMonth = async () => {
+ const month = store.month === 0 ? 11 : store.month - 1
+ const year = store.month === 0 ? store.year - 1 : store.year
+ setStore({ month, year })
+ }
+
+ const onNextMonth = async () => {
+ const month = store.month === 11 ? 0 : store.month + 1
+ const year = store.month === 11 ? store.year + 1 : store.year
+ setStore({ month, year })
+ }
+
+ const onSelectModel = (model: string | null) => setStore({ model, modelDropdownOpen: false })
+
+ const onSelectKey = (keyID: string | null) => setStore({ key: keyID, keyDropdownOpen: false })
+
+ const getModels = createMemo(() => {
+ if (!store.data?.usage) return []
+ return Array.from(new Set(store.data.usage.map((row) => row.model))).sort()
+ })
+
+ const getDates = createMemo(() => {
+ // Number of days in the month is independent of timezone.
+ const daysInMonth = new Date(Date.UTC(store.year, store.month + 1, 0)).getUTCDate()
+ const yyyy = store.year.toString().padStart(4, "0")
+ const mm = (store.month + 1).toString().padStart(2, "0")
+ return Array.from({ length: daysInMonth }, (_, i) => {
+ const dd = (i + 1).toString().padStart(2, "0")
+ return `${yyyy}-${mm}-${dd}`
+ })
+ })
+
+ const getKeyName = (keyID: string | null): string => {
+ if (!keyID || !store.data?.keys) return i18n.t("workspace.cost.allKeys")
+ const found = store.data.keys.find((k) => k.id === keyID)
+ if (!found) return i18n.t("workspace.cost.allKeys")
+ return found.deleted ? `${found.displayName} ${i18n.t("workspace.cost.deletedSuffix")}` : found.displayName
+ }
+
+ const formatMonthYear = () =>
+ new Date(store.year, store.month, 1).toLocaleDateString(undefined, { month: "long", year: "numeric" })
+
+ const isCurrentMonth = () => store.year === now.getFullYear() && store.month === now.getMonth()
+
+ const chartConfig = createMemo((): ChartConfiguration | null => {
+ const data = store.data
+ const dates = getDates()
+ if (!data?.usage?.length) return null
+
+ store.colorScheme
+ const styles = getComputedStyle(document.documentElement)
+ const colorTextMuted = styles.getPropertyValue("--color-text-muted").trim()
+ const colorBorderMuted = styles.getPropertyValue("--color-border-muted").trim()
+ const colorBgElevated = styles.getPropertyValue("--color-bg-elevated").trim()
+ const colorText = styles.getPropertyValue("--color-text").trim()
+ const colorTextSecondary = styles.getPropertyValue("--color-text-secondary").trim()
+ const colorBorder = styles.getPropertyValue("--color-border").trim()
+ const subSuffix = ` (${i18n.t("workspace.cost.subscriptionShort")})`
+ const liteSuffix = " (go)"
+
+ const dailyDataRegular = new Map>()
+ const dailyDataSub = new Map>()
+ const dailyDataLite = new Map>()
+ for (const dateKey of dates) {
+ dailyDataRegular.set(dateKey, new Map())
+ dailyDataSub.set(dateKey, new Map())
+ dailyDataLite.set(dateKey, new Map())
+ }
+
+ data.usage
+ .filter((row) => (store.key ? row.keyId === store.key : true))
+ .forEach((row) => {
+ const targetMap = row.plan === "sub" ? dailyDataSub : row.plan === "lite" ? dailyDataLite : dailyDataRegular
+ const dayMap = targetMap.get(row.date)
+ if (!dayMap) return
+ dayMap.set(row.model, (dayMap.get(row.model) ?? 0) + row.totalCost)
+ })
+
+ const filteredModels = store.model === null ? getModels() : [store.model]
+
+ // Create datasets: regular first, then subscription, then lite (with visual distinction via opacity)
+ const datasets = [
+ ...filteredModels
+ .filter((model) => dates.some((date) => (dailyDataRegular.get(date)?.get(model) || 0) > 0))
+ .map((model) => {
+ const color = getModelColor(model)
+ return {
+ label: model,
+ data: dates.map((date) => (dailyDataRegular.get(date)?.get(model) || 0) / 100_000_000),
+ backgroundColor: color,
+ hoverBackgroundColor: color,
+ borderWidth: 0,
+ stack: "usage",
+ }
+ }),
+ ...filteredModels
+ .filter((model) => dates.some((date) => (dailyDataSub.get(date)?.get(model) || 0) > 0))
+ .map((model) => {
+ const color = getModelColor(model)
+ return {
+ label: `${model}${subSuffix}`,
+ data: dates.map((date) => (dailyDataSub.get(date)?.get(model) || 0) / 100_000_000),
+ backgroundColor: addOpacityToColor(color, 0.5),
+ hoverBackgroundColor: addOpacityToColor(color, 0.7),
+ borderWidth: 1,
+ borderColor: color,
+ stack: "subscription",
+ }
+ }),
+ ...filteredModels
+ .filter((model) => dates.some((date) => (dailyDataLite.get(date)?.get(model) || 0) > 0))
+ .map((model) => {
+ const color = getModelColor(model)
+ return {
+ label: `${model}${liteSuffix}`,
+ data: dates.map((date) => (dailyDataLite.get(date)?.get(model) || 0) / 100_000_000),
+ backgroundColor: addOpacityToColor(color, 0.35),
+ hoverBackgroundColor: addOpacityToColor(color, 0.55),
+ borderWidth: 1,
+ borderColor: addOpacityToColor(color, 0.7),
+ borderDash: [4, 2],
+ stack: "lite",
+ }
+ }),
+ ]
+
+ return {
+ type: "bar",
+ data: {
+ labels: dates.map(formatDateLabel),
+ datasets,
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: false,
+ scales: {
+ x: {
+ stacked: true,
+ grid: {
+ display: false,
+ },
+ ticks: {
+ maxRotation: 0,
+ autoSkipPadding: 20,
+ color: colorTextMuted,
+ font: {
+ family: "monospace",
+ size: 11,
+ },
+ },
+ },
+ y: {
+ stacked: true,
+ beginAtZero: true,
+ grid: {
+ color: colorBorderMuted,
+ },
+ ticks: {
+ color: colorTextMuted,
+ font: {
+ family: "monospace",
+ size: 11,
+ },
+ callback: (value) => {
+ const num = Number(value)
+ return num >= 1000 ? `$${(num / 1000).toFixed(1)}k` : `$${num.toFixed(0)}`
+ },
+ },
+ },
+ },
+ plugins: {
+ tooltip: {
+ mode: "index",
+ intersect: false,
+ backgroundColor: colorBgElevated,
+ titleColor: colorText,
+ bodyColor: colorTextSecondary,
+ borderColor: colorBorder,
+ borderWidth: 1,
+ padding: 12,
+ displayColors: true,
+ filter: (item) => (item.parsed.y ?? 0) > 0,
+ callbacks: {
+ label: (context) => `${context.dataset.label}: $${(context.parsed.y ?? 0).toFixed(2)}`,
+ },
+ },
+ legend: {
+ display: true,
+ position: "bottom",
+ labels: {
+ color: colorTextSecondary,
+ font: {
+ size: 12,
+ },
+ padding: 16,
+ boxWidth: 16,
+ boxHeight: 16,
+ usePointStyle: false,
+ },
+ onHover: (event, legendItem, legend) => {
+ const chart = legend.chart
+ chart.data.datasets?.forEach((dataset, i) => {
+ const meta = chart.getDatasetMeta(i)
+ const label = dataset.label || ""
+ const isSub = label.endsWith(subSuffix)
+ const isLite = label.endsWith(liteSuffix)
+ const model = isSub
+ ? label.slice(0, -subSuffix.length)
+ : isLite
+ ? label.slice(0, -liteSuffix.length)
+ : label
+ const baseColor = getModelColor(model)
+ const originalColor = isSub
+ ? addOpacityToColor(baseColor, 0.5)
+ : isLite
+ ? addOpacityToColor(baseColor, 0.35)
+ : baseColor
+ const color = i === legendItem.datasetIndex ? originalColor : addOpacityToColor(baseColor, 0.15)
+ meta.data.forEach((bar: any) => {
+ bar.options.backgroundColor = color
+ })
+ })
+ chart.update("none")
+ },
+ onLeave: (event, legendItem, legend) => {
+ const chart = legend.chart
+ chart.data.datasets?.forEach((dataset, i) => {
+ const meta = chart.getDatasetMeta(i)
+ const label = dataset.label || ""
+ const isSub = label.endsWith(subSuffix)
+ const isLite = label.endsWith(liteSuffix)
+ const model = isSub
+ ? label.slice(0, -subSuffix.length)
+ : isLite
+ ? label.slice(0, -liteSuffix.length)
+ : label
+ const baseColor = getModelColor(model)
+ const color = isSub
+ ? addOpacityToColor(baseColor, 0.5)
+ : isLite
+ ? addOpacityToColor(baseColor, 0.35)
+ : baseColor
+ meta.data.forEach((bar: any) => {
+ bar.options.backgroundColor = color
+ })
+ })
+ chart.update("none")
+ },
+ },
+ },
+ },
+ }
+ })
+
+ createEffect(async () => {
+ // Compute the offset for mid-month so DST transitions don't bias to the
+ // wrong side.
+ const midMonth = new Date(Date.UTC(store.year, store.month, 15, 12, 0, 0))
+ const tzOffset = getTimezoneOffset(timezone, midMonth)
+ const data = await getCosts(params.id!, store.year, store.month, tzOffset)
+ setStore({ data })
+ })
+
+ createEffect(() => {
+ const config = chartConfig()
+ if (!config || !canvasRef) return
+
+ if (chartInstance) chartInstance.destroy()
+ chartInstance = new Chart(canvasRef, config)
+
+ onCleanup(() => chartInstance?.destroy())
+ })
+
+ createEffect(() => {
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)")
+ setStore({ colorScheme: mediaQuery.matches ? "dark" : "light" })
+
+ const handleColorSchemeChange = (e: MediaQueryListEvent) => {
+ setStore({ colorScheme: e.matches ? "dark" : "light" })
+ }
+
+ mediaQuery.addEventListener("change", handleColorSchemeChange)
+ onCleanup(() => mediaQuery.removeEventListener("change", handleColorSchemeChange))
+ })
+
+ return (
+
+
+
{i18n.t("workspace.cost.title")}
+
{i18n.t("workspace.cost.subtitle")}
+
+
+
+
+
+
+
+ {formatMonthYear()}
+
+
+
+
+
setStore({ modelDropdownOpen: open })}
+ >
+ <>
+ onSelectModel(null)}>
+ {i18n.t("workspace.cost.allModels")}
+
+
+ {(model) => (
+ onSelectModel(model)}>
+ {model}
+
+ )}
+
+ >
+
+
setStore({ keyDropdownOpen: open })}
+ >
+ <>
+ onSelectKey(null)}>
+ {i18n.t("workspace.cost.allKeys")}
+
+
+ {(key) => (
+ onSelectKey(key.id)}>
+
+ {key.deleted ? `${key.displayName} ${i18n.t("workspace.cost.deletedSuffix")}` : key.displayName}
+
+
+ )}
+
+ >
+
+
+
+
+ {i18n.t("workspace.cost.empty")}
+
+ }
+ >
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/usage/index.tsx b/packages/console/app/src/routes/workspace/[id]/usage/index.tsx
new file mode 100644
index 0000000..3a9c8db
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/usage/index.tsx
@@ -0,0 +1,21 @@
+import { Show } from "solid-js"
+import { createAsync, useParams } from "@solidjs/router"
+import { GraphSection } from "./graph-section"
+import { UsageSection } from "./usage-section"
+import { querySessionInfo } from "../../common"
+
+export default function () {
+ const params = useParams()
+ const user = createAsync(() => querySessionInfo(params.id!))
+
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/usage/usage-section.module.css b/packages/console/app/src/routes/workspace/[id]/usage/usage-section.module.css
new file mode 100644
index 0000000..866ed9a
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/usage/usage-section.module.css
@@ -0,0 +1,187 @@
+.root {
+ /* Empty state */
+ [data-component="empty-state"] {
+ padding: var(--space-20) var(--space-6);
+ text-align: center;
+ border: 1px dashed var(--color-border);
+ border-radius: var(--border-radius-sm);
+
+ p {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-muted);
+ }
+ }
+
+ /* Table container */
+ [data-slot="usage-table"] {
+ overflow-x: auto;
+ }
+
+ /* Table element */
+ [data-slot="usage-table-element"] {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--font-size-sm);
+
+ thead {
+ border-bottom: 1px solid var(--color-border);
+ }
+
+ th {
+ padding: var(--space-3) var(--space-4);
+ text-align: left;
+ font-weight: normal;
+ color: var(--color-text-muted);
+ text-transform: uppercase;
+ }
+
+ td {
+ padding: var(--space-3) var(--space-4);
+ border-bottom: 1px solid var(--color-border-muted);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+
+ &[data-slot="usage-date"] {
+ color: var(--color-text-muted);
+ }
+
+ &[data-slot="usage-model"] {
+ font-family: var(--font-sans);
+ color: var(--color-text-secondary);
+ max-width: 200px;
+ word-break: break-word;
+ }
+
+ &[data-slot="usage-cost"] {
+ color: var(--color-text-muted);
+ }
+
+ [data-slot="tokens-with-breakdown"] {
+ position: relative;
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ }
+
+ [data-slot="breakdown-button"] {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ padding: 0;
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ cursor: pointer;
+ transition: color 0.15s ease;
+
+ &:hover {
+ color: var(--color-text);
+ }
+
+ svg {
+ flex-shrink: 0;
+ width: 16px;
+ height: 16px;
+ }
+ }
+
+ [data-slot="breakdown-popup"] {
+ position: absolute;
+ left: 0;
+ top: 100%;
+ margin-top: var(--space-2);
+ background: var(--color-bg);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ padding: var(--space-2);
+ z-index: 10;
+ min-width: 180px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ font-size: var(--font-size-xs);
+
+ @media (prefers-color-scheme: dark) {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
+ }
+ }
+ }
+
+ tbody tr:last-child td {
+ border-bottom: none;
+ }
+ }
+
+ /* Pagination */
+ [data-slot="pagination"] {
+ display: flex;
+ justify-content: flex-end;
+ gap: var(--space-2);
+ padding: var(--space-4) 0;
+ border-top: 1px solid var(--color-border-muted);
+ margin-top: var(--space-2);
+
+ button {
+ padding: var(--space-2) var(--space-4);
+ background: var(--color-bg-secondary);
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-sm);
+ color: var(--color-text);
+ font-size: var(--font-size-sm);
+ cursor: pointer;
+ transition: all 0.15s ease;
+
+ svg {
+ width: 16px;
+ height: 16px;
+ stroke-width: 2;
+ }
+
+ &:hover:not(:disabled) {
+ background: var(--color-bg-tertiary);
+ border-color: var(--color-border-hover);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+ }
+
+ /* Mobile responsive */
+ @media (max-width: 40rem) {
+ [data-slot="usage-table-element"] {
+ th,
+ td {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-xs);
+ }
+
+ /* Hide Model column on mobile */
+ th:nth-child(2),
+ td:nth-child(2) {
+ display: none;
+ }
+ }
+ }
+
+ /* Breakdown popup content */
+ [data-slot="breakdown-row"] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-4);
+ padding: var(--space-1) 0;
+ }
+
+ [data-slot="breakdown-label"] {
+ color: var(--color-text-muted);
+ font-size: var(--font-size-xs);
+ }
+
+ [data-slot="breakdown-value"] {
+ color: var(--color-text);
+ font-weight: 500;
+ font-size: var(--font-size-xs);
+ }
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/usage/usage-section.tsx b/packages/console/app/src/routes/workspace/[id]/usage/usage-section.tsx
new file mode 100644
index 0000000..2075052
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/[id]/usage/usage-section.tsx
@@ -0,0 +1,217 @@
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { createAsync, query, useParams } from "@solidjs/router"
+import { createMemo, For, Show, Switch, Match, createEffect, createSignal } from "solid-js"
+import { formatDateUTC, formatDateForTable } from "../../common"
+import { withActor } from "~/context/auth.withActor"
+import { IconChevronLeft, IconChevronRight, IconBreakdown } from "~/component/icon"
+import styles from "./usage-section.module.css"
+import { createStore } from "solid-js/store"
+import { useI18n } from "~/context/i18n"
+
+const PAGE_SIZE = 50
+
+async function getUsageInfo(workspaceID: string, page: number) {
+ "use server"
+ return withActor(async () => {
+ return await Billing.usages(page, PAGE_SIZE)
+ }, workspaceID)
+}
+
+const queryUsageInfo = query(getUsageInfo, "usage.list")
+
+export function UsageSection() {
+ const params = useParams()
+ const i18n = useI18n()
+ const usage = createAsync(() => queryUsageInfo(params.id!, 0))
+ const [store, setStore] = createStore({ page: 0, usage: [] as Awaited> })
+ const [openBreakdownId, setOpenBreakdownId] = createSignal(null)
+
+ createEffect(() => {
+ setStore({ usage: usage() })
+ }, [usage])
+
+ createEffect(() => {
+ if (!openBreakdownId()) return
+
+ const handleClickOutside = (e: MouseEvent) => {
+ const target = e.target as HTMLElement
+ if (!target.closest('[data-slot="tokens-with-breakdown"]')) {
+ setOpenBreakdownId(null)
+ }
+ }
+
+ document.addEventListener("click", handleClickOutside)
+ return () => document.removeEventListener("click", handleClickOutside)
+ })
+
+ const hasResults = createMemo(() => store.usage && store.usage.length > 0)
+ const canGoPrev = createMemo(() => store.page > 0)
+ const canGoNext = createMemo(() => store.usage && store.usage.length === PAGE_SIZE)
+
+ const calculateTotalInputTokens = (u: Awaited>[0]) => {
+ return u.inputTokens + (u.cacheReadTokens ?? 0) + (u.cacheWrite5mTokens ?? 0) + (u.cacheWrite1hTokens ?? 0)
+ }
+
+ const calculateTotalOutputTokens = (u: Awaited>[0]) => {
+ return u.outputTokens
+ }
+
+ const goPrev = async () => {
+ const usage = await getUsageInfo(params.id!, store.page - 1)
+ setStore({
+ page: store.page - 1,
+ usage,
+ })
+ }
+ const goNext = async () => {
+ const usage = await getUsageInfo(params.id!, store.page + 1)
+ setStore({
+ page: store.page + 1,
+ usage,
+ })
+ }
+
+ return (
+
+
+
{i18n.t("workspace.usage.title")}
+
{i18n.t("workspace.usage.subtitle")}
+
+
+
+ {i18n.t("workspace.usage.empty")}
+
+ }
+ >
+
+
+
+ {i18n.t("workspace.usage.table.date")}
+ {i18n.t("workspace.usage.table.model")}
+ {i18n.t("workspace.usage.table.input")}
+ {i18n.t("workspace.usage.table.output")}
+ {i18n.t("workspace.usage.table.cost")}
+ {i18n.t("workspace.usage.table.session")}
+
+
+
+
+ {(usage, index) => {
+ const date = createMemo(() => new Date(usage.timeCreated))
+ const totalInputTokens = createMemo(() => calculateTotalInputTokens(usage))
+ const totalOutputTokens = createMemo(() => calculateTotalOutputTokens(usage))
+ const inputBreakdownId = `input-breakdown-${index()}`
+ const outputBreakdownId = `output-breakdown-${index()}`
+ const isInputOpen = createMemo(() => openBreakdownId() === inputBreakdownId)
+ const isOutputOpen = createMemo(() => openBreakdownId() === outputBreakdownId)
+ const isClaude = usage.model.toLowerCase().includes("claude")
+ return (
+
+
+ {formatDateForTable(date())}
+
+ {usage.model}
+
+ e.stopPropagation()}>
+
{
+ e.stopPropagation()
+ setOpenBreakdownId(isInputOpen() ? null : inputBreakdownId)
+ }}
+ >
+
+
+
setOpenBreakdownId(null)}>{totalInputTokens()}
+
+ e.stopPropagation()}>
+
+ {i18n.t("workspace.usage.breakdown.input")}
+ {usage.inputTokens}
+
+
+ {i18n.t("workspace.usage.breakdown.cacheRead")}
+ {usage.cacheReadTokens ?? 0}
+
+
+
+
+ {i18n.t("workspace.usage.breakdown.cacheWrite")}
+
+ {usage.cacheWrite5mTokens ?? 0}
+
+
+
+
+
+
+
+ e.stopPropagation()}>
+
{
+ e.stopPropagation()
+ setOpenBreakdownId(isOutputOpen() ? null : outputBreakdownId)
+ }}
+ >
+
+
+
setOpenBreakdownId(null)}>{totalOutputTokens()}
+
+ e.stopPropagation()}>
+
+ {i18n.t("workspace.usage.breakdown.output")}
+ {usage.outputTokens}
+
+
+ {i18n.t("workspace.usage.breakdown.reasoning")}
+ {usage.reasoningTokens ?? 0}
+
+
+
+
+
+
+ ${((usage.cost ?? 0) / 100000000).toFixed(4)}>}>
+
+ {i18n.t("workspace.usage.subscription", {
+ amount: ((usage.cost ?? 0) / 100000000).toFixed(4),
+ })}
+
+
+ {i18n.t("workspace.usage.lite", {
+ amount: ((usage.cost ?? 0) / 100000000).toFixed(4),
+ })}
+
+
+ {i18n.t("workspace.usage.byok", {
+ amount: ((usage.cost ?? 0) / 100000000).toFixed(4),
+ })}
+
+
+
+ {usage.sessionID?.slice(-8) ?? "-"}
+
+ )
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/workspace/common.tsx b/packages/console/app/src/routes/workspace/common.tsx
new file mode 100644
index 0000000..d41793d
--- /dev/null
+++ b/packages/console/app/src/routes/workspace/common.tsx
@@ -0,0 +1,122 @@
+import { Resource } from "@opencode-ai/console-resource"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { action, json, query } from "@solidjs/router"
+import { withActor } from "~/context/auth.withActor"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { and, Database, desc, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+
+export function formatDateForTable(date: Date) {
+ const options: Intl.DateTimeFormatOptions = {
+ day: "numeric",
+ month: "short",
+ hour: "numeric",
+ minute: "2-digit",
+ hour12: true,
+ }
+ return date.toLocaleDateString(undefined, options).replace(",", ",")
+}
+
+export function formatDateUTC(date: Date) {
+ const options: Intl.DateTimeFormatOptions = {
+ weekday: "short",
+ year: "numeric",
+ month: "short",
+ day: "numeric",
+ hour: "numeric",
+ minute: "2-digit",
+ second: "2-digit",
+ timeZoneName: "short",
+ timeZone: "UTC",
+ }
+ return date.toLocaleDateString(undefined, options)
+}
+
+export function formatBalance(amount: number) {
+ const balance = ((amount ?? 0) / 100000000).toFixed(2)
+ return balance === "-0.00" ? "0.00" : balance
+}
+
+export async function getLastSeenWorkspaceID() {
+ "use server"
+ return withActor(async () => {
+ const actor = Actor.assert("account")
+ return Database.use(async (tx) =>
+ tx
+ .select({ id: WorkspaceTable.id })
+ .from(UserTable)
+ .innerJoin(WorkspaceTable, eq(UserTable.workspaceID, WorkspaceTable.id))
+ .where(
+ and(
+ eq(UserTable.accountID, actor.properties.accountID),
+ isNull(UserTable.timeDeleted),
+ isNull(WorkspaceTable.timeDeleted),
+ ),
+ )
+ .orderBy(desc(UserTable.timeSeen))
+ .limit(1)
+ .then((x) => x[0]?.id),
+ )
+ })
+}
+
+export const querySessionInfo = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(() => {
+ return {
+ isAdmin: Actor.userRole() === "admin",
+ isBeta: Resource.App.stage === "production" ? workspaceID === "wrk_01K46JDFR0E75SG2Q8K172KF3Y" : true,
+ }
+ }, workspaceID)
+}, "session.get")
+
+export const createCheckoutUrl = action(
+ async (workspaceID: string, amount: number, successUrl: string, cancelUrl: string) => {
+ "use server"
+ return json(
+ await withActor(
+ () =>
+ Billing.generateCheckoutUrl({ amount, successUrl, cancelUrl })
+ .then((data) => ({ error: undefined, data }))
+ .catch((e) => ({
+ error: e.message as string,
+ data: undefined,
+ })),
+ workspaceID,
+ ),
+ )
+ },
+ "checkoutUrl",
+)
+
+export const queryBillingInfo = query(async (workspaceID: string) => {
+ "use server"
+ return withActor(async () => {
+ const billing = await Billing.get()
+ return {
+ customerID: billing.customerID,
+ paymentMethodID: billing.paymentMethodID,
+ paymentMethodType: billing.paymentMethodType,
+ paymentMethodLast4: billing.paymentMethodLast4,
+ balance: billing.balance,
+ reload: billing.reload,
+ reloadAmount: billing.reloadAmount ?? Billing.RELOAD_AMOUNT,
+ reloadAmountMin: Billing.RELOAD_AMOUNT_MIN,
+ reloadTrigger: billing.reloadTrigger ?? Billing.RELOAD_TRIGGER,
+ reloadTriggerMin: Billing.RELOAD_TRIGGER_MIN,
+ monthlyLimit: billing.monthlyLimit,
+ monthlyUsage: billing.monthlyUsage,
+ timeMonthlyUsageUpdated: billing.timeMonthlyUsageUpdated,
+ reloadError: billing.reloadError,
+ timeReloadError: billing.timeReloadError,
+ subscription: billing.subscription,
+ subscriptionID: billing.subscriptionID,
+ subscriptionPlan: billing.subscriptionPlan,
+ timeSubscriptionBooked: billing.timeSubscriptionBooked,
+ timeSubscriptionSelected: billing.timeSubscriptionSelected,
+ lite: billing.lite,
+ liteSubscriptionID: billing.liteSubscriptionID,
+ }
+ }, workspaceID)
+}, "billing.get")
diff --git a/packages/console/app/src/routes/zen/go/v1/chat/completions.ts b/packages/console/app/src/routes/zen/go/v1/chat/completions.ts
new file mode 100644
index 0000000..71fb8f2
--- /dev/null
+++ b/packages/console/app/src/routes/zen/go/v1/chat/completions.ts
@@ -0,0 +1,14 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+import { parseOpenAiVariant } from "~/routes/zen/util/variant"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "oa-compat",
+ modelList: "lite",
+ parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
+ parseModel: (url: string, body: any) => body.model,
+ parseVariant: (url: string, body: any) => parseOpenAiVariant(body),
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/go/v1/messages.ts b/packages/console/app/src/routes/zen/go/v1/messages.ts
new file mode 100644
index 0000000..d356b0b
--- /dev/null
+++ b/packages/console/app/src/routes/zen/go/v1/messages.ts
@@ -0,0 +1,14 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+import { parseAnthropicVariant } from "~/routes/zen/util/variant"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "anthropic",
+ modelList: "lite",
+ parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
+ parseModel: (url: string, body: any) => body.model,
+ parseVariant: (url: string, body: any) => parseAnthropicVariant(body),
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/go/v1/models.ts b/packages/console/app/src/routes/zen/go/v1/models.ts
new file mode 100644
index 0000000..83ef74f
--- /dev/null
+++ b/packages/console/app/src/routes/zen/go/v1/models.ts
@@ -0,0 +1,12 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { ZenData } from "@opencode-ai/console-core/model.js"
+import { buildModelsResponse, buildOptionsResponse } from "../../util/modelsHandler"
+
+export async function OPTIONS(_input: APIEvent) {
+ return buildOptionsResponse()
+}
+
+export async function GET(_input: APIEvent) {
+ const models = Object.keys(ZenData.list("lite").models)
+ return buildModelsResponse(models)
+}
diff --git a/packages/console/app/src/routes/zen/index.css b/packages/console/app/src/routes/zen/index.css
new file mode 100644
index 0000000..1b57552
--- /dev/null
+++ b/packages/console/app/src/routes/zen/index.css
@@ -0,0 +1,867 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+[data-page="zen"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 74%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+}
+
+[data-page="zen"] {
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ }
+}
+
+body {
+ background: var(--color-background);
+}
+
+@supports (background: -webkit-named-image(i)) {
+ [data-page="opencode"] {
+ border-top: 1px solid var(--color-border-weak);
+ }
+}
+
+[data-page="zen"] {
+ background: var(--color-background);
+ --padding: 5rem;
+ --vertical-padding: 4rem;
+
+ @media (max-width: 60rem) {
+ --padding: 1.5rem;
+ --vertical-padding: 3rem;
+ }
+
+ display: flex;
+ gap: var(--vertical-padding);
+ flex-direction: column;
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+
+ p {
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+
+ @media (max-width: 60rem) {
+ font-size: 15px;
+ }
+
+ input:-webkit-autofill,
+ input:-webkit-autofill:hover,
+ input:-webkit-autofill:focus,
+ input:-webkit-autofill:active {
+ transition: background-color 5000000s ease-in-out 0s;
+ }
+
+ input:-webkit-autofill {
+ -webkit-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ input:-moz-autofill {
+ -moz-text-fill-color: var(--color-text-strong) !important;
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ }
+
+ [data-component="top"] {
+ padding: 24px var(--padding);
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+
+ z-index: 10;
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 32px;
+
+ @media (max-width: 55rem) {
+ gap: 24px;
+ }
+
+ @media (max-width: 48rem) {
+ gap: 24px;
+ }
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+ [data-slot="cta-button"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ padding: 8px 16px;
+ border-radius: 4px;
+ font-weight: 500;
+ text-decoration: none;
+ white-space: nowrap;
+
+ @media (max-width: 55rem) {
+ display: none;
+ }
+ }
+ [data-slot="cta-button"]:hover {
+ background: var(--color-background-strong-hover);
+ text-decoration: none;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="hero"] {
+ display: flex;
+ flex-direction: column;
+ padding: calc(var(--vertical-padding) * 2) var(--padding);
+
+ [data-slot="zen logo dark"] {
+ display: none;
+ }
+
+ @media (max-width: 30rem) {
+ padding: var(--vertical-padding) var(--padding);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="zen logo light"] {
+ display: none;
+ }
+ [data-slot="zen logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-slot="hero-copy"] {
+ img {
+ margin-bottom: 24px;
+ }
+
+ h1 {
+ font-size: 28px;
+ color: var(--color-text-strong);
+ font-weight: 700;
+ margin-bottom: 16px;
+ display: block;
+
+ @media (max-width: 60rem) {
+ font-size: 22px;
+ }
+ }
+
+ p {
+ color: var(--color-text);
+ margin-bottom: 24px;
+ max-width: 82%;
+
+ @media (max-width: 50rem) {
+ max-width: 100%;
+ }
+ }
+
+ a {
+ background: var(--color-background-strong);
+ padding: 8px 12px 8px 20px;
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ margin-bottom: 56px;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ text-decoration: none;
+ }
+
+ a:hover {
+ background: var(--color-background-strong-hover);
+ }
+ }
+ [data-slot="model-logos"] {
+ display: flex;
+ gap: 24px;
+ margin-bottom: 56px;
+
+ svg {
+ color: var(--color-background-strong);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ svg {
+ color: var(--color-background-strong);
+ }
+ }
+ }
+
+ [data-slot="pricing-copy"] {
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+
+ p:first-child {
+ margin-bottom: 24px;
+ color: var(--color-text);
+ display: flex;
+ gap: 8px;
+
+ @media (max-width: 40rem) {
+ flex-direction: column;
+ gap: 4px;
+ }
+ }
+ }
+
+ [data-component="comparison"] {
+ border-top: 1px solid var(--color-border-weak);
+ video {
+ width: 100%;
+ height: auto;
+ max-width: none;
+ max-height: none;
+ display: block;
+ }
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ p {
+ margin-bottom: 12px;
+ color: var(--color-text);
+ }
+ }
+
+ [data-component="problem"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ p {
+ margin-bottom: 24px;
+ }
+
+ ul {
+ padding: 0;
+ li {
+ list-style: none;
+ margin-bottom: 16px;
+ display: flex;
+ gap: 12px;
+
+ span {
+ color: var(--color-icon);
+ }
+ }
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ [data-component="how"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ ul {
+ padding: 0;
+ li {
+ list-style: none;
+ margin-bottom: 16px;
+ display: flex;
+ gap: 12px;
+
+ span {
+ color: var(--color-icon);
+ }
+ strong {
+ font-weight: 500;
+ color: var(--color-text-strong);
+ }
+ }
+ li:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ [data-component="privacy"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ [data-slot="privacy-title"] {
+ h3 {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--color-text);
+ margin-bottom: 12px;
+ }
+
+ div {
+ display: flex;
+ gap: 12px;
+ }
+
+ p {
+ }
+
+ span {
+ color: var(--color-icon);
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+
+ div {
+ display: flex;
+ gap: 12px;
+ }
+ }
+ }
+
+ [data-component="email"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ color: var(--color-text);
+
+ [data-slot="dock"] {
+ border-radius: 14px;
+ border: 0.5px solid rgba(176, 176, 176, 0.6);
+ background: #f2f1f0;
+ margin-bottom: 32px;
+ overflow: hidden;
+ height: 64px;
+ width: 185px;
+ box-shadow:
+ 0 6px 80px 0 rgba(0, 0, 0, 0.05),
+ 0 2.507px 33.422px 0 rgba(0, 0, 0, 0.04),
+ 0 1.34px 17.869px 0 rgba(0, 0, 0, 0.03),
+ 0 0.751px 10.017px 0 rgba(0, 0, 0, 0.03),
+ 0 0.399px 5.32px 0 rgba(0, 0, 0, 0.02),
+ 0 0.166px 2.214px 0 rgba(0, 0, 0, 0.01);
+
+ img {
+ width: 100%;
+ height: auto;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ background: #312d2d;
+ }
+ }
+
+ [data-slot="form"] {
+ position: relative;
+
+ input {
+ background: var(--color-background-weak);
+ border-radius: 6px;
+ border: 1px solid var(--color-border-weak);
+ padding: 20px;
+ width: 100%;
+
+ /* Use color, not -moz-text-fill-color, for normal text */
+ color: var(--color-text-strong);
+
+ @media (max-width: 30rem) {
+ padding-bottom: 80px;
+ }
+
+ &:not(:focus) {
+ color: var(--color-text-strong);
+ }
+
+ &::placeholder {
+ color: var(--color-text-weak);
+ opacity: 1;
+ }
+
+ /* Optional legacy */
+ &::-moz-placeholder {
+ color: var(--color-text-weak);
+ opacity: 1;
+ }
+ }
+
+ input:focus {
+ background: var(--color-background-interactive-weaker);
+ outline: none;
+ border: none;
+ color: var(--color-text-strong);
+
+ border: 1px solid var(--color-background-strong); /* Tailwind blue-600 as example */
+
+ /* Tailwind-style ring */
+ box-shadow: 0 0 0 3px var(--color-background-interactive);
+ /* mimics "ring-2 ring-blue-600/50" */
+ }
+
+ button {
+ position: absolute;
+ height: 40px;
+ right: 12px;
+ background: var(--color-background-strong);
+ padding: 4px 20px;
+ color: var(--color-text-inverted);
+ border-radius: 4px;
+ font-weight: 500;
+ border: none;
+ outline: none;
+ cursor: pointer;
+ top: 50%;
+ margin-top: -20px;
+
+ @media (max-width: 30rem) {
+ left: 20px;
+ right: 20px;
+ bottom: 20px;
+ top: auto;
+ }
+ }
+ }
+ }
+
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+ }
+ }
+
+ [data-component="testimonials"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: var(--vertical-padding) var(--padding);
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+
+ a {
+ text-decoration: none;
+ }
+
+ [data-slot="testimonial"] {
+ background: var(--color-background-weak);
+ border-radius: 6px;
+ border: 1px solid var(--color-border-weak);
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+
+ @media (max-width: 30rem) {
+ flex-direction: column-reverse;
+ gap: 24px;
+ }
+
+ [data-slot="name"] {
+ display: flex;
+ gap: 16px;
+
+ strong {
+ font-weight: 500;
+ flex: 0 0 auto;
+ }
+
+ span {
+ color: var(--color-text);
+ }
+
+ @media (max-width: 30rem) {
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ span {
+ display: inline-block;
+ }
+
+ img {
+ height: 24px;
+ width: 24px;
+ border-radius: 24px;
+ }
+ }
+
+ [data-slot="quote"] {
+ margin-left: 40px;
+
+ @media (max-width: 30rem) {
+ margin-left: 0;
+ }
+ span {
+ color: var(--color-text);
+ text-decoration: none;
+ }
+ }
+ }
+
+ [data-slot="button"] {
+ all: unset;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ color: var(--color-text);
+ gap: var(--space-2-5);
+ font-size: 1rem;
+
+ @media (max-width: 24rem) {
+ font-size: 0.875rem;
+ }
+
+ strong {
+ color: var(--color-text-strong);
+ font-weight: 500;
+ }
+
+ @media (max-width: 40rem) {
+ justify-content: flex-start;
+ }
+
+ @media (max-width: 30rem) {
+ justify-content: center;
+ }
+ }
+ }
+
+ [data-component="copy-status"] {
+ @media (max-width: 38rem) {
+ display: none;
+ }
+
+ [data-slot="copy"] {
+ display: block;
+ width: var(--space-4);
+ height: var(--space-4);
+ color: var(--color-text-weaker);
+
+ [data-copied] & {
+ display: none;
+ }
+ }
+
+ [data-slot="check"] {
+ display: none;
+ width: var(--space-4);
+ height: var(--space-4);
+ color: var(--color-text-strong);
+
+ [data-copied] & {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: var(--space-1);
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ /* Mobile: third column on its own row */
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ display: flex;
+ gap: 32px;
+ justify-content: center;
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-text);
+ text-decoration: underline;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/zen/index.tsx b/packages/console/app/src/routes/zen/index.tsx
new file mode 100644
index 0000000..6285a0b
--- /dev/null
+++ b/packages/console/app/src/routes/zen/index.tsx
@@ -0,0 +1,336 @@
+import "./index.css"
+import { createAsync, query } from "@solidjs/router"
+import { Title, Meta } from "@solidjs/meta"
+//import { HttpHeader } from "@solidjs/start"
+import zenLogoLight from "../../asset/zen-ornate-light.svg"
+import zenLogoDark from "../../asset/zen-ornate-dark.svg"
+import compareVideo from "../../asset/lander/opencode-comparison-min.mp4"
+import compareVideoPoster from "../../asset/lander/opencode-comparison-poster.png"
+import avatarDax from "../../asset/lander/avatar-dax.png"
+import avatarJay from "../../asset/lander/avatar-jay.png"
+import avatarFrank from "../../asset/lander/avatar-frank.png"
+import avatarAdam from "../../asset/lander/avatar-adam.png"
+import avatarDavid from "../../asset/lander/avatar-david.png"
+import { EmailSignup } from "~/component/email-signup"
+import { Faq } from "~/component/faq"
+import { Legal } from "~/component/legal"
+import { Footer } from "~/component/footer"
+import { Header } from "~/component/header"
+import { getLastSeenWorkspaceID } from "../workspace/common"
+import { IconGemini, IconMiniMax, IconZai } from "~/component/icon"
+import { useI18n } from "~/context/i18n"
+import { useLanguage } from "~/context/language"
+import { LocaleLinks } from "~/component/locale-links"
+
+const checkLoggedIn = query(async () => {
+ "use server"
+ return await getLastSeenWorkspaceID().catch(() => {})
+}, "checkLoggedIn.get")
+
+export default function Home() {
+ const loggedin = createAsync(() => checkLoggedIn())
+ const i18n = useI18n()
+ const language = useLanguage()
+ return (
+
+ {/* */}
+ {i18n.t("zen.title")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("zen.pricing.title")} {i18n.t("zen.pricing.fee")}
+
+
{i18n.t("zen.pricing.body")}
+
+
+
+
+
+ {i18n.t("common.videoUnsupported")}
+
+
+
+
+
+
{i18n.t("zen.problem.title")}
+
{i18n.t("zen.problem.body")}
+
+ {i18n.t("zen.problem.subtitle")}
+
+
+ [*] {i18n.t("zen.problem.item1")}
+
+
+ [*] {i18n.t("zen.problem.item2")}
+
+
+ [*] {i18n.t("zen.problem.item3")}
+
+
+
+
+
+
+
{i18n.t("zen.how.title")}
+
{i18n.t("zen.how.body")}
+
+
+
+
+
+
+
{i18n.t("zen.privacy.title")}
+
+
+
+
+
+ {/*Dax*/}
+
+
+
+
+
Dax Raad
+
ex-CEO, Terminal Products
+
+
+ @OpenCode
+ {" Zen has been life changing, it's truly a no-brainer."}
+
+
+
+ {/*Jay*/}
+
+
+
+
+
Jay V
+
ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint
+
+
+ {"4 out of 5 people on our team love using "}
+ @OpenCode
+ {" Zen."}
+
+
+
+ {/*Adam*/}
+
+
+
+
+
Adam Elmore
+
ex-Hero, AWS
+
+
+ {"I can't recommend "}
+ @OpenCode
+ {" Zen enough. Seriously, it's really good."}
+
+
+
+ {/*David*/}
+
+
+
+
+
David Hill
+
ex-Head of Design, Laravel
+
+
+ {"With "}
+ @OpenCode
+ {" Zen I know all the models are tested and perfect for coding agents."}
+
+
+
+ {/*Frank*/}
+
+
+
+
+
Frank Wang
+
ex-Intern, Nvidia (4 times)
+
+
I wish I was still at Nvidia.
+
+
+
+
+
+
+
{i18n.t("common.faq")}
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/console/app/src/routes/zen/util/error.ts b/packages/console/app/src/routes/zen/util/error.ts
new file mode 100644
index 0000000..d17741f
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/error.ts
@@ -0,0 +1,27 @@
+export class AuthError extends Error {}
+export class CreditsError extends Error {}
+export class MonthlyLimitError extends Error {}
+export class UserLimitError extends Error {}
+export class ModelError extends Error {}
+
+class LimitError extends Error {
+ retryAfter?: number
+ constructor(message: string, retryAfter?: number) {
+ super(message)
+ this.retryAfter = retryAfter
+ }
+}
+export class RateLimitError extends LimitError {}
+export class FreeUsageLimitError extends LimitError {}
+export class BlackUsageLimitError extends LimitError {}
+
+type LimitName = "5 hour" | "weekly" | "monthly"
+export class GoUsageLimitError extends LimitError {
+ workspace: string
+ limitName: LimitName
+ constructor(message: string, workspace: string, limitName: LimitName, retryAfter?: number) {
+ super(message, retryAfter)
+ this.workspace = workspace
+ this.limitName = limitName
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts
new file mode 100644
index 0000000..0f9c179
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/handler.ts
@@ -0,0 +1,1168 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { and, Database, eq, isNull, lt, or, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
+import { BillingTable, LiteTable, SubscriptionTable, UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js"
+import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js"
+import { getMonthlyBounds, getWeekBounds } from "@opencode-ai/console-core/util/date.js"
+import { Identifier } from "@opencode-ai/console-core/identifier.js"
+import { Billing } from "@opencode-ai/console-core/billing.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { ZenData } from "@opencode-ai/console-core/model.js"
+import { Subscription } from "@opencode-ai/console-core/subscription.js"
+import { BlackData } from "@opencode-ai/console-core/black.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js"
+import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js"
+import { logger } from "./logger"
+import {
+ AuthError,
+ CreditsError,
+ MonthlyLimitError,
+ UserLimitError,
+ ModelError,
+ RateLimitError,
+ FreeUsageLimitError,
+ GoUsageLimitError,
+ BlackUsageLimitError,
+} from "./error"
+import {
+ buildCostChunk,
+ createBodyConverter,
+ createStreamPartConverter,
+ createResponseConverter,
+ UsageInfo,
+} from "./provider/provider"
+import { anthropicHelper } from "./provider/anthropic"
+import { googleHelper } from "./provider/google"
+import { openaiHelper } from "./provider/openai"
+import { oaCompatHelper } from "./provider/openai-compatible"
+import { createRateLimiter as createIpRateLimiter } from "./ipRateLimiter"
+import { createRateLimiter as createKeyRateLimiter } from "./keyRateLimiter"
+import { createTrialLimiter } from "./trialLimiter"
+import { createStickyTracker } from "./stickyProviderTracker"
+import { LiteData } from "@opencode-ai/console-core/lite.js"
+import { Resource } from "@opencode-ai/console-resource"
+import { i18n, type Key } from "~/i18n"
+import { localeFromRequest } from "~/lib/language"
+import { createModelTpmLimiter } from "./modelTpmLimiter"
+import { createModelTpsLimiter } from "./modelTpsLimiter"
+import { accumulateUsage, HOT_WORKSPACES } from "./usageBatcher"
+
+type ZenData = Awaited>
+type RetryOptions = {
+ excludeProviders: string[]
+ retryCount: number
+}
+type BillingSource = "anonymous" | "free" | "byok" | "subscription" | "lite" | "balance"
+
+function resolve(text: string, params?: Record) {
+ if (!params) return text
+ return text.replace(/\{\{(\w+)\}\}/g, (raw, key) => {
+ const value = params[key]
+ if (value === undefined || value === null) return raw
+ return String(value)
+ })
+}
+
+export async function handler(
+ input: APIEvent,
+ opts: {
+ format: ZenData.Format
+ modelList: "lite" | "full"
+ parseApiKey: (headers: Headers) => string | undefined
+ parseModel: (url: string, body: any) => string
+ parseVariant: (url: string, body: any) => string | undefined
+ parseIsStream: (url: string, body: any) => boolean
+ },
+) {
+ type AuthInfo = Awaited>
+ type ModelInfo = Awaited>
+ type ProviderInfo = Awaited>
+ type CostInfo = ReturnType
+
+ const MAX_FAILOVER_RETRIES = 3
+ const MAX_429_RETRIES = 3
+ const dict = i18n(localeFromRequest(input.request))
+ const t = (key: Key, params?: Record) => resolve(dict[key], params)
+ const ADMIN_WORKSPACES = [
+ "wrk_01K46JDFR0E75SG2Q8K172KF3Y", // anomaly
+ "wrk_01K6W1A3VE0KMNVSCQT43BG2SX", // benchmark
+ "wrk_01KKZDKDWCS1VTJF8QTX62DD50", // contributors
+ ]
+
+ try {
+ const url = input.request.url
+ const body = await input.request.json()
+ const model = opts.parseModel(url, body)
+ const variant = opts.parseVariant(url, body)
+ const isStream = opts.parseIsStream(url, body)
+ const rawIp = input.request.headers.get("x-real-ip") ?? ""
+ const ip = rawIp.includes(":") ? rawIp.split(":").slice(0, 4).join(":") : rawIp
+ const rawZenApiKey = opts.parseApiKey(input.request.headers)
+ const zenApiKey = rawZenApiKey === "public" ? undefined : rawZenApiKey
+ const sessionId = input.request.headers.get("x-opencode-session") ?? ""
+ const requestId = input.request.headers.get("x-opencode-request") ?? ""
+ const ocClient = input.request.headers.get("x-opencode-client") ?? ""
+ const userAgent = input.request.headers.get("user-agent") ?? ""
+ logger.metric({
+ is_stream: isStream,
+ session: sessionId,
+ request: requestId,
+ client: ocClient,
+ user_agent: userAgent,
+ "model.variant": variant,
+ "model.tier": opts.modelList === "full" ? "zen" : "go",
+ })
+ const zenData = ZenData.list(opts.modelList)
+ const modelInfo = validateModel(zenData, model)
+ const trialLimiter = createTrialLimiter(modelInfo.trialProvider, ip)
+ const trialProviders = await trialLimiter?.check()
+ const rateLimiter = modelInfo.allowAnonymous
+ ? createIpRateLimiter(modelInfo.id, modelInfo.rateLimit, ip, input.request)
+ : createKeyRateLimiter(modelInfo.id, modelInfo.rateLimit, zenApiKey, input.request)
+ await rateLimiter?.check()
+ const authInfo = await authenticate(modelInfo, zenApiKey)
+ const stickyId = sessionId ? sessionId : (authInfo?.workspaceID ?? ip)
+ const stickyTracker = createStickyTracker(modelInfo.id, modelInfo.stickyProvider, stickyId)
+ const stickyProvider = await stickyTracker?.get()
+ const billingSource = validateBilling(authInfo, modelInfo)
+ logger.metric({ source: billingSource })
+ const modelTpmLimiter = createModelTpmLimiter(modelInfo.providers)
+ const modelTpmLimits = await modelTpmLimiter?.check()
+ const modelTpsLimiter = createModelTpsLimiter(modelInfo.providers)
+ const modelTpsLimits = await modelTpsLimiter?.check()
+
+ const retriableRequest = async (retry: RetryOptions = { excludeProviders: [], retryCount: 0 }) => {
+ const providerInfo = selectProvider(
+ model,
+ zenData,
+ authInfo,
+ modelInfo,
+ stickyId,
+ trialProviders,
+ retry,
+ stickyProvider,
+ modelTpmLimits,
+ modelTpsLimits,
+ )
+ validateModelSettings(billingSource, authInfo)
+ updateProviderKey(authInfo, providerInfo)
+ logger.metric({
+ provider: providerInfo.id,
+ "provider.model": providerInfo.model,
+ })
+
+ const startTimestamp = Date.now()
+ const reqUrl = providerInfo.modifyUrl(providerInfo.api, isStream)
+ const reqBody = JSON.stringify(
+ providerInfo.modifyBody({
+ ...createBodyConverter(opts.format, providerInfo.format)(body),
+ model: providerInfo.model,
+ ...(() => {
+ const replacer = (obj: Record): Record =>
+ Object.fromEntries(
+ Object.entries(obj).flatMap(([k, v]) => {
+ if (Array.isArray(v)) return [[k, v]]
+ if (typeof v === "object") return [[k, replacer(v)]]
+ if (typeof v === "string") {
+ if (v === "$workspace") return authInfo?.workspaceID ? [[k, authInfo?.workspaceID]] : []
+ if (v === "$user") return stickyId ? [[k, stickyId]] : []
+ if (v.startsWith("$header.")) {
+ const headerValue = input.request.headers.get(v.slice(8))
+ return headerValue ? [[k, headerValue]] : []
+ }
+ }
+ return [[k, v]]
+ }),
+ )
+ return replacer(providerInfo.payloadModifier ?? {})
+ })(),
+ }),
+ )
+ logger.debug("REQUEST URL: " + reqUrl)
+ logger.debug("REQUEST: " + reqBody.substring(0, 300) + "...")
+ const res = await fetchWith429Retry(reqUrl, {
+ method: "POST",
+ headers: (() => {
+ const headers = new Headers(input.request.headers)
+ providerInfo.modifyHeaders(headers, providerInfo.apiKey, stickyId)
+ Object.entries(providerInfo.headerMappings ?? {}).forEach(([k, v]) => {
+ headers.set(k, headers.get(v)!)
+ })
+ headers.delete("host")
+ headers.delete("content-length")
+ headers.delete("x-opencode-request")
+ headers.delete("x-opencode-session")
+ headers.delete("x-opencode-project")
+ headers.delete("x-opencode-client")
+ return headers
+ })(),
+ body: reqBody,
+ })
+
+ if (res.status !== 200) {
+ logger.metric({
+ "llm.error.code": res.status,
+ "llm.error.message": res.statusText,
+ })
+ }
+
+ // Try another provider => stop retrying if using fallback provider
+ if (
+ res.status !== 200 &&
+ // ie. 400 error is usually provider error like malformed request
+ res.status !== 400 &&
+ // ie. openai 404 error: Item with id 'msg_0ead8b004a3b165d0069436a6b6834819896da85b63b196a3f' not found.
+ !(modelInfo.id.startsWith("gpt-") && res.status === 404) &&
+ // ie. cannot change codex model providers mid-session
+ modelInfo.stickyProvider !== "strict" &&
+ modelInfo.fallbackProvider &&
+ providerInfo.id !== modelInfo.fallbackProvider
+ ) {
+ return retriableRequest({
+ excludeProviders: [...retry.excludeProviders, providerInfo.id],
+ retryCount: retry.retryCount + 1,
+ })
+ }
+
+ return { providerInfo, reqBody, res, startTimestamp }
+ }
+
+ const { providerInfo, reqBody, res, startTimestamp } = await retriableRequest()
+
+ // Store sticky provider
+ if (res.status === 200) await stickyTracker?.set(providerInfo.id)
+
+ // Temporarily change 404 to 400 status code b/c solid start automatically override 404 response
+ const resStatus = res.status === 404 ? 400 : res.status
+
+ // Scrub response headers
+ const resHeaders = new Headers()
+ const keepHeaders = ["content-type", "cache-control"]
+ for (const [k, v] of res.headers.entries()) {
+ if (keepHeaders.includes(k.toLowerCase())) {
+ resHeaders.set(k, v)
+ }
+ }
+ logger.debug("STATUS: " + res.status + " " + res.statusText)
+
+ // Handle non-streaming response
+ if (!isStream || [400, 404, 429].includes(res.status)) {
+ const json = await res.json()
+ await rateLimiter?.track()
+ const usage = providerInfo.extractUsage(json)
+ if (usage) {
+ const usageInfo = providerInfo.normalizeUsage(usage)
+ const costInfo = calculateCost(modelInfo, usageInfo)
+ await trialLimiter?.track(usageInfo)
+ await modelTpmLimiter?.track(providerInfo.id, providerInfo.model, usageInfo)
+ await trackUsage(sessionId, billingSource, authInfo, modelInfo, providerInfo, usageInfo, costInfo)
+ await reload(billingSource, authInfo, costInfo)
+ json.cost = calculateOccurredCost(billingSource, costInfo)
+ }
+ if (res.status === 400) {
+ logger.metric({ "error.response": JSON.stringify(json) })
+ }
+ if (json.error?.message) {
+ json.error.message = `Error from provider${providerInfo.displayName ? ` (${providerInfo.displayName})` : ""}: ${json.error.message}`
+ }
+
+ const responseConverter = createResponseConverter(providerInfo.format, opts.format)
+ const body = JSON.stringify(responseConverter(json))
+ logger.metric({ response_length: body.length })
+ logger.debug("RESPONSE: " + body)
+ return new Response(body, {
+ status: resStatus,
+ statusText: res.statusText,
+ headers: resHeaders,
+ })
+ }
+
+ // Handle streaming response
+ const streamConverter = createStreamPartConverter(providerInfo.format, opts.format)
+ const usageParser = providerInfo.createUsageParser()
+ const binaryDecoder = providerInfo.createBinaryStreamDecoder()
+ const stream = new ReadableStream({
+ start(c) {
+ const reader = res.body?.getReader()
+ const decoder = new TextDecoder()
+ const encoder = new TextEncoder()
+
+ let buffer = ""
+ let responseLength = 0
+ let timestampFirstByte = 0
+
+ function pump(): Promise {
+ return (
+ reader?.read().then(async ({ done, value: rawValue }) => {
+ if (done) {
+ const timestampLastByte = Date.now()
+ logger.metric({
+ response_length: responseLength,
+ "timestamp.last_byte": timestampLastByte,
+ })
+ await rateLimiter?.track()
+ const usage = usageParser.retrieve()
+ if (usage) {
+ const usageInfo = providerInfo.normalizeUsage(usage)
+ const costInfo = calculateCost(modelInfo, usageInfo)
+ await trialLimiter?.track(usageInfo)
+ await modelTpmLimiter?.track(providerInfo.id, providerInfo.model, usageInfo)
+ await modelTpsLimiter?.track(
+ providerInfo.id,
+ providerInfo.model,
+ providerInfo.tpsGoal,
+ timestampFirstByte,
+ timestampLastByte,
+ usageInfo,
+ )
+ await trackUsage(sessionId, billingSource, authInfo, modelInfo, providerInfo, usageInfo, costInfo)
+ await reload(billingSource, authInfo, costInfo)
+ const cost = calculateOccurredCost(billingSource, costInfo)
+ c.enqueue(encoder.encode(buildCostChunk(opts.format, cost)))
+ }
+ c.close()
+ return
+ }
+
+ if (responseLength === 0) {
+ timestampFirstByte = Date.now()
+ logger.metric({
+ time_to_first_byte: timestampFirstByte - startTimestamp,
+ "timestamp.first_byte": timestampFirstByte,
+ })
+ }
+
+ const value = binaryDecoder ? binaryDecoder(rawValue) : rawValue
+ if (!value) return
+
+ responseLength += value.length
+ buffer += decoder.decode(value, { stream: true })
+
+ const parts = buffer.split(providerInfo.streamSeparator)
+ buffer = parts.pop() ?? ""
+
+ for (let part of parts) {
+ logger.debug("PART: " + part)
+
+ part = part.trim()
+ usageParser.parse(part)
+
+ if (providerInfo.format !== opts.format) {
+ part = streamConverter(part)
+ c.enqueue(encoder.encode(part + "\n\n"))
+ }
+ }
+
+ if (providerInfo.format === opts.format) {
+ c.enqueue(value)
+ }
+
+ return pump()
+ }) || Promise.resolve()
+ )
+ }
+
+ return pump()
+ },
+ })
+ return new Response(stream, {
+ status: resStatus,
+ statusText: res.statusText,
+ headers: resHeaders,
+ })
+ } catch (error: any) {
+ logger.metric({
+ "error.type": error.constructor.name,
+ "error.message": error.message,
+ "error.cause": error.cause?.toString(),
+ })
+ if (error.message.startsWith("Failed query")) {
+ try {
+ logger.metric({
+ "error.cause2": JSON.stringify(error.cause),
+ })
+ } catch {}
+ }
+
+ // Note: both top level "type" and "error.type" fields are used by the @ai-sdk/anthropic client to render the error message.
+ if (
+ error instanceof AuthError ||
+ error instanceof CreditsError ||
+ error instanceof MonthlyLimitError ||
+ error instanceof UserLimitError ||
+ error instanceof ModelError
+ )
+ return new Response(
+ JSON.stringify({
+ type: "error",
+ error: { type: error.constructor.name, message: error.message },
+ }),
+ { status: 401 },
+ )
+
+ if (
+ error instanceof RateLimitError ||
+ error instanceof FreeUsageLimitError ||
+ error instanceof GoUsageLimitError ||
+ error instanceof BlackUsageLimitError
+ ) {
+ const headers = new Headers()
+ if (error.retryAfter) {
+ headers.set("retry-after", String(error.retryAfter))
+ }
+ return new Response(
+ JSON.stringify({
+ type: "error",
+ error: {
+ type: error.constructor.name,
+ message: error.message,
+ },
+ metadata:
+ error instanceof GoUsageLimitError
+ ? {
+ workspace: error.workspace,
+ limitName: error.limitName,
+ }
+ : {},
+ }),
+ { status: 429, headers },
+ )
+ }
+
+ return new Response(
+ JSON.stringify({
+ type: "error",
+ error: {
+ type: "error",
+ message: "Internal server error",
+ },
+ }),
+ { status: 500 },
+ )
+ }
+
+ function validateModel(zenData: ZenData, reqModel: string) {
+ if (!(reqModel in zenData.models)) throw new ModelError(t("zen.api.error.modelNotSupported", { model: reqModel }))
+
+ const modelId = reqModel
+ const modelData = Array.isArray(zenData.models[modelId])
+ ? zenData.models[modelId].find((model) => opts.format === model.formatFilter)
+ : zenData.models[modelId]
+
+ if (!modelData)
+ throw new ModelError(
+ t("zen.api.error.modelFormatNotSupported", {
+ model: reqModel,
+ format: opts.format,
+ }),
+ )
+
+ if (modelData.trialEnded)
+ throw new ModelError(
+ `${t("zen.api.error.trialEnded", {
+ model: modelData.name,
+ link: "https://opencode.ai/go",
+ })}`,
+ )
+
+ logger.metric({ model: modelId })
+
+ return { id: modelId, ...modelData }
+ }
+
+ function selectProvider(
+ reqModel: string,
+ zenData: ZenData,
+ authInfo: AuthInfo,
+ modelInfo: ModelInfo,
+ stickyId: string,
+ trialProviders: string[] | undefined,
+ retry: RetryOptions,
+ stickyProviderId: string | undefined,
+ modelTpmLimits: Record | undefined,
+ modelTpsLimits: Record | undefined,
+ ) {
+ const modelProvider = (() => {
+ // Byok is top priority b/c if user set their own API key, we should use it
+ // instead of using the sticky provider for the same session
+ if (authInfo?.provider?.credentials) {
+ return modelInfo.providers.find((provider) => provider.id === modelInfo.byokProvider)
+ }
+
+ // Prioritize trial providers
+ let allProviders = modelInfo.providers.filter((provider) => !provider.disabled)
+ if (trialProviders) {
+ allProviders = allProviders.map((provider) => ({
+ ...provider,
+ priority: trialProviders.includes(provider.id) ? 0 : provider.priority,
+ }))
+ }
+
+ if (retry.retryCount !== MAX_FAILOVER_RETRIES) {
+ let topPriority = Infinity
+ const providers = allProviders
+ .filter((provider) => provider.weight !== 0)
+ .filter((provider) => !retry.excludeProviders.includes(provider.id))
+ .filter((provider) => {
+ if (!provider.tpmLimit) return true
+ const usage = modelTpmLimits?.[`${provider.id}/${provider.model}`] ?? 0
+ return usage < provider.tpmLimit * 1_000_000
+ })
+ .filter((provider) => {
+ if (!provider.tpsGoal) return true
+ const tps = modelTpsLimits?.[`${provider.id}/${provider.model}/${provider.tpsGoal}`] ?? {
+ qualify: 0,
+ unqualify: 0,
+ }
+ const isLowTps = tps.qualify + tps.unqualify > 10 && tps.qualify < tps.unqualify
+ return !isLowTps
+ })
+ .map((provider) => {
+ topPriority = Math.min(topPriority, provider.priority)
+ return provider
+ })
+ .filter((p) => p.priority <= topPriority)
+ .flatMap((provider) => Array(provider.weight).fill(provider))
+
+ // Use the last 4 characters of session ID to select a provider
+ let h = 0
+ const l = stickyId.length
+ for (let i = l - 4; i < l; i++) {
+ h = (h * 31 + stickyId.charCodeAt(i)) | 0 // 32-bit int
+ }
+ const index = (h >>> 0) % providers.length // make unsigned + range 0..length-1
+ const provider = providers[index || 0]
+
+ // sticky provider does not exist => use selected provider
+ if (!stickyProviderId) return provider
+ const stickProvider = allProviders.find((provider) => provider.id === stickyProviderId)
+ if (!stickProvider) return provider
+
+ // stick provider exists + selected provider is API type => use sticky provider
+ if (!provider.tpsGoal) return stickProvider
+
+ // stick provier exists + selected provider is GPU type + GPU not idle => use selected provider
+ const tps = modelTpsLimits?.[`${provider.id}/${provider.model}/${provider.tpsGoal}`] ?? {
+ qualify: 0,
+ unqualify: 0,
+ }
+ if (tps.qualify <= tps.unqualify * 3) return stickProvider
+
+ return provider
+ }
+
+ // fallback provider
+ return allProviders.find((provider) => provider.id === modelInfo.fallbackProvider)
+ })()
+
+ if (!modelProvider) throw new ModelError(t("zen.api.error.noProviderAvailable"))
+ if (!(modelProvider.id in zenData.providers))
+ throw new ModelError(t("zen.api.error.providerNotSupported", { provider: modelProvider.id }))
+
+ return {
+ ...modelProvider,
+ ...zenData.providers[modelProvider.id],
+ ...(() => {
+ const providerProps = zenData.providers[modelProvider.id]
+ const format = providerProps.format
+ const opts = {
+ reqModel,
+ providerModel: modelProvider.model,
+ adjustCacheUsage: providerProps.adjustCacheUsage,
+ workspaceID: authInfo?.workspaceID,
+ }
+ if (format === "anthropic") return anthropicHelper(opts)
+ if (format === "google") return googleHelper(opts)
+ if (format === "openai") return openaiHelper(opts)
+ return oaCompatHelper(opts)
+ })(),
+ }
+ }
+
+ async function authenticate(modelInfo: ModelInfo, zenApiKey?: string) {
+ if (!zenApiKey) {
+ if (modelInfo.allowAnonymous) return
+ throw new AuthError(t("zen.api.error.missingApiKey"))
+ }
+
+ const data = await Database.use((tx) =>
+ tx
+ .select({
+ apiKey: KeyTable.id,
+ workspaceID: KeyTable.workspaceID,
+ billing: {
+ balance: BillingTable.balance,
+ paymentMethodID: BillingTable.paymentMethodID,
+ monthlyLimit: BillingTable.monthlyLimit,
+ monthlyUsage: BillingTable.monthlyUsage,
+ timeMonthlyUsageUpdated: BillingTable.timeMonthlyUsageUpdated,
+ reloadTrigger: BillingTable.reloadTrigger,
+ timeReloadLockedTill: BillingTable.timeReloadLockedTill,
+ subscription: BillingTable.subscription,
+ lite: BillingTable.lite,
+ },
+ user: {
+ id: UserTable.id,
+ monthlyLimit: UserTable.monthlyLimit,
+ monthlyUsage: UserTable.monthlyUsage,
+ timeMonthlyUsageUpdated: UserTable.timeMonthlyUsageUpdated,
+ },
+ black: {
+ id: SubscriptionTable.id,
+ rollingUsage: SubscriptionTable.rollingUsage,
+ fixedUsage: SubscriptionTable.fixedUsage,
+ timeRollingUpdated: SubscriptionTable.timeRollingUpdated,
+ timeFixedUpdated: SubscriptionTable.timeFixedUpdated,
+ },
+ lite: {
+ id: LiteTable.id,
+ timeCreated: LiteTable.timeCreated,
+ rollingUsage: LiteTable.rollingUsage,
+ weeklyUsage: LiteTable.weeklyUsage,
+ monthlyUsage: LiteTable.monthlyUsage,
+ timeRollingUpdated: LiteTable.timeRollingUpdated,
+ timeWeeklyUpdated: LiteTable.timeWeeklyUpdated,
+ timeMonthlyUpdated: LiteTable.timeMonthlyUpdated,
+ },
+ provider: {
+ credentials: ProviderTable.credentials,
+ },
+ timeDisabled: ModelTable.timeCreated,
+ })
+ .from(KeyTable)
+ .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, KeyTable.workspaceID))
+ .innerJoin(BillingTable, eq(BillingTable.workspaceID, KeyTable.workspaceID))
+ .innerJoin(UserTable, and(eq(UserTable.workspaceID, KeyTable.workspaceID), eq(UserTable.id, KeyTable.userID)))
+ .leftJoin(ModelTable, and(eq(ModelTable.workspaceID, KeyTable.workspaceID), eq(ModelTable.model, modelInfo.id)))
+ .leftJoin(
+ ProviderTable,
+ modelInfo.byokProvider
+ ? and(
+ eq(ProviderTable.workspaceID, KeyTable.workspaceID),
+ eq(ProviderTable.provider, modelInfo.byokProvider),
+ )
+ : sql`false`,
+ )
+ .leftJoin(
+ SubscriptionTable,
+ and(
+ eq(SubscriptionTable.workspaceID, KeyTable.workspaceID),
+ eq(SubscriptionTable.userID, KeyTable.userID),
+ isNull(SubscriptionTable.timeDeleted),
+ ),
+ )
+ .leftJoin(
+ LiteTable,
+ and(
+ eq(LiteTable.workspaceID, KeyTable.workspaceID),
+ eq(LiteTable.userID, KeyTable.userID),
+ isNull(LiteTable.timeDeleted),
+ ),
+ )
+ .where(and(eq(KeyTable.key, zenApiKey), isNull(KeyTable.timeDeleted)))
+ .then((rows) => rows[0]),
+ )
+
+ if (!data) throw new AuthError(t("zen.api.error.invalidApiKey"))
+ if (
+ modelInfo.id.startsWith("alpha-") &&
+ Resource.App.stage === "production" &&
+ !ADMIN_WORKSPACES.includes(data.workspaceID)
+ )
+ throw new AuthError(t("zen.api.error.modelNotSupported", { model: modelInfo.id }))
+
+ logger.metric({
+ api_key: data.apiKey,
+ workspace: data.workspaceID,
+ ...(() => {
+ if (data.billing.subscription)
+ return {
+ subscription: data.billing.subscription.plan,
+ }
+ if (data.billing.lite)
+ return {
+ subscription: "lite",
+ }
+ return {}
+ })(),
+ })
+
+ return {
+ apiKeyId: data.apiKey,
+ workspaceID: data.workspaceID,
+ billing: data.billing,
+ user: data.user,
+ black: data.black,
+ lite: data.lite,
+ provider: data.provider,
+ isFree: ADMIN_WORKSPACES.includes(data.workspaceID),
+ isDisabled: !!data.timeDisabled,
+ }
+ }
+
+ function validateBilling(authInfo: AuthInfo, modelInfo: ModelInfo): BillingSource {
+ if (!authInfo) return "anonymous"
+ if (authInfo.provider?.credentials) return "byok"
+ if (authInfo.isFree) return "free"
+ if (modelInfo.allowAnonymous) return "free"
+
+ const formatRetryTime = (seconds: number) => {
+ const days = Math.floor(seconds / 86400)
+ if (days >= 1) return `${days} day${days > 1 ? "s" : ""}`
+ const hours = Math.floor(seconds / 3600)
+ const minutes = Math.ceil((seconds % 3600) / 60)
+ if (hours >= 1) return `${hours}hr ${minutes}min`
+ return `${minutes}min`
+ }
+
+ // Validate black subscription billing
+ if (authInfo.billing.subscription && authInfo.black) {
+ try {
+ const sub = authInfo.black
+ const plan = authInfo.billing.subscription.plan
+
+ // Check weekly limit
+ if (sub.fixedUsage && sub.timeFixedUpdated) {
+ const blackData = BlackData.getLimits({ plan })
+ const result = Subscription.analyzeWeeklyUsage({
+ limit: blackData.fixedLimit,
+ usage: sub.fixedUsage,
+ timeUpdated: sub.timeFixedUpdated,
+ })
+ if (result.status === "rate-limited")
+ throw new BlackUsageLimitError(
+ t("zen.api.error.subscriptionQuotaExceeded", {
+ retryIn: formatRetryTime(result.resetInSec),
+ }),
+ result.resetInSec,
+ )
+ }
+
+ // Check rolling limit
+ if (sub.rollingUsage && sub.timeRollingUpdated) {
+ const blackData = BlackData.getLimits({ plan })
+ const result = Subscription.analyzeRollingUsage({
+ limit: blackData.rollingLimit,
+ window: blackData.rollingWindow,
+ usage: sub.rollingUsage,
+ timeUpdated: sub.timeRollingUpdated,
+ })
+ if (result.status === "rate-limited")
+ throw new BlackUsageLimitError(
+ t("zen.api.error.subscriptionQuotaExceeded", {
+ retryIn: formatRetryTime(result.resetInSec),
+ }),
+ result.resetInSec,
+ )
+ }
+
+ return "subscription"
+ } catch (e) {
+ if (!authInfo.billing.subscription.useBalance) throw e
+ }
+ }
+
+ // Validate lite subscription billing
+ if (opts.modelList === "lite" && authInfo.billing.lite && authInfo.lite) {
+ try {
+ const consoleGoUrl = `https://opencode.ai/workspace/${authInfo.workspaceID}/go`
+ const sub = authInfo.lite
+ const liteData = LiteData.getLimits()
+
+ // Check weekly limit
+ if (sub.weeklyUsage && sub.timeWeeklyUpdated) {
+ const result = Subscription.analyzeWeeklyUsage({
+ limit: liteData.weeklyLimit,
+ usage: sub.weeklyUsage,
+ timeUpdated: sub.timeWeeklyUpdated,
+ })
+ if (result.status === "rate-limited")
+ throw new GoUsageLimitError(
+ t("zen.api.error.goSubscriptionWeeklyLimitExceeded", {
+ retryIn: formatRetryTime(result.resetInSec),
+ consoleGoUrl,
+ }),
+ authInfo.workspaceID,
+ "weekly",
+ result.resetInSec,
+ )
+ }
+
+ // Check monthly limit
+ if (sub.monthlyUsage && sub.timeMonthlyUpdated) {
+ const result = Subscription.analyzeMonthlyUsage({
+ limit: liteData.monthlyLimit,
+ usage: sub.monthlyUsage,
+ timeUpdated: sub.timeMonthlyUpdated,
+ timeSubscribed: sub.timeCreated,
+ })
+ if (result.status === "rate-limited")
+ throw new GoUsageLimitError(
+ t("zen.api.error.goSubscriptionMonthlyLimitExceeded", {
+ retryIn: formatRetryTime(result.resetInSec),
+ consoleGoUrl,
+ }),
+ authInfo.workspaceID,
+ "monthly",
+ result.resetInSec,
+ )
+ }
+
+ // Check rolling limit
+ if (sub.rollingUsage && sub.timeRollingUpdated) {
+ const result = Subscription.analyzeRollingUsage({
+ limit: liteData.rollingLimit,
+ window: liteData.rollingWindow,
+ usage: sub.rollingUsage,
+ timeUpdated: sub.timeRollingUpdated,
+ })
+ if (result.status === "rate-limited")
+ throw new GoUsageLimitError(
+ t("zen.api.error.goSubscriptionRollingLimitExceeded", {
+ retryIn: formatRetryTime(result.resetInSec),
+ consoleGoUrl,
+ }),
+ authInfo.workspaceID,
+ "5 hour",
+ result.resetInSec,
+ )
+ }
+
+ return "lite"
+ } catch (e) {
+ if (!authInfo.billing.lite.useBalance) throw e
+ }
+ }
+
+ // Validate pay as you go billing
+ const billing = authInfo.billing
+ const billingUrl = `https://opencode.ai/workspace/${authInfo.workspaceID}/billing`
+ const membersUrl = `https://opencode.ai/workspace/${authInfo.workspaceID}/members`
+ if (!billing.paymentMethodID && billing.balance <= 0)
+ throw new CreditsError(t("zen.api.error.noPaymentMethod", { billingUrl }))
+ if (billing.balance <= 0) throw new CreditsError(t("zen.api.error.insufficientBalance", { billingUrl }))
+
+ const now = new Date()
+ const currentYear = now.getUTCFullYear()
+ const currentMonth = now.getUTCMonth()
+ if (
+ billing.monthlyLimit &&
+ billing.monthlyUsage &&
+ billing.timeMonthlyUsageUpdated &&
+ billing.monthlyUsage >= centsToMicroCents(billing.monthlyLimit * 100) &&
+ currentYear === billing.timeMonthlyUsageUpdated.getUTCFullYear() &&
+ currentMonth === billing.timeMonthlyUsageUpdated.getUTCMonth()
+ )
+ throw new MonthlyLimitError(
+ t("zen.api.error.workspaceMonthlyLimitReached", {
+ amount: billing.monthlyLimit,
+ billingUrl,
+ }),
+ )
+
+ if (
+ authInfo.user.monthlyLimit &&
+ authInfo.user.monthlyUsage &&
+ authInfo.user.timeMonthlyUsageUpdated &&
+ authInfo.user.monthlyUsage >= centsToMicroCents(authInfo.user.monthlyLimit * 100) &&
+ currentYear === authInfo.user.timeMonthlyUsageUpdated.getUTCFullYear() &&
+ currentMonth === authInfo.user.timeMonthlyUsageUpdated.getUTCMonth()
+ )
+ throw new UserLimitError(
+ t("zen.api.error.userMonthlyLimitReached", {
+ amount: authInfo.user.monthlyLimit,
+ membersUrl,
+ }),
+ )
+
+ return "balance"
+ }
+
+ function validateModelSettings(billingSource: BillingSource, authInfo: AuthInfo) {
+ if (billingSource === "lite") return
+ if (billingSource === "anonymous") return
+ if (authInfo!.isDisabled) throw new ModelError(t("zen.api.error.modelDisabled"))
+ }
+
+ function updateProviderKey(authInfo: AuthInfo, providerInfo: ProviderInfo) {
+ if (!authInfo?.provider?.credentials) return
+ providerInfo.apiKey = authInfo.provider.credentials
+ }
+
+ async function fetchWith429Retry(url: string, options: RequestInit, retry = { count: 0 }) {
+ const res = await fetch(url, options)
+ if (res.status === 429 && retry.count < MAX_429_RETRIES) {
+ await new Promise((resolve) => setTimeout(resolve, Math.pow(2, retry.count) * 500))
+ return fetchWith429Retry(url, options, { count: retry.count + 1 })
+ }
+ return res
+ }
+
+ function calculateCost(modelInfo: ModelInfo, usageInfo: UsageInfo) {
+ const { inputTokens, outputTokens, reasoningTokens, cacheReadTokens, cacheWrite5mTokens, cacheWrite1hTokens } =
+ usageInfo
+
+ const modelCost =
+ modelInfo.cost200K &&
+ inputTokens + (cacheReadTokens ?? 0) + (cacheWrite5mTokens ?? 0) + (cacheWrite1hTokens ?? 0) > 200_000
+ ? modelInfo.cost200K
+ : modelInfo.cost
+
+ const inputCost = modelCost.input * inputTokens * 100
+ const outputCost = modelCost.output * outputTokens * 100
+ const cacheReadCost = (() => {
+ if (!cacheReadTokens) return undefined
+ if (!modelCost.cacheRead) return undefined
+ return modelCost.cacheRead * cacheReadTokens * 100
+ })()
+ const cacheWrite5mCost = (() => {
+ if (!cacheWrite5mTokens) return undefined
+ if (!modelCost.cacheWrite5m) return undefined
+ return modelCost.cacheWrite5m * cacheWrite5mTokens * 100
+ })()
+ const cacheWrite1hCost = (() => {
+ if (!cacheWrite1hTokens) return undefined
+ if (!modelCost.cacheWrite1h) return undefined
+ return modelCost.cacheWrite1h * cacheWrite1hTokens * 100
+ })()
+ const totalCostInCent =
+ inputCost + outputCost + (cacheReadCost ?? 0) + (cacheWrite5mCost ?? 0) + (cacheWrite1hCost ?? 0)
+ return {
+ totalCostInCent,
+ inputCost,
+ outputCost,
+ cacheReadCost,
+ cacheWrite5mCost,
+ cacheWrite1hCost,
+ }
+ }
+
+ function calculateOccurredCost(billingSource: BillingSource, costInfo: CostInfo) {
+ return billingSource === "balance" ? (costInfo.totalCostInCent / 100).toFixed(8) : "0"
+ }
+
+ async function trackUsage(
+ sessionId: string,
+ billingSource: BillingSource,
+ authInfo: AuthInfo,
+ modelInfo: ModelInfo,
+ providerInfo: ProviderInfo,
+ usageInfo: UsageInfo,
+ costInfo: CostInfo,
+ ) {
+ const { inputTokens, outputTokens, reasoningTokens, cacheReadTokens, cacheWrite5mTokens, cacheWrite1hTokens } =
+ usageInfo
+ const { totalCostInCent, inputCost, outputCost, cacheReadCost, cacheWrite5mCost, cacheWrite1hCost } = costInfo
+
+ logger.metric({
+ "tokens.input": inputTokens,
+ "tokens.output": outputTokens,
+ "tokens.reasoning": reasoningTokens,
+ "tokens.cache_read": cacheReadTokens,
+ "tokens.cache_write_5m": cacheWrite5mTokens,
+ "tokens.cache_write_1h": cacheWrite1hTokens,
+ "cost.input.microcents": centsToMicroCents(inputCost),
+ "cost.output.microcents": centsToMicroCents(outputCost),
+ "cost.cache_read.microcents": cacheReadCost ? centsToMicroCents(cacheReadCost) : undefined,
+ "cost.cache_write.microcents": cacheWrite5mCost ? centsToMicroCents(cacheWrite5mCost) : undefined,
+ "cost.total.microcents": centsToMicroCents(totalCostInCent),
+ // deprecated - remove after May 20, 2026
+ "cost.input": Math.round(inputCost),
+ "cost.output": Math.round(outputCost),
+ "cost.cache_read": cacheReadCost ? Math.round(cacheReadCost) : undefined,
+ "cost.cache_write_5m": cacheWrite5mCost ? Math.round(cacheWrite5mCost) : undefined,
+ "cost.cache_write_1h": cacheWrite1hCost ? Math.round(cacheWrite1hCost) : undefined,
+ "cost.total": Math.round(totalCostInCent),
+ })
+
+ if (billingSource === "anonymous") return
+ authInfo = authInfo!
+
+ const cost = centsToMicroCents(totalCostInCent)
+
+ // For hot workspaces, batch balance/usage updates through Redis to avoid
+ // row-level lock contention on BillingTable/UserTable. Returns the amount
+ // to flush this request, or null to skip the DB writes entirely.
+ const balanceFlush = await (async () => {
+ if (billingSource !== "subscription" && billingSource !== "lite" && HOT_WORKSPACES.has(authInfo.workspaceID)) {
+ const workspaceCost = billingSource === "free" || billingSource === "byok" ? 0 : cost
+ const flush = await accumulateUsage(authInfo.workspaceID, authInfo.user.id, workspaceCost, cost)
+ return { batched: true as const, flush }
+ }
+ return { batched: false as const, flush: null }
+ })()
+
+ await Database.use((db) =>
+ Promise.all([
+ db.insert(UsageTable).values({
+ workspaceID: authInfo.workspaceID,
+ id: Identifier.create("usage"),
+ model: modelInfo.id,
+ provider: providerInfo.id,
+ inputTokens,
+ outputTokens,
+ reasoningTokens,
+ cacheReadTokens,
+ cacheWrite5mTokens,
+ cacheWrite1hTokens,
+ cost,
+ keyID: authInfo.apiKeyId,
+ sessionID: sessionId.substring(0, 30),
+ enrichment: (() => {
+ if (billingSource === "subscription") return { plan: "sub" }
+ if (billingSource === "byok") return { plan: "byok" }
+ if (billingSource === "lite") return { plan: "lite" }
+ return undefined
+ })(),
+ }),
+ ...(() => {
+ if (billingSource === "subscription") {
+ const plan = authInfo.billing.subscription!.plan
+ const black = BlackData.getLimits({ plan })
+ const week = getWeekBounds(new Date())
+ const rollingWindowSeconds = black.rollingWindow * 3600
+ return [
+ db
+ .update(SubscriptionTable)
+ .set({
+ fixedUsage: sql`
+ CASE
+ WHEN ${SubscriptionTable.timeFixedUpdated} >= ${week.start} THEN ${SubscriptionTable.fixedUsage} + ${cost}
+ ELSE ${cost}
+ END
+ `,
+ timeFixedUpdated: sql`now()`,
+ rollingUsage: sql`
+ CASE
+ WHEN UNIX_TIMESTAMP(${SubscriptionTable.timeRollingUpdated}) >= UNIX_TIMESTAMP(now()) - ${rollingWindowSeconds} THEN ${SubscriptionTable.rollingUsage} + ${cost}
+ ELSE ${cost}
+ END
+ `,
+ timeRollingUpdated: sql`
+ CASE
+ WHEN UNIX_TIMESTAMP(${SubscriptionTable.timeRollingUpdated}) >= UNIX_TIMESTAMP(now()) - ${rollingWindowSeconds} THEN ${SubscriptionTable.timeRollingUpdated}
+ ELSE now()
+ END
+ `,
+ })
+ .where(
+ and(
+ eq(SubscriptionTable.workspaceID, authInfo.workspaceID),
+ eq(SubscriptionTable.userID, authInfo.user.id),
+ ),
+ ),
+ ]
+ }
+ if (billingSource === "lite") {
+ const lite = LiteData.getLimits()
+ const week = getWeekBounds(new Date())
+ const month = getMonthlyBounds(new Date(), authInfo.lite!.timeCreated)
+ const rollingWindowSeconds = lite.rollingWindow * 3600
+ return [
+ db
+ .update(LiteTable)
+ .set({
+ monthlyUsage: sql`
+ CASE
+ WHEN ${LiteTable.timeMonthlyUpdated} >= ${month.start} THEN ${LiteTable.monthlyUsage} + ${cost}
+ ELSE ${cost}
+ END
+ `,
+ timeMonthlyUpdated: sql`now()`,
+ weeklyUsage: sql`
+ CASE
+ WHEN ${LiteTable.timeWeeklyUpdated} >= ${week.start} THEN ${LiteTable.weeklyUsage} + ${cost}
+ ELSE ${cost}
+ END
+ `,
+ timeWeeklyUpdated: sql`now()`,
+ rollingUsage: sql`
+ CASE
+ WHEN UNIX_TIMESTAMP(${LiteTable.timeRollingUpdated}) >= UNIX_TIMESTAMP(now()) - ${rollingWindowSeconds} THEN ${LiteTable.rollingUsage} + ${cost}
+ ELSE ${cost}
+ END
+ `,
+ timeRollingUpdated: sql`
+ CASE
+ WHEN UNIX_TIMESTAMP(${LiteTable.timeRollingUpdated}) >= UNIX_TIMESTAMP(now()) - ${rollingWindowSeconds} THEN ${LiteTable.timeRollingUpdated}
+ ELSE now()
+ END
+ `,
+ })
+ .where(and(eq(LiteTable.workspaceID, authInfo.workspaceID), eq(LiteTable.userID, authInfo.user.id))),
+ ]
+ }
+
+ // Batched hot workspace: skip DB writes unless this request is the flush.
+ if (balanceFlush.batched && !balanceFlush.flush) return []
+
+ const workspaceDelta = balanceFlush.flush?.workspaceCost ?? cost
+ const userDelta = balanceFlush.flush?.userCost ?? cost
+ const balanceDelta = billingSource === "free" || billingSource === "byok" ? 0 : workspaceDelta
+
+ return [
+ db
+ .update(BillingTable)
+ .set({
+ balance: sql`${BillingTable.balance} - ${balanceDelta}`,
+ monthlyUsage: sql`
+ CASE
+ WHEN MONTH(${BillingTable.timeMonthlyUsageUpdated}) = MONTH(now()) AND YEAR(${BillingTable.timeMonthlyUsageUpdated}) = YEAR(now()) THEN ${BillingTable.monthlyUsage} + ${workspaceDelta}
+ ELSE ${workspaceDelta}
+ END
+ `,
+ timeMonthlyUsageUpdated: sql`now()`,
+ })
+ .where(eq(BillingTable.workspaceID, authInfo.workspaceID)),
+ db
+ .update(UserTable)
+ .set({
+ monthlyUsage: sql`
+ CASE
+ WHEN MONTH(${UserTable.timeMonthlyUsageUpdated}) = MONTH(now()) AND YEAR(${UserTable.timeMonthlyUsageUpdated}) = YEAR(now()) THEN ${UserTable.monthlyUsage} + ${userDelta}
+ ELSE ${userDelta}
+ END
+ `,
+ timeMonthlyUsageUpdated: sql`now()`,
+ })
+ .where(and(eq(UserTable.workspaceID, authInfo.workspaceID), eq(UserTable.id, authInfo.user.id))),
+ ]
+ })(),
+ ]),
+ )
+
+ return { costInMicroCents: cost }
+ }
+
+ async function reload(billingSource: BillingSource, authInfo: AuthInfo, costInfo: CostInfo) {
+ if (billingSource !== "balance") return
+ authInfo = authInfo!
+
+ const reloadTrigger = centsToMicroCents((authInfo.billing.reloadTrigger ?? Billing.RELOAD_TRIGGER) * 100)
+ if (authInfo.billing.balance - costInfo.totalCostInCent >= reloadTrigger) return
+ if (authInfo.billing.timeReloadLockedTill && authInfo.billing.timeReloadLockedTill > new Date()) return
+
+ const lock = await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ timeReloadLockedTill: sql`now() + interval 1 minute`,
+ })
+ .where(
+ and(
+ eq(BillingTable.workspaceID, authInfo.workspaceID),
+ eq(BillingTable.reload, true),
+ lt(BillingTable.balance, reloadTrigger),
+ or(isNull(BillingTable.timeReloadLockedTill), lt(BillingTable.timeReloadLockedTill, sql`now()`)),
+ ),
+ ),
+ )
+ if (lock.rowsAffected === 0) return
+
+ await Actor.provide("system", { workspaceID: authInfo.workspaceID }, async () => {
+ await Billing.reload()
+ })
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/ipRateLimiter.ts b/packages/console/app/src/routes/zen/util/ipRateLimiter.ts
new file mode 100644
index 0000000..7461fa6
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/ipRateLimiter.ts
@@ -0,0 +1,61 @@
+import { FreeUsageLimitError } from "./error"
+import { logger } from "./logger"
+import { buildRateLimitKey, getRedis } from "./redis"
+import { i18n } from "~/i18n"
+import { localeFromRequest } from "~/lib/language"
+import { Subscription } from "@opencode-ai/console-core/subscription.js"
+
+export function createRateLimiter(modelId: string, rateLimit: number | undefined, rawIp: string, request: Request) {
+ const dict = i18n(localeFromRequest(request))
+
+ const limits = Subscription.getFreeLimits()
+ // temporarily disable check headers
+ //const headersExist = Object.entries(limits.checkHeaders).every(
+ // ([name, value]) => request.headers.get(name)?.toLowerCase().includes(value) ?? false,
+ //)
+ //const dailyLimit = !headersExist ? limits.dailyRequestsFallback : (rateLimit ?? limits.dailyRequests)
+ const headersExist = true
+ const dailyLimit = !headersExist ? limits.dailyRequestsFallback : (rateLimit ?? limits.dailyRequests)
+ const isDefaultModel = headersExist && !rateLimit
+
+ const ip = !rawIp.length ? "unknown" : rawIp
+ const now = Date.now()
+ const dailyInterval = rateLimit ? `${buildYYYYMMDD(now)}${modelId.substring(0, 2)}` : buildYYYYMMDD(now)
+ const retryAfter = getRetryAfterDay(now)
+ const redis = getRedis()
+ const lifetimeKey = buildRateLimitKey("ip", ip)
+ const dailyKey = buildRateLimitKey("ip", ip, dailyInterval)
+ let isNew = false
+
+ return {
+ check: async () => {
+ const counts = await redis.mget<(string | number | null)[]>(isDefaultModel ? [lifetimeKey, dailyKey] : [dailyKey])
+ const lifetimeCount = isDefaultModel ? Number(counts[0] ?? 0) : 0
+ const dailyCount = Number(counts[isDefaultModel ? 1 : 0] ?? 0)
+ logger.debug(`rate limit lifetime: ${lifetimeCount}, daily: ${dailyCount}`)
+
+ isNew = isDefaultModel && lifetimeCount < dailyLimit * 7
+
+ if ((isNew && dailyCount >= dailyLimit * 2) || (!isNew && dailyCount >= dailyLimit))
+ throw new FreeUsageLimitError(dict["zen.api.error.rateLimitExceeded"], retryAfter)
+ },
+ track: async () => {
+ const pipeline = redis.pipeline()
+ pipeline.incr(dailyKey)
+ pipeline.expire(dailyKey, retryAfter)
+ if (isNew) pipeline.incr(lifetimeKey)
+ await pipeline.exec()
+ },
+ }
+}
+
+export function getRetryAfterDay(now: number) {
+ return Math.ceil((86_400_000 - (now % 86_400_000)) / 1000)
+}
+
+function buildYYYYMMDD(timestamp: number) {
+ return new Date(timestamp)
+ .toISOString()
+ .replace(/[^0-9]/g, "")
+ .substring(0, 8)
+}
diff --git a/packages/console/app/src/routes/zen/util/keyRateLimiter.ts b/packages/console/app/src/routes/zen/util/keyRateLimiter.ts
new file mode 100644
index 0000000..fdf5925
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/keyRateLimiter.ts
@@ -0,0 +1,37 @@
+import { RateLimitError } from "./error"
+import { buildRateLimitKey, getRedis } from "./redis"
+import { i18n } from "~/i18n"
+import { localeFromRequest } from "~/lib/language"
+
+export function createRateLimiter(
+ modelId: string,
+ rateLimit: number | undefined,
+ zenApiKey: string | undefined,
+ request: Request,
+) {
+ if (!zenApiKey) return
+ const dict = i18n(localeFromRequest(request))
+
+ const LIMIT = rateLimit ?? 1000
+ const yyyyMMddHHmm = new Date(Date.now())
+ .toISOString()
+ .replace(/[^0-9]/g, "")
+ .substring(0, 12)
+ const interval = `${modelId.substring(0, 27)}-${yyyyMMddHHmm}`
+ const redis = getRedis()
+ const key = buildRateLimitKey("key", zenApiKey, interval)
+
+ return {
+ check: async () => {
+ const count = Number((await redis.mget<(string | number | null)[]>([key]))[0] ?? 0)
+
+ if (count >= LIMIT) throw new RateLimitError(dict["zen.api.error.rateLimitExceeded"], 60)
+ },
+ track: async () => {
+ const pipeline = redis.pipeline()
+ pipeline.incr(key)
+ pipeline.expire(key, 60)
+ await pipeline.exec()
+ },
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/logger.ts b/packages/console/app/src/routes/zen/util/logger.ts
new file mode 100644
index 0000000..aef46dd
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/logger.ts
@@ -0,0 +1,12 @@
+import { Resource } from "@opencode-ai/console-resource"
+
+export const logger = {
+ metric: (values: Record) => {
+ console.log(`_metric:${JSON.stringify(values)}`)
+ },
+ log: console.log,
+ debug: (message: string) => {
+ if (Resource.App.stage === "production") return
+ console.debug(message)
+ },
+}
diff --git a/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts b/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts
new file mode 100644
index 0000000..8e3e8cc
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts
@@ -0,0 +1,47 @@
+import { and, Database, eq, inArray, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { ModelTpmRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js"
+import { UsageInfo } from "./provider/provider"
+
+export function createModelTpmLimiter(providers: { id: string; model: string; tpmLimit?: number }[]) {
+ const ids = providers.filter((p) => p.tpmLimit).map((p) => `${p.id}/${p.model}`)
+ if (ids.length === 0) return
+
+ const yyyyMMddHHmm = parseInt(
+ new Date(Date.now())
+ .toISOString()
+ .replace(/[^0-9]/g, "")
+ .substring(0, 12),
+ )
+
+ return {
+ check: async () => {
+ const data = await Database.use((tx) =>
+ tx
+ .select()
+ .from(ModelTpmRateLimitTable)
+ .where(and(inArray(ModelTpmRateLimitTable.id, ids), eq(ModelTpmRateLimitTable.interval, yyyyMMddHHmm))),
+ )
+
+ // convert to map of model to count
+ return data.reduce(
+ (acc, curr) => {
+ acc[curr.id] = curr.count
+ return acc
+ },
+ {} as Record,
+ )
+ },
+ track: async (provider: string, model: string, usageInfo: UsageInfo) => {
+ const id = `${provider}/${model}`
+ if (!ids.includes(id)) return
+ const usage = usageInfo.inputTokens
+ if (usage <= 0) return
+ await Database.use((tx) =>
+ tx
+ .insert(ModelTpmRateLimitTable)
+ .values({ id, interval: yyyyMMddHHmm, count: usage })
+ .onDuplicateKeyUpdate({ set: { count: sql`${ModelTpmRateLimitTable.count} + ${usage}` } }),
+ )
+ },
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/modelTpsLimiter.ts b/packages/console/app/src/routes/zen/util/modelTpsLimiter.ts
new file mode 100644
index 0000000..3ff63f7
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/modelTpsLimiter.ts
@@ -0,0 +1,88 @@
+import { and, Database, inArray, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { ModelTpsRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js"
+import { UsageInfo } from "./provider/provider"
+
+export function createModelTpsLimiter(providers: { id: string; model: string; tpsGoal?: number }[]) {
+ const tpsGoals = Object.fromEntries(
+ providers.flatMap((p) => {
+ return p.tpsGoal ? [[`${p.id}/${p.model}/${p.tpsGoal}`, p.tpsGoal]] : []
+ }),
+ )
+ const ids = Object.keys(tpsGoals)
+ if (ids.length === 0) return
+
+ const toInterval = (date: Date) =>
+ parseInt(
+ date
+ .toISOString()
+ .replace(/[^0-9]/g, "")
+ .substring(0, 12),
+ )
+ const now = Date.now()
+ const currInterval = toInterval(new Date(now))
+ const prevInterval = toInterval(new Date(now - 60 * 1000))
+
+ return {
+ check: async () => {
+ const data = await Database.use((tx) =>
+ tx
+ .select()
+ .from(ModelTpsRateLimitTable)
+ .where(
+ and(
+ inArray(ModelTpsRateLimitTable.id, ids),
+ inArray(ModelTpsRateLimitTable.interval, [currInterval, prevInterval]),
+ ),
+ ),
+ )
+
+ // convert to map of model to summed count across current and previous intervals
+ return data.reduce(
+ (acc, curr) => {
+ const existing = acc[curr.id] ?? { qualify: 0, unqualify: 0 }
+ acc[curr.id] = {
+ qualify: existing.qualify + curr.qualify,
+ unqualify: existing.unqualify + curr.unqualify,
+ }
+ return acc
+ },
+ {} as Record,
+ )
+ },
+ track: async (
+ provider: string,
+ model: string,
+ tpsGoal: number | undefined,
+ tsFirstByte: number,
+ tsLastByte: number,
+ usageInfo: UsageInfo,
+ ) => {
+ if (!tpsGoal) return
+ const id = `${provider}/${model}/${tpsGoal}`
+ if (!ids.includes(id)) return
+ if (tsFirstByte <= 0 || tsLastByte <= 0) return
+ const tokens = usageInfo.outputTokens
+ if (tokens <= 10) return
+
+ const tps = (tokens / (tsLastByte - tsFirstByte)) * 1000
+ const qualify = tps >= tpsGoal ? 1 : 0
+ const unqualify = tps < tpsGoal ? 1 : 0
+ await Database.use((tx) =>
+ tx
+ .insert(ModelTpsRateLimitTable)
+ .values({
+ id,
+ interval: currInterval,
+ qualify,
+ unqualify,
+ })
+ .onDuplicateKeyUpdate({
+ set: {
+ qualify: sql`${ModelTpsRateLimitTable.qualify} + ${qualify}`,
+ unqualify: sql`${ModelTpsRateLimitTable.unqualify} + ${unqualify}`,
+ },
+ }),
+ )
+ },
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/modelsHandler.ts b/packages/console/app/src/routes/zen/util/modelsHandler.ts
new file mode 100644
index 0000000..102e415
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/modelsHandler.ts
@@ -0,0 +1,31 @@
+export async function buildOptionsResponse() {
+ return new Response(null, {
+ status: 200,
+ headers: {
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
+ },
+ })
+}
+
+export async function buildModelsResponse(models: string[]) {
+ return new Response(
+ JSON.stringify({
+ object: "list",
+ data: models
+ .filter((id) => !id.startsWith("alpha-"))
+ .map((id) => ({
+ id,
+ object: "model",
+ created: Math.floor(Date.now() / 1000),
+ owned_by: "opencode",
+ })),
+ }),
+ {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ },
+ )
+}
diff --git a/packages/console/app/src/routes/zen/util/provider/anthropic.ts b/packages/console/app/src/routes/zen/util/provider/anthropic.ts
new file mode 100644
index 0000000..64053fd
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/provider/anthropic.ts
@@ -0,0 +1,760 @@
+import { EventStreamCodec } from "@smithy/eventstream-codec"
+import { ProviderHelper, CommonRequest, CommonResponse, CommonChunk } from "./provider"
+import { fromUtf8, toUtf8 } from "@smithy/util-utf8"
+
+type Usage = {
+ cache_creation?: {
+ ephemeral_5m_input_tokens?: number
+ ephemeral_1h_input_tokens?: number
+ }
+ cache_creation_input_tokens?: number
+ cache_read_input_tokens?: number
+ input_tokens?: number
+ output_tokens?: number
+ server_tool_use?: {
+ web_search_requests?: number
+ }
+}
+
+export const anthropicHelper: ProviderHelper = ({ reqModel, providerModel }) => {
+ const isBedrockModelArn = providerModel.startsWith("arn:aws:bedrock:")
+ const isBedrockModelID = providerModel.startsWith("global.anthropic.")
+ const isBedrock = isBedrockModelArn || isBedrockModelID
+ const isDatabricks = providerModel.startsWith("databricks-claude-")
+ const supports1m = reqModel.includes("sonnet") || reqModel.includes("opus-4-6")
+ return {
+ format: "anthropic",
+ modifyUrl: (providerApi: string, isStream?: boolean) =>
+ isBedrock
+ ? `${providerApi}/model/${isBedrockModelArn ? encodeURIComponent(providerModel) : providerModel}/${isStream ? "invoke-with-response-stream" : "invoke"}`
+ : providerApi + "/messages",
+ modifyHeaders: (headers: Headers, apiKey: string, _stickyId: string) => {
+ if (isBedrock || isDatabricks) {
+ headers.set("Authorization", `Bearer ${apiKey}`)
+ } else {
+ headers.set("x-api-key", apiKey)
+ headers.set("anthropic-version", headers.get("anthropic-version") ?? "2023-06-01")
+ if (supports1m) {
+ headers.set("anthropic-beta", "context-1m-2025-08-07")
+ }
+ }
+ },
+ modifyBody: (body: Record) => ({
+ ...body,
+ ...(isBedrock
+ ? {
+ anthropic_version: "bedrock-2023-05-31",
+ anthropic_beta: supports1m ? ["context-1m-2025-08-07"] : undefined,
+ model: undefined,
+ stream: undefined,
+ }
+ : isDatabricks
+ ? {
+ anthropic_version: "bedrock-2023-05-31",
+ anthropic_beta: supports1m ? ["context-1m-2025-08-07"] : undefined,
+ }
+ : {}),
+ }),
+ createBinaryStreamDecoder: () => {
+ if (!isBedrock) return undefined
+
+ const decoder = new TextDecoder()
+ const encoder = new TextEncoder()
+ const codec = new EventStreamCodec(toUtf8, fromUtf8)
+ let buffer = new Uint8Array(0)
+ return (value: Uint8Array) => {
+ const newBuffer = new Uint8Array(buffer.length + value.length)
+ newBuffer.set(buffer)
+ newBuffer.set(value, buffer.length)
+ buffer = newBuffer
+
+ const messages = []
+ while (buffer.length >= 4) {
+ // first 4 bytes are the total length (big-endian)
+ const totalLength = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength).getUint32(0, false)
+
+ // wait for more chunks
+ if (buffer.length < totalLength) break
+
+ try {
+ const subView = buffer.subarray(0, totalLength)
+ const decoded = codec.decode(subView)
+ buffer = buffer.slice(totalLength)
+
+ /* Example of Bedrock data
+ ```
+ {
+ bytes: 'eyJ0eXBlIjoibWVzc2FnZV9zdGFydCIsIm1lc3NhZ2UiOnsibW9kZWwiOiJjbGF1ZGUtb3B1cy00LTUtMjAyNTExMDEiLCJpZCI6Im1zZ19iZHJrXzAxMjVGdHRGb2lkNGlwWmZ4SzZMbktxeCIsInR5cGUiOiJtZXNzYWdlIiwicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOltdLCJzdG9wX3JlYXNvbiI6bnVsbCwic3RvcF9zZXF1ZW5jZSI6bnVsbCwidXNhZ2UiOnsiaW5wdXRfdG9rZW5zIjo0LCJjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMiOjEsImNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zIjoxMTk2MywiY2FjaGVfY3JlYXRpb24iOnsiZXBoZW1lcmFsXzVtX2lucHV0X3Rva2VucyI6MSwiZXBoZW1lcmFsXzFoX2lucHV0X3Rva2VucyI6MH0sIm91dHB1dF90b2tlbnMiOjF9fX0=',
+ p: '...'
+ }
+ ```
+
+ Decoded bytes
+ ```
+ {
+ type: 'message_start',
+ message: {
+ model: 'claude-opus-4-5-20251101',
+ id: 'msg_bdrk_0125FttFoid4ipZfxK6LnKqx',
+ type: 'message',
+ role: 'assistant',
+ content: [],
+ stop_reason: null,
+ stop_sequence: null,
+ usage: {
+ input_tokens: 4,
+ cache_creation_input_tokens: 1,
+ cache_read_input_tokens: 11963,
+ cache_creation: [Object],
+ output_tokens: 1
+ }
+ }
+ }
+ ```
+ */
+
+ /* Example of Anthropic data
+ ```
+ event: message_delta
+ data: {"type":"message_start","message":{"model":"claude-opus-4-5-20251101","id":"msg_01ETvwVWSKULxzPdkQ1xAnk2","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":11543,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":11543,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}}}
+ ```
+ */
+ if (decoded.headers[":message-type"]?.value === "event") {
+ const data = decoder.decode(decoded.body, { stream: true })
+
+ const parsedDataResult = JSON.parse(data)
+ delete parsedDataResult.p
+ const binary = atob(parsedDataResult.bytes)
+ const uint8 = Uint8Array.from(binary, (c) => c.charCodeAt(0))
+ const bytes = decoder.decode(uint8)
+ const eventName = JSON.parse(bytes).type
+ messages.push([`event: ${eventName}`, "\n", `data: ${bytes}`, "\n\n"].join(""))
+ }
+ } catch (e) {
+ console.log("@@@EE@@@")
+ console.log(e)
+ break
+ }
+ }
+ return encoder.encode(messages.join(""))
+ }
+ },
+ streamSeparator: "\n\n",
+ createUsageParser: () => {
+ let usage: Usage
+
+ return {
+ parse: (chunk: string) => {
+ const data = chunk.split("\n")[1]
+ // Claude models start with "data: {"
+ // Alibaba models start with "data:{"
+ if (!data.startsWith("data:")) return
+
+ let json
+ try {
+ json = JSON.parse(data.replace(/^data:\s*/, ""))
+ } catch {
+ return
+ }
+
+ const usageUpdate = json.usage ?? json.message?.usage
+ if (!usageUpdate) return
+ usage = {
+ ...usage,
+ ...usageUpdate,
+ cache_creation: {
+ ...usage?.cache_creation,
+ ...usageUpdate.cache_creation,
+ },
+ server_tool_use: {
+ ...usage?.server_tool_use,
+ ...usageUpdate.server_tool_use,
+ },
+ }
+ },
+ retrieve: () => usage,
+ }
+ },
+ extractUsage: (response: any) => response.usage,
+ normalizeUsage: (usage: Usage) => ({
+ inputTokens: usage.input_tokens ?? 0,
+ outputTokens: usage.output_tokens ?? 0,
+ reasoningTokens: undefined,
+ cacheReadTokens: usage.cache_read_input_tokens ?? undefined,
+ cacheWrite5mTokens:
+ usage.cache_creation?.ephemeral_5m_input_tokens ?? usage.cache_creation_input_tokens ?? undefined,
+ cacheWrite1hTokens: usage.cache_creation?.ephemeral_1h_input_tokens ?? undefined,
+ }),
+ }
+}
+
+export function fromAnthropicRequest(body: any): CommonRequest {
+ if (!body || typeof body !== "object") return body
+
+ const msgs: any[] = []
+
+ const sys = Array.isArray(body.system) ? body.system : undefined
+ if (sys && sys.length > 0) {
+ for (const s of sys) {
+ if (!s) continue
+ if ((s as any).type !== "text") continue
+ if (typeof (s as any).text !== "string") continue
+ if ((s as any).text.length === 0) continue
+ msgs.push({ role: "system", content: (s as any).text })
+ }
+ }
+
+ const toImg = (src: any) => {
+ if (!src || typeof src !== "object") return undefined
+ if ((src as any).type === "url" && typeof (src as any).url === "string")
+ return { type: "image_url", image_url: { url: (src as any).url } }
+ if (
+ (src as any).type === "base64" &&
+ typeof (src as any).media_type === "string" &&
+ typeof (src as any).data === "string"
+ )
+ return {
+ type: "image_url",
+ image_url: { url: `data:${(src as any).media_type};base64,${(src as any).data}` },
+ }
+ return undefined
+ }
+
+ const inMsgs = Array.isArray(body.messages) ? body.messages : []
+ for (const m of inMsgs) {
+ if (!m || !(m as any).role) continue
+
+ if ((m as any).role === "user") {
+ const partsIn = Array.isArray((m as any).content) ? (m as any).content : []
+ const partsOut: any[] = []
+ for (const p of partsIn) {
+ if (!p || !(p as any).type) continue
+ if ((p as any).type === "text" && typeof (p as any).text === "string")
+ partsOut.push({ type: "text", text: (p as any).text })
+ if ((p as any).type === "image") {
+ const ip = toImg((p as any).source)
+ if (ip) partsOut.push(ip)
+ }
+ if ((p as any).type === "tool_result") {
+ const id = (p as any).tool_use_id
+ const content =
+ typeof (p as any).content === "string" ? (p as any).content : JSON.stringify((p as any).content)
+ msgs.push({ role: "tool", tool_call_id: id, content })
+ }
+ }
+ if (partsOut.length > 0) {
+ if (partsOut.length === 1 && partsOut[0].type === "text") msgs.push({ role: "user", content: partsOut[0].text })
+ else msgs.push({ role: "user", content: partsOut })
+ }
+ continue
+ }
+
+ if ((m as any).role === "assistant") {
+ const partsIn = Array.isArray((m as any).content) ? (m as any).content : []
+ const texts: string[] = []
+ const tcs: any[] = []
+ for (const p of partsIn) {
+ if (!p || !(p as any).type) continue
+ if ((p as any).type === "text" && typeof (p as any).text === "string") texts.push((p as any).text)
+ if ((p as any).type === "tool_use") {
+ const name = (p as any).name
+ const id = (p as any).id
+ const inp = (p as any).input
+ const input = (() => {
+ if (typeof inp === "string") return inp
+ try {
+ return JSON.stringify(inp ?? {})
+ } catch {
+ return String(inp ?? "")
+ }
+ })()
+ tcs.push({ id, type: "function", function: { name, arguments: input } })
+ }
+ }
+ const out: any = { role: "assistant", content: texts.join("") }
+ if (tcs.length > 0) out.tool_calls = tcs
+ msgs.push(out)
+ continue
+ }
+ }
+
+ const tools = Array.isArray(body.tools)
+ ? body.tools
+ .filter((t: any) => t && typeof t === "object" && "input_schema" in t)
+ .map((t: any) => ({
+ type: "function",
+ function: {
+ name: (t as any).name,
+ description: (t as any).description,
+ parameters: (t as any).input_schema,
+ },
+ }))
+ : undefined
+
+ const tcin = body.tool_choice
+ const tc = (() => {
+ if (!tcin) return undefined
+ if ((tcin as any).type === "auto") return "auto"
+ if ((tcin as any).type === "any") return "required"
+ if ((tcin as any).type === "tool" && typeof (tcin as any).name === "string")
+ return { type: "function" as const, function: { name: (tcin as any).name } }
+ return undefined
+ })()
+
+ const stop = (() => {
+ const v = body.stop_sequences
+ if (!v) return undefined
+ if (Array.isArray(v)) return v.length === 1 ? v[0] : v
+ if (typeof v === "string") return v
+ return undefined
+ })()
+
+ return {
+ model: body.model,
+ max_tokens: body.max_tokens,
+ temperature: body.temperature,
+ top_p: body.top_p,
+ stop,
+ messages: msgs,
+ stream: !!body.stream,
+ tools,
+ tool_choice: tc,
+ }
+}
+
+export function toAnthropicRequest(body: CommonRequest) {
+ if (!body || typeof body !== "object") return body
+
+ const sysIn = Array.isArray(body.messages) ? body.messages.filter((m: any) => m && m.role === "system") : []
+ let ccCount = 0
+ const cc = () => {
+ ccCount++
+ return ccCount <= 4 ? { cache_control: { type: "ephemeral" } } : {}
+ }
+ const system = sysIn
+ .filter((m: any) => typeof m.content === "string" && m.content.length > 0)
+ .map((m: any) => ({ type: "text", text: m.content, ...cc() }))
+
+ const msgsIn = Array.isArray(body.messages) ? body.messages : []
+ const msgsOut: any[] = []
+
+ const toSrc = (p: any) => {
+ if (!p || typeof p !== "object") return undefined
+ if ((p as any).type === "image_url" && (p as any).image_url) {
+ const u = (p as any).image_url.url ?? (p as any).image_url
+ if (typeof u === "string" && u.startsWith("data:")) {
+ const m = u.match(/^data:([^;]+);base64,(.*)$/)
+ if (m) return { type: "base64", media_type: m[1], data: m[2] }
+ }
+ if (typeof u === "string") return { type: "url", url: u }
+ }
+ return undefined
+ }
+
+ for (const m of msgsIn) {
+ if (!m || !(m as any).role) continue
+
+ if ((m as any).role === "user") {
+ if (typeof (m as any).content === "string") {
+ msgsOut.push({
+ role: "user",
+ content: [{ type: "text", text: (m as any).content, ...cc() }],
+ })
+ } else if (Array.isArray((m as any).content)) {
+ const parts: any[] = []
+ for (const p of (m as any).content) {
+ if (!p || !(p as any).type) continue
+ if ((p as any).type === "text" && typeof (p as any).text === "string")
+ parts.push({ type: "text", text: (p as any).text, ...cc() })
+ if ((p as any).type === "image_url") {
+ const s = toSrc(p)
+ if (s) parts.push({ type: "image", source: s, ...cc() })
+ }
+ }
+ if (parts.length > 0) msgsOut.push({ role: "user", content: parts })
+ }
+ continue
+ }
+
+ if ((m as any).role === "assistant") {
+ const out: any = { role: "assistant", content: [] as any[] }
+ if (typeof (m as any).content === "string" && (m as any).content.length > 0) {
+ ;(out.content as any[]).push({ type: "text", text: (m as any).content, ...cc() })
+ }
+ if (Array.isArray((m as any).tool_calls)) {
+ for (const tc of (m as any).tool_calls) {
+ if ((tc as any).type === "function" && (tc as any).function) {
+ let input: any
+ const a = (tc as any).function.arguments
+ if (typeof a === "string") {
+ try {
+ input = JSON.parse(a)
+ } catch {
+ input = a
+ }
+ } else input = a
+ const id = (tc as any).id || `toolu_${Math.random().toString(36).slice(2)}`
+ ;(out.content as any[]).push({
+ type: "tool_use",
+ id,
+ name: (tc as any).function.name,
+ input,
+ ...cc(),
+ })
+ }
+ }
+ }
+ if ((out.content as any[]).length > 0) msgsOut.push(out)
+ continue
+ }
+
+ if ((m as any).role === "tool") {
+ msgsOut.push({
+ role: "user",
+ content: [
+ {
+ type: "tool_result",
+ tool_use_id: (m as any).tool_call_id,
+ content: (m as any).content,
+ ...cc(),
+ },
+ ],
+ })
+ continue
+ }
+ }
+
+ const tools = Array.isArray(body.tools)
+ ? body.tools
+ .filter((t: any) => t && typeof t === "object" && (t as any).type === "function")
+ .map((t: any) => ({
+ name: (t as any).function.name,
+ description: (t as any).function.description,
+ input_schema: (t as any).function.parameters,
+ ...cc(),
+ }))
+ : undefined
+
+ const tcIn = body.tool_choice
+ const tool_choice = (() => {
+ if (!tcIn) return undefined
+ if (tcIn === "auto") return { type: "auto" }
+ if (tcIn === "required") return { type: "any" }
+ if ((tcIn as any).type === "function" && (tcIn as any).function?.name)
+ return { type: "tool", name: (tcIn as any).function.name }
+ return undefined
+ })()
+
+ const stop_sequences = (() => {
+ const v = body.stop
+ if (!v) return undefined
+ if (Array.isArray(v)) return v
+ if (typeof v === "string") return [v]
+ return undefined
+ })()
+
+ return {
+ max_tokens: body.max_tokens ?? 32_000,
+ temperature: body.temperature,
+ top_p: body.top_p,
+ system: system.length > 0 ? system : undefined,
+ messages: msgsOut,
+ stream: !!body.stream,
+ tools,
+ tool_choice,
+ stop_sequences,
+ }
+}
+
+export function fromAnthropicResponse(resp: any): CommonResponse {
+ if (!resp || typeof resp !== "object") return resp
+
+ if (Array.isArray((resp as any).choices)) return resp
+
+ const isAnthropic = typeof (resp as any).type === "string" && (resp as any).type === "message"
+ if (!isAnthropic) return resp
+
+ const idIn = (resp as any).id
+ const id =
+ typeof idIn === "string" ? idIn.replace(/^msg_/, "chatcmpl_") : `chatcmpl_${Math.random().toString(36).slice(2)}`
+ const model = (resp as any).model
+
+ const blocks: any[] = Array.isArray((resp as any).content) ? (resp as any).content : []
+ const text = blocks
+ .filter((b) => b && b.type === "text" && typeof (b as any).text === "string")
+ .map((b: any) => b.text)
+ .join("")
+ const tcs = blocks
+ .filter((b) => b && b.type === "tool_use")
+ .map((b: any) => {
+ const name = (b as any).name
+ const args = (() => {
+ const inp = (b as any).input
+ if (typeof inp === "string") return inp
+ try {
+ return JSON.stringify(inp ?? {})
+ } catch {
+ return String(inp ?? "")
+ }
+ })()
+ const tid =
+ typeof (b as any).id === "string" && (b as any).id.length > 0
+ ? (b as any).id
+ : `toolu_${Math.random().toString(36).slice(2)}`
+ return { id: tid, type: "function" as const, function: { name, arguments: args } }
+ })
+
+ const finish = (r: string | null) => {
+ if (r === "end_turn") return "stop"
+ if (r === "tool_use") return "tool_calls"
+ if (r === "max_tokens") return "length"
+ if (r === "content_filter") return "content_filter"
+ return null
+ }
+
+ const u = (resp as any).usage
+ const usage = (() => {
+ if (!u) return undefined as any
+ const pt = typeof (u as any).input_tokens === "number" ? (u as any).input_tokens : undefined
+ const ct = typeof (u as any).output_tokens === "number" ? (u as any).output_tokens : undefined
+ const total = pt != null && ct != null ? pt + ct : undefined
+ const cached =
+ typeof (u as any).cache_read_input_tokens === "number" ? (u as any).cache_read_input_tokens : undefined
+ const details = cached != null ? { cached_tokens: cached } : undefined
+ return {
+ prompt_tokens: pt,
+ completion_tokens: ct,
+ total_tokens: total,
+ ...(details ? { prompt_tokens_details: details } : {}),
+ }
+ })()
+
+ return {
+ id,
+ object: "chat.completion",
+ created: Math.floor(Date.now() / 1000),
+ model,
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ ...(text && text.length > 0 ? { content: text } : {}),
+ ...(tcs.length > 0 ? { tool_calls: tcs } : {}),
+ },
+ finish_reason: finish((resp as any).stop_reason ?? null),
+ },
+ ],
+ ...(usage ? { usage } : {}),
+ }
+}
+
+export function toAnthropicResponse(resp: CommonResponse) {
+ if (!resp || typeof resp !== "object") return resp
+
+ if (!Array.isArray((resp as any).choices)) return resp
+
+ const choice = (resp as any).choices[0]
+ if (!choice) return resp
+
+ const message = choice.message
+ if (!message) return resp
+
+ const content: any[] = []
+
+ if (typeof message.content === "string" && message.content.length > 0)
+ content.push({ type: "text", text: message.content })
+
+ if (Array.isArray(message.tool_calls)) {
+ for (const tc of message.tool_calls) {
+ if ((tc as any).type === "function" && (tc as any).function) {
+ let input: any
+ try {
+ input = JSON.parse((tc as any).function.arguments)
+ } catch {
+ input = (tc as any).function.arguments
+ }
+ content.push({
+ type: "tool_use",
+ id: (tc as any).id,
+ name: (tc as any).function.name,
+ input,
+ })
+ }
+ }
+ }
+
+ const stop_reason = (() => {
+ const r = choice.finish_reason
+ if (r === "stop") return "end_turn"
+ if (r === "tool_calls") return "tool_use"
+ if (r === "length") return "max_tokens"
+ if (r === "content_filter") return "content_filter"
+ return null
+ })()
+
+ const usage = (() => {
+ const u = (resp as any).usage
+ if (!u) return undefined
+ return {
+ input_tokens: u.prompt_tokens,
+ output_tokens: u.completion_tokens,
+ cache_read_input_tokens: u.prompt_tokens_details?.cached_tokens,
+ }
+ })()
+
+ return {
+ id: (resp as any).id,
+ type: "message",
+ role: "assistant",
+ content: content.length > 0 ? content : [{ type: "text", text: "" }],
+ model: (resp as any).model,
+ stop_reason,
+ usage,
+ }
+}
+
+export function fromAnthropicChunk(chunk: string): CommonChunk | string {
+ // Anthropic sends two lines per part: "event: \n" + "data: "
+ const lines = chunk.split("\n")
+ const dataLine = lines.find((l) => l.startsWith("data: "))
+ if (!dataLine) return chunk
+
+ let json
+ try {
+ json = JSON.parse(dataLine.slice(6))
+ } catch {
+ return chunk
+ }
+
+ const out: CommonChunk = {
+ id: json.id ?? json.message?.id ?? "",
+ object: "chat.completion.chunk",
+ created: Math.floor(Date.now() / 1000),
+ model: json.model ?? json.message?.model ?? "",
+ choices: [],
+ }
+
+ if (json.type === "content_block_start") {
+ const cb = json.content_block
+ if (cb?.type === "text") {
+ out.choices.push({
+ index: json.index ?? 0,
+ delta: { role: "assistant", content: "" },
+ finish_reason: null,
+ })
+ } else if (cb?.type === "tool_use") {
+ out.choices.push({
+ index: json.index ?? 0,
+ delta: {
+ tool_calls: [
+ {
+ index: json.index ?? 0,
+ id: cb.id,
+ type: "function",
+ function: { name: cb.name, arguments: "" },
+ },
+ ],
+ },
+ finish_reason: null,
+ })
+ }
+ }
+
+ if (json.type === "content_block_delta") {
+ const d = json.delta
+ if (d?.type === "text_delta") {
+ out.choices.push({ index: json.index ?? 0, delta: { content: d.text }, finish_reason: null })
+ } else if (d?.type === "input_json_delta") {
+ out.choices.push({
+ index: json.index ?? 0,
+ delta: {
+ tool_calls: [{ index: json.index ?? 0, function: { arguments: d.partial_json } }],
+ },
+ finish_reason: null,
+ })
+ }
+ }
+
+ if (json.type === "message_delta") {
+ const d = json.delta
+ const finish_reason = (() => {
+ const r = d?.stop_reason
+ if (r === "end_turn") return "stop"
+ if (r === "tool_use") return "tool_calls"
+ if (r === "max_tokens") return "length"
+ if (r === "content_filter") return "content_filter"
+ return null
+ })()
+
+ out.choices.push({ index: 0, delta: {}, finish_reason })
+ }
+
+ if (json.usage) {
+ const u = json.usage
+ out.usage = {
+ prompt_tokens: u.input_tokens,
+ completion_tokens: u.output_tokens,
+ total_tokens: (u.input_tokens || 0) + (u.output_tokens || 0),
+ ...(u.cache_read_input_tokens ? { prompt_tokens_details: { cached_tokens: u.cache_read_input_tokens } } : {}),
+ }
+ }
+
+ return out
+}
+
+export function toAnthropicChunk(chunk: CommonChunk): string {
+ if (!chunk.choices || !Array.isArray(chunk.choices) || chunk.choices.length === 0) {
+ return JSON.stringify({})
+ }
+
+ const choice = chunk.choices[0]
+ const delta = choice.delta
+ if (!delta) return JSON.stringify({})
+
+ const result: any = {}
+
+ if (delta.content) {
+ result.type = "content_block_delta"
+ result.index = 0
+ result.delta = { type: "text_delta", text: delta.content }
+ }
+
+ if (delta.tool_calls) {
+ for (const tc of delta.tool_calls) {
+ if (tc.function?.name) {
+ result.type = "content_block_start"
+ result.index = tc.index ?? 0
+ result.content_block = { type: "tool_use", id: tc.id, name: tc.function.name, input: {} }
+ } else if (tc.function?.arguments) {
+ result.type = "content_block_delta"
+ result.index = tc.index ?? 0
+ result.delta = { type: "input_json_delta", partial_json: tc.function.arguments }
+ }
+ }
+ }
+
+ if (choice.finish_reason) {
+ const stop_reason = (() => {
+ const r = choice.finish_reason
+ if (r === "stop") return "end_turn"
+ if (r === "tool_calls") return "tool_use"
+ if (r === "length") return "max_tokens"
+ if (r === "content_filter") return "content_filter"
+ return null
+ })()
+ result.type = "message_delta"
+ result.delta = { stop_reason, stop_sequence: null }
+ }
+
+ if (chunk.usage) {
+ const u = chunk.usage
+ result.usage = {
+ input_tokens: u.prompt_tokens,
+ output_tokens: u.completion_tokens,
+ cache_read_input_tokens: u.prompt_tokens_details?.cached_tokens,
+ }
+ }
+
+ return JSON.stringify(result)
+}
diff --git a/packages/console/app/src/routes/zen/util/provider/google.ts b/packages/console/app/src/routes/zen/util/provider/google.ts
new file mode 100644
index 0000000..eead927
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/provider/google.ts
@@ -0,0 +1,76 @@
+import { ProviderHelper } from "./provider"
+
+/*
+{
+ promptTokenCount: 11453,
+ candidatesTokenCount: 71,
+ totalTokenCount: 11625,
+ cachedContentTokenCount: 8100,
+ promptTokensDetails: [
+ {modality: "TEXT",tokenCount: 11453}
+ ],
+ cacheTokensDetails: [
+ {modality: "TEXT",tokenCount: 8100}
+ ],
+ thoughtsTokenCount: 101
+}
+*/
+
+type Usage = {
+ promptTokenCount?: number
+ candidatesTokenCount?: number
+ totalTokenCount?: number
+ cachedContentTokenCount?: number
+ promptTokensDetails?: { modality: string; tokenCount: number }[]
+ cacheTokensDetails?: { modality: string; tokenCount: number }[]
+ thoughtsTokenCount?: number
+}
+
+export const googleHelper: ProviderHelper = ({ providerModel }) => ({
+ format: "google",
+ modifyUrl: (providerApi: string, isStream?: boolean) =>
+ `${providerApi}/models/${providerModel}:${isStream ? "streamGenerateContent?alt=sse" : "generateContent"}`,
+ modifyHeaders: (headers: Headers, apiKey: string, _stickyId: string) => {
+ headers.set("x-goog-api-key", apiKey)
+ },
+ modifyBody: (body: Record) => {
+ return body
+ },
+ createBinaryStreamDecoder: () => undefined,
+ streamSeparator: "\r\n\r\n",
+ createUsageParser: () => {
+ let usage: Usage
+
+ return {
+ parse: (chunk: string) => {
+ if (!chunk.startsWith("data: ")) return
+
+ let json
+ try {
+ json = JSON.parse(chunk.slice(6)) as { usageMetadata?: Usage }
+ } catch {
+ return
+ }
+
+ if (!json.usageMetadata) return
+ usage = json.usageMetadata
+ },
+ retrieve: () => usage,
+ }
+ },
+ extractUsage: (response: any) => response.usageMetadata,
+ normalizeUsage: (usage: Usage) => {
+ const inputTokens = usage.promptTokenCount ?? 0
+ const outputTokens = usage.candidatesTokenCount ?? 0
+ const reasoningTokens = usage.thoughtsTokenCount ?? 0
+ const cacheReadTokens = usage.cachedContentTokenCount ?? 0
+ return {
+ inputTokens: inputTokens - cacheReadTokens,
+ outputTokens,
+ reasoningTokens,
+ cacheReadTokens,
+ cacheWrite5mTokens: undefined,
+ cacheWrite1hTokens: undefined,
+ }
+ },
+})
diff --git a/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts b/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts
new file mode 100644
index 0000000..9e5e15d
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/provider/openai-compatible.ts
@@ -0,0 +1,556 @@
+import { ProviderHelper, CommonRequest, CommonResponse, CommonChunk } from "./provider"
+
+type Usage = {
+ prompt_tokens?: number
+ completion_tokens?: number
+ total_tokens?: number
+ // used by moonshot
+ cached_tokens?: number
+ // used by xai & alibaba
+ prompt_tokens_details?: {
+ text_tokens?: number
+ audio_tokens?: number
+ image_tokens?: number
+ cached_tokens?: number
+ // used by alibaba
+ cache_creation_input_tokens?: number
+ }
+ completion_tokens_details?: {
+ reasoning_tokens?: number
+ audio_tokens?: number
+ accepted_prediction_tokens?: number
+ rejected_prediction_tokens?: number
+ }
+}
+
+export const oaCompatHelper: ProviderHelper = ({ adjustCacheUsage }) => ({
+ format: "oa-compat",
+ modifyUrl: (providerApi: string) => providerApi + "/chat/completions",
+ modifyHeaders: (headers: Headers, apiKey: string, stickyId: string) => {
+ headers.set("authorization", `Bearer ${apiKey}`)
+ headers.set("x-session-affinity", stickyId)
+ },
+ modifyBody: (body: Record, _workspaceID?: string) => {
+ return {
+ ...body,
+ ...(body.stream ? { stream_options: { include_usage: true } } : {}),
+ }
+ },
+ createBinaryStreamDecoder: () => undefined,
+ streamSeparator: "\n\n",
+ createUsageParser: () => {
+ let usage: Usage
+
+ return {
+ parse: (chunk: string) => {
+ if (!chunk.startsWith("data: ")) return
+
+ let json
+ try {
+ json = JSON.parse(chunk.slice(6)) as { usage?: Usage }
+ } catch {
+ return
+ }
+
+ if (!json.usage) return
+ usage = json.usage
+ },
+ retrieve: () => usage,
+ }
+ },
+ extractUsage: (response: any) => response.usage,
+ normalizeUsage: (usage: Usage) => {
+ let inputTokens = usage.prompt_tokens ?? 0
+ const outputTokens = usage.completion_tokens ?? 0
+ const reasoningTokens = usage.completion_tokens_details?.reasoning_tokens ?? undefined
+ let cacheReadTokens = usage.cached_tokens ?? usage.prompt_tokens_details?.cached_tokens ?? undefined
+ const cacheWriteTokens = usage.prompt_tokens_details?.cache_creation_input_tokens ?? undefined
+
+ if (adjustCacheUsage && !cacheReadTokens) {
+ cacheReadTokens = Math.floor(inputTokens * 0.9)
+ }
+
+ return {
+ inputTokens: inputTokens - (cacheReadTokens ?? 0),
+ outputTokens,
+ reasoningTokens,
+ cacheReadTokens,
+ cacheWrite5mTokens: cacheWriteTokens,
+ cacheWrite1hTokens: undefined,
+ }
+ },
+})
+
+export function fromOaCompatibleRequest(body: any): CommonRequest {
+ if (!body || typeof body !== "object") return body
+
+ const msgsIn = Array.isArray(body.messages) ? body.messages : []
+ const msgsOut: any[] = []
+
+ for (const m of msgsIn) {
+ if (!m || !m.role) continue
+
+ if (m.role === "system") {
+ if (typeof m.content === "string" && m.content.length > 0) msgsOut.push({ role: "system", content: m.content })
+ continue
+ }
+
+ if (m.role === "user") {
+ if (typeof m.content === "string") {
+ msgsOut.push({ role: "user", content: m.content })
+ } else if (Array.isArray(m.content)) {
+ const parts: any[] = []
+ for (const p of m.content) {
+ if (!p || !p.type) continue
+ if (p.type === "text" && typeof p.text === "string") parts.push({ type: "text", text: p.text })
+ if (p.type === "image_url") parts.push({ type: "image_url", image_url: p.image_url })
+ }
+ if (parts.length === 1 && parts[0].type === "text") msgsOut.push({ role: "user", content: parts[0].text })
+ else if (parts.length > 0) msgsOut.push({ role: "user", content: parts })
+ }
+ continue
+ }
+
+ if (m.role === "assistant") {
+ const out: any = { role: "assistant" }
+ if (typeof m.content === "string") out.content = m.content
+ if (Array.isArray(m.tool_calls)) out.tool_calls = m.tool_calls
+ msgsOut.push(out)
+ continue
+ }
+
+ if (m.role === "tool") {
+ msgsOut.push({ role: "tool", tool_call_id: m.tool_call_id, content: m.content })
+ continue
+ }
+ }
+
+ return {
+ model: body.model,
+ max_tokens: body.max_tokens,
+ temperature: body.temperature,
+ top_p: body.top_p,
+ stop: body.stop,
+ messages: msgsOut,
+ stream: !!body.stream,
+ tools: Array.isArray(body.tools) ? body.tools : undefined,
+ tool_choice: body.tool_choice,
+ }
+}
+
+export function toOaCompatibleRequest(body: CommonRequest) {
+ if (!body || typeof body !== "object") return body
+
+ const msgsIn = Array.isArray(body.messages) ? body.messages : []
+ const msgsOut: any[] = []
+
+ const toImg = (p: any) => {
+ if (!p || typeof p !== "object") return undefined
+ if (p.type === "image_url" && p.image_url) return { type: "image_url", image_url: p.image_url }
+ const s = (p as any).source
+ if (!s || typeof s !== "object") return undefined
+ if (s.type === "url" && typeof s.url === "string") return { type: "image_url", image_url: { url: s.url } }
+ if (s.type === "base64" && typeof s.media_type === "string" && typeof s.data === "string")
+ return { type: "image_url", image_url: { url: `data:${s.media_type};base64,${s.data}` } }
+ return undefined
+ }
+
+ for (const m of msgsIn) {
+ if (!m || !m.role) continue
+
+ if (m.role === "system") {
+ if (typeof m.content === "string" && m.content.length > 0) msgsOut.push({ role: "system", content: m.content })
+ continue
+ }
+
+ if (m.role === "user") {
+ if (typeof m.content === "string") {
+ msgsOut.push({ role: "user", content: m.content })
+ continue
+ }
+ if (Array.isArray(m.content)) {
+ const parts: any[] = []
+ for (const p of m.content) {
+ if (!p || !p.type) continue
+ if (p.type === "text" && typeof p.text === "string") parts.push({ type: "text", text: p.text })
+ const ip = toImg(p)
+ if (ip) parts.push(ip)
+ }
+ if (parts.length === 1 && parts[0].type === "text") msgsOut.push({ role: "user", content: parts[0].text })
+ else if (parts.length > 0) msgsOut.push({ role: "user", content: parts })
+ }
+ continue
+ }
+
+ if (m.role === "assistant") {
+ const out: any = { role: "assistant" }
+ if (typeof m.content === "string") out.content = m.content
+ if (Array.isArray(m.tool_calls)) out.tool_calls = m.tool_calls
+ msgsOut.push(out)
+ continue
+ }
+
+ if (m.role === "tool") {
+ msgsOut.push({ role: "tool", tool_call_id: m.tool_call_id, content: m.content })
+ continue
+ }
+ }
+
+ const tools = Array.isArray(body.tools)
+ ? body.tools.map((tool: any) => ({
+ type: "function",
+ function: {
+ name: tool.name,
+ description: tool.description,
+ parameters: tool.parameters,
+ },
+ }))
+ : undefined
+
+ return {
+ model: body.model,
+ max_tokens: body.max_tokens,
+ temperature: body.temperature,
+ top_p: body.top_p,
+ stop: body.stop,
+ messages: msgsOut,
+ stream: !!body.stream,
+ tools,
+ tool_choice: body.tool_choice,
+ response_format: (body as any).response_format,
+ }
+}
+
+export function fromOaCompatibleResponse(resp: any): CommonResponse {
+ if (!resp || typeof resp !== "object") return resp
+
+ if (!Array.isArray((resp as any).choices)) return resp
+
+ const choice = (resp as any).choices[0]
+ if (!choice) return resp
+
+ const message = choice.message
+ if (!message) return resp
+
+ const content: any[] = []
+
+ if (typeof message.content === "string" && message.content.length > 0) {
+ content.push({ type: "text", text: message.content })
+ }
+
+ if (Array.isArray(message.tool_calls)) {
+ for (const toolCall of message.tool_calls) {
+ if (toolCall.type === "function" && toolCall.function) {
+ let input
+ try {
+ input = JSON.parse(toolCall.function.arguments)
+ } catch {
+ input = toolCall.function.arguments
+ }
+ content.push({
+ type: "tool_use",
+ id: toolCall.id,
+ name: toolCall.function.name,
+ input,
+ })
+ }
+ }
+ }
+
+ const stopReason = (() => {
+ const reason = choice.finish_reason
+ if (reason === "stop") return "stop"
+ if (reason === "tool_calls") return "tool_calls"
+ if (reason === "length") return "length"
+ if (reason === "content_filter") return "content_filter"
+ return null
+ })()
+
+ const usage = (() => {
+ const u = (resp as any).usage
+ if (!u) return undefined
+ return {
+ prompt_tokens: u.prompt_tokens,
+ completion_tokens: u.completion_tokens,
+ total_tokens: u.total_tokens,
+ ...(u.prompt_tokens_details?.cached_tokens
+ ? { prompt_tokens_details: { cached_tokens: u.prompt_tokens_details.cached_tokens } }
+ : {}),
+ }
+ })()
+
+ return {
+ id: (resp as any).id,
+ object: "chat.completion" as const,
+ created: Math.floor(Date.now() / 1000),
+ model: (resp as any).model,
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant" as const,
+ ...(content.some((c) => c.type === "text")
+ ? {
+ content: content
+ .filter((c) => c.type === "text")
+ .map((c: any) => c.text)
+ .join(""),
+ }
+ : {}),
+ ...(content.some((c) => c.type === "tool_use")
+ ? {
+ tool_calls: content
+ .filter((c) => c.type === "tool_use")
+ .map((c: any) => ({
+ id: c.id,
+ type: "function" as const,
+ function: {
+ name: c.name,
+ arguments: typeof c.input === "string" ? c.input : JSON.stringify(c.input),
+ },
+ })),
+ }
+ : {}),
+ },
+ finish_reason: stopReason,
+ },
+ ],
+ ...(usage ? { usage } : {}),
+ }
+}
+
+export function toOaCompatibleResponse(resp: CommonResponse) {
+ if (!resp || typeof resp !== "object") return resp
+
+ if (Array.isArray((resp as any).choices)) return resp
+
+ const isAnthropic = typeof (resp as any).type === "string" && (resp as any).type === "message"
+ if (!isAnthropic) return resp
+
+ const idIn = (resp as any).id
+ const id =
+ typeof idIn === "string" ? idIn.replace(/^msg_/, "chatcmpl_") : `chatcmpl_${Math.random().toString(36).slice(2)}`
+ const model = (resp as any).model
+
+ const blocks: any[] = Array.isArray((resp as any).content) ? (resp as any).content : []
+ const text = blocks
+ .filter((b) => b && b.type === "text" && typeof b.text === "string")
+ .map((b) => b.text)
+ .join("")
+ const tcs = blocks
+ .filter((b) => b && b.type === "tool_use")
+ .map((b) => {
+ const name = (b as any).name
+ const args = (() => {
+ const inp = (b as any).input
+ if (typeof inp === "string") return inp
+ try {
+ return JSON.stringify(inp ?? {})
+ } catch {
+ return String(inp ?? "")
+ }
+ })()
+ const tid =
+ typeof (b as any).id === "string" && (b as any).id.length > 0
+ ? (b as any).id
+ : `toolu_${Math.random().toString(36).slice(2)}`
+ return { id: tid, type: "function" as const, function: { name, arguments: args } }
+ })
+
+ const finish = (r: string | null) => {
+ if (r === "end_turn") return "stop"
+ if (r === "tool_use") return "tool_calls"
+ if (r === "max_tokens") return "length"
+ if (r === "content_filter") return "content_filter"
+ return null
+ }
+
+ const u = (resp as any).usage
+ const usage = (() => {
+ if (!u) return undefined as any
+ const pt = typeof u.input_tokens === "number" ? u.input_tokens : undefined
+ const ct = typeof u.output_tokens === "number" ? u.output_tokens : undefined
+ const total = pt != null && ct != null ? pt + ct : undefined
+ const cached = typeof u.cache_read_input_tokens === "number" ? u.cache_read_input_tokens : undefined
+ const details = cached != null ? { cached_tokens: cached } : undefined
+ return {
+ prompt_tokens: pt,
+ completion_tokens: ct,
+ total_tokens: total,
+ ...(details ? { prompt_tokens_details: details } : {}),
+ }
+ })()
+
+ return {
+ id,
+ object: "chat.completion",
+ created: Math.floor(Date.now() / 1000),
+ model,
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ ...(text && text.length > 0 ? { content: text } : {}),
+ ...(tcs.length > 0 ? { tool_calls: tcs } : {}),
+ },
+ finish_reason: finish((resp as any).stop_reason ?? null),
+ },
+ ],
+ ...(usage ? { usage } : {}),
+ }
+}
+
+export function fromOaCompatibleChunk(chunk: string): CommonChunk | string {
+ if (!chunk.startsWith("data: ")) return chunk
+
+ let json
+ try {
+ json = JSON.parse(chunk.slice(6))
+ } catch {
+ return chunk
+ }
+
+ if (!json.choices || !Array.isArray(json.choices) || json.choices.length === 0) {
+ return chunk
+ }
+
+ const choice = json.choices[0]
+ const delta = choice.delta
+
+ if (!delta) return chunk
+
+ const result: CommonChunk = {
+ id: json.id ?? "",
+ object: "chat.completion.chunk",
+ created: json.created ?? Math.floor(Date.now() / 1000),
+ model: json.model ?? "",
+ choices: [],
+ }
+
+ if (delta.content) {
+ result.choices.push({
+ index: choice.index ?? 0,
+ delta: { content: delta.content },
+ finish_reason: null,
+ })
+ }
+
+ if (delta.tool_calls) {
+ for (const toolCall of delta.tool_calls) {
+ result.choices.push({
+ index: choice.index ?? 0,
+ delta: {
+ tool_calls: [
+ {
+ index: toolCall.index ?? 0,
+ id: toolCall.id,
+ type: toolCall.type ?? "function",
+ function: toolCall.function,
+ },
+ ],
+ },
+ finish_reason: null,
+ })
+ }
+ }
+
+ if (choice.finish_reason) {
+ result.choices.push({
+ index: choice.index ?? 0,
+ delta: {},
+ finish_reason: choice.finish_reason,
+ })
+ }
+
+ if (json.usage) {
+ const usage = json.usage
+ result.usage = {
+ prompt_tokens: usage.prompt_tokens,
+ completion_tokens: usage.completion_tokens,
+ total_tokens: usage.total_tokens,
+ ...(usage.prompt_tokens_details?.cached_tokens
+ ? { prompt_tokens_details: { cached_tokens: usage.prompt_tokens_details.cached_tokens } }
+ : {}),
+ }
+ }
+
+ return result
+}
+
+export function toOaCompatibleChunk(chunk: CommonChunk): string {
+ const result: any = {
+ id: chunk.id,
+ object: "chat.completion.chunk",
+ created: chunk.created,
+ model: chunk.model,
+ choices: [],
+ }
+
+ if (!chunk.choices || chunk.choices.length === 0) {
+ return `data: ${JSON.stringify(result)}`
+ }
+
+ const choice = chunk.choices[0]
+ const delta = choice.delta
+
+ if (delta?.role) {
+ result.choices.push({
+ index: choice.index,
+ delta: { role: delta.role },
+ finish_reason: null,
+ })
+ }
+
+ if (delta?.content) {
+ result.choices.push({
+ index: choice.index,
+ delta: { content: delta.content },
+ finish_reason: null,
+ })
+ }
+
+ if (delta?.tool_calls) {
+ for (const tc of delta.tool_calls) {
+ result.choices.push({
+ index: choice.index,
+ delta: {
+ tool_calls: [
+ {
+ index: tc.index,
+ id: tc.id,
+ type: tc.type,
+ function: tc.function,
+ },
+ ],
+ },
+ finish_reason: null,
+ })
+ }
+ }
+
+ if (choice.finish_reason) {
+ result.choices.push({
+ index: choice.index,
+ delta: {},
+ finish_reason: choice.finish_reason,
+ })
+ }
+
+ if (chunk.usage) {
+ result.usage = {
+ prompt_tokens: chunk.usage.prompt_tokens,
+ completion_tokens: chunk.usage.completion_tokens,
+ total_tokens: chunk.usage.total_tokens,
+ ...(chunk.usage.prompt_tokens_details?.cached_tokens
+ ? {
+ prompt_tokens_details: {
+ cached_tokens: chunk.usage.prompt_tokens_details.cached_tokens,
+ },
+ }
+ : {}),
+ }
+ }
+
+ return `data: ${JSON.stringify(result)}`
+}
diff --git a/packages/console/app/src/routes/zen/util/provider/openai.ts b/packages/console/app/src/routes/zen/util/provider/openai.ts
new file mode 100644
index 0000000..e55dcd8
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/provider/openai.ts
@@ -0,0 +1,629 @@
+import { ProviderHelper, CommonRequest, CommonResponse, CommonChunk } from "./provider"
+
+type Usage = {
+ input_tokens?: number
+ input_tokens_details?: {
+ cached_tokens?: number
+ }
+ output_tokens?: number
+ output_tokens_details?: {
+ reasoning_tokens?: number
+ }
+ total_tokens?: number
+}
+
+export const openaiHelper: ProviderHelper = ({ workspaceID }) => ({
+ format: "openai",
+ modifyUrl: (providerApi: string) => providerApi + "/responses",
+ modifyHeaders: (headers: Headers, apiKey: string, _stickyId: string) => {
+ headers.set("authorization", `Bearer ${apiKey}`)
+ },
+ modifyBody: (body: Record) => body,
+ createBinaryStreamDecoder: () => undefined,
+ streamSeparator: "\n\n",
+ createUsageParser: () => {
+ let usage: Usage
+
+ return {
+ parse: (chunk: string) => {
+ const [event, data] = chunk.split("\n")
+ if (event !== "event: response.completed") return
+ if (!data.startsWith("data: ")) return
+
+ let json
+ try {
+ json = JSON.parse(data.slice(6)) as { response?: { usage?: Usage } }
+ } catch {
+ return
+ }
+
+ if (!json.response?.usage) return
+ usage = json.response.usage
+ },
+ retrieve: () => usage,
+ }
+ },
+ extractUsage: (response: any) => response.usage ?? response.response?.usage,
+ normalizeUsage: (usage: Usage) => {
+ const inputTokens = usage.input_tokens ?? 0
+ const outputTokens = usage.output_tokens ?? 0
+ const reasoningTokens = usage.output_tokens_details?.reasoning_tokens ?? undefined
+ const cacheReadTokens = usage.input_tokens_details?.cached_tokens ?? undefined
+ return {
+ inputTokens: inputTokens - (cacheReadTokens ?? 0),
+ outputTokens,
+ reasoningTokens,
+ cacheReadTokens,
+ cacheWrite5mTokens: undefined,
+ cacheWrite1hTokens: undefined,
+ }
+ },
+})
+
+export function fromOpenaiRequest(body: any): CommonRequest {
+ if (!body || typeof body !== "object") return body
+
+ const toImg = (p: any) => {
+ if (!p || typeof p !== "object") return undefined
+ if ((p as any).type === "image_url" && (p as any).image_url)
+ return { type: "image_url", image_url: (p as any).image_url }
+ if ((p as any).type === "input_image" && (p as any).image_url)
+ return { type: "image_url", image_url: (p as any).image_url }
+ const s = (p as any).source
+ if (!s || typeof s !== "object") return undefined
+ if ((s as any).type === "url" && typeof (s as any).url === "string")
+ return { type: "image_url", image_url: { url: (s as any).url } }
+ if (
+ (s as any).type === "base64" &&
+ typeof (s as any).media_type === "string" &&
+ typeof (s as any).data === "string"
+ )
+ return {
+ type: "image_url",
+ image_url: { url: `data:${(s as any).media_type};base64,${(s as any).data}` },
+ }
+ return undefined
+ }
+
+ const msgs: any[] = []
+
+ const inMsgs = Array.isArray(body.input) ? body.input : Array.isArray(body.messages) ? body.messages : []
+
+ for (const m of inMsgs) {
+ if (!m) continue
+
+ // Responses API items without role:
+ if (!(m as any).role && (m as any).type) {
+ if ((m as any).type === "function_call") {
+ const name = (m as any).name
+ const a = (m as any).arguments
+ const args = typeof a === "string" ? a : JSON.stringify(a ?? {})
+ msgs.push({
+ role: "assistant",
+ tool_calls: [{ id: (m as any).id, type: "function", function: { name, arguments: args } }],
+ })
+ }
+ if ((m as any).type === "function_call_output") {
+ const id = (m as any).call_id
+ const out = (m as any).output
+ const content = typeof out === "string" ? out : JSON.stringify(out)
+ msgs.push({ role: "tool", tool_call_id: id, content })
+ }
+ continue
+ }
+
+ if ((m as any).role === "system" || (m as any).role === "developer") {
+ const c = (m as any).content
+ if (typeof c === "string" && c.length > 0) msgs.push({ role: "system", content: c })
+ if (Array.isArray(c)) {
+ const t = c.find((p: any) => p && typeof p.text === "string")
+ if (t && typeof t.text === "string" && t.text.length > 0) msgs.push({ role: "system", content: t.text })
+ }
+ continue
+ }
+
+ if ((m as any).role === "user") {
+ const c = (m as any).content
+ if (typeof c === "string") {
+ msgs.push({ role: "user", content: c })
+ } else if (Array.isArray(c)) {
+ const parts: any[] = []
+ for (const p of c) {
+ if (!p || !(p as any).type) continue
+ if (((p as any).type === "text" || (p as any).type === "input_text") && typeof (p as any).text === "string")
+ parts.push({ type: "text", text: (p as any).text })
+ const ip = toImg(p)
+ if (ip) parts.push(ip)
+ if ((p as any).type === "tool_result") {
+ const id = (p as any).tool_call_id
+ const content =
+ typeof (p as any).content === "string" ? (p as any).content : JSON.stringify((p as any).content)
+ msgs.push({ role: "tool", tool_call_id: id, content })
+ }
+ }
+ if (parts.length === 1 && parts[0].type === "text") msgs.push({ role: "user", content: parts[0].text })
+ else if (parts.length > 0) msgs.push({ role: "user", content: parts })
+ }
+ continue
+ }
+
+ if ((m as any).role === "assistant") {
+ const c = (m as any).content
+ const out: any = { role: "assistant" }
+ if (typeof c === "string" && c.length > 0) out.content = c
+ if (Array.isArray((m as any).tool_calls)) out.tool_calls = (m as any).tool_calls
+ msgs.push(out)
+ continue
+ }
+
+ if ((m as any).role === "tool") {
+ msgs.push({
+ role: "tool",
+ tool_call_id: (m as any).tool_call_id,
+ content: (m as any).content,
+ })
+ continue
+ }
+ }
+
+ const tcIn = body.tool_choice
+ const tc = (() => {
+ if (!tcIn) return undefined
+ if (tcIn === "auto") return "auto"
+ if (tcIn === "required") return "required"
+ if ((tcIn as any).type === "function" && (tcIn as any).function?.name)
+ return { type: "function" as const, function: { name: (tcIn as any).function.name } }
+ return undefined
+ })()
+
+ const stop = (() => {
+ const v = body.stop_sequences ?? body.stop
+ if (!v) return undefined
+ if (Array.isArray(v)) return v.length === 1 ? v[0] : v
+ if (typeof v === "string") return v
+ return undefined
+ })()
+
+ return {
+ model: body.model,
+ max_tokens: body.max_output_tokens ?? body.max_tokens,
+ temperature: body.temperature,
+ top_p: body.top_p,
+ stop,
+ messages: msgs,
+ stream: !!body.stream,
+ tools: Array.isArray(body.tools) ? body.tools : undefined,
+ tool_choice: tc,
+ }
+}
+
+export function toOpenaiRequest(body: CommonRequest) {
+ if (!body || typeof body !== "object") return body
+
+ const msgsIn = Array.isArray(body.messages) ? body.messages : []
+ const input: any[] = []
+
+ const toPart = (p: any) => {
+ if (!p || typeof p !== "object") return undefined
+ if ((p as any).type === "text" && typeof (p as any).text === "string")
+ return { type: "input_text", text: (p as any).text }
+ if ((p as any).type === "image_url" && (p as any).image_url)
+ return { type: "input_image", image_url: (p as any).image_url }
+ const s = (p as any).source
+ if (!s || typeof s !== "object") return undefined
+ if ((s as any).type === "url" && typeof (s as any).url === "string")
+ return { type: "input_image", image_url: { url: (s as any).url } }
+ if (
+ (s as any).type === "base64" &&
+ typeof (s as any).media_type === "string" &&
+ typeof (s as any).data === "string"
+ )
+ return {
+ type: "input_image",
+ image_url: { url: `data:${(s as any).media_type};base64,${(s as any).data}` },
+ }
+ return undefined
+ }
+
+ for (const m of msgsIn) {
+ if (!m || !(m as any).role) continue
+
+ if ((m as any).role === "system") {
+ const c = (m as any).content
+ if (typeof c === "string") input.push({ role: "system", content: c })
+ continue
+ }
+
+ if ((m as any).role === "user") {
+ const c = (m as any).content
+ if (typeof c === "string") {
+ input.push({ role: "user", content: [{ type: "input_text", text: c }] })
+ } else if (Array.isArray(c)) {
+ const parts: any[] = []
+ for (const p of c) {
+ const op = toPart(p)
+ if (op) parts.push(op)
+ }
+ if (parts.length > 0) input.push({ role: "user", content: parts })
+ }
+ continue
+ }
+
+ if ((m as any).role === "assistant") {
+ const c = (m as any).content
+ if (typeof c === "string" && c.length > 0) {
+ input.push({ role: "assistant", content: [{ type: "output_text", text: c }] })
+ }
+ if (Array.isArray((m as any).tool_calls)) {
+ for (const tc of (m as any).tool_calls) {
+ if ((tc as any).type === "function" && (tc as any).function) {
+ const name = (tc as any).function.name
+ const a = (tc as any).function.arguments
+ const args = typeof a === "string" ? a : JSON.stringify(a)
+ input.push({ type: "function_call", call_id: (tc as any).id, name, arguments: args })
+ }
+ }
+ }
+ continue
+ }
+
+ if ((m as any).role === "tool") {
+ const out = typeof (m as any).content === "string" ? (m as any).content : JSON.stringify((m as any).content)
+ input.push({ type: "function_call_output", call_id: (m as any).tool_call_id, output: out })
+ continue
+ }
+ }
+
+ const stop_sequences = (() => {
+ const v = body.stop
+ if (!v) return undefined
+ if (Array.isArray(v)) return v
+ if (typeof v === "string") return [v]
+ return undefined
+ })()
+
+ const tcIn = body.tool_choice
+ const tool_choice = (() => {
+ if (!tcIn) return undefined
+ if (tcIn === "auto") return "auto"
+ if (tcIn === "required") return "required"
+ if ((tcIn as any).type === "function" && (tcIn as any).function?.name)
+ return { type: "function", function: { name: (tcIn as any).function.name } }
+ return undefined
+ })()
+
+ const tools = (() => {
+ if (!Array.isArray(body.tools)) return undefined
+ return body.tools.map((tool: any) => {
+ if (tool.type === "function") {
+ return {
+ type: "function",
+ name: tool.function?.name,
+ description: tool.function?.description,
+ parameters: tool.function?.parameters,
+ strict: tool.function?.strict,
+ }
+ }
+ return tool
+ })
+ })()
+
+ return {
+ model: body.model,
+ input,
+ max_output_tokens: body.max_tokens,
+ top_p: body.top_p,
+ stop_sequences,
+ stream: !!body.stream,
+ tools,
+ tool_choice,
+ include: Array.isArray((body as any).include) ? (body as any).include : undefined,
+ truncation: (body as any).truncation,
+ metadata: (body as any).metadata,
+ store: (body as any).store,
+ user: (body as any).user,
+ text: { verbosity: body.model === "gpt-5-codex" ? "medium" : "low" },
+ reasoning: { effort: "medium" },
+ }
+}
+
+export function fromOpenaiResponse(resp: any): CommonResponse {
+ if (!resp || typeof resp !== "object") return resp
+ if (Array.isArray((resp as any).choices)) return resp
+
+ const r = (resp as any).response ?? resp
+ if (!r || typeof r !== "object") return resp
+
+ const idIn = (r as any).id
+ const id =
+ typeof idIn === "string" ? idIn.replace(/^resp_/, "chatcmpl_") : `chatcmpl_${Math.random().toString(36).slice(2)}`
+ const model = (r as any).model ?? (resp as any).model
+
+ const out = Array.isArray((r as any).output) ? (r as any).output : []
+ const text = out
+ .filter((o: any) => o && o.type === "message" && Array.isArray((o as any).content))
+ .flatMap((o: any) => (o as any).content)
+ .filter((p: any) => p && p.type === "output_text" && typeof p.text === "string")
+ .map((p: any) => p.text)
+ .join("")
+
+ const tcs = out
+ .filter((o: any) => o && o.type === "function_call")
+ .map((o: any) => {
+ const name = (o as any).name
+ const a = (o as any).arguments
+ const args = typeof a === "string" ? a : JSON.stringify(a ?? {})
+ const tid =
+ typeof (o as any).id === "string" && (o as any).id.length > 0
+ ? (o as any).id
+ : `toolu_${Math.random().toString(36).slice(2)}`
+ return { id: tid, type: "function" as const, function: { name, arguments: args } }
+ })
+
+ const finish = (r: string | null) => {
+ if (r === "stop") return "stop"
+ if (r === "tool_call" || r === "tool_calls") return "tool_calls"
+ if (r === "length" || r === "max_output_tokens") return "length"
+ if (r === "content_filter") return "content_filter"
+ return null
+ }
+
+ const u = (r as any).usage ?? (resp as any).usage
+ const usage = (() => {
+ if (!u) return undefined as any
+ const pt = typeof (u as any).input_tokens === "number" ? (u as any).input_tokens : undefined
+ const ct = typeof (u as any).output_tokens === "number" ? (u as any).output_tokens : undefined
+ const total = pt != null && ct != null ? pt + ct : undefined
+ const cached = (u as any).input_tokens_details?.cached_tokens
+ const details = typeof cached === "number" ? { cached_tokens: cached } : undefined
+ return {
+ prompt_tokens: pt,
+ completion_tokens: ct,
+ total_tokens: total,
+ ...(details ? { prompt_tokens_details: details } : {}),
+ }
+ })()
+
+ return {
+ id,
+ object: "chat.completion",
+ created: Math.floor(Date.now() / 1000),
+ model,
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ ...(text && text.length > 0 ? { content: text } : {}),
+ ...(tcs.length > 0 ? { tool_calls: tcs } : {}),
+ },
+ finish_reason: finish((r as any).stop_reason ?? null),
+ },
+ ],
+ ...(usage ? { usage } : {}),
+ }
+}
+
+export function toOpenaiResponse(resp: CommonResponse) {
+ if (!resp || typeof resp !== "object") return resp
+ if (!Array.isArray((resp as any).choices)) return resp
+
+ const choice = (resp as any).choices[0]
+ if (!choice) return resp
+
+ const msg = choice.message
+ if (!msg) return resp
+
+ const outputItems: any[] = []
+
+ if (typeof msg.content === "string" && msg.content.length > 0) {
+ outputItems.push({
+ id: `msg_${Math.random().toString(36).slice(2)}`,
+ type: "message",
+ status: "completed",
+ role: "assistant",
+ content: [{ type: "output_text", text: msg.content, annotations: [], logprobs: [] }],
+ })
+ }
+
+ if (Array.isArray(msg.tool_calls)) {
+ for (const tc of msg.tool_calls) {
+ if ((tc as any).type === "function" && (tc as any).function) {
+ outputItems.push({
+ id: (tc as any).id,
+ type: "function_call",
+ name: (tc as any).function.name,
+ call_id: (tc as any).id,
+ arguments: (tc as any).function.arguments,
+ })
+ }
+ }
+ }
+
+ const stop_reason = (() => {
+ const r = choice.finish_reason
+ if (r === "stop") return "stop"
+ if (r === "tool_calls") return "tool_call"
+ if (r === "length") return "max_output_tokens"
+ if (r === "content_filter") return "content_filter"
+ return null
+ })()
+
+ const usage = (() => {
+ const u = (resp as any).usage
+ if (!u) return undefined
+ return {
+ input_tokens: u.prompt_tokens,
+ output_tokens: u.completion_tokens,
+ total_tokens: u.total_tokens,
+ ...(u.prompt_tokens_details?.cached_tokens
+ ? { input_tokens_details: { cached_tokens: u.prompt_tokens_details.cached_tokens } }
+ : {}),
+ }
+ })()
+
+ return {
+ id: (resp as any).id?.replace(/^chatcmpl_/, "resp_") ?? `resp_${Math.random().toString(36).slice(2)}`,
+ object: "response",
+ model: (resp as any).model,
+ output: outputItems,
+ stop_reason,
+ usage,
+ }
+}
+
+export function fromOpenaiChunk(chunk: string): CommonChunk | string {
+ const lines = chunk.split("\n")
+ const ev = lines[0]
+ const dl = lines[1]
+ if (!ev || !dl || !dl.startsWith("data: ")) return chunk
+
+ let json: any
+ try {
+ json = JSON.parse(dl.slice(6))
+ } catch {
+ return chunk
+ }
+
+ const respObj = json.response ?? {}
+
+ const out: CommonChunk = {
+ id: respObj.id ?? json.id ?? "",
+ object: "chat.completion.chunk",
+ created: Math.floor(Date.now() / 1000),
+ model: respObj.model ?? json.model ?? "",
+ choices: [],
+ }
+
+ const e = ev.replace("event: ", "").trim()
+
+ if (e === "response.output_text.delta") {
+ const d = (json as any).delta ?? (json as any).text ?? (json as any).output_text_delta
+ if (typeof d === "string" && d.length > 0)
+ out.choices.push({ index: 0, delta: { content: d }, finish_reason: null })
+ }
+
+ if (e === "response.output_item.added" && (json as any).item?.type === "function_call") {
+ const name = (json as any).item?.name
+ const id = (json as any).item?.id
+ if (typeof name === "string" && name.length > 0) {
+ out.choices.push({
+ index: 0,
+ delta: {
+ tool_calls: [{ index: 0, id, type: "function", function: { name, arguments: "" } }],
+ },
+ finish_reason: null,
+ })
+ }
+ }
+
+ if (e === "response.function_call_arguments.delta") {
+ const a = (json as any).delta ?? (json as any).arguments_delta
+ if (typeof a === "string" && a.length > 0) {
+ out.choices.push({
+ index: 0,
+ delta: { tool_calls: [{ index: 0, function: { arguments: a } }] },
+ finish_reason: null,
+ })
+ }
+ }
+
+ if (e === "response.completed") {
+ const fr = (() => {
+ const sr = (respObj as any).stop_reason ?? (json as any).stop_reason
+ if (sr === "stop") return "stop"
+ if (sr === "tool_call" || sr === "tool_calls") return "tool_calls"
+ if (sr === "length" || sr === "max_output_tokens") return "length"
+ if (sr === "content_filter") return "content_filter"
+ return null
+ })()
+ out.choices.push({ index: 0, delta: {}, finish_reason: fr })
+
+ const u = (respObj as any).usage ?? (json as any).response?.usage
+ if (u) {
+ out.usage = {
+ prompt_tokens: u.input_tokens,
+ completion_tokens: u.output_tokens,
+ total_tokens: (u.input_tokens || 0) + (u.output_tokens || 0),
+ ...(u.input_tokens_details?.cached_tokens
+ ? { prompt_tokens_details: { cached_tokens: u.input_tokens_details.cached_tokens } }
+ : {}),
+ }
+ }
+ }
+
+ return out
+}
+
+export function toOpenaiChunk(chunk: CommonChunk): string {
+ if (!chunk.choices || !Array.isArray(chunk.choices) || chunk.choices.length === 0) {
+ return ""
+ }
+
+ const choice = chunk.choices[0]
+ const d = choice.delta
+ if (!d) return ""
+
+ const id = chunk.id
+ const model = chunk.model
+
+ if (d.content) {
+ const data = {
+ id,
+ type: "response.output_text.delta",
+ delta: d.content,
+ response: { id, model },
+ }
+ return `event: response.output_text.delta\ndata: ${JSON.stringify(data)}`
+ }
+
+ if (d.tool_calls) {
+ for (const tc of d.tool_calls) {
+ if (tc.function?.name) {
+ const data = {
+ type: "response.output_item.added",
+ output_index: 0,
+ item: {
+ id: tc.id,
+ type: "function_call",
+ name: tc.function.name,
+ call_id: tc.id,
+ arguments: "",
+ },
+ }
+ return `event: response.output_item.added\ndata: ${JSON.stringify(data)}`
+ }
+ if (tc.function?.arguments) {
+ const data = {
+ type: "response.function_call_arguments.delta",
+ output_index: 0,
+ delta: tc.function.arguments,
+ }
+ return `event: response.function_call_arguments.delta\ndata: ${JSON.stringify(data)}`
+ }
+ }
+ }
+
+ if (choice.finish_reason) {
+ const u = chunk.usage
+ const usage = u
+ ? {
+ input_tokens: u.prompt_tokens,
+ output_tokens: u.completion_tokens,
+ total_tokens: u.total_tokens,
+ ...(u.prompt_tokens_details?.cached_tokens
+ ? { input_tokens_details: { cached_tokens: u.prompt_tokens_details.cached_tokens } }
+ : {}),
+ }
+ : undefined
+
+ const data: any = {
+ id,
+ type: "response.completed",
+ response: { id, model, ...(usage ? { usage } : {}) },
+ }
+ return `event: response.completed\ndata: ${JSON.stringify(data)}`
+ }
+
+ return ""
+}
diff --git a/packages/console/app/src/routes/zen/util/provider/provider.ts b/packages/console/app/src/routes/zen/util/provider/provider.ts
new file mode 100644
index 0000000..d9fe556
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/provider/provider.ts
@@ -0,0 +1,229 @@
+import { ZenData } from "@opencode-ai/console-core/model.js"
+import {
+ fromAnthropicChunk,
+ fromAnthropicRequest,
+ fromAnthropicResponse,
+ toAnthropicChunk,
+ toAnthropicRequest,
+ toAnthropicResponse,
+} from "./anthropic"
+import {
+ fromOpenaiChunk,
+ fromOpenaiRequest,
+ fromOpenaiResponse,
+ toOpenaiChunk,
+ toOpenaiRequest,
+ toOpenaiResponse,
+} from "./openai"
+import {
+ fromOaCompatibleChunk,
+ fromOaCompatibleRequest,
+ fromOaCompatibleResponse,
+ toOaCompatibleChunk,
+ toOaCompatibleRequest,
+ toOaCompatibleResponse,
+} from "./openai-compatible"
+
+export type UsageInfo = {
+ inputTokens: number
+ outputTokens: number
+ reasoningTokens?: number
+ cacheReadTokens?: number
+ cacheWrite5mTokens?: number
+ cacheWrite1hTokens?: number
+}
+
+export type ProviderHelper = (input: {
+ reqModel: string
+ providerModel: string
+ adjustCacheUsage?: boolean
+ workspaceID?: string
+}) => {
+ format: ZenData.Format
+ modifyUrl: (providerApi: string, isStream?: boolean) => string
+ modifyHeaders: (headers: Headers, apiKey: string, stickyId: string) => void
+ modifyBody: (body: Record) => Record
+ createBinaryStreamDecoder: () => ((chunk: Uint8Array) => Uint8Array | undefined) | undefined
+ streamSeparator: string
+ createUsageParser: () => {
+ parse: (chunk: string) => void
+ retrieve: () => any
+ }
+ extractUsage: (response: any) => any
+ normalizeUsage: (usage: any) => UsageInfo
+}
+
+export interface CommonMessage {
+ role: "system" | "user" | "assistant" | "tool"
+ content?: string | Array
+ tool_call_id?: string
+ tool_calls?: CommonToolCall[]
+}
+
+export interface CommonContentPart {
+ type: "text" | "image_url"
+ text?: string
+ image_url?: { url: string }
+}
+
+export interface CommonToolCall {
+ id: string
+ type: "function"
+ function: {
+ name: string
+ arguments: string
+ }
+}
+
+export interface CommonTool {
+ type: "function"
+ function: {
+ name: string
+ description?: string
+ parameters?: Record
+ }
+}
+
+export interface CommonUsage {
+ input_tokens?: number
+ output_tokens?: number
+ total_tokens?: number
+ prompt_tokens?: number
+ completion_tokens?: number
+ cache_read_input_tokens?: number
+ cache_creation?: {
+ ephemeral_5m_input_tokens?: number
+ ephemeral_1h_input_tokens?: number
+ }
+ input_tokens_details?: {
+ cached_tokens?: number
+ }
+ output_tokens_details?: {
+ reasoning_tokens?: number
+ }
+}
+
+export interface CommonRequest {
+ model: string
+ max_tokens?: number
+ temperature?: number
+ top_p?: number
+ stop?: string | string[]
+ messages: CommonMessage[]
+ stream?: boolean
+ tools?: CommonTool[]
+ tool_choice?: "auto" | "required" | { type: "function"; function: { name: string } }
+}
+
+export interface CommonResponse {
+ id: string
+ object: "chat.completion"
+ created: number
+ model: string
+ choices: Array<{
+ index: number
+ message: {
+ role: "assistant"
+ content?: string
+ tool_calls?: CommonToolCall[]
+ }
+ finish_reason: "stop" | "tool_calls" | "length" | "content_filter" | null
+ }>
+ usage?: {
+ prompt_tokens?: number
+ completion_tokens?: number
+ total_tokens?: number
+ prompt_tokens_details?: { cached_tokens?: number }
+ }
+}
+
+export interface CommonChunk {
+ id: string
+ object: "chat.completion.chunk"
+ created: number
+ model: string
+ choices: Array<{
+ index: number
+ delta: {
+ role?: "assistant"
+ content?: string
+ tool_calls?: Array<{
+ index: number
+ id?: string
+ type?: "function"
+ function?: {
+ name?: string
+ arguments?: string
+ }
+ }>
+ }
+ finish_reason: "stop" | "tool_calls" | "length" | "content_filter" | null
+ }>
+ usage?: {
+ prompt_tokens?: number
+ completion_tokens?: number
+ total_tokens?: number
+ prompt_tokens_details?: { cached_tokens?: number }
+ }
+}
+
+export function buildCostChunk(format: ZenData.Format, cost: string): string {
+ switch (format) {
+ case "anthropic":
+ return `event: ping\ndata: ${JSON.stringify({ type: "ping", cost })}\n\n`
+ case "openai":
+ return `event: ping\ndata: ${JSON.stringify({ type: "ping", cost })}\n\n`
+ case "oa-compat":
+ return `data: ${JSON.stringify({ choices: [], cost })}\n\n`
+ default:
+ return `data: ${JSON.stringify({ type: "ping", cost })}\n\n`
+ }
+}
+
+export function createBodyConverter(from: ZenData.Format, to: ZenData.Format) {
+ return (body: any): any => {
+ if (from === to) return body
+
+ let raw: CommonRequest
+ if (from === "anthropic") raw = fromAnthropicRequest(body)
+ else if (from === "openai") raw = fromOpenaiRequest(body)
+ else raw = fromOaCompatibleRequest(body)
+
+ if (to === "anthropic") return toAnthropicRequest(raw)
+ if (to === "openai") return toOpenaiRequest(raw)
+ if (to === "oa-compat") return toOaCompatibleRequest(raw)
+ }
+}
+
+export function createStreamPartConverter(from: ZenData.Format, to: ZenData.Format) {
+ return (part: any): any => {
+ if (from === to) return part
+
+ let raw: CommonChunk | string
+ if (from === "anthropic") raw = fromAnthropicChunk(part)
+ else if (from === "openai") raw = fromOpenaiChunk(part)
+ else raw = fromOaCompatibleChunk(part)
+
+ // If result is a string (error case), pass it through
+ if (typeof raw === "string") return raw
+
+ if (to === "anthropic") return toAnthropicChunk(raw)
+ if (to === "openai") return toOpenaiChunk(raw)
+ if (to === "oa-compat") return toOaCompatibleChunk(raw)
+ }
+}
+
+export function createResponseConverter(from: ZenData.Format, to: ZenData.Format) {
+ return (response: any): any => {
+ if (from === to) return response
+
+ let raw: CommonResponse
+ if (from === "anthropic") raw = fromAnthropicResponse(response)
+ else if (from === "openai") raw = fromOpenaiResponse(response)
+ else raw = fromOaCompatibleResponse(response)
+
+ if (to === "anthropic") return toAnthropicResponse(raw)
+ if (to === "openai") return toOpenaiResponse(raw)
+ if (to === "oa-compat") return toOaCompatibleResponse(raw)
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/redis.ts b/packages/console/app/src/routes/zen/util/redis.ts
new file mode 100644
index 0000000..5125232
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/redis.ts
@@ -0,0 +1,18 @@
+import { Resource } from "@opencode-ai/console-resource"
+import { Redis } from "@upstash/redis/cloudflare"
+
+let redis: Redis | undefined
+
+export function getRedis() {
+ if (redis) return redis
+ redis = new Redis({
+ url: Resource.UpstashRedisRestUrl.value,
+ token: Resource.UpstashRedisRestToken.value,
+ enableTelemetry: false,
+ })
+ return redis
+}
+
+export function buildRateLimitKey(kind: string, identifier: string, interval?: string) {
+ return `${Resource.App.stage}:ratelimit:${kind}:${identifier}${interval ? `:${interval}` : ""}`
+}
diff --git a/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts b/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts
new file mode 100644
index 0000000..67fe3ed
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts
@@ -0,0 +1,46 @@
+import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js"
+import { ModelStickyProviderTable } from "@opencode-ai/console-core/schema/ip.sql.js"
+
+export function createStickyTracker(
+ modelId: string,
+ stickyProvider: "strict" | "prefer" | undefined,
+ stickyId: string,
+) {
+ if (!stickyProvider) return
+ if (!stickyId) return
+ const id = `${modelId}/${stickyId}`
+ let _providerId: string | undefined
+
+ return {
+ get: async () => {
+ const data = await Database.use((tx) =>
+ tx
+ .select({
+ providerId: ModelStickyProviderTable.providerId,
+ })
+ .from(ModelStickyProviderTable)
+ .where(eq(ModelStickyProviderTable.id, id))
+ .limit(1),
+ )
+ _providerId = data[0]?.providerId
+ return _providerId
+ },
+ set: async (providerId: string) => {
+ if (_providerId === providerId) return
+
+ await Database.use((tx) =>
+ tx
+ .insert(ModelStickyProviderTable)
+ .values({
+ id,
+ providerId,
+ })
+ .onDuplicateKeyUpdate({
+ set: {
+ providerId,
+ },
+ }),
+ )
+ },
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/trialLimiter.ts b/packages/console/app/src/routes/zen/util/trialLimiter.ts
new file mode 100644
index 0000000..319825d
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/trialLimiter.ts
@@ -0,0 +1,46 @@
+import { Database, eq, sql } from "@opencode-ai/console-core/drizzle/index.js"
+import { IpTable } from "@opencode-ai/console-core/schema/ip.sql.js"
+import { UsageInfo } from "./provider/provider"
+import { Subscription } from "@opencode-ai/console-core/subscription.js"
+
+export function createTrialLimiter(trialProviders: string[] | undefined, ip: string) {
+ if (!trialProviders) return
+ if (!ip) return
+
+ const limit = Subscription.getFreeLimits().promoTokens
+
+ let _isTrial: boolean
+
+ return {
+ check: async () => {
+ const data = await Database.use((tx) =>
+ tx
+ .select({
+ usage: IpTable.usage,
+ })
+ .from(IpTable)
+ .where(eq(IpTable.ip, ip))
+ .then((rows) => rows[0]),
+ )
+
+ _isTrial = (data?.usage ?? 0) < limit
+ return _isTrial ? trialProviders : undefined
+ },
+ track: async (usageInfo: UsageInfo) => {
+ if (!_isTrial) return
+ const usage =
+ usageInfo.inputTokens +
+ usageInfo.outputTokens +
+ (usageInfo.reasoningTokens ?? 0) +
+ (usageInfo.cacheReadTokens ?? 0) +
+ (usageInfo.cacheWrite5mTokens ?? 0) +
+ (usageInfo.cacheWrite1hTokens ?? 0)
+ await Database.use((tx) =>
+ tx
+ .insert(IpTable)
+ .values({ ip, usage })
+ .onDuplicateKeyUpdate({ set: { usage: sql`${IpTable.usage} + ${usage}` } }),
+ )
+ },
+ }
+}
diff --git a/packages/console/app/src/routes/zen/util/usageBatcher.ts b/packages/console/app/src/routes/zen/util/usageBatcher.ts
new file mode 100644
index 0000000..315ce0a
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/usageBatcher.ts
@@ -0,0 +1,31 @@
+import { Resource } from "@opencode-ai/console-resource"
+import { getRedis } from "./redis"
+
+// Workspaces whose balance/usage updates should be batched in Redis to avoid
+// row-level lock contention on BillingTable / UserTable.
+export const HOT_WORKSPACES = new Set([
+ "wrk_01KJ8PX5CH50Y4YNGNS9ZR8YDC", // invoice
+])
+
+// Probability that a given request flushes the accumulated totals to the DB.
+// Lower = fewer DB writes, more staleness. ~1 in 100 -> ~1% of requests write.
+const FLUSH_PROBABILITY = 1 / 100
+
+export async function accumulateUsage(workspaceID: string, userID: string, workspaceCost: number, userCost: number) {
+ const redis = getRedis()
+ const wKey = `${Resource.App.stage}:usage:wrk:${workspaceID}`
+ const uKey = `${Resource.App.stage}:usage:usr:${workspaceID}:${userID}`
+
+ await Promise.all([redis.incrby(wKey, workspaceCost), redis.incrby(uKey, userCost)])
+
+ if (Math.random() > FLUSH_PROBABILITY) return null
+
+ // Atomically take the current totals and reset to 0
+ const [workspaceTotal, userTotal] = await Promise.all([redis.getdel(wKey), redis.getdel(uKey)])
+
+ const workspaceFlush = Number(workspaceTotal ?? 0)
+ const userFlush = Number(userTotal ?? 0)
+ if (workspaceFlush === 0 && userFlush === 0) return null
+
+ return { workspaceCost: workspaceFlush, userCost: userFlush }
+}
diff --git a/packages/console/app/src/routes/zen/util/variant.ts b/packages/console/app/src/routes/zen/util/variant.ts
new file mode 100644
index 0000000..6346439
--- /dev/null
+++ b/packages/console/app/src/routes/zen/util/variant.ts
@@ -0,0 +1,21 @@
+export function parseAnthropicVariant(body: any) {
+ const effort = body.effort ?? body.output_config?.effort ?? body.outputConfig?.effort ?? body.thinking?.effort
+ if (effort) return effort
+
+ const budget = body.thinking?.budget_tokens ?? body.thinking?.budgetTokens
+ if (body.thinking?.type !== "enabled" || typeof budget !== "number") return undefined
+ return budget > 16_000 ? "max" : "high"
+}
+
+export function parseGoogleVariant(body: any) {
+ const thinkingConfig = body.generationConfig?.thinkingConfig ?? body.thinkingConfig
+ if (thinkingConfig?.thinkingLevel) return thinkingConfig.thinkingLevel
+
+ const budget = thinkingConfig?.thinkingBudget ?? thinkingConfig?.thinking_budget
+ if (typeof budget !== "number" || budget <= 0) return undefined
+ return budget > 16_000 ? "max" : "high"
+}
+
+export function parseOpenAiVariant(body: any) {
+ return body.reasoningEffort ?? body.reasoning_effort ?? body.reasoning?.effort
+}
diff --git a/packages/console/app/src/routes/zen/v1/chat/completions.ts b/packages/console/app/src/routes/zen/v1/chat/completions.ts
new file mode 100644
index 0000000..745e0c2
--- /dev/null
+++ b/packages/console/app/src/routes/zen/v1/chat/completions.ts
@@ -0,0 +1,14 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+import { parseOpenAiVariant } from "~/routes/zen/util/variant"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "oa-compat",
+ modelList: "full",
+ parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
+ parseModel: (url: string, body: any) => body.model,
+ parseVariant: (url: string, body: any) => parseOpenAiVariant(body),
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/v1/messages.ts b/packages/console/app/src/routes/zen/v1/messages.ts
new file mode 100644
index 0000000..876a160
--- /dev/null
+++ b/packages/console/app/src/routes/zen/v1/messages.ts
@@ -0,0 +1,14 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+import { parseAnthropicVariant } from "~/routes/zen/util/variant"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "anthropic",
+ modelList: "full",
+ parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
+ parseModel: (url: string, body: any) => body.model,
+ parseVariant: (url: string, body: any) => parseAnthropicVariant(body),
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/v1/models.ts b/packages/console/app/src/routes/zen/v1/models.ts
new file mode 100644
index 0000000..68c3cac
--- /dev/null
+++ b/packages/console/app/src/routes/zen/v1/models.ts
@@ -0,0 +1,36 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { ZenData } from "@opencode-ai/console-core/model.js"
+import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js"
+import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js"
+import { buildOptionsResponse, buildModelsResponse } from "~/routes/zen/util/modelsHandler"
+
+export async function OPTIONS(_input: APIEvent) {
+ return buildOptionsResponse()
+}
+
+export async function GET(input: APIEvent) {
+ const disabledModels = await (() => {
+ const apiKey = input.request.headers.get("authorization")?.split(" ")[1]
+ if (!apiKey) return [] as string[]
+
+ return Database.use((tx) =>
+ tx
+ .select({
+ model: ModelTable.model,
+ })
+ .from(KeyTable)
+ .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, KeyTable.workspaceID))
+ .innerJoin(ModelTable, and(eq(ModelTable.workspaceID, KeyTable.workspaceID), isNull(ModelTable.timeDeleted)))
+ .where(and(eq(KeyTable.key, apiKey), isNull(KeyTable.timeDeleted)))
+ .then((rows) => rows.map((row) => row.model)),
+ )
+ })()
+
+ const models = Object.keys(ZenData.list("full").models)
+ .filter((id) => !id.endsWith(":global"))
+ .filter((id) => !disabledModels.includes(id))
+
+ return buildModelsResponse(models)
+}
diff --git a/packages/console/app/src/routes/zen/v1/models/[model].ts b/packages/console/app/src/routes/zen/v1/models/[model].ts
new file mode 100644
index 0000000..372f666
--- /dev/null
+++ b/packages/console/app/src/routes/zen/v1/models/[model].ts
@@ -0,0 +1,16 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+import { parseGoogleVariant } from "~/routes/zen/util/variant"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "google",
+ modelList: "full",
+ parseApiKey: (headers: Headers) => headers.get("x-goog-api-key") ?? undefined,
+ parseModel: (url: string, _body: any) => url.split("/").pop()?.split(":")?.[0] ?? "",
+ parseVariant: (url: string, body: any) => parseGoogleVariant(body),
+ parseIsStream: (url: string, _body: any) =>
+ // ie. url: https://opencode.ai/zen/v1/models/gemini-3-pro:streamGenerateContent?alt=sse'
+ url.split("/").pop()?.split(":")?.[1]?.startsWith("streamGenerateContent") ?? false,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/v1/responses.ts b/packages/console/app/src/routes/zen/v1/responses.ts
new file mode 100644
index 0000000..b827358
--- /dev/null
+++ b/packages/console/app/src/routes/zen/v1/responses.ts
@@ -0,0 +1,14 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+import { parseOpenAiVariant } from "~/routes/zen/util/variant"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "openai",
+ modelList: "full",
+ parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
+ parseModel: (url: string, body: any) => body.model,
+ parseVariant: (url: string, body: any) => parseOpenAiVariant(body),
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/style/base.css b/packages/console/app/src/style/base.css
new file mode 100644
index 0000000..1c3f1d5
--- /dev/null
+++ b/packages/console/app/src/style/base.css
@@ -0,0 +1,21 @@
+html {
+ line-height: 1;
+ background-color: var(--color-bg);
+ color: var(--color-text);
+}
+
+body {
+ font-family: var(--font-sans);
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
diff --git a/packages/console/app/src/style/component/button.css b/packages/console/app/src/style/component/button.css
new file mode 100644
index 0000000..d10f7af
--- /dev/null
+++ b/packages/console/app/src/style/component/button.css
@@ -0,0 +1,102 @@
+[data-component="button"] {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--space-2);
+ padding: var(--space-3) var(--space-4);
+ border: 1px solid transparent;
+ border-radius: var(--space-2);
+ font-family: var(--font-sans);
+ font-size: var(--font-size-md);
+ font-weight: 500;
+ line-height: 1.25;
+ cursor: pointer;
+ transition: all 0.2s ease-in-out;
+ text-decoration: none;
+ user-select: none;
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+
+ &:focus {
+ outline: none;
+ box-shadow: 0 0 0 2px var(--color-primary);
+ }
+
+ &[data-color="primary"] {
+ background-color: var(--color-primary);
+ color: var(--color-primary-text);
+ border-color: var(--color-primary);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-primary-hover);
+ border-color: var(--color-primary-hover);
+ }
+
+ &:active:not(:disabled) {
+ background-color: var(--color-primary-active);
+ border-color: var(--color-primary-active);
+ }
+ }
+
+ &[data-color="danger"] {
+ background-color: var(--color-danger);
+ color: var(--color-danger-text);
+ border-color: var(--color-danger);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-danger-hover);
+ border-color: var(--color-danger-hover);
+ }
+
+ &:active:not(:disabled) {
+ background-color: var(--color-danger-active);
+ border-color: var(--color-danger-active);
+ }
+
+ &:focus {
+ box-shadow: 0 0 0 2px var(--color-danger);
+ }
+ }
+
+ &[data-color="warning"] {
+ background-color: var(--color-warning);
+ color: var(--color-warning-text);
+ border-color: var(--color-warning);
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-warning-hover);
+ border-color: var(--color-warning-hover);
+ }
+
+ &:active:not(:disabled) {
+ background-color: var(--color-warning-active);
+ border-color: var(--color-warning-active);
+ }
+
+ &:focus {
+ box-shadow: 0 0 0 2px var(--color-warning);
+ }
+ }
+
+ &[data-size="small"] {
+ padding: var(--space-2) var(--space-3);
+ font-size: var(--font-size-sm);
+ gap: var(--space-1-5);
+ }
+
+ &[data-size="large"] {
+ padding: var(--space-4) var(--space-6);
+ font-size: var(--font-size-lg);
+ gap: var(--space-3);
+ }
+
+ [data-slot="icon"] {
+ display: flex;
+ align-items: center;
+ width: 1em;
+ height: 1em;
+ }
+}
diff --git a/packages/console/app/src/style/index.css b/packages/console/app/src/style/index.css
new file mode 100644
index 0000000..832a901
--- /dev/null
+++ b/packages/console/app/src/style/index.css
@@ -0,0 +1,8 @@
+@import "./token/color.css";
+@import "./token/font.css";
+@import "./token/space.css";
+
+@import "./component/button.css";
+
+@import "./reset.css";
+@import "./base.css";
diff --git a/packages/console/app/src/style/reset.css b/packages/console/app/src/style/reset.css
new file mode 100644
index 0000000..d331ed7
--- /dev/null
+++ b/packages/console/app/src/style/reset.css
@@ -0,0 +1,76 @@
+/* 1. Use a more-intuitive box-sizing model */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+/* 2. Remove default margin */
+* {
+ margin: 0;
+}
+
+/* 3. Enable keyword animations */
+@media (prefers-reduced-motion: no-preference) {
+ html {
+ interpolate-size: allow-keywords;
+ }
+}
+
+body {
+ /* 4. Add accessible line-height */
+ line-height: 1.5;
+ /* 5. Improve text rendering */
+ -webkit-font-smoothing: antialiased;
+}
+
+/* 6. Improve media defaults */
+img,
+picture,
+video,
+canvas,
+svg {
+ display: block;
+ max-width: 100%;
+}
+
+/* 7. Inherit fonts for form controls */
+input,
+button,
+textarea,
+select {
+ font: inherit;
+}
+
+/* 8. Avoid text overflows */
+p,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ overflow-wrap: break-word;
+}
+
+/* 9. Improve line wrapping */
+p {
+ text-wrap: pretty;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ text-wrap: balance;
+}
+
+/*
+ 10. Create a root stacking context
+*/
+#root,
+#__next {
+ isolation: isolate;
+}
diff --git a/packages/console/app/src/style/token/color.css b/packages/console/app/src/style/token/color.css
new file mode 100644
index 0000000..f1a097d
--- /dev/null
+++ b/packages/console/app/src/style/token/color.css
@@ -0,0 +1,91 @@
+:root {
+ --color-white: #ffffff;
+ --color-black: #000000;
+
+ /* Default light theme colors */
+ --color-bg: #ffffff;
+ --color-bg-surface: #f5f5f7;
+ --color-bg-elevated: #ffffff;
+
+ --color-text: #1d1d1f;
+ --color-text-secondary: #424245;
+ --color-text-muted: #6e6e73;
+ --color-text-disabled: #86868b;
+
+ --color-accent: #007aff;
+ --color-accent-hover: #0056b3;
+ --color-accent-active: #004085;
+
+ --color-success: #30d158;
+ --color-warning: #ff9f0a;
+ --color-danger: #ff3b30;
+
+ --color-border: #d2d2d7;
+ --color-border-muted: #e5e5ea;
+
+ /* Button colors */
+ --color-primary: var(--color-accent);
+ --color-primary-hover: var(--color-accent-hover);
+ --color-primary-active: var(--color-accent-active);
+ --color-primary-text: #ffffff;
+
+ --color-danger: #ff3b30;
+ --color-danger-hover: #d70015;
+ --color-danger-active: #a50011;
+ --color-danger-text: #ffffff;
+
+ --color-warning: #ff9f0a;
+ --color-warning-hover: #cc7f08;
+ --color-warning-active: #995f06;
+ --color-warning-text: #000000;
+
+ /* Surface colors */
+ --color-surface: var(--color-bg-surface);
+ --color-surface-hover: var(--color-bg-elevated);
+ --color-surface-border: var(--color-border);
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-bg: #0c0c0e;
+ --color-bg-surface: #161618;
+ --color-bg-elevated: #1c1c1f;
+
+ --color-text: #ffffff;
+ --color-text-secondary: #c7c7cc;
+ --color-text-muted: #a1a1a6;
+ --color-text-disabled: #68686f;
+
+ --color-accent: #007aff;
+ --color-accent-hover: #0056b3;
+ --color-accent-active: #004085;
+
+ --color-success: #30d158;
+ --color-warning: #ff9f0a;
+ --color-danger: #ff453a;
+
+ --color-border: #38383a;
+ --color-border-muted: #2c2c2e;
+
+ /* Button colors */
+ --color-primary: var(--color-accent);
+ --color-primary-hover: var(--color-accent-hover);
+ --color-primary-active: var(--color-accent-active);
+ --color-primary-text: #ffffff;
+
+ --color-danger: #ff453a;
+ --color-danger-hover: #d70015;
+ --color-danger-active: #a50011;
+ --color-danger-text: #ffffff;
+
+ --color-warning: #ff9f0a;
+ --color-warning-hover: #cc7f08;
+ --color-warning-active: #995f06;
+ --color-warning-text: #000000;
+
+ /* Surface colors */
+ --color-surface: var(--color-bg-surface);
+ --color-surface-hover: var(--color-bg-elevated);
+ --color-surface-border: var(--color-border);
+ }
+}
diff --git a/packages/console/app/src/style/token/font.css b/packages/console/app/src/style/token/font.css
new file mode 100644
index 0000000..844677b
--- /dev/null
+++ b/packages/console/app/src/style/token/font.css
@@ -0,0 +1,21 @@
+body {
+ --font-size-2xs: 0.6875rem;
+ --font-size-xs: 0.75rem;
+ --font-size-sm: 0.8125rem;
+ --font-size-md: 0.9375rem;
+ --font-size-lg: 1.125rem;
+ --font-size-xl: 1.25rem;
+ --font-size-2xl: 1.5rem;
+ --font-size-3xl: 1.875rem;
+ --font-size-4xl: 2.25rem;
+ --font-size-5xl: 3rem;
+ --font-size-6xl: 3.75rem;
+ --font-size-7xl: 4.5rem;
+ --font-size-8xl: 6rem;
+ --font-size-9xl: 8rem;
+
+ --font-mono:
+ "Berkeley Mono", "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
+ "Courier New", monospace;
+ --font-sans: var(--font-mono);
+}
diff --git a/packages/console/app/src/style/token/space.css b/packages/console/app/src/style/token/space.css
new file mode 100644
index 0000000..7e1a1b3
--- /dev/null
+++ b/packages/console/app/src/style/token/space.css
@@ -0,0 +1,46 @@
+body {
+ --space-0: 0;
+ --space-px: 1px;
+ --space-0-5: 0.125rem;
+ --space-0-75: 0.1875rem;
+ --space-1: 0.25rem;
+ --space-1-5: 0.375rem;
+ --space-2: 0.5rem;
+ --space-2-5: 0.625rem;
+ --space-3: 0.75rem;
+ --space-3-5: 0.875rem;
+ --space-4: 1rem;
+ --space-4-5: 1.125rem;
+ --space-5: 1.25rem;
+ --space-6: 1.5rem;
+ --space-7: 1.75rem;
+ --space-8: 2rem;
+ --space-9: 2.25rem;
+ --space-10: 2.5rem;
+ --space-11: 2.75rem;
+ --space-12: 3rem;
+ --space-14: 3.5rem;
+ --space-16: 4rem;
+ --space-17: 4.25rem;
+ --space-18: 4.5rem;
+ --space-19: 4.75rem;
+ --space-20: 5rem;
+ --space-24: 6rem;
+ --space-28: 7rem;
+ --space-32: 8rem;
+ --space-36: 9rem;
+ --space-40: 10rem;
+ --space-44: 11rem;
+ --space-48: 12rem;
+ --space-52: 13rem;
+ --space-56: 14rem;
+ --space-60: 15rem;
+ --space-64: 16rem;
+ --space-72: 18rem;
+ --space-80: 20rem;
+ --space-96: 24rem;
+
+ --border-radius-sm: 0.1875rem;
+ --border-radius-md: 0.3125rem;
+ --border-radius-lg: 0.5rem;
+}
diff --git a/packages/console/app/sst-env.d.ts b/packages/console/app/sst-env.d.ts
new file mode 100644
index 0000000..301538c
--- /dev/null
+++ b/packages/console/app/sst-env.d.ts
@@ -0,0 +1,10 @@
+/* This file is auto-generated by SST. Do not edit. */
+/* tslint:disable */
+/* eslint-disable */
+/* deno-fmt-ignore-file */
+/* biome-ignore-all lint: auto-generated */
+
+///
+
+import "sst"
+export {}
\ No newline at end of file
diff --git a/packages/console/app/test/providerUsage.test.ts b/packages/console/app/test/providerUsage.test.ts
new file mode 100644
index 0000000..d39c9fa
--- /dev/null
+++ b/packages/console/app/test/providerUsage.test.ts
@@ -0,0 +1,68 @@
+import { describe, expect, test } from "bun:test"
+import type { ZenData } from "@opencode-ai/console-core/model.js"
+import type { ProviderHelper } from "../src/routes/zen/util/provider/provider"
+import { anthropicHelper } from "../src/routes/zen/util/provider/anthropic"
+import { googleHelper } from "../src/routes/zen/util/provider/google"
+import { oaCompatHelper } from "../src/routes/zen/util/provider/openai-compatible"
+import { openaiHelper } from "../src/routes/zen/util/provider/openai"
+
+const providers = {
+ anthropic: anthropicHelper({ reqModel: "claude-haiku-4-5", providerModel: "claude-haiku-4-5" }),
+ google: googleHelper({ reqModel: "gemini-3-flash", providerModel: "gemini-3-flash" }),
+ openai: openaiHelper({ reqModel: "gpt-5", providerModel: "gpt-5" }),
+ "oa-compat": oaCompatHelper({ reqModel: "gpt-5-nano", providerModel: "gpt-5-nano" }),
+} satisfies Record>
+
+describe("provider usage extraction", () => {
+ test("extracts Google non-stream usage metadata", () => {
+ const usage = providers.google.extractUsage({
+ usageMetadata: {
+ promptTokenCount: 10,
+ candidatesTokenCount: 3,
+ thoughtsTokenCount: 2,
+ cachedContentTokenCount: 4,
+ },
+ })
+
+ expect(providers.google.normalizeUsage(usage)).toEqual({
+ inputTokens: 6,
+ outputTokens: 3,
+ reasoningTokens: 2,
+ cacheReadTokens: 4,
+ cacheWrite5mTokens: undefined,
+ cacheWrite1hTokens: undefined,
+ })
+ })
+
+ test("parses Google stream usage metadata", () => {
+ const usageParser = providers.google.createUsageParser()
+ usageParser.parse(
+ 'data: {"usageMetadata":{"promptTokenCount":10,"candidatesTokenCount":3,"thoughtsTokenCount":2,"cachedContentTokenCount":4}}',
+ )
+
+ expect(providers.google.normalizeUsage(usageParser.retrieve())).toEqual({
+ inputTokens: 6,
+ outputTokens: 3,
+ reasoningTokens: 2,
+ cacheReadTokens: 4,
+ cacheWrite5mTokens: undefined,
+ cacheWrite1hTokens: undefined,
+ })
+ })
+
+ test("extracts nested OpenAI Responses usage", () => {
+ expect(
+ providers.openai.extractUsage({
+ response: {
+ usage: {
+ input_tokens: 5,
+ output_tokens: 7,
+ },
+ },
+ }),
+ ).toEqual({
+ input_tokens: 5,
+ output_tokens: 7,
+ })
+ })
+})
diff --git a/packages/console/app/test/rateLimiter.test.ts b/packages/console/app/test/rateLimiter.test.ts
new file mode 100644
index 0000000..6c96226
--- /dev/null
+++ b/packages/console/app/test/rateLimiter.test.ts
@@ -0,0 +1,19 @@
+import { describe, expect, test } from "bun:test"
+import { getRetryAfterDay } from "../src/routes/zen/util/ipRateLimiter"
+
+describe("getRetryAfterDay", () => {
+ test("returns full day at midnight UTC", () => {
+ const midnight = Date.UTC(2026, 0, 15, 0, 0, 0, 0)
+ expect(getRetryAfterDay(midnight)).toBe(86_400)
+ })
+
+ test("returns remaining seconds until next UTC day", () => {
+ const noon = Date.UTC(2026, 0, 15, 12, 0, 0, 0)
+ expect(getRetryAfterDay(noon)).toBe(43_200)
+ })
+
+ test("rounds up to nearest second", () => {
+ const almost = Date.UTC(2026, 0, 15, 23, 59, 59, 500)
+ expect(getRetryAfterDay(almost)).toBe(1)
+ })
+})
diff --git a/packages/console/app/tsconfig.json b/packages/console/app/tsconfig.json
new file mode 100644
index 0000000..be7ee43
--- /dev/null
+++ b/packages/console/app/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "jsx": "preserve",
+ "jsxImportSource": "solid-js",
+ "allowJs": true,
+ "strict": true,
+ "noEmit": true,
+ "types": ["vite/client", "@webgpu/types", "bun"],
+ "isolatedModules": true,
+ "paths": {
+ "~/*": ["./src/*"]
+ }
+ }
+}
diff --git a/packages/console/app/vite.config.ts b/packages/console/app/vite.config.ts
new file mode 100644
index 0000000..33455ac
--- /dev/null
+++ b/packages/console/app/vite.config.ts
@@ -0,0 +1,28 @@
+import { defineConfig, PluginOption } from "vite"
+import { solidStart } from "@solidjs/start/config"
+import { nitro } from "nitro/vite"
+
+export default defineConfig({
+ plugins: [
+ solidStart({
+ middleware: "./src/middleware.ts",
+ }) as PluginOption,
+ nitro({
+ compatibilityDate: "2024-09-19",
+ preset: "cloudflare-module",
+ cloudflare: {
+ nodeCompat: true,
+ },
+ }),
+ ],
+ server: {
+ allowedHosts: true,
+ port: 3001,
+ },
+ build: {
+ rollupOptions: {
+ external: ["cloudflare:workers"],
+ },
+ minify: false,
+ },
+})
diff --git a/packages/console/core/.gitignore b/packages/console/core/.gitignore
new file mode 100644
index 0000000..67b7c8e
--- /dev/null
+++ b/packages/console/core/.gitignore
@@ -0,0 +1 @@
+script/scrap.ts
diff --git a/packages/console/core/drizzle.config.ts b/packages/console/core/drizzle.config.ts
new file mode 100644
index 0000000..0b7c441
--- /dev/null
+++ b/packages/console/core/drizzle.config.ts
@@ -0,0 +1,20 @@
+import { Resource } from "sst"
+import { defineConfig } from "drizzle-kit"
+
+export default defineConfig({
+ out: "./migrations/",
+ strict: true,
+ schema: ["./src/**/*.sql.ts"],
+ verbose: true,
+ dialect: "mysql",
+ dbCredentials: {
+ database: Resource.Database.database,
+ host: Resource.Database.host,
+ user: Resource.Database.username,
+ password: Resource.Database.password,
+ port: Resource.Database.port,
+ ssl: {
+ rejectUnauthorized: false,
+ },
+ },
+})
diff --git a/packages/console/core/migrations/20250902065410_fluffy_raza/migration.sql b/packages/console/core/migrations/20250902065410_fluffy_raza/migration.sql
new file mode 100644
index 0000000..8e81733
--- /dev/null
+++ b/packages/console/core/migrations/20250902065410_fluffy_raza/migration.sql
@@ -0,0 +1,89 @@
+CREATE TABLE `account` (
+ `id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `email` varchar(255) NOT NULL,
+ CONSTRAINT `email` UNIQUE(`email`)
+);
+--> statement-breakpoint
+CREATE TABLE `billing` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `customer_id` varchar(255),
+ `payment_method_id` varchar(255),
+ `payment_method_last4` varchar(4),
+ `balance` bigint NOT NULL,
+ `reload` boolean,
+ CONSTRAINT `billing_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`)
+);
+--> statement-breakpoint
+CREATE TABLE `payment` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `customer_id` varchar(255),
+ `payment_id` varchar(255),
+ `amount` bigint NOT NULL,
+ CONSTRAINT `payment_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`)
+);
+--> statement-breakpoint
+CREATE TABLE `usage` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `model` varchar(255) NOT NULL,
+ `input_tokens` int NOT NULL,
+ `output_tokens` int NOT NULL,
+ `reasoning_tokens` int,
+ `cache_read_tokens` int,
+ `cache_write_tokens` int,
+ `cost` bigint NOT NULL,
+ CONSTRAINT `usage_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`)
+);
+--> statement-breakpoint
+CREATE TABLE `key` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `user_id` text NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `key` varchar(255) NOT NULL,
+ `time_used` timestamp(3),
+ CONSTRAINT `key_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `global_key` UNIQUE(`key`)
+);
+--> statement-breakpoint
+CREATE TABLE `user` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `email` varchar(255) NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `time_seen` timestamp(3),
+ `color` int,
+ CONSTRAINT `user_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `user_email` UNIQUE(`workspace_id`,`email`)
+);
+--> statement-breakpoint
+CREATE TABLE `workspace` (
+ `id` varchar(30) NOT NULL,
+ `slug` varchar(255),
+ `name` varchar(255),
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ CONSTRAINT `workspace_id` PRIMARY KEY(`id`),
+ CONSTRAINT `slug` UNIQUE(`slug`)
+);
diff --git a/packages/console/core/migrations/20250902065410_fluffy_raza/snapshot.json b/packages/console/core/migrations/20250902065410_fluffy_raza/snapshot.json
new file mode 100644
index 0000000..6b26128
--- /dev/null
+++ b/packages/console/core/migrations/20250902065410_fluffy_raza/snapshot.json
@@ -0,0 +1,967 @@
+{
+ "version": "6",
+ "id": "aee779c5-db1d-4655-95ec-6451c18455be",
+ "prevIds": ["00000000-0000-0000-0000-000000000000"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250903035359_serious_whistler/migration.sql b/packages/console/core/migrations/20250903035359_serious_whistler/migration.sql
new file mode 100644
index 0000000..4a9a03d
--- /dev/null
+++ b/packages/console/core/migrations/20250903035359_serious_whistler/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `key` ADD `actor` json;--> statement-breakpoint
+ALTER TABLE `key` DROP COLUMN `user_id`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250903035359_serious_whistler/snapshot.json b/packages/console/core/migrations/20250903035359_serious_whistler/snapshot.json
new file mode 100644
index 0000000..8e0af76
--- /dev/null
+++ b/packages/console/core/migrations/20250903035359_serious_whistler/snapshot.json
@@ -0,0 +1,967 @@
+{
+ "version": "6",
+ "id": "79b7ee25-1c1c-41ff-9bbf-754af257102b",
+ "prevIds": ["aee779c5-db1d-4655-95ec-6451c18455be"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250911133331_violet_loners/migration.sql b/packages/console/core/migrations/20250911133331_violet_loners/migration.sql
new file mode 100644
index 0000000..1727335
--- /dev/null
+++ b/packages/console/core/migrations/20250911133331_violet_loners/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `key` ADD `old_name` varchar(255);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250911133331_violet_loners/snapshot.json b/packages/console/core/migrations/20250911133331_violet_loners/snapshot.json
new file mode 100644
index 0000000..27f5a5d
--- /dev/null
+++ b/packages/console/core/migrations/20250911133331_violet_loners/snapshot.json
@@ -0,0 +1,981 @@
+{
+ "version": "6",
+ "id": "9f51ef52-31ac-4ace-8b6d-39b35efe9c81",
+ "prevIds": ["79b7ee25-1c1c-41ff-9bbf-754af257102b"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250911141957_dusty_clint_barton/migration.sql b/packages/console/core/migrations/20250911141957_dusty_clint_barton/migration.sql
new file mode 100644
index 0000000..14efae2
--- /dev/null
+++ b/packages/console/core/migrations/20250911141957_dusty_clint_barton/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `key` ADD CONSTRAINT `name` UNIQUE(`workspace_id`,`name`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250911141957_dusty_clint_barton/snapshot.json b/packages/console/core/migrations/20250911141957_dusty_clint_barton/snapshot.json
new file mode 100644
index 0000000..da412fe
--- /dev/null
+++ b/packages/console/core/migrations/20250911141957_dusty_clint_barton/snapshot.json
@@ -0,0 +1,1001 @@
+{
+ "version": "6",
+ "id": "26cebd59-f553-441c-a2b2-2f9578a0ad2b",
+ "prevIds": ["9f51ef52-31ac-4ace-8b6d-39b35efe9c81"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250911214917_first_mockingbird/migration.sql b/packages/console/core/migrations/20250911214917_first_mockingbird/migration.sql
new file mode 100644
index 0000000..2a6b110
--- /dev/null
+++ b/packages/console/core/migrations/20250911214917_first_mockingbird/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `usage` ADD `provider` varchar(255);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250911214917_first_mockingbird/snapshot.json b/packages/console/core/migrations/20250911214917_first_mockingbird/snapshot.json
new file mode 100644
index 0000000..e0c84bb
--- /dev/null
+++ b/packages/console/core/migrations/20250911214917_first_mockingbird/snapshot.json
@@ -0,0 +1,1015 @@
+{
+ "version": "6",
+ "id": "06dc6226-bfbb-4ccc-b4bc-f26070c3bed5",
+ "prevIds": ["26cebd59-f553-441c-a2b2-2f9578a0ad2b"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250911231144_jazzy_skrulls/migration.sql b/packages/console/core/migrations/20250911231144_jazzy_skrulls/migration.sql
new file mode 100644
index 0000000..774c38d
--- /dev/null
+++ b/packages/console/core/migrations/20250911231144_jazzy_skrulls/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `usage` MODIFY COLUMN `provider` varchar(255) NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250911231144_jazzy_skrulls/snapshot.json b/packages/console/core/migrations/20250911231144_jazzy_skrulls/snapshot.json
new file mode 100644
index 0000000..57ef218
--- /dev/null
+++ b/packages/console/core/migrations/20250911231144_jazzy_skrulls/snapshot.json
@@ -0,0 +1,1015 @@
+{
+ "version": "6",
+ "id": "d13af80e-3c70-4866-8f14-48e7ff6ff0ff",
+ "prevIds": ["06dc6226-bfbb-4ccc-b4bc-f26070c3bed5"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250912021148_parallel_gauntlet/migration.sql b/packages/console/core/migrations/20250912021148_parallel_gauntlet/migration.sql
new file mode 100644
index 0000000..a1ff78e
--- /dev/null
+++ b/packages/console/core/migrations/20250912021148_parallel_gauntlet/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `usage` ADD `cache_write_5m_tokens` int;--> statement-breakpoint
+ALTER TABLE `usage` ADD `cache_write_1h_tokens` int;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250912021148_parallel_gauntlet/snapshot.json b/packages/console/core/migrations/20250912021148_parallel_gauntlet/snapshot.json
new file mode 100644
index 0000000..7547250
--- /dev/null
+++ b/packages/console/core/migrations/20250912021148_parallel_gauntlet/snapshot.json
@@ -0,0 +1,1043 @@
+{
+ "version": "6",
+ "id": "b0ad4b11-b607-46c7-8e2d-3b9823cdc5f7",
+ "prevIds": ["d13af80e-3c70-4866-8f14-48e7ff6ff0ff"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250912161749_familiar_nightshade/migration.sql b/packages/console/core/migrations/20250912161749_familiar_nightshade/migration.sql
new file mode 100644
index 0000000..89cf77f
--- /dev/null
+++ b/packages/console/core/migrations/20250912161749_familiar_nightshade/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `usage` DROP COLUMN `cache_write_tokens`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250912161749_familiar_nightshade/snapshot.json b/packages/console/core/migrations/20250912161749_familiar_nightshade/snapshot.json
new file mode 100644
index 0000000..5aa2505
--- /dev/null
+++ b/packages/console/core/migrations/20250912161749_familiar_nightshade/snapshot.json
@@ -0,0 +1,1029 @@
+{
+ "version": "6",
+ "id": "91067cc9-d492-47b3-932a-42dcc0920b3c",
+ "prevIds": ["b0ad4b11-b607-46c7-8e2d-3b9823cdc5f7"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250914213824_eminent_ultimatum/migration.sql b/packages/console/core/migrations/20250914213824_eminent_ultimatum/migration.sql
new file mode 100644
index 0000000..93e40a7
--- /dev/null
+++ b/packages/console/core/migrations/20250914213824_eminent_ultimatum/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `time_reload_locked_till` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250914213824_eminent_ultimatum/snapshot.json b/packages/console/core/migrations/20250914213824_eminent_ultimatum/snapshot.json
new file mode 100644
index 0000000..f7606b7
--- /dev/null
+++ b/packages/console/core/migrations/20250914213824_eminent_ultimatum/snapshot.json
@@ -0,0 +1,1043 @@
+{
+ "version": "6",
+ "id": "3e080fc0-9efd-411f-b764-ed3aa4abcee5",
+ "prevIds": ["91067cc9-d492-47b3-932a-42dcc0920b3c"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250914222302_redundant_piledriver/migration.sql b/packages/console/core/migrations/20250914222302_redundant_piledriver/migration.sql
new file mode 100644
index 0000000..4ba1b2d
--- /dev/null
+++ b/packages/console/core/migrations/20250914222302_redundant_piledriver/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `payment` ADD `error` varchar(255);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250914222302_redundant_piledriver/snapshot.json b/packages/console/core/migrations/20250914222302_redundant_piledriver/snapshot.json
new file mode 100644
index 0000000..9f4163f
--- /dev/null
+++ b/packages/console/core/migrations/20250914222302_redundant_piledriver/snapshot.json
@@ -0,0 +1,1057 @@
+{
+ "version": "6",
+ "id": "b0019e1e-d365-4f67-be3d-a2e69bdddc04",
+ "prevIds": ["3e080fc0-9efd-411f-b764-ed3aa4abcee5"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "error",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250914232505_needy_sue_storm/migration.sql b/packages/console/core/migrations/20250914232505_needy_sue_storm/migration.sql
new file mode 100644
index 0000000..ffd46c9
--- /dev/null
+++ b/packages/console/core/migrations/20250914232505_needy_sue_storm/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD CONSTRAINT `global_customer_id` UNIQUE(`customer_id`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250914232505_needy_sue_storm/snapshot.json b/packages/console/core/migrations/20250914232505_needy_sue_storm/snapshot.json
new file mode 100644
index 0000000..835c27e
--- /dev/null
+++ b/packages/console/core/migrations/20250914232505_needy_sue_storm/snapshot.json
@@ -0,0 +1,1073 @@
+{
+ "version": "6",
+ "id": "1f08bd5a-436d-4905-a585-87b156847402",
+ "prevIds": ["b0019e1e-d365-4f67-be3d-a2e69bdddc04"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "error",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250915150801_freezing_phil_sheldon/migration.sql b/packages/console/core/migrations/20250915150801_freezing_phil_sheldon/migration.sql
new file mode 100644
index 0000000..095f259
--- /dev/null
+++ b/packages/console/core/migrations/20250915150801_freezing_phil_sheldon/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `billing` ADD `last_error` varchar(255);--> statement-breakpoint
+ALTER TABLE `billing` ADD `time_last_error` timestamp(3);--> statement-breakpoint
+ALTER TABLE `payment` DROP COLUMN `error`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250915150801_freezing_phil_sheldon/snapshot.json b/packages/console/core/migrations/20250915150801_freezing_phil_sheldon/snapshot.json
new file mode 100644
index 0000000..e2f4817
--- /dev/null
+++ b/packages/console/core/migrations/20250915150801_freezing_phil_sheldon/snapshot.json
@@ -0,0 +1,1087 @@
+{
+ "version": "6",
+ "id": "cd9c94c4-9167-4346-b716-1bd0cff10ffc",
+ "prevIds": ["1f08bd5a-436d-4905-a585-87b156847402"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "last_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_last_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250915172014_bright_photon/migration.sql b/packages/console/core/migrations/20250915172014_bright_photon/migration.sql
new file mode 100644
index 0000000..8ad777b
--- /dev/null
+++ b/packages/console/core/migrations/20250915172014_bright_photon/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `billing` ADD `monthly_limit` int;--> statement-breakpoint
+ALTER TABLE `billing` ADD `monthly_usage` bigint;--> statement-breakpoint
+ALTER TABLE `billing` ADD `time_monthly_usage_updated` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250915172014_bright_photon/snapshot.json b/packages/console/core/migrations/20250915172014_bright_photon/snapshot.json
new file mode 100644
index 0000000..eae20d5
--- /dev/null
+++ b/packages/console/core/migrations/20250915172014_bright_photon/snapshot.json
@@ -0,0 +1,1129 @@
+{
+ "version": "6",
+ "id": "ba801b30-747a-433e-ab43-b407c961a24c",
+ "prevIds": ["cd9c94c4-9167-4346-b716-1bd0cff10ffc"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "last_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_last_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250915172258_absurd_hobgoblin/migration.sql b/packages/console/core/migrations/20250915172258_absurd_hobgoblin/migration.sql
new file mode 100644
index 0000000..8c331b1
--- /dev/null
+++ b/packages/console/core/migrations/20250915172258_absurd_hobgoblin/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `billing` RENAME COLUMN `last_error` TO `reload_error`;--> statement-breakpoint
+ALTER TABLE `billing` RENAME COLUMN `time_last_error` TO `time_reload_error`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250915172258_absurd_hobgoblin/snapshot.json b/packages/console/core/migrations/20250915172258_absurd_hobgoblin/snapshot.json
new file mode 100644
index 0000000..6c0a9b3
--- /dev/null
+++ b/packages/console/core/migrations/20250915172258_absurd_hobgoblin/snapshot.json
@@ -0,0 +1,1129 @@
+{
+ "version": "6",
+ "id": "28336c91-553c-4d1d-9875-1ee761e47582",
+ "prevIds": ["ba801b30-747a-433e-ab43-b407c961a24c"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250919135159_demonic_princess_powerful/migration.sql b/packages/console/core/migrations/20250919135159_demonic_princess_powerful/migration.sql
new file mode 100644
index 0000000..c2c228b
--- /dev/null
+++ b/packages/console/core/migrations/20250919135159_demonic_princess_powerful/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `workspace` ADD `data_share` boolean;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250919135159_demonic_princess_powerful/snapshot.json b/packages/console/core/migrations/20250919135159_demonic_princess_powerful/snapshot.json
new file mode 100644
index 0000000..c94526e
--- /dev/null
+++ b/packages/console/core/migrations/20250919135159_demonic_princess_powerful/snapshot.json
@@ -0,0 +1,1143 @@
+{
+ "version": "6",
+ "id": "12189a4e-5083-4b17-b8e3-8279c9a3e61a",
+ "prevIds": ["28336c91-553c-4d1d-9875-1ee761e47582"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "data_share",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250921042124_cloudy_revanche/migration.sql b/packages/console/core/migrations/20250921042124_cloudy_revanche/migration.sql
new file mode 100644
index 0000000..4a61a10
--- /dev/null
+++ b/packages/console/core/migrations/20250921042124_cloudy_revanche/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `workspace` DROP COLUMN `data_share`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250921042124_cloudy_revanche/snapshot.json b/packages/console/core/migrations/20250921042124_cloudy_revanche/snapshot.json
new file mode 100644
index 0000000..9de0344
--- /dev/null
+++ b/packages/console/core/migrations/20250921042124_cloudy_revanche/snapshot.json
@@ -0,0 +1,1129 @@
+{
+ "version": "6",
+ "id": "7f3989cb-3e8b-430e-a0f5-f87051d1d824",
+ "prevIds": ["12189a4e-5083-4b17-b8e3-8279c9a3e61a"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250923213126_cold_la_nuit/migration.sql b/packages/console/core/migrations/20250923213126_cold_la_nuit/migration.sql
new file mode 100644
index 0000000..860beb2
--- /dev/null
+++ b/packages/console/core/migrations/20250923213126_cold_la_nuit/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `payment` ADD `time_refunded` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250923213126_cold_la_nuit/snapshot.json b/packages/console/core/migrations/20250923213126_cold_la_nuit/snapshot.json
new file mode 100644
index 0000000..8f51319
--- /dev/null
+++ b/packages/console/core/migrations/20250923213126_cold_la_nuit/snapshot.json
@@ -0,0 +1,1143 @@
+{
+ "version": "6",
+ "id": "45b67fb4-77ce-4aa2-b883-1971429c69f5",
+ "prevIds": ["7f3989cb-3e8b-430e-a0f5-f87051d1d824"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250924230623_woozy_thaddeus_ross/migration.sql b/packages/console/core/migrations/20250924230623_woozy_thaddeus_ross/migration.sql
new file mode 100644
index 0000000..4aafaff
--- /dev/null
+++ b/packages/console/core/migrations/20250924230623_woozy_thaddeus_ross/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `payment` ADD `invoice_id` varchar(255);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250924230623_woozy_thaddeus_ross/snapshot.json b/packages/console/core/migrations/20250924230623_woozy_thaddeus_ross/snapshot.json
new file mode 100644
index 0000000..4a6758c
--- /dev/null
+++ b/packages/console/core/migrations/20250924230623_woozy_thaddeus_ross/snapshot.json
@@ -0,0 +1,1157 @@
+{
+ "version": "6",
+ "id": "100a21cf-ff9c-476f-bf7d-100c1824b2b2",
+ "prevIds": ["45b67fb4-77ce-4aa2-b883-1971429c69f5"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250928163425_nervous_iron_lad/migration.sql b/packages/console/core/migrations/20250928163425_nervous_iron_lad/migration.sql
new file mode 100644
index 0000000..d0a1318
--- /dev/null
+++ b/packages/console/core/migrations/20250928163425_nervous_iron_lad/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `user` ADD `time_joined` timestamp(3);--> statement-breakpoint
+ALTER TABLE `user` ADD `role` enum('admin','member');
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250928163425_nervous_iron_lad/snapshot.json b/packages/console/core/migrations/20250928163425_nervous_iron_lad/snapshot.json
new file mode 100644
index 0000000..a23bd3c
--- /dev/null
+++ b/packages/console/core/migrations/20250928163425_nervous_iron_lad/snapshot.json
@@ -0,0 +1,1185 @@
+{
+ "version": "6",
+ "id": "e9c91c2d-787d-4234-b98d-1620e4ce80e1",
+ "prevIds": ["100a21cf-ff9c-476f-bf7d-100c1824b2b2"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_joined",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250928235456_dazzling_cable/migration.sql b/packages/console/core/migrations/20250928235456_dazzling_cable/migration.sql
new file mode 100644
index 0000000..ab0a222
--- /dev/null
+++ b/packages/console/core/migrations/20250928235456_dazzling_cable/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `user` MODIFY COLUMN `role` enum('admin','member') NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250928235456_dazzling_cable/snapshot.json b/packages/console/core/migrations/20250928235456_dazzling_cable/snapshot.json
new file mode 100644
index 0000000..4f52f4b
--- /dev/null
+++ b/packages/console/core/migrations/20250928235456_dazzling_cable/snapshot.json
@@ -0,0 +1,1185 @@
+{
+ "version": "6",
+ "id": "a2bb7222-561c-45f0-8939-8ef9b8e57bb3",
+ "prevIds": ["e9c91c2d-787d-4234-b98d-1620e4ce80e1"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_joined",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250929181457_supreme_jack_power/migration.sql b/packages/console/core/migrations/20250929181457_supreme_jack_power/migration.sql
new file mode 100644
index 0000000..93e34e1
--- /dev/null
+++ b/packages/console/core/migrations/20250929181457_supreme_jack_power/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `user` DROP COLUMN `time_joined`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250929181457_supreme_jack_power/snapshot.json b/packages/console/core/migrations/20250929181457_supreme_jack_power/snapshot.json
new file mode 100644
index 0000000..6808c0f
--- /dev/null
+++ b/packages/console/core/migrations/20250929181457_supreme_jack_power/snapshot.json
@@ -0,0 +1,1171 @@
+{
+ "version": "6",
+ "id": "908437f9-54ed-4c83-b555-614926e326f8",
+ "prevIds": ["a2bb7222-561c-45f0-8939-8ef9b8e57bb3"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20250929224703_flawless_clea/migration.sql b/packages/console/core/migrations/20250929224703_flawless_clea/migration.sql
new file mode 100644
index 0000000..8c4489c
--- /dev/null
+++ b/packages/console/core/migrations/20250929224703_flawless_clea/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `user` MODIFY COLUMN `email` varchar(255);--> statement-breakpoint
+ALTER TABLE `user` ADD `old_email` varchar(255);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20250929224703_flawless_clea/snapshot.json b/packages/console/core/migrations/20250929224703_flawless_clea/snapshot.json
new file mode 100644
index 0000000..5c2ab1a
--- /dev/null
+++ b/packages/console/core/migrations/20250929224703_flawless_clea/snapshot.json
@@ -0,0 +1,1185 @@
+{
+ "version": "6",
+ "id": "14616ba2-c21e-4787-a289-f2a3eb6de04f",
+ "prevIds": ["908437f9-54ed-4c83-b555-614926e326f8"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251002175032_nice_dreadnoughts/migration.sql b/packages/console/core/migrations/20251002175032_nice_dreadnoughts/migration.sql
new file mode 100644
index 0000000..60c7f86
--- /dev/null
+++ b/packages/console/core/migrations/20251002175032_nice_dreadnoughts/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `user` ADD `account_id` varchar(30);--> statement-breakpoint
+ALTER TABLE `user` ADD `old_account_id` varchar(30);--> statement-breakpoint
+ALTER TABLE `user` ADD CONSTRAINT `user_account_id` UNIQUE(`workspace_id`,`account_id`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251002175032_nice_dreadnoughts/snapshot.json b/packages/console/core/migrations/20251002175032_nice_dreadnoughts/snapshot.json
new file mode 100644
index 0000000..12dd969
--- /dev/null
+++ b/packages/console/core/migrations/20251002175032_nice_dreadnoughts/snapshot.json
@@ -0,0 +1,1233 @@
+{
+ "version": "6",
+ "id": "2296e9e4-bee6-485b-a146-6666ac8dc0d0",
+ "prevIds": ["14616ba2-c21e-4787-a289-f2a3eb6de04f"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251002223020_optimal_paibok/migration.sql b/packages/console/core/migrations/20251002223020_optimal_paibok/migration.sql
new file mode 100644
index 0000000..93e7848
--- /dev/null
+++ b/packages/console/core/migrations/20251002223020_optimal_paibok/migration.sql
@@ -0,0 +1,2 @@
+CREATE INDEX `global_account_id` ON `user` (`account_id`);--> statement-breakpoint
+CREATE INDEX `global_email` ON `user` (`email`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251002223020_optimal_paibok/snapshot.json b/packages/console/core/migrations/20251002223020_optimal_paibok/snapshot.json
new file mode 100644
index 0000000..21f2b0e
--- /dev/null
+++ b/packages/console/core/migrations/20251002223020_optimal_paibok/snapshot.json
@@ -0,0 +1,1265 @@
+{
+ "version": "6",
+ "id": "6857f409-1b5d-4752-9d65-a82ee70e6ad2",
+ "prevIds": ["2296e9e4-bee6-485b-a146-6666ac8dc0d0"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251003202205_early_black_crow/migration.sql b/packages/console/core/migrations/20251003202205_early_black_crow/migration.sql
new file mode 100644
index 0000000..903c32b
--- /dev/null
+++ b/packages/console/core/migrations/20251003202205_early_black_crow/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `user` DROP COLUMN `old_account_id`;--> statement-breakpoint
+ALTER TABLE `user` DROP COLUMN `old_email`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251003202205_early_black_crow/snapshot.json b/packages/console/core/migrations/20251003202205_early_black_crow/snapshot.json
new file mode 100644
index 0000000..638be65
--- /dev/null
+++ b/packages/console/core/migrations/20251003202205_early_black_crow/snapshot.json
@@ -0,0 +1,1237 @@
+{
+ "version": "6",
+ "id": "6d546f3e-17b2-4195-bb10-7e6d91774bd7",
+ "prevIds": ["6857f409-1b5d-4752-9d65-a82ee70e6ad2"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251003210411_legal_joseph/migration.sql b/packages/console/core/migrations/20251003210411_legal_joseph/migration.sql
new file mode 100644
index 0000000..dcf4773
--- /dev/null
+++ b/packages/console/core/migrations/20251003210411_legal_joseph/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `key` ADD `user_id` varchar(30);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251003210411_legal_joseph/snapshot.json b/packages/console/core/migrations/20251003210411_legal_joseph/snapshot.json
new file mode 100644
index 0000000..6366356
--- /dev/null
+++ b/packages/console/core/migrations/20251003210411_legal_joseph/snapshot.json
@@ -0,0 +1,1251 @@
+{
+ "version": "6",
+ "id": "ce444765-0606-4880-970a-2176bc2a78ac",
+ "prevIds": ["6d546f3e-17b2-4195-bb10-7e6d91774bd7"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "name",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "name",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251004030300_numerous_prodigy/migration.sql b/packages/console/core/migrations/20251004030300_numerous_prodigy/migration.sql
new file mode 100644
index 0000000..d90e747
--- /dev/null
+++ b/packages/console/core/migrations/20251004030300_numerous_prodigy/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `key` DROP INDEX `name`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251004030300_numerous_prodigy/snapshot.json b/packages/console/core/migrations/20251004030300_numerous_prodigy/snapshot.json
new file mode 100644
index 0000000..1588e6b
--- /dev/null
+++ b/packages/console/core/migrations/20251004030300_numerous_prodigy/snapshot.json
@@ -0,0 +1,1231 @@
+{
+ "version": "6",
+ "id": "9e1313c7-ca78-4d2c-b13b-625d9d6fcaa3",
+ "prevIds": ["ce444765-0606-4880-970a-2176bc2a78ac"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "actor",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "old_name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251004045106_hot_wong/migration.sql b/packages/console/core/migrations/20251004045106_hot_wong/migration.sql
new file mode 100644
index 0000000..ff97d34
--- /dev/null
+++ b/packages/console/core/migrations/20251004045106_hot_wong/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `key` MODIFY COLUMN `user_id` varchar(30) NOT NULL;--> statement-breakpoint
+ALTER TABLE `key` DROP COLUMN `actor`;--> statement-breakpoint
+ALTER TABLE `key` DROP COLUMN `old_name`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251004045106_hot_wong/snapshot.json b/packages/console/core/migrations/20251004045106_hot_wong/snapshot.json
new file mode 100644
index 0000000..15467ef
--- /dev/null
+++ b/packages/console/core/migrations/20251004045106_hot_wong/snapshot.json
@@ -0,0 +1,1203 @@
+{
+ "version": "6",
+ "id": "05e873f6-1556-4bcb-8e19-14971e37610a",
+ "prevIds": ["9e1313c7-ca78-4d2c-b13b-625d9d6fcaa3"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251007024345_careful_cerise/migration.sql b/packages/console/core/migrations/20251007024345_careful_cerise/migration.sql
new file mode 100644
index 0000000..ba2bc02
--- /dev/null
+++ b/packages/console/core/migrations/20251007024345_careful_cerise/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `workspace` MODIFY COLUMN `name` varchar(255) NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251007024345_careful_cerise/snapshot.json b/packages/console/core/migrations/20251007024345_careful_cerise/snapshot.json
new file mode 100644
index 0000000..7dd21cf
--- /dev/null
+++ b/packages/console/core/migrations/20251007024345_careful_cerise/snapshot.json
@@ -0,0 +1,1203 @@
+{
+ "version": "6",
+ "id": "a331e38c-c2e3-406d-a1ff-b0af7229cd85",
+ "prevIds": ["05e873f6-1556-4bcb-8e19-14971e37610a"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251007043715_panoramic_harrier/migration.sql b/packages/console/core/migrations/20251007043715_panoramic_harrier/migration.sql
new file mode 100644
index 0000000..5a7bbc3
--- /dev/null
+++ b/packages/console/core/migrations/20251007043715_panoramic_harrier/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `user` ADD `monthly_limit` int;--> statement-breakpoint
+ALTER TABLE `user` ADD `monthly_usage` bigint;--> statement-breakpoint
+ALTER TABLE `user` ADD `time_monthly_usage_updated` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251007043715_panoramic_harrier/snapshot.json b/packages/console/core/migrations/20251007043715_panoramic_harrier/snapshot.json
new file mode 100644
index 0000000..610ce90
--- /dev/null
+++ b/packages/console/core/migrations/20251007043715_panoramic_harrier/snapshot.json
@@ -0,0 +1,1245 @@
+{
+ "version": "6",
+ "id": "33551b4c-fc2e-4753-8d9d-0971f333e65d",
+ "prevIds": ["a331e38c-c2e3-406d-a1ff-b0af7229cd85"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251007230438_ordinary_ultragirl/migration.sql b/packages/console/core/migrations/20251007230438_ordinary_ultragirl/migration.sql
new file mode 100644
index 0000000..4d1666a
--- /dev/null
+++ b/packages/console/core/migrations/20251007230438_ordinary_ultragirl/migration.sql
@@ -0,0 +1,10 @@
+CREATE TABLE `model` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `model` varchar(64) NOT NULL,
+ CONSTRAINT `model_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `model_workspace_model` UNIQUE(`workspace_id`,`model`)
+);
diff --git a/packages/console/core/migrations/20251007230438_ordinary_ultragirl/snapshot.json b/packages/console/core/migrations/20251007230438_ordinary_ultragirl/snapshot.json
new file mode 100644
index 0000000..77205c7
--- /dev/null
+++ b/packages/console/core/migrations/20251007230438_ordinary_ultragirl/snapshot.json
@@ -0,0 +1,1359 @@
+{
+ "version": "6",
+ "id": "eae45fcf-dc0f-4756-bc5d-30791f2965a2",
+ "prevIds": ["33551b4c-fc2e-4753-8d9d-0971f333e65d"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251008161718_outgoing_outlaw_kid/migration.sql b/packages/console/core/migrations/20251008161718_outgoing_outlaw_kid/migration.sql
new file mode 100644
index 0000000..c9f385e
--- /dev/null
+++ b/packages/console/core/migrations/20251008161718_outgoing_outlaw_kid/migration.sql
@@ -0,0 +1,11 @@
+CREATE TABLE `provider` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `provider` varchar(64) NOT NULL,
+ `credentials` text NOT NULL,
+ CONSTRAINT `provider_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `workspace_provider` UNIQUE(`workspace_id`,`provider`)
+);
diff --git a/packages/console/core/migrations/20251008161718_outgoing_outlaw_kid/snapshot.json b/packages/console/core/migrations/20251008161718_outgoing_outlaw_kid/snapshot.json
new file mode 100644
index 0000000..d91bd7d
--- /dev/null
+++ b/packages/console/core/migrations/20251008161718_outgoing_outlaw_kid/snapshot.json
@@ -0,0 +1,1487 @@
+{
+ "version": "6",
+ "id": "9dceb591-8e08-4991-a49c-1f1741ec1e57",
+ "prevIds": ["eae45fcf-dc0f-4756-bc5d-30791f2965a2"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251009021849_white_doctor_doom/migration.sql b/packages/console/core/migrations/20251009021849_white_doctor_doom/migration.sql
new file mode 100644
index 0000000..cc84163
--- /dev/null
+++ b/packages/console/core/migrations/20251009021849_white_doctor_doom/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `usage` ADD `key_id` varchar(30);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251009021849_white_doctor_doom/snapshot.json b/packages/console/core/migrations/20251009021849_white_doctor_doom/snapshot.json
new file mode 100644
index 0000000..6fe9fd5
--- /dev/null
+++ b/packages/console/core/migrations/20251009021849_white_doctor_doom/snapshot.json
@@ -0,0 +1,1501 @@
+{
+ "version": "6",
+ "id": "b2406421-f22d-4153-a2a4-6deafe70ee54",
+ "prevIds": ["9dceb591-8e08-4991-a49c-1f1741ec1e57"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251016175624_cynical_jack_flag/migration.sql b/packages/console/core/migrations/20251016175624_cynical_jack_flag/migration.sql
new file mode 100644
index 0000000..5e9adfc
--- /dev/null
+++ b/packages/console/core/migrations/20251016175624_cynical_jack_flag/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `payment_method_type` varchar(32);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251016175624_cynical_jack_flag/snapshot.json b/packages/console/core/migrations/20251016175624_cynical_jack_flag/snapshot.json
new file mode 100644
index 0000000..3ea2624
--- /dev/null
+++ b/packages/console/core/migrations/20251016175624_cynical_jack_flag/snapshot.json
@@ -0,0 +1,1515 @@
+{
+ "version": "6",
+ "id": "91ef8fda-ca96-4a3f-af29-dd6ae7136398",
+ "prevIds": ["b2406421-f22d-4153-a2a4-6deafe70ee54"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251016214520_short_bulldozer/migration.sql b/packages/console/core/migrations/20251016214520_short_bulldozer/migration.sql
new file mode 100644
index 0000000..70f52c9
--- /dev/null
+++ b/packages/console/core/migrations/20251016214520_short_bulldozer/migration.sql
@@ -0,0 +1,10 @@
+CREATE TABLE `auth` (
+ `id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `provider` enum('email','github','google') NOT NULL,
+ `subject` varchar(255) NOT NULL,
+ `account_id` varchar(30) NOT NULL,
+ CONSTRAINT `provider` UNIQUE(`provider`,`subject`)
+);
diff --git a/packages/console/core/migrations/20251016214520_short_bulldozer/snapshot.json b/packages/console/core/migrations/20251016214520_short_bulldozer/snapshot.json
new file mode 100644
index 0000000..c22274d
--- /dev/null
+++ b/packages/console/core/migrations/20251016214520_short_bulldozer/snapshot.json
@@ -0,0 +1,1637 @@
+{
+ "version": "6",
+ "id": "34706440-26d7-43f5-9b39-815aa912e5ef",
+ "prevIds": ["91ef8fda-ca96-4a3f-af29-dd6ae7136398"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "email",
+ "table": "account",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251017015733_narrow_blindfold/migration.sql b/packages/console/core/migrations/20251017015733_narrow_blindfold/migration.sql
new file mode 100644
index 0000000..c62f01f
--- /dev/null
+++ b/packages/console/core/migrations/20251017015733_narrow_blindfold/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `account` DROP INDEX `email`;--> statement-breakpoint
+CREATE INDEX `account_id` ON `auth` (`account_id`);--> statement-breakpoint
+ALTER TABLE `account` DROP COLUMN `email`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251017015733_narrow_blindfold/snapshot.json b/packages/console/core/migrations/20251017015733_narrow_blindfold/snapshot.json
new file mode 100644
index 0000000..0266131
--- /dev/null
+++ b/packages/console/core/migrations/20251017015733_narrow_blindfold/snapshot.json
@@ -0,0 +1,1623 @@
+{
+ "version": "6",
+ "id": "10169105-4545-4894-838b-004c0a42c584",
+ "prevIds": ["34706440-26d7-43f5-9b39-815aa912e5ef"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251017024232_slimy_energizer/migration.sql b/packages/console/core/migrations/20251017024232_slimy_energizer/migration.sql
new file mode 100644
index 0000000..a1662ce
--- /dev/null
+++ b/packages/console/core/migrations/20251017024232_slimy_energizer/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `account` ADD PRIMARY KEY(`id`);--> statement-breakpoint
+ALTER TABLE `auth` ADD PRIMARY KEY(`id`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251017024232_slimy_energizer/snapshot.json b/packages/console/core/migrations/20251017024232_slimy_energizer/snapshot.json
new file mode 100644
index 0000000..106aa33
--- /dev/null
+++ b/packages/console/core/migrations/20251017024232_slimy_energizer/snapshot.json
@@ -0,0 +1,1635 @@
+{
+ "version": "6",
+ "id": "5470c8b4-296d-47bd-85a7-88cfd3b71434",
+ "prevIds": ["10169105-4545-4894-838b-004c0a42c584"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251031163113_messy_jackal/migration.sql b/packages/console/core/migrations/20251031163113_messy_jackal/migration.sql
new file mode 100644
index 0000000..28aa690
--- /dev/null
+++ b/packages/console/core/migrations/20251031163113_messy_jackal/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `billing` ADD `reload_trigger` int;--> statement-breakpoint
+ALTER TABLE `billing` ADD `reload_amount` int;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251031163113_messy_jackal/snapshot.json b/packages/console/core/migrations/20251031163113_messy_jackal/snapshot.json
new file mode 100644
index 0000000..27f0338
--- /dev/null
+++ b/packages/console/core/migrations/20251031163113_messy_jackal/snapshot.json
@@ -0,0 +1,1663 @@
+{
+ "version": "6",
+ "id": "8b7fa839-a088-408e-84a4-1a07325c0290",
+ "prevIds": ["5470c8b4-296d-47bd-85a7-88cfd3b71434"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251125223403_famous_magik/migration.sql b/packages/console/core/migrations/20251125223403_famous_magik/migration.sql
new file mode 100644
index 0000000..ad195f5
--- /dev/null
+++ b/packages/console/core/migrations/20251125223403_famous_magik/migration.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `ip` (
+ `ip` varchar(45) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `usage` int,
+ CONSTRAINT `ip_ip_pk` PRIMARY KEY(`ip`)
+);
diff --git a/packages/console/core/migrations/20251125223403_famous_magik/snapshot.json b/packages/console/core/migrations/20251125223403_famous_magik/snapshot.json
new file mode 100644
index 0000000..5250b41
--- /dev/null
+++ b/packages/console/core/migrations/20251125223403_famous_magik/snapshot.json
@@ -0,0 +1,1743 @@
+{
+ "version": "6",
+ "id": "9d5d9885-7ec5-45f6-ac53-45a8e25dede7",
+ "prevIds": ["8b7fa839-a088-408e-84a4-1a07325c0290"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20251228182259_striped_forge/migration.sql b/packages/console/core/migrations/20251228182259_striped_forge/migration.sql
new file mode 100644
index 0000000..ad82319
--- /dev/null
+++ b/packages/console/core/migrations/20251228182259_striped_forge/migration.sql
@@ -0,0 +1,12 @@
+CREATE TABLE `benchmark` (
+ `id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `model` varchar(64) NOT NULL,
+ `agent` varchar(64) NOT NULL,
+ `result` mediumtext NOT NULL,
+ CONSTRAINT `benchmark_id_pk` PRIMARY KEY(`id`)
+);
+--> statement-breakpoint
+CREATE INDEX `time_created` ON `benchmark` (`time_created`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20251228182259_striped_forge/snapshot.json b/packages/console/core/migrations/20251228182259_striped_forge/snapshot.json
new file mode 100644
index 0000000..0a540a4
--- /dev/null
+++ b/packages/console/core/migrations/20251228182259_striped_forge/snapshot.json
@@ -0,0 +1,1867 @@
+{
+ "version": "6",
+ "id": "49a1ac05-78ab-4aae-908e-d4aeeb8196fc",
+ "prevIds": ["9d5d9885-7ec5-45f6-ac53-45a8e25dede7"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260105034337_broken_gamora/migration.sql b/packages/console/core/migrations/20260105034337_broken_gamora/migration.sql
new file mode 100644
index 0000000..f6008f7
--- /dev/null
+++ b/packages/console/core/migrations/20260105034337_broken_gamora/migration.sql
@@ -0,0 +1 @@
+CREATE INDEX `usage_time_created` ON `usage` (`workspace_id`,`time_created`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260105034337_broken_gamora/snapshot.json b/packages/console/core/migrations/20260105034337_broken_gamora/snapshot.json
new file mode 100644
index 0000000..04e0885
--- /dev/null
+++ b/packages/console/core/migrations/20260105034337_broken_gamora/snapshot.json
@@ -0,0 +1,1887 @@
+{
+ "version": "6",
+ "id": "bf19cd74-71f9-4bdf-b50e-67c2436f3408",
+ "prevIds": ["49a1ac05-78ab-4aae-908e-d4aeeb8196fc"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260106204919_odd_misty_knight/migration.sql b/packages/console/core/migrations/20260106204919_odd_misty_knight/migration.sql
new file mode 100644
index 0000000..5b98137
--- /dev/null
+++ b/packages/console/core/migrations/20260106204919_odd_misty_knight/migration.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `ip_rate_limit` (
+ `ip` varchar(45) NOT NULL,
+ `interval` varchar(10) NOT NULL,
+ `count` int NOT NULL,
+ CONSTRAINT `ip_rate_limit_ip_interval_pk` PRIMARY KEY(`ip`,`interval`)
+);
diff --git a/packages/console/core/migrations/20260106204919_odd_misty_knight/snapshot.json b/packages/console/core/migrations/20260106204919_odd_misty_knight/snapshot.json
new file mode 100644
index 0000000..17a9730
--- /dev/null
+++ b/packages/console/core/migrations/20260106204919_odd_misty_knight/snapshot.json
@@ -0,0 +1,1939 @@
+{
+ "version": "6",
+ "id": "9cf10c24-6029-4cb4-866e-ff9b501eaf7e",
+ "prevIds": ["bf19cd74-71f9-4bdf-b50e-67c2436f3408"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260107000117_flat_nightmare/migration.sql b/packages/console/core/migrations/20260107000117_flat_nightmare/migration.sql
new file mode 100644
index 0000000..666988e
--- /dev/null
+++ b/packages/console/core/migrations/20260107000117_flat_nightmare/migration.sql
@@ -0,0 +1,7 @@
+ALTER TABLE `billing` ADD `subscription_id` varchar(28);--> statement-breakpoint
+ALTER TABLE `usage` ADD `data` json;--> statement-breakpoint
+ALTER TABLE `user` ADD `time_subscribed` timestamp(3);--> statement-breakpoint
+ALTER TABLE `user` ADD `sub_recent_usage` bigint;--> statement-breakpoint
+ALTER TABLE `user` ADD `sub_monthly_usage` bigint;--> statement-breakpoint
+ALTER TABLE `user` ADD `sub_time_recent_usage_updated` timestamp(3);--> statement-breakpoint
+ALTER TABLE `user` ADD `sub_time_monthly_usage_updated` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260107000117_flat_nightmare/snapshot.json b/packages/console/core/migrations/20260107000117_flat_nightmare/snapshot.json
new file mode 100644
index 0000000..179c712
--- /dev/null
+++ b/packages/console/core/migrations/20260107000117_flat_nightmare/snapshot.json
@@ -0,0 +1,2037 @@
+{
+ "version": "6",
+ "id": "4775571c-ad9c-4104-a202-2374b1963cfe",
+ "prevIds": ["9cf10c24-6029-4cb4-866e-ff9b501eaf7e"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "data",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscribed",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_recent_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_recent_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260107022356_lame_calypso/migration.sql b/packages/console/core/migrations/20260107022356_lame_calypso/migration.sql
new file mode 100644
index 0000000..9a2facb
--- /dev/null
+++ b/packages/console/core/migrations/20260107022356_lame_calypso/migration.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `user` RENAME COLUMN `sub_recent_usage` TO `sub_interval_usage`;--> statement-breakpoint
+ALTER TABLE `user` RENAME COLUMN `sub_time_recent_usage_updated` TO `sub_time_interval_usage_updated`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260107022356_lame_calypso/snapshot.json b/packages/console/core/migrations/20260107022356_lame_calypso/snapshot.json
new file mode 100644
index 0000000..27b00b6
--- /dev/null
+++ b/packages/console/core/migrations/20260107022356_lame_calypso/snapshot.json
@@ -0,0 +1,2037 @@
+{
+ "version": "6",
+ "id": "3ff862f3-eeb6-4b10-8c78-254de3778ab3",
+ "prevIds": ["4775571c-ad9c-4104-a202-2374b1963cfe"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "data",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscribed",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_interval_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_interval_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260107041522_tiny_captain_midlands/migration.sql b/packages/console/core/migrations/20260107041522_tiny_captain_midlands/migration.sql
new file mode 100644
index 0000000..07163dd
--- /dev/null
+++ b/packages/console/core/migrations/20260107041522_tiny_captain_midlands/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `usage` RENAME COLUMN `data` TO `enrichment`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260107041522_tiny_captain_midlands/snapshot.json b/packages/console/core/migrations/20260107041522_tiny_captain_midlands/snapshot.json
new file mode 100644
index 0000000..088f956
--- /dev/null
+++ b/packages/console/core/migrations/20260107041522_tiny_captain_midlands/snapshot.json
@@ -0,0 +1,2037 @@
+{
+ "version": "6",
+ "id": "70394850-2c28-4012-a3d5-69357e3348b6",
+ "prevIds": ["3ff862f3-eeb6-4b10-8c78-254de3778ab3"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscribed",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_interval_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_interval_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260107055817_cuddly_diamondback/migration.sql b/packages/console/core/migrations/20260107055817_cuddly_diamondback/migration.sql
new file mode 100644
index 0000000..476e6bf
--- /dev/null
+++ b/packages/console/core/migrations/20260107055817_cuddly_diamondback/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD CONSTRAINT `global_subscription_id` UNIQUE(`subscription_id`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260107055817_cuddly_diamondback/snapshot.json b/packages/console/core/migrations/20260107055817_cuddly_diamondback/snapshot.json
new file mode 100644
index 0000000..03fe576
--- /dev/null
+++ b/packages/console/core/migrations/20260107055817_cuddly_diamondback/snapshot.json
@@ -0,0 +1,2053 @@
+{
+ "version": "6",
+ "id": "27c1a3eb-b125-46d4-b436-abe5764fe4b7",
+ "prevIds": ["70394850-2c28-4012-a3d5-69357e3348b6"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscribed",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_interval_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_interval_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260108224422_charming_black_bolt/migration.sql b/packages/console/core/migrations/20260108224422_charming_black_bolt/migration.sql
new file mode 100644
index 0000000..607300d
--- /dev/null
+++ b/packages/console/core/migrations/20260108224422_charming_black_bolt/migration.sql
@@ -0,0 +1,13 @@
+CREATE TABLE `subscription` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `user_id` varchar(30) NOT NULL,
+ `rolling_usage` bigint,
+ `fixed_usage` bigint,
+ `time_rolling_updated` timestamp(3),
+ `time_fixed_updated` timestamp(3),
+ CONSTRAINT `subscription_workspace_id_id_pk` PRIMARY KEY(`workspace_id`,`id`)
+);
diff --git a/packages/console/core/migrations/20260108224422_charming_black_bolt/snapshot.json b/packages/console/core/migrations/20260108224422_charming_black_bolt/snapshot.json
new file mode 100644
index 0000000..90142e7
--- /dev/null
+++ b/packages/console/core/migrations/20260108224422_charming_black_bolt/snapshot.json
@@ -0,0 +1,2203 @@
+{
+ "version": "6",
+ "id": "f3725f6d-5f33-4497-b4ba-cf05c46fb873",
+ "prevIds": ["27c1a3eb-b125-46d4-b436-abe5764fe4b7"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscribed",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_interval_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_interval_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "sub_time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260109000245_huge_omega_red/migration.sql b/packages/console/core/migrations/20260109000245_huge_omega_red/migration.sql
new file mode 100644
index 0000000..d5086f0
--- /dev/null
+++ b/packages/console/core/migrations/20260109000245_huge_omega_red/migration.sql
@@ -0,0 +1,6 @@
+CREATE INDEX `workspace_user_id` ON `subscription` (`workspace_id`,`user_id`);--> statement-breakpoint
+ALTER TABLE `user` DROP COLUMN `time_subscribed`;--> statement-breakpoint
+ALTER TABLE `user` DROP COLUMN `sub_interval_usage`;--> statement-breakpoint
+ALTER TABLE `user` DROP COLUMN `sub_monthly_usage`;--> statement-breakpoint
+ALTER TABLE `user` DROP COLUMN `sub_time_interval_usage_updated`;--> statement-breakpoint
+ALTER TABLE `user` DROP COLUMN `sub_time_monthly_usage_updated`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260109000245_huge_omega_red/snapshot.json b/packages/console/core/migrations/20260109000245_huge_omega_red/snapshot.json
new file mode 100644
index 0000000..dad3cdb
--- /dev/null
+++ b/packages/console/core/migrations/20260109000245_huge_omega_red/snapshot.json
@@ -0,0 +1,2153 @@
+{
+ "version": "6",
+ "id": "fec4cb15-6f13-465d-a902-b76b026872f4",
+ "prevIds": ["f3725f6d-5f33-4497-b4ba-cf05c46fb873"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260109001625_mean_frank_castle/migration.sql b/packages/console/core/migrations/20260109001625_mean_frank_castle/migration.sql
new file mode 100644
index 0000000..c2cf5ee
--- /dev/null
+++ b/packages/console/core/migrations/20260109001625_mean_frank_castle/migration.sql
@@ -0,0 +1,2 @@
+DROP INDEX `workspace_user_id` ON `subscription`;--> statement-breakpoint
+ALTER TABLE `subscription` ADD CONSTRAINT `workspace_user_id` UNIQUE(`workspace_id`,`user_id`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260109001625_mean_frank_castle/snapshot.json b/packages/console/core/migrations/20260109001625_mean_frank_castle/snapshot.json
new file mode 100644
index 0000000..9a43cd2
--- /dev/null
+++ b/packages/console/core/migrations/20260109001625_mean_frank_castle/snapshot.json
@@ -0,0 +1,2153 @@
+{
+ "version": "6",
+ "id": "bb90bb3e-fd08-439a-b92f-5f433807480e",
+ "prevIds": ["fec4cb15-6f13-465d-a902-b76b026872f4"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260109014234_noisy_domino/migration.sql b/packages/console/core/migrations/20260109014234_noisy_domino/migration.sql
new file mode 100644
index 0000000..654a5a8
--- /dev/null
+++ b/packages/console/core/migrations/20260109014234_noisy_domino/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `subscription_coupon_id` varchar(28);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260109014234_noisy_domino/snapshot.json b/packages/console/core/migrations/20260109014234_noisy_domino/snapshot.json
new file mode 100644
index 0000000..0e6084f
--- /dev/null
+++ b/packages/console/core/migrations/20260109014234_noisy_domino/snapshot.json
@@ -0,0 +1,2167 @@
+{
+ "version": "6",
+ "id": "2fd0308b-0653-437d-aea3-29428a4de9f1",
+ "prevIds": ["bb90bb3e-fd08-439a-b92f-5f433807480e"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_coupon_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260109040130_bumpy_mephistopheles/migration.sql b/packages/console/core/migrations/20260109040130_bumpy_mephistopheles/migration.sql
new file mode 100644
index 0000000..2c3d554
--- /dev/null
+++ b/packages/console/core/migrations/20260109040130_bumpy_mephistopheles/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `payment` ADD `enrichment` json;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260109040130_bumpy_mephistopheles/snapshot.json b/packages/console/core/migrations/20260109040130_bumpy_mephistopheles/snapshot.json
new file mode 100644
index 0000000..ebff34d
--- /dev/null
+++ b/packages/console/core/migrations/20260109040130_bumpy_mephistopheles/snapshot.json
@@ -0,0 +1,2181 @@
+{
+ "version": "6",
+ "id": "a0d18802-c390-47d4-98f1-d1f83869cf0c",
+ "prevIds": ["2fd0308b-0653-437d-aea3-29428a4de9f1"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_coupon_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260113215232_jazzy_green_goblin/migration.sql b/packages/console/core/migrations/20260113215232_jazzy_green_goblin/migration.sql
new file mode 100644
index 0000000..cadb4a7
--- /dev/null
+++ b/packages/console/core/migrations/20260113215232_jazzy_green_goblin/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `time_subscription_booked` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260113215232_jazzy_green_goblin/snapshot.json b/packages/console/core/migrations/20260113215232_jazzy_green_goblin/snapshot.json
new file mode 100644
index 0000000..f03e37f
--- /dev/null
+++ b/packages/console/core/migrations/20260113215232_jazzy_green_goblin/snapshot.json
@@ -0,0 +1,2195 @@
+{
+ "version": "6",
+ "id": "14cbf4c8-55f1-4488-956f-56fb5ccb3a5a",
+ "prevIds": ["a0d18802-c390-47d4-98f1-d1f83869cf0c"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_coupon_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260113223840_aromatic_agent_zero/migration.sql b/packages/console/core/migrations/20260113223840_aromatic_agent_zero/migration.sql
new file mode 100644
index 0000000..c53ba5e
--- /dev/null
+++ b/packages/console/core/migrations/20260113223840_aromatic_agent_zero/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `subscription_plan` enum('20','100','200');
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260113223840_aromatic_agent_zero/snapshot.json b/packages/console/core/migrations/20260113223840_aromatic_agent_zero/snapshot.json
new file mode 100644
index 0000000..000b6f5
--- /dev/null
+++ b/packages/console/core/migrations/20260113223840_aromatic_agent_zero/snapshot.json
@@ -0,0 +1,2209 @@
+{
+ "version": "6",
+ "id": "00774acd-a1e5-49c0-b296-cacc9506a566",
+ "prevIds": ["14cbf4c8-55f1-4488-956f-56fb5ccb3a5a"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_coupon_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260116213606_gigantic_hardball/migration.sql b/packages/console/core/migrations/20260116213606_gigantic_hardball/migration.sql
new file mode 100644
index 0000000..72d4313
--- /dev/null
+++ b/packages/console/core/migrations/20260116213606_gigantic_hardball/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `subscription` json;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260116213606_gigantic_hardball/snapshot.json b/packages/console/core/migrations/20260116213606_gigantic_hardball/snapshot.json
new file mode 100644
index 0000000..d62a4ca
--- /dev/null
+++ b/packages/console/core/migrations/20260116213606_gigantic_hardball/snapshot.json
@@ -0,0 +1,2223 @@
+{
+ "version": "6",
+ "id": "32a0c40b-a269-4ad1-a5a0-52b1f18932aa",
+ "prevIds": ["00774acd-a1e5-49c0-b296-cacc9506a566"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_coupon_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260116224745_numerous_annihilus/migration.sql b/packages/console/core/migrations/20260116224745_numerous_annihilus/migration.sql
new file mode 100644
index 0000000..299847d
--- /dev/null
+++ b/packages/console/core/migrations/20260116224745_numerous_annihilus/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` DROP COLUMN `subscription_coupon_id`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260116224745_numerous_annihilus/snapshot.json b/packages/console/core/migrations/20260116224745_numerous_annihilus/snapshot.json
new file mode 100644
index 0000000..85f6c84
--- /dev/null
+++ b/packages/console/core/migrations/20260116224745_numerous_annihilus/snapshot.json
@@ -0,0 +1,2209 @@
+{
+ "version": "6",
+ "id": "a0ade64b-b735-4a70-8d39-ebd84bc9e924",
+ "prevIds": ["32a0c40b-a269-4ad1-a5a0-52b1f18932aa"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260122190905_moaning_karnak/migration.sql b/packages/console/core/migrations/20260122190905_moaning_karnak/migration.sql
new file mode 100644
index 0000000..120ae72
--- /dev/null
+++ b/packages/console/core/migrations/20260122190905_moaning_karnak/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `billing` ADD `time_subscription_selected` timestamp(3);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260122190905_moaning_karnak/snapshot.json b/packages/console/core/migrations/20260122190905_moaning_karnak/snapshot.json
new file mode 100644
index 0000000..cb606b0
--- /dev/null
+++ b/packages/console/core/migrations/20260122190905_moaning_karnak/snapshot.json
@@ -0,0 +1,2223 @@
+{
+ "version": "6",
+ "id": "e630f63c-04a8-4b59-bf56-03efcdd1b011",
+ "prevIds": ["a0ade64b-b735-4a70-8d39-ebd84bc9e924"],
+ "dialect": "mysql",
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "account",
+ "entityType": "columns"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "columns"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "table": "benchmark",
+ "entityType": "columns"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "table": "billing",
+ "entityType": "columns"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "payment",
+ "entityType": "columns"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "table": "subscription",
+ "entityType": "columns"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "table": "usage",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "table": "ip_rate_limit",
+ "entityType": "columns"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "table": "ip",
+ "entityType": "columns"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "table": "key",
+ "entityType": "columns"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "table": "model",
+ "entityType": "columns"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "table": "provider",
+ "entityType": "columns"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "table": "user",
+ "entityType": "columns"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "table": "workspace",
+ "entityType": "columns"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "table": "auth",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "table": "benchmark",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "table": "billing",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "table": "subscription",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "table": "usage",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "table": "key",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "table": "model",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "table": "provider",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "table": "user",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "table": "workspace",
+ "entityType": "indexes"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260222233442_clever_toxin/migration.sql b/packages/console/core/migrations/20260222233442_clever_toxin/migration.sql
new file mode 100644
index 0000000..03cfe4c
--- /dev/null
+++ b/packages/console/core/migrations/20260222233442_clever_toxin/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `usage` ADD `session_id` varchar(30);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260222233442_clever_toxin/snapshot.json b/packages/console/core/migrations/20260222233442_clever_toxin/snapshot.json
new file mode 100644
index 0000000..a91dacd
--- /dev/null
+++ b/packages/console/core/migrations/20260222233442_clever_toxin/snapshot.json
@@ -0,0 +1,2237 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "4bf45b3f-3edd-4db7-94d5-097aa55ca5f7",
+ "prevIds": ["e630f63c-04a8-4b59-bf56-03efcdd1b011"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260224043338_nifty_starjammers/migration.sql b/packages/console/core/migrations/20260224043338_nifty_starjammers/migration.sql
new file mode 100644
index 0000000..1c97afb
--- /dev/null
+++ b/packages/console/core/migrations/20260224043338_nifty_starjammers/migration.sql
@@ -0,0 +1,19 @@
+CREATE TABLE `lite` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `user_id` varchar(30) NOT NULL,
+ `rolling_usage` bigint,
+ `weekly_usage` bigint,
+ `monthly_usage` bigint,
+ `time_rolling_updated` timestamp(3),
+ `time_weekly_updated` timestamp(3),
+ `time_monthly_updated` timestamp(3),
+ CONSTRAINT `PRIMARY` PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `workspace_user_id` UNIQUE INDEX(`workspace_id`,`user_id`)
+);
+--> statement-breakpoint
+ALTER TABLE `billing` ADD `lite_subscription_id` varchar(28);--> statement-breakpoint
+ALTER TABLE `billing` ADD `lite` json;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260224043338_nifty_starjammers/snapshot.json b/packages/console/core/migrations/20260224043338_nifty_starjammers/snapshot.json
new file mode 100644
index 0000000..bc20ee2
--- /dev/null
+++ b/packages/console/core/migrations/20260224043338_nifty_starjammers/snapshot.json
@@ -0,0 +1,2463 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "5e506dec-61e7-4726-81d1-afa4ffbc61ed",
+ "prevIds": ["4bf45b3f-3edd-4db7-94d5-097aa55ca5f7"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260414235536_lame_wild_child/migration.sql b/packages/console/core/migrations/20260414235536_lame_wild_child/migration.sql
new file mode 100644
index 0000000..439bf0c
--- /dev/null
+++ b/packages/console/core/migrations/20260414235536_lame_wild_child/migration.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `key_rate_limit` (
+ `key` varchar(255) NOT NULL,
+ `interval` varchar(12) NOT NULL,
+ `count` int NOT NULL,
+ CONSTRAINT PRIMARY KEY(`key`,`interval`)
+);
diff --git a/packages/console/core/migrations/20260414235536_lame_wild_child/snapshot.json b/packages/console/core/migrations/20260414235536_lame_wild_child/snapshot.json
new file mode 100644
index 0000000..5419042
--- /dev/null
+++ b/packages/console/core/migrations/20260414235536_lame_wild_child/snapshot.json
@@ -0,0 +1,2515 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "09166f7c-37b3-456a-93a9-76a3a29a7b5e",
+ "prevIds": ["5e506dec-61e7-4726-81d1-afa4ffbc61ed"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(12)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260415002256_perpetual_karen_page/migration.sql b/packages/console/core/migrations/20260415002256_perpetual_karen_page/migration.sql
new file mode 100644
index 0000000..287b59f
--- /dev/null
+++ b/packages/console/core/migrations/20260415002256_perpetual_karen_page/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `key_rate_limit` MODIFY COLUMN `interval` varchar(20) NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260415002256_perpetual_karen_page/snapshot.json b/packages/console/core/migrations/20260415002256_perpetual_karen_page/snapshot.json
new file mode 100644
index 0000000..a450e9e
--- /dev/null
+++ b/packages/console/core/migrations/20260415002256_perpetual_karen_page/snapshot.json
@@ -0,0 +1,2515 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "d0c6d0a1-f50c-4f6a-b6a8-13aebb2b86fd",
+ "prevIds": ["09166f7c-37b3-456a-93a9-76a3a29a7b5e"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(20)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260415002534_far_smasher/migration.sql b/packages/console/core/migrations/20260415002534_far_smasher/migration.sql
new file mode 100644
index 0000000..e3474ce
--- /dev/null
+++ b/packages/console/core/migrations/20260415002534_far_smasher/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `key_rate_limit` MODIFY COLUMN `interval` varchar(40) NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260415002534_far_smasher/snapshot.json b/packages/console/core/migrations/20260415002534_far_smasher/snapshot.json
new file mode 100644
index 0000000..8132172
--- /dev/null
+++ b/packages/console/core/migrations/20260415002534_far_smasher/snapshot.json
@@ -0,0 +1,2515 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "a09a925d-6cdd-4e7c-b8b1-11c259928b4c",
+ "prevIds": ["d0c6d0a1-f50c-4f6a-b6a8-13aebb2b86fd"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260417071612_tidy_diamondback/migration.sql b/packages/console/core/migrations/20260417071612_tidy_diamondback/migration.sql
new file mode 100644
index 0000000..41a4efe
--- /dev/null
+++ b/packages/console/core/migrations/20260417071612_tidy_diamondback/migration.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `model_rate_limit` (
+ `key` varchar(255) NOT NULL,
+ `interval` varchar(40) NOT NULL,
+ `count` int NOT NULL,
+ CONSTRAINT PRIMARY KEY(`key`,`interval`)
+);
diff --git a/packages/console/core/migrations/20260417071612_tidy_diamondback/snapshot.json b/packages/console/core/migrations/20260417071612_tidy_diamondback/snapshot.json
new file mode 100644
index 0000000..2152bfa
--- /dev/null
+++ b/packages/console/core/migrations/20260417071612_tidy_diamondback/snapshot.json
@@ -0,0 +1,2567 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "93c492af-c95b-4213-9fc2-38c3dd10374d",
+ "prevIds": ["a09a925d-6cdd-4e7c-b8b1-11c259928b4c"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "model_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260418195905_shocking_marvel_zombies/migration.sql b/packages/console/core/migrations/20260418195905_shocking_marvel_zombies/migration.sql
new file mode 100644
index 0000000..7b7f7a2
--- /dev/null
+++ b/packages/console/core/migrations/20260418195905_shocking_marvel_zombies/migration.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `coupon` (
+ `email` varchar(255),
+ `type` enum('BUILDATHON','GOFREEMONTH') NOT NULL,
+ `time_redeemed` timestamp(3),
+ CONSTRAINT PRIMARY KEY(`email`,`type`)
+);
diff --git a/packages/console/core/migrations/20260418195905_shocking_marvel_zombies/snapshot.json b/packages/console/core/migrations/20260418195905_shocking_marvel_zombies/snapshot.json
new file mode 100644
index 0000000..44ccb08
--- /dev/null
+++ b/packages/console/core/migrations/20260418195905_shocking_marvel_zombies/snapshot.json
@@ -0,0 +1,2619 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "18b4281c-1609-47d8-9d51-0b08e3925f2b",
+ "prevIds": ["93c492af-c95b-4213-9fc2-38c3dd10374d"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "model_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260420184535_aromatic_molten_man/migration.sql b/packages/console/core/migrations/20260420184535_aromatic_molten_man/migration.sql
new file mode 100644
index 0000000..db8e4f0
--- /dev/null
+++ b/packages/console/core/migrations/20260420184535_aromatic_molten_man/migration.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `model_tpm_limit` (
+ `id` varchar(255) NOT NULL,
+ `interval` int NOT NULL,
+ `count` int NOT NULL,
+ CONSTRAINT PRIMARY KEY(`id`,`interval`)
+);
diff --git a/packages/console/core/migrations/20260420184535_aromatic_molten_man/snapshot.json b/packages/console/core/migrations/20260420184535_aromatic_molten_man/snapshot.json
new file mode 100644
index 0000000..68814ae
--- /dev/null
+++ b/packages/console/core/migrations/20260420184535_aromatic_molten_man/snapshot.json
@@ -0,0 +1,2671 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "1bd00ab4-28b3-4852-b95f-f854e4195a77",
+ "prevIds": ["18b4281c-1609-47d8-9d51-0b08e3925f2b"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "model_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260420185813_supreme_roxanne_simpson/migration.sql b/packages/console/core/migrations/20260420185813_supreme_roxanne_simpson/migration.sql
new file mode 100644
index 0000000..00b7b5f
--- /dev/null
+++ b/packages/console/core/migrations/20260420185813_supreme_roxanne_simpson/migration.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `model_tpm_limit` DROP PRIMARY KEY;--> statement-breakpoint
+ALTER TABLE `model_tpm_limit` ADD PRIMARY KEY (`id`);--> statement-breakpoint
+ALTER TABLE `model_tpm_limit` DROP COLUMN `interval`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260420185813_supreme_roxanne_simpson/snapshot.json b/packages/console/core/migrations/20260420185813_supreme_roxanne_simpson/snapshot.json
new file mode 100644
index 0000000..7549846
--- /dev/null
+++ b/packages/console/core/migrations/20260420185813_supreme_roxanne_simpson/snapshot.json
@@ -0,0 +1,2657 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "1f9a146c-a20b-4246-a78d-3a261e91fc41",
+ "prevIds": ["1bd00ab4-28b3-4852-b95f-f854e4195a77"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "model_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_tpm_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260420191234_deep_scarecrow/migration.sql b/packages/console/core/migrations/20260420191234_deep_scarecrow/migration.sql
new file mode 100644
index 0000000..c07d65e
--- /dev/null
+++ b/packages/console/core/migrations/20260420191234_deep_scarecrow/migration.sql
@@ -0,0 +1 @@
+DROP TABLE `model_rate_limit`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260420191234_deep_scarecrow/snapshot.json b/packages/console/core/migrations/20260420191234_deep_scarecrow/snapshot.json
new file mode 100644
index 0000000..042c8a2
--- /dev/null
+++ b/packages/console/core/migrations/20260420191234_deep_scarecrow/snapshot.json
@@ -0,0 +1,2605 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "0af8994a-606c-4ac9-a0a7-ebc991faaa38",
+ "prevIds": ["1f9a146c-a20b-4246-a78d-3a261e91fc41"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_tpm_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260421020842_bizarre_living_tribunal/migration.sql b/packages/console/core/migrations/20260421020842_bizarre_living_tribunal/migration.sql
new file mode 100644
index 0000000..07dc63d
--- /dev/null
+++ b/packages/console/core/migrations/20260421020842_bizarre_living_tribunal/migration.sql
@@ -0,0 +1,5 @@
+CREATE TABLE `model_tpm_rate_limit` (
+ `id` varchar(255) PRIMARY KEY,
+ `interval` bigint NOT NULL,
+ `count` int NOT NULL
+);
diff --git a/packages/console/core/migrations/20260421020842_bizarre_living_tribunal/snapshot.json b/packages/console/core/migrations/20260421020842_bizarre_living_tribunal/snapshot.json
new file mode 100644
index 0000000..99e6fa5
--- /dev/null
+++ b/packages/console/core/migrations/20260421020842_bizarre_living_tribunal/snapshot.json
@@ -0,0 +1,2657 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "29e20639-1d4f-4125-bed8-70b7adaaa387",
+ "prevIds": ["0af8994a-606c-4ac9-a0a7-ebc991faaa38"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_tpm_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260421023950_nebulous_weapon_omega/migration.sql b/packages/console/core/migrations/20260421023950_nebulous_weapon_omega/migration.sql
new file mode 100644
index 0000000..d7da039
--- /dev/null
+++ b/packages/console/core/migrations/20260421023950_nebulous_weapon_omega/migration.sql
@@ -0,0 +1,3 @@
+DROP TABLE `model_tpm_limit`;--> statement-breakpoint
+ALTER TABLE `model_tpm_rate_limit` DROP PRIMARY KEY;--> statement-breakpoint
+ALTER TABLE `model_tpm_rate_limit` ADD PRIMARY KEY (`id`,`interval`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260421023950_nebulous_weapon_omega/snapshot.json b/packages/console/core/migrations/20260421023950_nebulous_weapon_omega/snapshot.json
new file mode 100644
index 0000000..351c19d
--- /dev/null
+++ b/packages/console/core/migrations/20260421023950_nebulous_weapon_omega/snapshot.json
@@ -0,0 +1,2619 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "9e2d81ba-88b4-4704-a8b6-4a27dd2bd8d9",
+ "prevIds": ["29e20639-1d4f-4125-bed8-70b7adaaa387"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260427053132_smiling_puppet_master/migration.sql b/packages/console/core/migrations/20260427053132_smiling_puppet_master/migration.sql
new file mode 100644
index 0000000..6d15430
--- /dev/null
+++ b/packages/console/core/migrations/20260427053132_smiling_puppet_master/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `coupon` MODIFY COLUMN `type` enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100') NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260427053132_smiling_puppet_master/snapshot.json b/packages/console/core/migrations/20260427053132_smiling_puppet_master/snapshot.json
new file mode 100644
index 0000000..5f5e5bc
--- /dev/null
+++ b/packages/console/core/migrations/20260427053132_smiling_puppet_master/snapshot.json
@@ -0,0 +1,2619 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "b3b243c0-8097-4d8a-a439-243d5a7d543f",
+ "prevIds": ["9e2d81ba-88b4-4704-a8b6-4a27dd2bd8d9"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260511220522_fine_shaman/migration.sql b/packages/console/core/migrations/20260511220522_fine_shaman/migration.sql
new file mode 100644
index 0000000..3af8255
--- /dev/null
+++ b/packages/console/core/migrations/20260511220522_fine_shaman/migration.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `model_tps_rate_limit` (
+ `id` varchar(255) NOT NULL,
+ `interval` bigint NOT NULL,
+ `qualify` int NOT NULL,
+ `unqualify` int NOT NULL,
+ CONSTRAINT PRIMARY KEY(`id`,`interval`)
+);
diff --git a/packages/console/core/migrations/20260511220522_fine_shaman/snapshot.json b/packages/console/core/migrations/20260511220522_fine_shaman/snapshot.json
new file mode 100644
index 0000000..b175f6d
--- /dev/null
+++ b/packages/console/core/migrations/20260511220522_fine_shaman/snapshot.json
@@ -0,0 +1,2685 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "c742e0f2-5d89-4216-b843-059d00680f13",
+ "prevIds": ["b3b243c0-8097-4d8a-a439-243d5a7d543f"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260513163955_tearful_whistler/migration.sql b/packages/console/core/migrations/20260513163955_tearful_whistler/migration.sql
new file mode 100644
index 0000000..a2bcc16
--- /dev/null
+++ b/packages/console/core/migrations/20260513163955_tearful_whistler/migration.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `model_sticky_provider` (
+ `id` varchar(255) PRIMARY KEY,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `provider_id` varchar(255) NOT NULL
+);
diff --git a/packages/console/core/migrations/20260513163955_tearful_whistler/snapshot.json b/packages/console/core/migrations/20260513163955_tearful_whistler/snapshot.json
new file mode 100644
index 0000000..b791735
--- /dev/null
+++ b/packages/console/core/migrations/20260513163955_tearful_whistler/snapshot.json
@@ -0,0 +1,2765 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "1f04bd59-35b0-493b-9d55-cfa08207ba8e",
+ "prevIds": ["c742e0f2-5d89-4216-b843-059d00680f13"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260513173355_groovy_jane_foster/migration.sql b/packages/console/core/migrations/20260513173355_groovy_jane_foster/migration.sql
new file mode 100644
index 0000000..76f85ee
--- /dev/null
+++ b/packages/console/core/migrations/20260513173355_groovy_jane_foster/migration.sql
@@ -0,0 +1,47 @@
+CREATE TABLE `referral_code` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `code` varchar(10) NOT NULL,
+ CONSTRAINT PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `referral_code_workspace_id` UNIQUE INDEX(`workspace_id`),
+ CONSTRAINT `referral_code_code` UNIQUE INDEX(`code`)
+);
+--> statement-breakpoint
+CREATE TABLE `referral_reward` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `referral_id` varchar(30) NOT NULL,
+ `source` enum('inviter','invitee') NOT NULL,
+ `amount` bigint NOT NULL,
+ `applied_by_user_id` varchar(30),
+ `time_applied` timestamp(3),
+ CONSTRAINT PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `referral_reward_referral_source` UNIQUE INDEX(`referral_id`,`source`)
+);
+--> statement-breakpoint
+CREATE TABLE `referral` (
+ `id` varchar(30) NOT NULL,
+ `workspace_id` varchar(30) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ `inviter_workspace_id` varchar(30) NOT NULL,
+ `invitee_account_id` varchar(30) NOT NULL,
+ `invitee_user_id` varchar(30) NOT NULL,
+ `referral_code_id` varchar(30) NOT NULL,
+ `stripe_customer_id` varchar(255) NOT NULL,
+ `stripe_subscription_id` varchar(255) NOT NULL,
+ CONSTRAINT PRIMARY KEY(`workspace_id`,`id`),
+ CONSTRAINT `referral_invitee_account_id` UNIQUE INDEX(`invitee_account_id`),
+ CONSTRAINT `referral_stripe_subscription_id` UNIQUE INDEX(`stripe_subscription_id`)
+);
+--> statement-breakpoint
+CREATE INDEX `referral_reward_workspace_time` ON `referral_reward` (`workspace_id`,`time_created`);--> statement-breakpoint
+CREATE INDEX `referral_inviter_workspace_id` ON `referral` (`inviter_workspace_id`);--> statement-breakpoint
+CREATE INDEX `referral_code_id` ON `referral` (`referral_code_id`);
diff --git a/packages/console/core/migrations/20260513173355_groovy_jane_foster/snapshot.json b/packages/console/core/migrations/20260513173355_groovy_jane_foster/snapshot.json
new file mode 100644
index 0000000..3fb58d1
--- /dev/null
+++ b/packages/console/core/migrations/20260513173355_groovy_jane_foster/snapshot.json
@@ -0,0 +1,3229 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "91a9afa8-a5b1-4fa4-b71d-b3ae866744c9",
+ "prevIds": ["c742e0f2-5d89-4216-b843-059d00680f13"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_code",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "code",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "enum('inviter','invitee')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "source",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "applied_by_user_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "inviter_workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_user_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_code_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "stripe_customer_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "stripe_subscription_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral_code",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_code_workspace_id",
+ "entityType": "indexes",
+ "table": "referral_code"
+ },
+ {
+ "columns": [
+ {
+ "value": "code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_code_code",
+ "entityType": "indexes",
+ "table": "referral_code"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_id",
+ "isExpression": false
+ },
+ {
+ "value": "source",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_reward_referral_source",
+ "entityType": "indexes",
+ "table": "referral_reward"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_reward_workspace_time",
+ "entityType": "indexes",
+ "table": "referral_reward"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "stripe_subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_stripe_subscription_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "inviter_workspace_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_inviter_workspace_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_code_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_code_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260516082200_long_spirit/migration.sql b/packages/console/core/migrations/20260516082200_long_spirit/migration.sql
new file mode 100644
index 0000000..471552c
--- /dev/null
+++ b/packages/console/core/migrations/20260516082200_long_spirit/migration.sql
@@ -0,0 +1,20 @@
+DROP TABLE `referral_code`;--> statement-breakpoint
+DROP INDEX `referral_reward_referral_source` ON `referral_reward`;--> statement-breakpoint
+DROP INDEX `referral_stripe_subscription_id` ON `referral`;--> statement-breakpoint
+DROP INDEX `referral_inviter_workspace_id` ON `referral`;--> statement-breakpoint
+DROP INDEX `referral_code_id` ON `referral`;--> statement-breakpoint
+ALTER TABLE `referral_reward` DROP PRIMARY KEY;--> statement-breakpoint
+ALTER TABLE `referral` DROP PRIMARY KEY;--> statement-breakpoint
+ALTER TABLE `referral_reward` MODIFY COLUMN `workspace_id` varchar(30);--> statement-breakpoint
+ALTER TABLE `workspace` ADD `referral_code` varchar(16);--> statement-breakpoint
+ALTER TABLE `referral_reward` ADD PRIMARY KEY (`id`);--> statement-breakpoint
+ALTER TABLE `referral` ADD PRIMARY KEY (`id`);--> statement-breakpoint
+CREATE INDEX `referral_workspace_id` ON `referral` (`workspace_id`);--> statement-breakpoint
+CREATE UNIQUE INDEX `workspace_referral_code` ON `workspace` (`referral_code`);--> statement-breakpoint
+ALTER TABLE `referral_reward` DROP COLUMN `source`;--> statement-breakpoint
+ALTER TABLE `referral_reward` DROP COLUMN `applied_by_user_id`;--> statement-breakpoint
+ALTER TABLE `referral` DROP COLUMN `inviter_workspace_id`;--> statement-breakpoint
+ALTER TABLE `referral` DROP COLUMN `invitee_user_id`;--> statement-breakpoint
+ALTER TABLE `referral` DROP COLUMN `referral_code_id`;--> statement-breakpoint
+ALTER TABLE `referral` DROP COLUMN `stripe_customer_id`;--> statement-breakpoint
+ALTER TABLE `referral` DROP COLUMN `stripe_subscription_id`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260516082200_long_spirit/snapshot.json b/packages/console/core/migrations/20260516082200_long_spirit/snapshot.json
new file mode 100644
index 0000000..2bdb0af
--- /dev/null
+++ b/packages/console/core/migrations/20260516082200_long_spirit/snapshot.json
@@ -0,0 +1,3063 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "e93db4f6-6e8b-43f4-b883-59d2fd6ede53",
+ "prevIds": ["1f04bd59-35b0-493b-9d55-cfa08207ba8e", "91a9afa8-a5b1-4fa4-b71d-b3ae866744c9"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(16)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_code",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_reward_workspace_time",
+ "entityType": "indexes",
+ "table": "referral_reward"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_workspace_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_referral_code",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260516110447_classy_wilson_fisk/migration.sql b/packages/console/core/migrations/20260516110447_classy_wilson_fisk/migration.sql
new file mode 100644
index 0000000..ab3a107
--- /dev/null
+++ b/packages/console/core/migrations/20260516110447_classy_wilson_fisk/migration.sql
@@ -0,0 +1,4 @@
+DROP INDEX `referral_reward_workspace_time` ON `referral_reward`;--> statement-breakpoint
+ALTER TABLE `referral_reward` DROP PRIMARY KEY;--> statement-breakpoint
+ALTER TABLE `referral_reward` ADD PRIMARY KEY (`workspace_id`,`referral_id`);--> statement-breakpoint
+ALTER TABLE `referral_reward` DROP COLUMN `id`;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260516110447_classy_wilson_fisk/snapshot.json b/packages/console/core/migrations/20260516110447_classy_wilson_fisk/snapshot.json
new file mode 100644
index 0000000..f229312
--- /dev/null
+++ b/packages/console/core/migrations/20260516110447_classy_wilson_fisk/snapshot.json
@@ -0,0 +1,3029 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "77de1eaf-69f6-433f-b244-cda75319450a",
+ "prevIds": ["e93db4f6-6e8b-43f4-b883-59d2fd6ede53"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(16)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_code",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "referral_id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_workspace_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_referral_code",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260516112143_cynical_dexter_bennett/migration.sql b/packages/console/core/migrations/20260516112143_cynical_dexter_bennett/migration.sql
new file mode 100644
index 0000000..c2ac686
--- /dev/null
+++ b/packages/console/core/migrations/20260516112143_cynical_dexter_bennett/migration.sql
@@ -0,0 +1,3 @@
+DROP INDEX `referral_workspace_id` ON `referral`;--> statement-breakpoint
+ALTER TABLE `referral` DROP PRIMARY KEY;--> statement-breakpoint
+ALTER TABLE `referral` ADD PRIMARY KEY (`workspace_id`,`id`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260516112143_cynical_dexter_bennett/snapshot.json b/packages/console/core/migrations/20260516112143_cynical_dexter_bennett/snapshot.json
new file mode 100644
index 0000000..c38a24e
--- /dev/null
+++ b/packages/console/core/migrations/20260516112143_cynical_dexter_bennett/snapshot.json
@@ -0,0 +1,3013 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "9809797a-e6f6-418c-8532-196553b315b8",
+ "prevIds": ["77de1eaf-69f6-433f-b244-cda75319450a"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(16)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_code",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "referral_id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_referral_code",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260516222132_referral_code_length/migration.sql b/packages/console/core/migrations/20260516222132_referral_code_length/migration.sql
new file mode 100644
index 0000000..943f1f4
--- /dev/null
+++ b/packages/console/core/migrations/20260516222132_referral_code_length/migration.sql
@@ -0,0 +1,2 @@
+UPDATE `workspace` SET `referral_code` = NULL WHERE CHAR_LENGTH(`referral_code`) > 10;--> statement-breakpoint
+ALTER TABLE `workspace` MODIFY COLUMN `referral_code` varchar(10);
diff --git a/packages/console/core/migrations/20260516222132_referral_code_length/snapshot.json b/packages/console/core/migrations/20260516222132_referral_code_length/snapshot.json
new file mode 100644
index 0000000..b7265eb
--- /dev/null
+++ b/packages/console/core/migrations/20260516222132_referral_code_length/snapshot.json
@@ -0,0 +1,3013 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "e49321c9-2b03-4e2c-b2f0-76fbb88088ea",
+ "prevIds": ["9809797a-e6f6-418c-8532-196553b315b8"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_code",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "referral_id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_referral_code",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260517075207_famous_chat/migration.sql b/packages/console/core/migrations/20260517075207_famous_chat/migration.sql
new file mode 100644
index 0000000..33ca132
--- /dev/null
+++ b/packages/console/core/migrations/20260517075207_famous_chat/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `coupon` MODIFY COLUMN `type` enum('BUILDATHON','GO1MONTH50','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100') NOT NULL;
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260517075207_famous_chat/snapshot.json b/packages/console/core/migrations/20260517075207_famous_chat/snapshot.json
new file mode 100644
index 0000000..b2ba113
--- /dev/null
+++ b/packages/console/core/migrations/20260517075207_famous_chat/snapshot.json
@@ -0,0 +1,2765 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "dc498f8b-c8e7-4da5-b70a-419427dd5901",
+ "prevIds": ["1f04bd59-35b0-493b-9d55-cfa08207ba8e"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GO1MONTH50','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260518181630_secret_strong_guy/migration.sql b/packages/console/core/migrations/20260518181630_secret_strong_guy/migration.sql
new file mode 100644
index 0000000..27b1bc9
--- /dev/null
+++ b/packages/console/core/migrations/20260518181630_secret_strong_guy/migration.sql
@@ -0,0 +1,2 @@
+DROP INDEX `workspace_referral_code` ON `workspace`;--> statement-breakpoint
+CREATE UNIQUE INDEX `referral_code` ON `workspace` (`referral_code`);
\ No newline at end of file
diff --git a/packages/console/core/migrations/20260518181630_secret_strong_guy/snapshot.json b/packages/console/core/migrations/20260518181630_secret_strong_guy/snapshot.json
new file mode 100644
index 0000000..c7625a7
--- /dev/null
+++ b/packages/console/core/migrations/20260518181630_secret_strong_guy/snapshot.json
@@ -0,0 +1,3013 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "9a7123cb-5c2c-47f6-b22f-8fd6a02dcb03",
+ "prevIds": ["e49321c9-2b03-4e2c-b2f0-76fbb88088ea"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_code",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "referral_id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ },
+ {
+ "columns": [
+ {
+ "value": "referral_code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "referral_code",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/migrations/20260520164350_quick_red_hulk/migration.sql b/packages/console/core/migrations/20260520164350_quick_red_hulk/migration.sql
new file mode 100644
index 0000000..72102d7
--- /dev/null
+++ b/packages/console/core/migrations/20260520164350_quick_red_hulk/migration.sql
@@ -0,0 +1,13 @@
+CREATE TABLE `referral_code` (
+ `workspace_id` varchar(30) PRIMARY KEY,
+ `code` varchar(10) NOT NULL,
+ `time_created` timestamp(3) NOT NULL DEFAULT (now()),
+ `time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
+ `time_deleted` timestamp(3),
+ CONSTRAINT `code` UNIQUE INDEX(`code`)
+);
+--> statement-breakpoint
+DROP INDEX `referral_invitee_account_id` ON `referral`;--> statement-breakpoint
+DROP INDEX `referral_code` ON `workspace`;--> statement-breakpoint
+CREATE UNIQUE INDEX `invitee_account_id` ON `referral` (`invitee_account_id`);--> statement-breakpoint
+ALTER TABLE `workspace` DROP COLUMN `referral_code`;
diff --git a/packages/console/core/migrations/20260520164350_quick_red_hulk/snapshot.json b/packages/console/core/migrations/20260520164350_quick_red_hulk/snapshot.json
new file mode 100644
index 0000000..40f2b32
--- /dev/null
+++ b/packages/console/core/migrations/20260520164350_quick_red_hulk/snapshot.json
@@ -0,0 +1,3079 @@
+{
+ "version": "6",
+ "dialect": "mysql",
+ "id": "a946ea14-a35d-49cc-a10a-8c93c30a3cb1",
+ "prevIds": ["9a7123cb-5c2c-47f6-b22f-8fd6a02dcb03", "dc498f8b-c8e7-4da5-b70a-419427dd5901"],
+ "ddl": [
+ {
+ "name": "account",
+ "entityType": "tables"
+ },
+ {
+ "name": "auth",
+ "entityType": "tables"
+ },
+ {
+ "name": "benchmark",
+ "entityType": "tables"
+ },
+ {
+ "name": "billing",
+ "entityType": "tables"
+ },
+ {
+ "name": "coupon",
+ "entityType": "tables"
+ },
+ {
+ "name": "lite",
+ "entityType": "tables"
+ },
+ {
+ "name": "payment",
+ "entityType": "tables"
+ },
+ {
+ "name": "subscription",
+ "entityType": "tables"
+ },
+ {
+ "name": "usage",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "ip",
+ "entityType": "tables"
+ },
+ {
+ "name": "key_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_sticky_provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tpm_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "model_tps_rate_limit",
+ "entityType": "tables"
+ },
+ {
+ "name": "key",
+ "entityType": "tables"
+ },
+ {
+ "name": "model",
+ "entityType": "tables"
+ },
+ {
+ "name": "provider",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_code",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral_reward",
+ "entityType": "tables"
+ },
+ {
+ "name": "referral",
+ "entityType": "tables"
+ },
+ {
+ "name": "user",
+ "entityType": "tables"
+ },
+ {
+ "name": "workspace",
+ "entityType": "tables"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "account"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "enum('email','github','google')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subject",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "auth"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "agent",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "mediumtext",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "result",
+ "entityType": "columns",
+ "table": "benchmark"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(32)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_type",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(4)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_method_last4",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "balance",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "boolean",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_trigger",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_amount",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_error",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_reload_locked_till",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "enum('20','100','200')",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "subscription_plan",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_booked",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_subscription_selected",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(28)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite_subscription_id",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "lite",
+ "entityType": "columns",
+ "table": "billing"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "enum('BUILDATHON','GO1MONTH50','GOFREEMONTH','GO3MONTHS100','GO6MONTHS100','GO12MONTHS100')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_redeemed",
+ "entityType": "columns",
+ "table": "coupon"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "weekly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_weekly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_updated",
+ "entityType": "columns",
+ "table": "lite"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "customer_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invoice_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "payment_id",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_refunded",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "payment"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "rolling_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "fixed_usage",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_rolling_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_fixed_updated",
+ "entityType": "columns",
+ "table": "subscription"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "input_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "output_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "reasoning_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_read_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_5m_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cache_write_1h_tokens",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "cost",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "session_id",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "json",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "enrichment",
+ "entityType": "columns",
+ "table": "usage"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "ip_rate_limit"
+ },
+ {
+ "type": "varchar(45)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "ip",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "usage",
+ "entityType": "columns",
+ "table": "ip"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(40)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "key_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider_id",
+ "entityType": "columns",
+ "table": "model_sticky_provider"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "count",
+ "entityType": "columns",
+ "table": "model_tpm_rate_limit"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "interval",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "qualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "int",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "unqualify",
+ "entityType": "columns",
+ "table": "model_tps_rate_limit"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "key",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_used",
+ "entityType": "columns",
+ "table": "key"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "model",
+ "entityType": "columns",
+ "table": "model"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(64)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "provider",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "credentials",
+ "entityType": "columns",
+ "table": "provider"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(10)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "code",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_code"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "referral_id",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "bigint",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "amount",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_applied",
+ "entityType": "columns",
+ "table": "referral_reward"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "invitee_account_id",
+ "entityType": "columns",
+ "table": "referral"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "workspace_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "account_id",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_seen",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "color",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "enum('admin','member')",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "role",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "int",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_limit",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "bigint",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "monthly_usage",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_monthly_usage_updated",
+ "entityType": "columns",
+ "table": "user"
+ },
+ {
+ "type": "varchar(30)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "slug",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "varchar(255)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(now())",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_created",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": true,
+ "autoIncrement": false,
+ "default": "(CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3))",
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_updated",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "type": "timestamp(3)",
+ "notNull": false,
+ "autoIncrement": false,
+ "default": null,
+ "onUpdateNow": false,
+ "onUpdateNowFsp": null,
+ "charSet": null,
+ "collation": null,
+ "generated": null,
+ "name": "time_deleted",
+ "entityType": "columns",
+ "table": "workspace"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "account",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "auth",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "benchmark",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "billing",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["email", "type"],
+ "name": "PRIMARY",
+ "table": "coupon",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "lite",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "payment",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "subscription",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "usage",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip", "interval"],
+ "name": "PRIMARY",
+ "table": "ip_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["ip"],
+ "name": "PRIMARY",
+ "table": "ip",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["key", "interval"],
+ "name": "PRIMARY",
+ "table": "key_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "model_sticky_provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tpm_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id", "interval"],
+ "name": "PRIMARY",
+ "table": "model_tps_rate_limit",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "key",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "model",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "provider",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id"],
+ "name": "PRIMARY",
+ "table": "referral_code",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "referral_id"],
+ "name": "PRIMARY",
+ "table": "referral_reward",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "referral",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["workspace_id", "id"],
+ "name": "PRIMARY",
+ "table": "user",
+ "entityType": "pks"
+ },
+ {
+ "columns": ["id"],
+ "name": "PRIMARY",
+ "table": "workspace",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "provider",
+ "isExpression": false
+ },
+ {
+ "value": "subject",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "provider",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "account_id",
+ "entityType": "indexes",
+ "table": "auth"
+ },
+ {
+ "columns": [
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "time_created",
+ "entityType": "indexes",
+ "table": "benchmark"
+ },
+ {
+ "columns": [
+ {
+ "value": "customer_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_customer_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "subscription_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_subscription_id",
+ "entityType": "indexes",
+ "table": "billing"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "lite"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_user_id",
+ "entityType": "indexes",
+ "table": "subscription"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "time_created",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "usage_time_created",
+ "entityType": "indexes",
+ "table": "usage"
+ },
+ {
+ "columns": [
+ {
+ "value": "key",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_key",
+ "entityType": "indexes",
+ "table": "key"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "model",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "model_workspace_model",
+ "entityType": "indexes",
+ "table": "model"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "provider",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "workspace_provider",
+ "entityType": "indexes",
+ "table": "provider"
+ },
+ {
+ "columns": [
+ {
+ "value": "code",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "code",
+ "entityType": "indexes",
+ "table": "referral_code"
+ },
+ {
+ "columns": [
+ {
+ "value": "invitee_account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "invitee_account_id",
+ "entityType": "indexes",
+ "table": "referral"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "workspace_id",
+ "isExpression": false
+ },
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "user_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "account_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_account_id",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "email",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "global_email",
+ "entityType": "indexes",
+ "table": "user"
+ },
+ {
+ "columns": [
+ {
+ "value": "slug",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "using": null,
+ "algorithm": null,
+ "lock": null,
+ "nameExplicit": true,
+ "name": "slug",
+ "entityType": "indexes",
+ "table": "workspace"
+ }
+ ],
+ "renames": []
+}
diff --git a/packages/console/core/package.json b/packages/console/core/package.json
new file mode 100644
index 0000000..092e55b
--- /dev/null
+++ b/packages/console/core/package.json
@@ -0,0 +1,53 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "name": "@opencode-ai/console-core",
+ "version": "1.17.4",
+ "private": true,
+ "type": "module",
+ "license": "MIT",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.782.0",
+ "@jsx-email/render": "1.1.1",
+ "@opencode-ai/console-mail": "workspace:*",
+ "@opencode-ai/console-resource": "workspace:*",
+ "@planetscale/database": "1.19.0",
+ "aws4fetch": "1.0.20",
+ "drizzle-orm": "catalog:",
+ "postgres": "3.4.7",
+ "stripe": "18.0.0",
+ "ulid": "catalog:",
+ "zod": "catalog:"
+ },
+ "exports": {
+ "./*.js": "./src/*.ts",
+ "./*": "./src/*"
+ },
+ "scripts": {
+ "db": "sst shell drizzle-kit",
+ "db-dev": "sst shell --stage dev -- drizzle-kit",
+ "db-prod": "sst shell --stage production -- drizzle-kit",
+ "shell": "sst shell",
+ "shell-dev": "sst shell --stage dev",
+ "shell-prod": "sst shell --stage production",
+ "update-models": "script/update-models.ts",
+ "promote-models-to-dev": "script/promote-models.ts dev",
+ "promote-models-to-prod": "script/promote-models.ts production",
+ "pull-models-from-dev": "script/pull-models.ts dev",
+ "pull-models-from-prod": "script/pull-models.ts production",
+ "update-limits": "script/update-limits.ts",
+ "promote-limits-to-dev": "script/promote-limits.ts dev",
+ "promote-limits-to-prod": "script/promote-limits.ts production",
+ "referral-backfill": "script/referral-backfill.ts",
+ "typecheck": "tsgo --noEmit"
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tsconfig/node22": "22.0.2",
+ "@types/bun": "catalog:",
+ "@types/node": "catalog:",
+ "drizzle-kit": "catalog:",
+ "mysql2": "3.14.4",
+ "typescript": "catalog:",
+ "@typescript/native-preview": "catalog:"
+ }
+}
diff --git a/packages/console/core/script/black-cancel-waitlist.ts b/packages/console/core/script/black-cancel-waitlist.ts
new file mode 100644
index 0000000..7c3584e
--- /dev/null
+++ b/packages/console/core/script/black-cancel-waitlist.ts
@@ -0,0 +1,39 @@
+import { Database, eq } from "../src/drizzle/index.js"
+import { BillingTable } from "../src/schema/billing.sql.js"
+
+const workspaceID = process.argv[2]
+
+if (!workspaceID) {
+ console.error("Usage: bun script/foo.ts ")
+ process.exit(1)
+}
+
+console.log(`Removing from Black waitlist`)
+
+const billing = await Database.use((tx) =>
+ tx
+ .select({
+ subscriptionPlan: BillingTable.subscriptionPlan,
+ timeSubscriptionBooked: BillingTable.timeSubscriptionBooked,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0]),
+)
+
+if (!billing?.timeSubscriptionBooked) {
+ console.error(`Error: Workspace is not on the waitlist`)
+ process.exit(1)
+}
+
+await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ subscriptionPlan: null,
+ timeSubscriptionBooked: null,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+)
+
+console.log(`Done`)
diff --git a/packages/console/core/script/black-gift.ts b/packages/console/core/script/black-gift.ts
new file mode 100644
index 0000000..e57ec97
--- /dev/null
+++ b/packages/console/core/script/black-gift.ts
@@ -0,0 +1,115 @@
+import { Billing } from "../src/billing.js"
+import { and, Database, eq, isNull } from "../src/drizzle/index.js"
+import { UserTable } from "../src/schema/user.sql.js"
+import { BillingTable, SubscriptionTable } from "../src/schema/billing.sql.js"
+import { Identifier } from "../src/identifier.js"
+import { AuthTable } from "../src/schema/auth.sql.js"
+import { BlackData } from "../src/black.js"
+
+const plan = "200"
+const couponID = "JAIr0Pe1"
+const workspaceID = process.argv[2]
+const seats = parseInt(process.argv[3])
+
+console.log(`Gifting ${seats} seats of Black to workspace ${workspaceID}`)
+
+if (!workspaceID || !seats) throw new Error("Usage: bun foo.ts ")
+
+// Get workspace user
+const users = await Database.use((tx) =>
+ tx
+ .select({
+ id: UserTable.id,
+ role: UserTable.role,
+ email: AuthTable.subject,
+ })
+ .from(UserTable)
+ .leftJoin(AuthTable, and(eq(AuthTable.accountID, UserTable.accountID), eq(AuthTable.provider, "email")))
+ .where(and(eq(UserTable.workspaceID, workspaceID), isNull(UserTable.timeDeleted))),
+)
+if (users.length === 0) throw new Error(`Error: No users found in workspace ${workspaceID}`)
+if (users.length !== seats)
+ throw new Error(`Error: Workspace ${workspaceID} has ${users.length} users, expected ${seats}`)
+const adminUser = users.find((user) => user.role === "admin")
+if (!adminUser) throw new Error(`Error: No admin user found in workspace ${workspaceID}`)
+if (!adminUser.email) throw new Error(`Error: Admin user ${adminUser.id} has no email`)
+
+// Get Billing
+const billing = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: BillingTable.customerID,
+ subscriptionID: BillingTable.subscriptionID,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0]),
+)
+if (!billing) throw new Error(`Error: Workspace ${workspaceID} has no billing record`)
+if (billing.subscriptionID) throw new Error(`Error: Workspace ${workspaceID} already has a subscription`)
+
+// Look up the Stripe customer by email
+const customerID =
+ billing.customerID ??
+ (await (() =>
+ Billing.stripe()
+ .customers.create({
+ email: adminUser.email,
+ metadata: {
+ workspaceID,
+ },
+ })
+ .then((customer) => customer.id))())
+console.log(`Customer ID: ${customerID}`)
+
+const subscription = await Billing.stripe().subscriptions.create({
+ customer: customerID!,
+ items: [
+ {
+ price: BlackData.planToPriceID({ plan }),
+ discounts: [{ coupon: couponID }],
+ quantity: seats,
+ },
+ ],
+ metadata: {
+ workspaceID,
+ },
+})
+console.log(`Subscription ID: ${subscription.id}`)
+
+await Database.transaction(async (tx) => {
+ // Set customer id, subscription id, and payment method on workspace billing
+ await tx
+ .update(BillingTable)
+ .set({
+ customerID,
+ subscriptionID: subscription.id,
+ subscription: { status: "subscribed", coupon: couponID, seats, plan },
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+
+ // Create a row in subscription table
+ for (const user of users) {
+ await tx.insert(SubscriptionTable).values({
+ workspaceID,
+ id: Identifier.create("subscription"),
+ userID: user.id,
+ })
+ }
+ //
+ // // Create a row in payments table
+ // await tx.insert(PaymentTable).values({
+ // workspaceID,
+ // id: Identifier.create("payment"),
+ // amount: centsToMicroCents(amountInCents),
+ // customerID,
+ // invoiceID,
+ // paymentID,
+ // enrichment: {
+ // type: "subscription",
+ // couponID,
+ // },
+ // })
+})
+
+console.log(`done`)
diff --git a/packages/console/core/script/black-onboard-waitlist.ts b/packages/console/core/script/black-onboard-waitlist.ts
new file mode 100644
index 0000000..9e7d9e9
--- /dev/null
+++ b/packages/console/core/script/black-onboard-waitlist.ts
@@ -0,0 +1,38 @@
+import { Database, eq } from "../src/drizzle/index.js"
+import { BillingTable } from "../src/schema/billing.sql.js"
+
+const workspaceID = process.argv[2]
+
+if (!workspaceID) {
+ console.error("Usage: bun script/foo.ts ")
+ process.exit(1)
+}
+
+console.log(`Onboarding to Black waitlist`)
+
+const billing = await Database.use((tx) =>
+ tx
+ .select({
+ subscriptionPlan: BillingTable.subscriptionPlan,
+ timeSubscriptionBooked: BillingTable.timeSubscriptionBooked,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0]),
+)
+
+if (!billing?.timeSubscriptionBooked) {
+ console.error(`Error: Workspace is not on the waitlist`)
+ process.exit(1)
+}
+
+await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ timeSubscriptionSelected: new Date(),
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID)),
+)
+
+console.log(`Done`)
diff --git a/packages/console/core/script/black-select-workspaces.ts b/packages/console/core/script/black-select-workspaces.ts
new file mode 100644
index 0000000..0772bd2
--- /dev/null
+++ b/packages/console/core/script/black-select-workspaces.ts
@@ -0,0 +1,41 @@
+import { Database, eq, and, sql, inArray, isNull } from "../src/drizzle/index.js"
+import { BillingTable, BlackPlans } from "../src/schema/billing.sql.js"
+import { UserTable } from "../src/schema/user.sql.js"
+import { AuthTable } from "../src/schema/auth.sql.js"
+
+const plan = process.argv[2] as (typeof BlackPlans)[number]
+if (!BlackPlans.includes(plan)) {
+ console.error("Usage: bun foo.ts ")
+ process.exit(1)
+}
+
+const workspaces = await Database.use((tx) =>
+ tx
+ .select({ workspaceID: BillingTable.workspaceID })
+ .from(BillingTable)
+ .where(and(eq(BillingTable.subscriptionPlan, plan), isNull(BillingTable.timeSubscriptionSelected)))
+ .orderBy(sql`RAND()`)
+ .limit(100),
+)
+
+console.log(`Found ${workspaces.length} workspaces on Black ${plan} waitlist`)
+
+console.log("== Workspace IDs ==")
+const ids = workspaces.map((w) => w.workspaceID)
+for (const id of ids) {
+ console.log(id)
+}
+
+console.log("\n== User Emails ==")
+const emails = await Database.use((tx) =>
+ tx
+ .select({ email: AuthTable.subject })
+ .from(UserTable)
+ .innerJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .where(inArray(UserTable.workspaceID, ids)),
+)
+
+const unique = new Set(emails.map((row) => row.email))
+for (const email of unique) {
+ console.log(email)
+}
diff --git a/packages/console/core/script/black-stats.ts b/packages/console/core/script/black-stats.ts
new file mode 100644
index 0000000..de7cf5e
--- /dev/null
+++ b/packages/console/core/script/black-stats.ts
@@ -0,0 +1,312 @@
+import { Database, and, eq, inArray, isNotNull, sql } from "../src/drizzle/index.js"
+import { BillingTable, BlackPlans, SubscriptionTable, UsageTable } from "../src/schema/billing.sql.js"
+
+if (process.argv.length < 3) {
+ console.error("Usage: bun black-stats.ts ")
+ process.exit(1)
+}
+const plan = process.argv[2] as (typeof BlackPlans)[number]
+if (!BlackPlans.includes(plan)) {
+ console.error("Usage: bun black-stats.ts ")
+ process.exit(1)
+}
+const cutoff = new Date(Date.UTC(2026, 1, 0, 23, 59, 59, 999))
+
+// get workspaces
+const workspaces = await Database.use((tx) =>
+ tx
+ .select({ workspaceID: BillingTable.workspaceID })
+ .from(BillingTable)
+ .where(
+ and(isNotNull(BillingTable.subscriptionID), sql`JSON_UNQUOTE(JSON_EXTRACT(subscription, '$.plan')) = ${plan}`),
+ ),
+)
+if (workspaces.length === 0) throw new Error(`No active Black ${plan} subscriptions found`)
+
+const week = sql`YEARWEEK(${UsageTable.timeCreated}, 3)`
+const workspaceIDs = workspaces.map((row) => row.workspaceID)
+// Get subscription spend
+const spend = await Database.use((tx) =>
+ tx
+ .select({
+ workspaceID: UsageTable.workspaceID,
+ week,
+ amount: sql`COALESCE(SUM(${UsageTable.cost}), 0)`,
+ })
+ .from(UsageTable)
+ .where(
+ and(inArray(UsageTable.workspaceID, workspaceIDs), sql`JSON_UNQUOTE(JSON_EXTRACT(enrichment, '$.plan')) = 'sub'`),
+ )
+ .groupBy(UsageTable.workspaceID, week),
+)
+
+// Get pay per use spend
+const ppu = await Database.use((tx) =>
+ tx
+ .select({
+ workspaceID: UsageTable.workspaceID,
+ week,
+ amount: sql`COALESCE(SUM(${UsageTable.cost}), 0)`,
+ })
+ .from(UsageTable)
+ .where(
+ and(
+ inArray(UsageTable.workspaceID, workspaceIDs),
+ sql`(${UsageTable.enrichment} IS NULL OR JSON_UNQUOTE(JSON_EXTRACT(enrichment, '$.plan')) != 'sub')`,
+ ),
+ )
+ .groupBy(UsageTable.workspaceID, week),
+)
+
+const models = await Database.use((tx) =>
+ tx
+ .select({
+ workspaceID: UsageTable.workspaceID,
+ model: UsageTable.model,
+ amount: sql`COALESCE(SUM(${UsageTable.cost}), 0)`,
+ })
+ .from(UsageTable)
+ .where(
+ and(inArray(UsageTable.workspaceID, workspaceIDs), sql`JSON_UNQUOTE(JSON_EXTRACT(enrichment, '$.plan')) = 'sub'`),
+ )
+ .groupBy(UsageTable.workspaceID, UsageTable.model),
+)
+
+const tokens = await Database.use((tx) =>
+ tx
+ .select({
+ workspaceID: UsageTable.workspaceID,
+ week,
+ input: sql`COALESCE(SUM(${UsageTable.inputTokens}), 0)`,
+ cacheRead: sql`COALESCE(SUM(${UsageTable.cacheReadTokens}), 0)`,
+ output: sql`COALESCE(SUM(${UsageTable.outputTokens}), 0) + COALESCE(SUM(${UsageTable.reasoningTokens}), 0)`,
+ })
+ .from(UsageTable)
+ .where(
+ and(inArray(UsageTable.workspaceID, workspaceIDs), sql`JSON_UNQUOTE(JSON_EXTRACT(enrichment, '$.plan')) = 'sub'`),
+ )
+ .groupBy(UsageTable.workspaceID, week),
+)
+
+const allWeeks = [...spend, ...ppu].map((row) => row.week)
+const weeks = [...new Set(allWeeks)].sort((a, b) => a - b)
+const spendMap = new Map>()
+const totals = new Map()
+const ppuMap = new Map>()
+const ppuTotals = new Map()
+const modelMap = new Map()
+const tokenMap = new Map>()
+
+for (const row of spend) {
+ const workspace = spendMap.get(row.workspaceID) ?? new Map()
+ const total = totals.get(row.workspaceID) ?? 0
+ const amount = toNumber(row.amount)
+ workspace.set(row.week, amount)
+ totals.set(row.workspaceID, total + amount)
+ spendMap.set(row.workspaceID, workspace)
+}
+
+for (const row of ppu) {
+ const workspace = ppuMap.get(row.workspaceID) ?? new Map()
+ const total = ppuTotals.get(row.workspaceID) ?? 0
+ const amount = toNumber(row.amount)
+ workspace.set(row.week, amount)
+ ppuTotals.set(row.workspaceID, total + amount)
+ ppuMap.set(row.workspaceID, workspace)
+}
+
+for (const row of models) {
+ const current = modelMap.get(row.workspaceID) ?? []
+ current.push({ model: row.model, amount: toNumber(row.amount) })
+ modelMap.set(row.workspaceID, current)
+}
+
+for (const row of tokens) {
+ const workspace = tokenMap.get(row.workspaceID) ?? new Map()
+ workspace.set(row.week, {
+ input: toNumber(row.input),
+ cacheRead: toNumber(row.cacheRead),
+ output: toNumber(row.output),
+ })
+ tokenMap.set(row.workspaceID, workspace)
+}
+
+const users = await Database.use((tx) =>
+ tx
+ .select({
+ workspaceID: SubscriptionTable.workspaceID,
+ subscribed: SubscriptionTable.timeCreated,
+ subscription: BillingTable.subscription,
+ })
+ .from(SubscriptionTable)
+ .innerJoin(BillingTable, eq(SubscriptionTable.workspaceID, BillingTable.workspaceID))
+ .where(
+ and(inArray(SubscriptionTable.workspaceID, workspaceIDs), sql`${SubscriptionTable.timeCreated} <= ${cutoff}`),
+ ),
+)
+
+const counts = new Map()
+for (const user of users) {
+ const current = counts.get(user.workspaceID) ?? 0
+ counts.set(user.workspaceID, current + 1)
+}
+
+const rows = users
+ .map((user) => {
+ const workspace = spendMap.get(user.workspaceID) ?? new Map()
+ const ppuWorkspace = ppuMap.get(user.workspaceID) ?? new Map()
+ const count = counts.get(user.workspaceID) ?? 1
+ const amount = (totals.get(user.workspaceID) ?? 0) / count
+ const ppuAmount = (ppuTotals.get(user.workspaceID) ?? 0) / count
+ const monthStart = user.subscribed ? startOfMonth(user.subscribed) : null
+ const modelRows = (modelMap.get(user.workspaceID) ?? []).sort((a, b) => b.amount - a.amount).slice(0, 3)
+ const modelTotal = totals.get(user.workspaceID) ?? 0
+ const modelCells = modelRows.map((row) => ({
+ model: row.model,
+ percent: modelTotal > 0 ? `${((row.amount / modelTotal) * 100).toFixed(1)}%` : "0.0%",
+ }))
+ const modelData = [0, 1, 2].map((index) => modelCells[index] ?? { model: "-", percent: "-" })
+ const weekly = Object.fromEntries(
+ weeks.map((item) => {
+ const value = (workspace.get(item) ?? 0) / count
+ const beforeMonth = monthStart ? isoWeekStart(item) < monthStart : false
+ return [formatWeek(item), beforeMonth ? "-" : formatMicroCents(value)]
+ }),
+ )
+ const ppuWeekly = Object.fromEntries(
+ weeks.map((item) => {
+ const value = (ppuWorkspace.get(item) ?? 0) / count
+ const beforeMonth = monthStart ? isoWeekStart(item) < monthStart : false
+ return [formatWeek(item), beforeMonth ? "-" : formatMicroCents(value)]
+ }),
+ )
+ const tokenWorkspace = tokenMap.get(user.workspaceID) ?? new Map()
+ const weeklyTokens = Object.fromEntries(
+ weeks.map((item) => {
+ const t = tokenWorkspace.get(item) ?? { input: 0, cacheRead: 0, output: 0 }
+ const beforeMonth = monthStart ? isoWeekStart(item) < monthStart : false
+ return [
+ formatWeek(item),
+ beforeMonth
+ ? { input: "-", cacheRead: "-", output: "-" }
+ : {
+ input: Math.round(t.input / count),
+ cacheRead: Math.round(t.cacheRead / count),
+ output: Math.round(t.output / count),
+ },
+ ]
+ }),
+ )
+ return {
+ workspaceID: user.workspaceID,
+ useBalance: user.subscription?.useBalance ?? false,
+ subscribed: formatDate(user.subscribed),
+ subscribedAt: user.subscribed?.getTime() ?? 0,
+ amount,
+ ppuAmount,
+ models: modelData,
+ weekly,
+ ppuWeekly,
+ weeklyTokens,
+ }
+ })
+ .sort((a, b) => a.subscribedAt - b.subscribedAt)
+
+console.log(`Black ${plan} subscribers: ${rows.length}`)
+const header = [
+ "workspaceID",
+ "subscribed",
+ "useCredit",
+ "subTotal",
+ "ppuTotal",
+ "model1",
+ "model1%",
+ "model2",
+ "model2%",
+ "model3",
+ "model3%",
+ ...weeks.flatMap((item) => [
+ formatWeek(item) + " sub",
+ formatWeek(item) + " ppu",
+ formatWeek(item) + " input",
+ formatWeek(item) + " cache",
+ formatWeek(item) + " output",
+ ]),
+]
+const lines = [header.map(csvCell).join(",")]
+for (const row of rows) {
+ const model1 = row.models[0]
+ const model2 = row.models[1]
+ const model3 = row.models[2]
+ const cells = [
+ row.workspaceID,
+ row.subscribed ?? "",
+ row.useBalance ? "yes" : "no",
+ formatMicroCents(row.amount),
+ formatMicroCents(row.ppuAmount),
+ model1.model,
+ model1.percent,
+ model2.model,
+ model2.percent,
+ model3.model,
+ model3.percent,
+ ...weeks.flatMap((item) => {
+ const t = row.weeklyTokens[formatWeek(item)] ?? { input: "-", cacheRead: "-", output: "-" }
+ return [
+ row.weekly[formatWeek(item)] ?? "",
+ row.ppuWeekly[formatWeek(item)] ?? "",
+ String(t.input),
+ String(t.cacheRead),
+ String(t.output),
+ ]
+ }),
+ ]
+ lines.push(cells.map(csvCell).join(","))
+}
+const output = `${lines.join("\n")}\n`
+const file = Bun.file(`black-stats-${plan}.csv`)
+await file.write(output)
+console.log(`Wrote ${lines.length - 1} rows to ${file.name}`)
+const total = rows.reduce((sum, row) => sum + row.amount, 0)
+const average = rows.length === 0 ? 0 : total / rows.length
+console.log(`Average spending per user: ${formatMicroCents(average)}`)
+
+function formatMicroCents(value: number) {
+ return `$${(value / 100000000).toFixed(2)}`
+}
+
+function formatDate(value: Date | null | undefined) {
+ if (!value) return null
+ return value.toISOString().split("T")[0]
+}
+
+function formatWeek(value: number) {
+ return formatDate(isoWeekStart(value)) ?? ""
+}
+
+function startOfMonth(value: Date) {
+ return new Date(Date.UTC(value.getUTCFullYear(), value.getUTCMonth(), 1))
+}
+
+function isoWeekStart(value: number) {
+ const year = Math.floor(value / 100)
+ const weekNumber = value % 100
+ const jan4 = new Date(Date.UTC(year, 0, 4))
+ const day = jan4.getUTCDay() || 7
+ const weekStart = new Date(Date.UTC(year, 0, 4 - (day - 1)))
+ weekStart.setUTCDate(weekStart.getUTCDate() + (weekNumber - 1) * 7)
+ return weekStart
+}
+
+function toNumber(value: unknown) {
+ if (typeof value === "number") return value
+ if (typeof value === "bigint") return Number(value)
+ if (typeof value === "string") return Number(value)
+ return 0
+}
+
+function csvCell(value: string | number) {
+ const text = String(value)
+ if (!/[",\n]/.test(text)) return text
+ return `"${text.replace(/"/g, '""')}"`
+}
diff --git a/packages/console/core/script/black-transfer.ts b/packages/console/core/script/black-transfer.ts
new file mode 100644
index 0000000..e962ba5
--- /dev/null
+++ b/packages/console/core/script/black-transfer.ts
@@ -0,0 +1,163 @@
+import { Billing } from "../src/billing.js"
+import { and, Database, desc, eq, isNotNull, lt, sql } from "../src/drizzle/index.js"
+import { BillingTable, PaymentTable, SubscriptionTable } from "../src/schema/billing.sql.js"
+
+const fromWrkID = process.argv[2]
+const toWrkID = process.argv[3]
+
+if (!fromWrkID || !toWrkID) {
+ console.error("Usage: bun foo.ts ")
+ process.exit(1)
+}
+
+console.log(`Transferring subscription from ${fromWrkID} to ${toWrkID}`)
+
+// Look up the FROM workspace billing
+const fromBilling = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: BillingTable.customerID,
+ subscriptionID: BillingTable.subscriptionID,
+ subscription: BillingTable.subscription,
+ paymentMethodID: BillingTable.paymentMethodID,
+ paymentMethodType: BillingTable.paymentMethodType,
+ paymentMethodLast4: BillingTable.paymentMethodLast4,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, fromWrkID))
+ .then((rows) => rows[0]),
+)
+if (!fromBilling) throw new Error(`Error: FROM workspace has no billing record`)
+if (!fromBilling.customerID) throw new Error(`Error: FROM workspace has no Stripe customer ID`)
+if (!fromBilling.subscriptionID) throw new Error(`Error: FROM workspace has no subscription`)
+
+const fromSubscription = await Database.use((tx) =>
+ tx
+ .select({ userID: SubscriptionTable.userID })
+ .from(SubscriptionTable)
+ .where(eq(SubscriptionTable.workspaceID, fromWrkID))
+ .then((rows) => rows[0]),
+)
+if (!fromSubscription) throw new Error(`Error: FROM workspace has no subscription`)
+
+// Look up the previous customer ID in FROM workspace
+const subscriptionPayment = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: PaymentTable.customerID,
+ timeCreated: PaymentTable.timeCreated,
+ })
+ .from(PaymentTable)
+ .where(and(eq(PaymentTable.workspaceID, fromWrkID), sql`JSON_EXTRACT(enrichment, '$.type') = 'subscription'`))
+ .then((rows) => {
+ if (rows.length > 1) {
+ console.error(`Error: Multiple subscription payments found for workspace ${fromWrkID}`)
+ process.exit(1)
+ }
+ return rows[0]
+ }),
+)
+const fromPrevPayment = await Database.use((tx) =>
+ tx
+ .select({ customerID: PaymentTable.customerID })
+ .from(PaymentTable)
+ .where(
+ and(
+ eq(PaymentTable.workspaceID, fromWrkID),
+ isNotNull(PaymentTable.customerID),
+ lt(PaymentTable.timeCreated, subscriptionPayment.timeCreated),
+ ),
+ )
+ .orderBy(desc(PaymentTable.timeCreated))
+ .limit(1)
+ .then((rows) => rows[0]),
+)
+if (!fromPrevPayment?.customerID) throw new Error(`Error: FROM workspace has no previous Stripe customer to revert to`)
+if (fromPrevPayment.customerID === fromBilling.customerID)
+ throw new Error(`Error: FROM workspace has the same Stripe customer ID as the current one`)
+
+const fromPrevPaymentMethods = await Billing.stripe().customers.listPaymentMethods(fromPrevPayment.customerID, {})
+if (fromPrevPaymentMethods.data.length === 0)
+ throw new Error(`Error: FROM workspace has no previous Stripe payment methods`)
+
+// Look up the TO workspace billing
+const toBilling = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: BillingTable.customerID,
+ subscriptionID: BillingTable.subscriptionID,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, toWrkID))
+ .then((rows) => rows[0]),
+)
+if (!toBilling) throw new Error(`Error: TO workspace has no billing record`)
+if (toBilling.subscriptionID) throw new Error(`Error: TO workspace already has a subscription`)
+
+console.log(`FROM:`)
+console.log(` Old Customer ID: ${fromBilling.customerID}`)
+console.log(` New Customer ID: ${fromPrevPayment.customerID}`)
+console.log(`TO:`)
+console.log(` Old Customer ID: ${toBilling.customerID}`)
+console.log(` New Customer ID: ${fromBilling.customerID}`)
+
+// Clear workspaceID from Stripe customer metadata
+await Billing.stripe().customers.update(fromPrevPayment.customerID, {
+ metadata: {
+ workspaceID: fromWrkID,
+ },
+})
+await Billing.stripe().customers.update(fromBilling.customerID, {
+ metadata: {
+ workspaceID: toWrkID,
+ },
+})
+
+await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ customerID: fromPrevPayment.customerID,
+ subscriptionID: null,
+ subscription: null,
+ paymentMethodID: fromPrevPaymentMethods.data[0].id,
+ paymentMethodLast4: fromPrevPaymentMethods.data[0].card?.last4 ?? null,
+ paymentMethodType: fromPrevPaymentMethods.data[0].type,
+ })
+ .where(eq(BillingTable.workspaceID, fromWrkID))
+
+ await tx
+ .update(BillingTable)
+ .set({
+ customerID: fromBilling.customerID,
+ subscriptionID: fromBilling.subscriptionID,
+ subscription: fromBilling.subscription,
+ paymentMethodID: fromBilling.paymentMethodID,
+ paymentMethodLast4: fromBilling.paymentMethodLast4,
+ paymentMethodType: fromBilling.paymentMethodType,
+ })
+ .where(eq(BillingTable.workspaceID, toWrkID))
+
+ await tx
+ .update(SubscriptionTable)
+ .set({
+ workspaceID: toWrkID,
+ userID: fromSubscription.userID,
+ })
+ .where(eq(SubscriptionTable.workspaceID, fromWrkID))
+
+ await tx
+ .update(PaymentTable)
+ .set({
+ workspaceID: toWrkID,
+ })
+ .where(
+ and(
+ eq(PaymentTable.workspaceID, fromWrkID),
+ sql`JSON_EXTRACT(enrichment, '$.type') = 'subscription'`,
+ eq(PaymentTable.amount, 20000000000),
+ ),
+ )
+})
+
+console.log(`done`)
diff --git a/packages/console/core/script/create-api-key.ts b/packages/console/core/script/create-api-key.ts
new file mode 100644
index 0000000..dba2ee9
--- /dev/null
+++ b/packages/console/core/script/create-api-key.ts
@@ -0,0 +1,146 @@
+import { Resource } from "@opencode-ai/console-resource"
+import { and, Database, eq, isNull } from "../src/drizzle/index.js"
+import { Identifier } from "../src/identifier.js"
+import { AccountTable } from "../src/schema/account.sql.js"
+import { AuthTable } from "../src/schema/auth.sql.js"
+import { BillingTable } from "../src/schema/billing.sql.js"
+import { KeyTable } from "../src/schema/key.sql.js"
+import { UserTable } from "../src/schema/user.sql.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+import { centsToMicroCents } from "../src/util/price.js"
+
+const args = parseArgs(process.argv.slice(2))
+if (!args.email) {
+ console.error(
+ "Usage: bun script/create-api-key.ts --email [--workspace-id ] [--workspace-name ] [--key-name ] [--balance-dollars ] [--allow-production]",
+ )
+ process.exit(1)
+}
+if (Resource.App.stage === "production" && !args.allowProduction) {
+ throw new Error("Refusing to create a production API key without --allow-production")
+}
+
+const result = await Database.transaction(async (tx) => {
+ const auth = await tx
+ .select()
+ .from(AuthTable)
+ .where(and(eq(AuthTable.provider, "email"), eq(AuthTable.subject, args.email)))
+ .then((rows) => rows[0])
+ const accountID = auth?.accountID ?? Identifier.create("account")
+ if (!auth) {
+ await tx.insert(AccountTable).values({ id: accountID })
+ await tx.insert(AuthTable).values({
+ id: Identifier.create("auth"),
+ provider: "email",
+ subject: args.email,
+ accountID,
+ })
+ }
+
+ const workspace = args.workspaceID
+ ? await tx
+ .select()
+ .from(WorkspaceTable)
+ .where(eq(WorkspaceTable.id, args.workspaceID))
+ .then((rows) => rows[0])
+ : await tx
+ .select({ workspace: WorkspaceTable })
+ .from(UserTable)
+ .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, UserTable.workspaceID))
+ .where(and(eq(UserTable.accountID, accountID), isNull(UserTable.timeDeleted)))
+ .then((rows) => rows[0]?.workspace)
+ if (args.workspaceID && !workspace) throw new Error(`Workspace not found: ${args.workspaceID}`)
+ const workspaceID = workspace?.id ?? Identifier.create("workspace")
+ if (!workspace) {
+ await tx.insert(WorkspaceTable).values({
+ id: workspaceID,
+ slug: null,
+ name: args.workspaceName ?? `${args.email} manual`,
+ })
+ }
+
+ const user = await tx
+ .select()
+ .from(UserTable)
+ .where(
+ and(eq(UserTable.workspaceID, workspaceID), eq(UserTable.accountID, accountID), isNull(UserTable.timeDeleted)),
+ )
+ .then((rows) => rows[0])
+ const userID = user?.id ?? Identifier.create("user")
+ if (!user) {
+ await tx.insert(UserTable).values({
+ id: userID,
+ workspaceID,
+ accountID,
+ email: args.email,
+ name: args.email,
+ role: "admin",
+ })
+ }
+
+ const balance = centsToMicroCents(args.balanceDollars * 100)
+ const billing = await tx
+ .select()
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0])
+ if (!billing) {
+ await tx.insert(BillingTable).values({
+ id: Identifier.create("billing"),
+ workspaceID,
+ balance,
+ })
+ } else if (billing.balance < balance) {
+ await tx.update(BillingTable).set({ balance }).where(eq(BillingTable.workspaceID, workspaceID))
+ }
+
+ const secretKey = createSecretKey()
+ const keyID = Identifier.create("key")
+ await tx.insert(KeyTable).values({
+ id: keyID,
+ workspaceID,
+ userID,
+ name: args.keyName ?? "Manual API Key",
+ key: secretKey,
+ timeUsed: null,
+ })
+
+ return { accountID, workspaceID, userID, keyID, secretKey }
+})
+
+console.log(JSON.stringify({ stage: Resource.App.stage, ...result }, null, 2))
+
+function createSecretKey() {
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ const values = new Uint32Array(64)
+ crypto.getRandomValues(values)
+ return `sk-${Array.from(values, (value) => chars[value % chars.length]).join("")}`
+}
+
+function parseArgs(argv: string[]) {
+ const parsed = {
+ email: "",
+ workspaceID: "",
+ workspaceName: "",
+ keyName: "",
+ balanceDollars: 100,
+ allowProduction: false,
+ }
+ for (let index = 0; index < argv.length; index++) {
+ const arg = argv[index]
+ if (arg === "--email") parsed.email = requiredValue(argv, ++index, arg)
+ if (arg === "--workspace-id") parsed.workspaceID = requiredValue(argv, ++index, arg)
+ if (arg === "--workspace-name") parsed.workspaceName = requiredValue(argv, ++index, arg)
+ if (arg === "--key-name") parsed.keyName = requiredValue(argv, ++index, arg)
+ if (arg === "--balance-dollars") parsed.balanceDollars = Number(requiredValue(argv, ++index, arg))
+ if (arg === "--allow-production") parsed.allowProduction = true
+ }
+ if (!Number.isFinite(parsed.balanceDollars) || parsed.balanceDollars < 0) throw new Error("Invalid --balance-dollars")
+ return parsed
+}
+
+function requiredValue(argv: string[], index: number, arg: string) {
+ const value = argv[index]
+ if (!value || value.startsWith("--")) throw new Error(`Missing value for ${arg}`)
+ return value
+}
diff --git a/packages/console/core/script/create-coupon.ts b/packages/console/core/script/create-coupon.ts
new file mode 100644
index 0000000..e133379
--- /dev/null
+++ b/packages/console/core/script/create-coupon.ts
@@ -0,0 +1,24 @@
+import { Database } from "../src/drizzle/index.js"
+import { CouponTable, CouponType } from "../src/schema/billing.sql.js"
+
+const email = process.argv[2]
+const type = process.argv[3] as (typeof CouponType)[number]
+
+if (!email || !type) {
+ console.error(`Usage: bun create-coupon.ts <${CouponType.join("|")}>`)
+ process.exit(1)
+}
+
+if (!(CouponType as readonly string[]).includes(type)) {
+ console.error(`Error: type must be one of ${CouponType.join(", ")}`)
+ process.exit(1)
+}
+
+await Database.use((tx) =>
+ tx.insert(CouponTable).values({
+ email,
+ type,
+ }),
+)
+
+console.log(`Created ${type} coupon for ${email}`)
diff --git a/packages/console/core/script/credit-workspace.ts b/packages/console/core/script/credit-workspace.ts
new file mode 100644
index 0000000..ad2404f
--- /dev/null
+++ b/packages/console/core/script/credit-workspace.ts
@@ -0,0 +1,35 @@
+import { Billing } from "../src/billing.js"
+import { Database, eq } from "../src/drizzle/index.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+
+// get input from command line
+const workspaceID = process.argv[2]
+const dollarAmount = process.argv[3]
+
+if (!workspaceID || !dollarAmount) {
+ console.error("Usage: bun credit-workspace.ts ")
+ process.exit(1)
+}
+
+// check workspace exists
+const workspace = await Database.use((tx) =>
+ tx
+ .select()
+ .from(WorkspaceTable)
+ .where(eq(WorkspaceTable.id, workspaceID))
+ .then((rows) => rows[0]),
+)
+if (!workspace) {
+ console.error("Error: Workspace not found")
+ process.exit(1)
+}
+
+const amountInDollars = parseFloat(dollarAmount)
+if (isNaN(amountInDollars) || amountInDollars <= 0) {
+ console.error("Error: dollarAmount must be a positive number")
+ process.exit(1)
+}
+
+await Billing.grantCredit(workspaceID, amountInDollars)
+
+console.log(`Added payment of $${amountInDollars.toFixed(2)} to workspace ${workspaceID}`)
diff --git a/packages/console/core/script/disable-reload.ts b/packages/console/core/script/disable-reload.ts
new file mode 100644
index 0000000..860739e
--- /dev/null
+++ b/packages/console/core/script/disable-reload.ts
@@ -0,0 +1,34 @@
+import { Database, eq } from "../src/drizzle/index.js"
+import { BillingTable } from "../src/schema/billing.sql.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+
+const workspaceID = process.argv[2]
+
+if (!workspaceID) {
+ console.error("Usage: bun disable-reload.ts ")
+ process.exit(1)
+}
+
+const billing = await Database.use((tx) =>
+ tx
+ .select({ reload: BillingTable.reload })
+ .from(BillingTable)
+ .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, BillingTable.workspaceID))
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0]),
+)
+if (!billing) {
+ console.error("Error: Workspace or billing record not found")
+ process.exit(1)
+}
+
+if (!billing.reload) {
+ console.log(`Reload is already disabled for workspace ${workspaceID}`)
+ process.exit(0)
+}
+
+await Database.use((tx) =>
+ tx.update(BillingTable).set({ reload: false }).where(eq(BillingTable.workspaceID, workspaceID)),
+)
+
+console.log(`Disabled reload for workspace ${workspaceID}`)
diff --git a/packages/console/core/script/freeze-workspace.ts b/packages/console/core/script/freeze-workspace.ts
new file mode 100644
index 0000000..d2ccf21
--- /dev/null
+++ b/packages/console/core/script/freeze-workspace.ts
@@ -0,0 +1,39 @@
+import { Billing } from "../src/billing.js"
+import { Database, eq } from "../src/drizzle/index.js"
+import { BillingTable } from "../src/schema/billing.sql.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+import { microCentsToCents } from "../src/util/price.js"
+
+// get input from command line
+const workspaceID = process.argv[2]
+
+if (!workspaceID) {
+ console.error("Usage: bun freeze-workspace.ts ")
+ process.exit(1)
+}
+
+// check workspace exists
+const workspace = await Database.use((tx) =>
+ tx
+ .select()
+ .from(WorkspaceTable)
+ .where(eq(WorkspaceTable.id, workspaceID))
+ .then((rows) => rows[0]),
+)
+if (!workspace) {
+ console.error("Error: Workspace not found")
+ process.exit(1)
+}
+
+const billing = await Database.use((tx) =>
+ tx
+ .select()
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ .then((rows) => rows[0]),
+)
+
+const amountInDollars = microCentsToCents(billing.balance) / 100
+await Billing.grantCredit(workspaceID, 0 - amountInDollars)
+
+console.log(`Removed payment of $${amountInDollars.toFixed(2)} from workspace ${workspaceID}`)
diff --git a/packages/console/core/script/lookup-user.ts b/packages/console/core/script/lookup-user.ts
new file mode 100644
index 0000000..db783aa
--- /dev/null
+++ b/packages/console/core/script/lookup-user.ts
@@ -0,0 +1,386 @@
+import { Database, and, eq, sql } from "../src/drizzle/index.js"
+import { AuthTable } from "../src/schema/auth.sql.js"
+import { UserTable } from "../src/schema/user.sql.js"
+import {
+ BillingTable,
+ PaymentTable,
+ SubscriptionTable,
+ BlackPlans,
+ UsageTable,
+ LiteTable,
+} from "../src/schema/billing.sql.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+import { KeyTable } from "../src/schema/key.sql.js"
+import { BlackData } from "../src/black.js"
+import { centsToMicroCents } from "../src/util/price.js"
+import { getWeekBounds } from "../src/util/date.js"
+import { ModelTable } from "../src/schema/model.sql.js"
+
+// get input from command line
+const identifier = process.argv[2]
+const verbose = process.argv[process.argv.length - 1] === "-v"
+if (!identifier) {
+ console.error("Usage: bun lookup-user.ts [-v]")
+ process.exit(1)
+}
+
+// loop up by workspace ID
+if (identifier.startsWith("wrk_")) {
+ await printWorkspace(identifier)
+}
+// lookup by API key ID
+else if (identifier.startsWith("key_")) {
+ const key = await Database.use((tx) =>
+ tx
+ .select()
+ .from(KeyTable)
+ .where(eq(KeyTable.id, identifier))
+ .then((rows) => rows[0]),
+ )
+ if (!key) {
+ console.error("API key not found")
+ process.exit(1)
+ }
+ await printWorkspace(key.workspaceID)
+}
+// lookup by API key value
+else if (identifier.startsWith("sk-")) {
+ const key = await Database.use((tx) =>
+ tx
+ .select()
+ .from(KeyTable)
+ .where(eq(KeyTable.key, identifier))
+ .then((rows) => rows[0]),
+ )
+ if (!key) {
+ console.error("API key not found")
+ process.exit(1)
+ }
+ await printWorkspace(key.workspaceID)
+}
+// lookup by email
+else {
+ const authData = await Database.use(async (tx) =>
+ tx.select().from(AuthTable).where(eq(AuthTable.subject, identifier)),
+ )
+ if (authData.length === 0) {
+ console.error("Email not found")
+ process.exit(1)
+ }
+ if (authData.length > 1) console.warn("Multiple users found for email", identifier)
+
+ // Get all auth records for email
+ const accountID = authData[0].accountID
+ await printTable("Auth", (tx) => tx.select().from(AuthTable).where(eq(AuthTable.accountID, accountID)))
+
+ // Get all workspaces for this account
+ const users = await printTable("Workspaces", (tx) =>
+ tx
+ .select({
+ userID: UserTable.id,
+ workspaceID: UserTable.workspaceID,
+ workspaceName: WorkspaceTable.name,
+ role: UserTable.role,
+ black: SubscriptionTable.timeCreated,
+ lite: LiteTable.timeCreated,
+ })
+ .from(UserTable)
+ .rightJoin(WorkspaceTable, eq(WorkspaceTable.id, UserTable.workspaceID))
+ .leftJoin(SubscriptionTable, eq(SubscriptionTable.userID, UserTable.id))
+ .leftJoin(LiteTable, eq(LiteTable.userID, UserTable.id))
+ .where(eq(UserTable.accountID, accountID))
+ .then((rows) =>
+ rows.map((row) => ({
+ userID: row.userID,
+ workspaceID: row.workspaceID,
+ workspaceName: row.workspaceName,
+ role: row.role,
+ black: formatDate(row.black),
+ lite: formatDate(row.lite),
+ })),
+ ),
+ )
+
+ for (const user of users) {
+ await printWorkspace(user.workspaceID)
+ }
+}
+
+async function printWorkspace(workspaceID: string) {
+ const workspace = await Database.use((tx) =>
+ tx
+ .select()
+ .from(WorkspaceTable)
+ .where(eq(WorkspaceTable.id, workspaceID))
+ .then((rows) => rows[0]),
+ )
+
+ printHeader(`Workspace "${workspace.name}" (${workspace.id})`)
+
+ await printTable("Users", (tx) =>
+ tx
+ .select({
+ authEmail: AuthTable.subject,
+ inviteEmail: UserTable.email,
+ role: UserTable.role,
+ timeSeen: UserTable.timeSeen,
+ monthlyLimit: UserTable.monthlyLimit,
+ monthlyUsage: UserTable.monthlyUsage,
+ timeDeleted: UserTable.timeDeleted,
+ fixedUsage: SubscriptionTable.fixedUsage,
+ rollingUsage: SubscriptionTable.rollingUsage,
+ timeFixedUpdated: SubscriptionTable.timeFixedUpdated,
+ timeRollingUpdated: SubscriptionTable.timeRollingUpdated,
+ timeSubscriptionCreated: SubscriptionTable.timeCreated,
+ subscription: BillingTable.subscription,
+ })
+ .from(UserTable)
+ .innerJoin(BillingTable, eq(BillingTable.workspaceID, workspace.id))
+ .leftJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .leftJoin(SubscriptionTable, eq(SubscriptionTable.userID, UserTable.id))
+ .where(eq(UserTable.workspaceID, workspace.id))
+ .then((rows) =>
+ rows.map((row) => {
+ const subStatus = getSubscriptionStatus(row)
+ return {
+ email: (row.timeDeleted ? "❌ " : "") + (row.authEmail ?? row.inviteEmail),
+ role: row.role,
+ timeSeen: formatDate(row.timeSeen),
+ monthly: formatMonthlyUsage(row.monthlyUsage, row.monthlyLimit),
+ subscribed: formatDate(row.timeSubscriptionCreated),
+ subWeekly: subStatus.weekly,
+ subRolling: subStatus.rolling,
+ rateLimited: subStatus.rateLimited,
+ retryIn: subStatus.retryIn,
+ }
+ }),
+ ),
+ )
+
+ await printTable("Billing", (tx) =>
+ tx
+ .select({
+ balance: BillingTable.balance,
+ customerID: BillingTable.customerID,
+ reload: BillingTable.reload,
+ blackSubscriptionID: BillingTable.subscriptionID,
+ blackSubscription: {
+ plan: BillingTable.subscriptionPlan,
+ booked: BillingTable.timeSubscriptionBooked,
+ enrichment: BillingTable.subscription,
+ },
+ timeBlackSubscriptionSelected: BillingTable.timeSubscriptionSelected,
+ liteSubscriptionID: BillingTable.liteSubscriptionID,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, workspace.id))
+ .then(
+ (rows) =>
+ rows.map((row) => ({
+ balance: `$${(row.balance / 100000000).toFixed(2)}`,
+ reload: row.reload ? "yes" : "no",
+ customerID: row.customerID,
+ GO: row.liteSubscriptionID,
+ Black: row.blackSubscriptionID
+ ? [
+ `Black ${row.blackSubscription.enrichment!.plan}`,
+ row.blackSubscription.enrichment!.seats > 1
+ ? `X ${row.blackSubscription.enrichment!.seats} seats`
+ : "",
+ row.blackSubscription.enrichment!.coupon
+ ? `(coupon: ${row.blackSubscription.enrichment!.coupon})`
+ : "",
+ `(ref: ${row.blackSubscriptionID})`,
+ ].join(" ")
+ : row.blackSubscription.booked
+ ? `Waitlist ${row.blackSubscription.plan} plan${row.timeBlackSubscriptionSelected ? " (selected)" : ""}`
+ : undefined,
+ }))[0],
+ ),
+ )
+
+ await printTable("Payments", (tx) =>
+ tx
+ .select({
+ amount: PaymentTable.amount,
+ paymentID: PaymentTable.paymentID,
+ invoiceID: PaymentTable.invoiceID,
+ customerID: PaymentTable.customerID,
+ timeCreated: PaymentTable.timeCreated,
+ timeRefunded: PaymentTable.timeRefunded,
+ })
+ .from(PaymentTable)
+ .where(eq(PaymentTable.workspaceID, workspace.id))
+ .orderBy(sql`${PaymentTable.timeCreated} DESC`)
+ .limit(100)
+ .then((rows) =>
+ rows.map((row) => ({
+ ...row,
+ amount: `$${(row.amount / 100000000).toFixed(2)}`,
+ paymentID: row.paymentID
+ ? `https://dashboard.stripe.com/acct_1RszBH2StuRr0lbX/payments/${row.paymentID}`
+ : null,
+ })),
+ ),
+ )
+
+ if (verbose) {
+ await printTable("28-Day Usage", (tx) =>
+ tx
+ .select({
+ date: sql`DATE(${UsageTable.timeCreated})`.as("date"),
+ requests: sql`COUNT(*)`.as("requests"),
+ inputTokens: sql`SUM(${UsageTable.inputTokens})`.as("input_tokens"),
+ outputTokens: sql`SUM(${UsageTable.outputTokens})`.as("output_tokens"),
+ reasoningTokens: sql`SUM(${UsageTable.reasoningTokens})`.as("reasoning_tokens"),
+ cacheReadTokens: sql`SUM(${UsageTable.cacheReadTokens})`.as("cache_read_tokens"),
+ cacheWrite5mTokens: sql`SUM(${UsageTable.cacheWrite5mTokens})`.as("cache_write_5m_tokens"),
+ cacheWrite1hTokens: sql`SUM(${UsageTable.cacheWrite1hTokens})`.as("cache_write_1h_tokens"),
+ cost: sql`SUM(${UsageTable.cost})`.as("cost"),
+ })
+ .from(UsageTable)
+ .where(
+ and(
+ eq(UsageTable.workspaceID, workspace.id),
+ sql`${UsageTable.timeCreated} >= DATE_SUB(NOW(), INTERVAL 28 DAY)`,
+ ),
+ )
+ .groupBy(sql`DATE(${UsageTable.timeCreated})`)
+ .orderBy(sql`DATE(${UsageTable.timeCreated}) DESC`)
+ .then((rows) => {
+ const totalCost = rows.reduce((sum, r) => sum + Number(r.cost), 0)
+ const mapped = rows.map((row) => ({
+ ...row,
+ cost: `$${(Number(row.cost) / 100000000).toFixed(2)}`,
+ }))
+ if (mapped.length > 0) {
+ mapped.push({
+ date: "TOTAL",
+ requests: null as any,
+ inputTokens: null as any,
+ outputTokens: null as any,
+ reasoningTokens: null as any,
+ cacheReadTokens: null as any,
+ cacheWrite5mTokens: null as any,
+ cacheWrite1hTokens: null as any,
+ cost: `$${(totalCost / 100000000).toFixed(2)}`,
+ })
+ }
+ return mapped
+ }),
+ )
+ await printTable("Disabled Models", (tx) =>
+ tx
+ .select({
+ model: ModelTable.model,
+ timeCreated: ModelTable.timeCreated,
+ })
+ .from(ModelTable)
+ .where(eq(ModelTable.workspaceID, workspace.id))
+ .orderBy(sql`${ModelTable.timeCreated} DESC`)
+ .then((rows) =>
+ rows.map((row) => ({
+ model: row.model,
+ timeCreated: formatDate(row.timeCreated),
+ })),
+ ),
+ )
+ }
+}
+
+function formatMicroCents(value: number | null | undefined) {
+ if (value === null || value === undefined) return null
+ return `$${(value / 100000000).toFixed(2)}`
+}
+
+function formatDate(value: Date | null | undefined) {
+ if (!value) return null
+ return value.toISOString().split("T")[0]
+}
+
+function formatMonthlyUsage(usage: number | null | undefined, limit: number | null | undefined) {
+ const usageText = formatMicroCents(usage) ?? "$0.00"
+ if (limit === null || limit === undefined) return `${usageText} / no limit`
+ return `${usageText} / $${limit.toFixed(2)}`
+}
+
+function formatRetryTime(seconds: number) {
+ const days = Math.floor(seconds / 86400)
+ if (days >= 1) return `${days} day${days > 1 ? "s" : ""}`
+ const hours = Math.floor(seconds / 3600)
+ const minutes = Math.ceil((seconds % 3600) / 60)
+ if (hours >= 1) return `${hours}hr ${minutes}min`
+ return `${minutes}min`
+}
+
+function getSubscriptionStatus(row: {
+ subscription: {
+ plan: (typeof BlackPlans)[number]
+ } | null
+ timeSubscriptionCreated: Date | null
+ fixedUsage: number | null
+ rollingUsage: number | null
+ timeFixedUpdated: Date | null
+ timeRollingUpdated: Date | null
+}) {
+ if (!row.timeSubscriptionCreated || !row.subscription) {
+ return { weekly: null, rolling: null, rateLimited: null, retryIn: null }
+ }
+
+ const black = BlackData.getLimits({ plan: row.subscription.plan })
+ const now = new Date()
+ const week = getWeekBounds(now)
+
+ const fixedLimit = black.fixedLimit ? centsToMicroCents(black.fixedLimit * 100) : null
+ const rollingLimit = black.rollingLimit ? centsToMicroCents(black.rollingLimit * 100) : null
+ const rollingWindowMs = (black.rollingWindow ?? 5) * 3600 * 1000
+
+ // Calculate current weekly usage (reset if outside current week)
+ const currentWeekly =
+ row.fixedUsage && row.timeFixedUpdated && row.timeFixedUpdated >= week.start ? row.fixedUsage : 0
+
+ // Calculate current rolling usage
+ const windowStart = new Date(now.getTime() - rollingWindowMs)
+ const currentRolling =
+ row.rollingUsage && row.timeRollingUpdated && row.timeRollingUpdated >= windowStart ? row.rollingUsage : 0
+
+ // Check rate limiting
+ const isWeeklyLimited = fixedLimit !== null && currentWeekly >= fixedLimit
+ const isRollingLimited = rollingLimit !== null && currentRolling >= rollingLimit
+
+ let retryIn: string | null = null
+ if (isWeeklyLimited) {
+ const retryAfter = Math.ceil((week.end.getTime() - now.getTime()) / 1000)
+ retryIn = formatRetryTime(retryAfter)
+ } else if (isRollingLimited && row.timeRollingUpdated) {
+ const retryAfter = Math.ceil((row.timeRollingUpdated.getTime() + rollingWindowMs - now.getTime()) / 1000)
+ retryIn = formatRetryTime(retryAfter)
+ }
+
+ return {
+ weekly: fixedLimit !== null ? `${formatMicroCents(currentWeekly)} / $${black.fixedLimit}` : null,
+ rolling: rollingLimit !== null ? `${formatMicroCents(currentRolling)} / $${black.rollingLimit}` : null,
+ rateLimited: isWeeklyLimited || isRollingLimited ? "yes" : "no",
+ retryIn,
+ }
+}
+
+function printHeader(title: string) {
+ console.log()
+ console.log("─".repeat(title.length))
+ console.log(`${title}`)
+ console.log("─".repeat(title.length))
+}
+
+function printTable(title: string, callback: (tx: Database.TxOrDb) => Promise): Promise {
+ return Database.use(async (tx) => {
+ const data = await callback(tx)
+ console.log(`\n== ${title} ==`)
+ if (data.length === 0) {
+ console.log("(no data)")
+ } else {
+ console.table(data)
+ }
+ return data
+ })
+}
diff --git a/packages/console/core/script/promote-limits.ts b/packages/console/core/script/promote-limits.ts
new file mode 100755
index 0000000..55dabdb
--- /dev/null
+++ b/packages/console/core/script/promote-limits.ts
@@ -0,0 +1,22 @@
+#!/usr/bin/env bun
+
+import { $ } from "bun"
+import path from "path"
+import { Subscription } from "../src/subscription"
+
+const stage = process.argv[2]
+if (!stage) throw new Error("Stage is required")
+
+const root = path.resolve(process.cwd(), "..", "..", "..")
+
+// read the secret
+const ret = await $`bun sst secret list --fallback`.cwd(root).text()
+const lines = ret.split("\n")
+const value = lines.find((line) => line.startsWith("ZEN_LIMITS"))?.split("=")[1]
+if (!value) throw new Error("ZEN_LIMITS not found")
+
+// validate value
+Subscription.validate(JSON.parse(value))
+
+// update the secret
+await $`bun sst secret set ZEN_LIMITS ${value} --stage ${stage}`
diff --git a/packages/console/core/script/promote-models.ts b/packages/console/core/script/promote-models.ts
new file mode 100755
index 0000000..28db364
--- /dev/null
+++ b/packages/console/core/script/promote-models.ts
@@ -0,0 +1,33 @@
+#!/usr/bin/env bun
+
+import { $ } from "bun"
+import path from "path"
+import os from "os"
+import { ZenData } from "../src/model"
+
+const stage = process.argv[2]
+if (!stage) throw new Error("Stage is required")
+
+const root = path.resolve(process.cwd(), "..", "..", "..")
+const PARTS = 30
+
+// read the secret
+const ret = await $`bun sst secret list --stage frank`.cwd(root).text()
+const lines = ret.split("\n")
+const values = Array.from({ length: PARTS }, (_, i) => {
+ const value = lines
+ .find((line) => line.startsWith(`ZEN_MODELS${i + 1}=`))
+ ?.split("=")
+ .slice(1)
+ .join("=")
+ if (!value) throw new Error(`ZEN_MODELS${i + 1} not found`)
+ return value
+})
+
+// validate value
+ZenData.validate(JSON.parse(values.join("")))
+
+// update the secret
+const envFile = Bun.file(path.join(os.tmpdir(), `models-${Date.now()}.env`))
+await envFile.write(values.map((v, i) => `ZEN_MODELS${i + 1}="${v.replace(/"/g, '\\"')}"`).join("\n"))
+await $`bun sst secret load ${envFile.name} --stage ${stage}`.cwd(root)
diff --git a/packages/console/core/script/pull-models.ts b/packages/console/core/script/pull-models.ts
new file mode 100755
index 0000000..4c37621
--- /dev/null
+++ b/packages/console/core/script/pull-models.ts
@@ -0,0 +1,33 @@
+#!/usr/bin/env bun
+
+import { $ } from "bun"
+import path from "path"
+import os from "os"
+import { ZenData } from "../src/model"
+
+const stage = process.argv[2]
+if (!stage) throw new Error("Stage is required")
+
+const root = path.resolve(process.cwd(), "..", "..", "..")
+const PARTS = 20
+
+// read the secret
+const ret = await $`bun sst secret list --stage ${stage}`.cwd(root).text()
+const lines = ret.split("\n")
+const values = Array.from({ length: PARTS }, (_, i) => {
+ const value = lines
+ .find((line) => line.startsWith(`ZEN_MODELS${i + 1}=`))
+ ?.split("=")
+ .slice(1)
+ .join("=")
+ if (!value) throw new Error(`ZEN_MODELS${i + 1} not found`)
+ return value
+})
+
+// validate value
+ZenData.validate(JSON.parse(values.join("")))
+
+// update the secret
+const envFile = Bun.file(path.join(os.tmpdir(), `models-${Date.now()}.env`))
+await envFile.write(values.map((v, i) => `ZEN_MODELS${i + 1}="${v.replace(/"/g, '\\"')}"`).join("\n"))
+await $`bun sst secret load ${envFile.name}`.cwd(root)
diff --git a/packages/console/core/script/referral-backfill.ts b/packages/console/core/script/referral-backfill.ts
new file mode 100644
index 0000000..c3062ad
--- /dev/null
+++ b/packages/console/core/script/referral-backfill.ts
@@ -0,0 +1,153 @@
+import { and, Database, eq, inArray, isNull } from "../src/drizzle/index.js"
+import { Identifier } from "../src/identifier.js"
+import { Referral } from "../src/referral.js"
+import { LiteTable } from "../src/schema/billing.sql.js"
+import { ReferralRewardTable, ReferralTable } from "../src/schema/referral.sql.js"
+import { UserTable } from "../src/schema/user.sql.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+
+const backfills = [
+ {
+ inviterWorkspaceID: "wrk_00000000000000000000000000",
+ inviteeWorkspaceID: "wrk_00000000000000000000000000",
+ inviteeAccountID: "acc_00000000000000000000000000",
+ },
+]
+
+console.log(`Backfilling ${backfills.length} referrals`)
+
+for (const [index, backfill] of backfills.entries()) {
+ console.log(`[${index + 1}/${backfills.length}] ${backfill.inviterWorkspaceID} -> ${backfill.inviteeWorkspaceID}`)
+ console.log(` invitee account: ${backfill.inviteeAccountID}`)
+
+ const result = await Database.transaction(async (tx) => {
+ if (backfill.inviterWorkspaceID === backfill.inviteeWorkspaceID) throw new Error("Self-referral workspace mismatch")
+
+ const inviterWorkspace = await tx
+ .select({ id: WorkspaceTable.id })
+ .from(WorkspaceTable)
+ .where(and(eq(WorkspaceTable.id, backfill.inviterWorkspaceID), isNull(WorkspaceTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!inviterWorkspace) throw new Error(`Inviter workspace not found: ${backfill.inviterWorkspaceID}`)
+
+ const inviteeWorkspace = await tx
+ .select({ id: WorkspaceTable.id })
+ .from(WorkspaceTable)
+ .where(and(eq(WorkspaceTable.id, backfill.inviteeWorkspaceID), isNull(WorkspaceTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!inviteeWorkspace) throw new Error(`Invitee workspace not found: ${backfill.inviteeWorkspaceID}`)
+
+ const inviteeUser = await tx
+ .select({ id: UserTable.id })
+ .from(UserTable)
+ .where(
+ and(
+ eq(UserTable.workspaceID, backfill.inviteeWorkspaceID),
+ eq(UserTable.accountID, backfill.inviteeAccountID),
+ eq(UserTable.role, "admin"),
+ isNull(UserTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (!inviteeUser) throw new Error(`Invitee workspace owner not found: ${backfill.inviteeAccountID}`)
+
+ const inviterUser = await tx
+ .select({ id: UserTable.id })
+ .from(UserTable)
+ .where(
+ and(
+ eq(UserTable.workspaceID, backfill.inviterWorkspaceID),
+ eq(UserTable.accountID, backfill.inviteeAccountID),
+ isNull(UserTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (inviterUser) throw new Error(`Self-referral is not allowed: ${backfill.inviteeAccountID}`)
+
+ const lite = await tx
+ .select({ id: LiteTable.id })
+ .from(LiteTable)
+ .where(
+ and(
+ eq(LiteTable.workspaceID, backfill.inviteeWorkspaceID),
+ eq(LiteTable.userID, inviteeUser.id),
+ isNull(LiteTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (!lite) throw new Error(`Invitee Lite subscription not found: ${backfill.inviteeWorkspaceID}`)
+
+ const existingReferral = await tx
+ .select({ id: ReferralTable.id, workspaceID: ReferralTable.workspaceID })
+ .from(ReferralTable)
+ .where(and(eq(ReferralTable.inviteeAccountID, backfill.inviteeAccountID), isNull(ReferralTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (existingReferral && existingReferral.workspaceID !== backfill.inviterWorkspaceID) {
+ throw new Error(`Referral already belongs to ${existingReferral.workspaceID}: ${existingReferral.id}`)
+ }
+
+ const referralID = existingReferral?.id ?? Identifier.create("referral")
+ if (!existingReferral) {
+ await tx.insert(ReferralTable).ignore().values({
+ workspaceID: backfill.inviterWorkspaceID,
+ id: referralID,
+ inviteeAccountID: backfill.inviteeAccountID,
+ })
+
+ const referral = await tx
+ .select({ id: ReferralTable.id })
+ .from(ReferralTable)
+ .where(and(eq(ReferralTable.inviteeAccountID, backfill.inviteeAccountID), isNull(ReferralTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!referral) throw new Error(`Referral not created: ${backfill.inviteeAccountID}`)
+ if (referral.id !== referralID) throw new Error(`Referral already redeemed: ${referral.id}`)
+ }
+
+ const rewardInsert = await tx
+ .insert(ReferralRewardTable)
+ .ignore()
+ .values([
+ {
+ workspaceID: backfill.inviterWorkspaceID,
+ referralID,
+ amount: Referral.REWARD_AMOUNT,
+ },
+ {
+ workspaceID: backfill.inviteeWorkspaceID,
+ referralID,
+ amount: Referral.REWARD_AMOUNT,
+ },
+ ])
+
+ const rewards = await tx
+ .select({ workspaceID: ReferralRewardTable.workspaceID, amount: ReferralRewardTable.amount })
+ .from(ReferralRewardTable)
+ .where(
+ and(
+ eq(ReferralRewardTable.referralID, referralID),
+ inArray(ReferralRewardTable.workspaceID, [backfill.inviterWorkspaceID, backfill.inviteeWorkspaceID]),
+ isNull(ReferralRewardTable.timeDeleted),
+ ),
+ )
+ if (rewards.length !== 2) throw new Error(`Referral rewards not created: ${referralID}`)
+ if (rewards.some((reward) => reward.amount !== Referral.REWARD_AMOUNT)) {
+ throw new Error(`Referral reward amount mismatch: ${referralID}`)
+ }
+
+ return {
+ referralID,
+ createdReferral: !existingReferral,
+ createdRewards: rewardInsert.rowsAffected,
+ inviteeUserID: inviteeUser.id,
+ liteID: lite.id,
+ rewardWorkspaces: rewards.map((reward) => reward.workspaceID),
+ }
+ })
+
+ console.log(` invitee user: ${result.inviteeUserID}`)
+ console.log(` lite: ${result.liteID}`)
+ console.log(` referral: ${result.referralID} (${result.createdReferral ? "created" : "existing"})`)
+ console.log(` rewards: ${result.rewardWorkspaces.join(", ")} (${result.createdRewards} inserted)`)
+}
+
+console.log("Referral backfill complete")
diff --git a/packages/console/core/script/reset-db.ts b/packages/console/core/script/reset-db.ts
new file mode 100644
index 0000000..02d4989
--- /dev/null
+++ b/packages/console/core/script/reset-db.ts
@@ -0,0 +1,13 @@
+import { Resource } from "@opencode-ai/console-resource"
+import { Database } from "../src/drizzle/index.js"
+import { UserTable } from "../src/schema/user.sql.js"
+import { AccountTable } from "../src/schema/account.sql.js"
+import { WorkspaceTable } from "../src/schema/workspace.sql.js"
+import { BillingTable, PaymentTable, UsageTable } from "../src/schema/billing.sql.js"
+import { KeyTable } from "../src/schema/key.sql.js"
+
+if (Resource.App.stage !== "frank") throw new Error("This script is only for frank")
+
+for (const table of [AccountTable, BillingTable, KeyTable, PaymentTable, UsageTable, UserTable, WorkspaceTable]) {
+ await Database.use((tx) => tx.delete(table))
+}
diff --git a/packages/console/core/script/update-limits.ts b/packages/console/core/script/update-limits.ts
new file mode 100755
index 0000000..f69a274
--- /dev/null
+++ b/packages/console/core/script/update-limits.ts
@@ -0,0 +1,30 @@
+#!/usr/bin/env bun
+
+import { $ } from "bun"
+import path from "path"
+import os from "os"
+import { Subscription } from "../src/subscription"
+
+const root = path.resolve(process.cwd(), "..", "..", "..")
+const secrets = await $`bun sst secret list --fallback`.cwd(root).text()
+
+// read value
+const lines = secrets.split("\n")
+const oldValue = lines.find((line) => line.startsWith("ZEN_LIMITS"))?.split("=")[1] ?? "{}"
+if (!oldValue) throw new Error("ZEN_LIMITS not found")
+
+// store the prettified json to a temp file
+const filename = `limits-${Date.now()}.json`
+const tempFile = Bun.file(path.join(os.tmpdir(), filename))
+await tempFile.write(JSON.stringify(JSON.parse(oldValue), null, 2))
+console.log("tempFile", tempFile.name)
+
+// open temp file in vim and read the file on close
+await $`vim ${tempFile.name}`
+const newValue = JSON.stringify(JSON.parse(await tempFile.text()))
+Subscription.validate(JSON.parse(newValue))
+
+// update the secret
+const envFile = Bun.file(path.join(os.tmpdir(), `limits-${Date.now()}.env`))
+await envFile.write(`ZEN_LIMITS="${newValue.replace(/"/g, '\\"')}"`)
+await $`bun sst secret load ${envFile.name} --fallback`.cwd(root)
diff --git a/packages/console/core/script/update-models.ts b/packages/console/core/script/update-models.ts
new file mode 100755
index 0000000..e426aec
--- /dev/null
+++ b/packages/console/core/script/update-models.ts
@@ -0,0 +1,43 @@
+#!/usr/bin/env bun
+
+import { $ } from "bun"
+import path from "path"
+import os from "os"
+import { ZenData } from "../src/model"
+
+const root = path.resolve(process.cwd(), "..", "..", "..")
+const models = await $`bun sst secret list --stage frank`.cwd(root).text()
+const PARTS = 30
+
+// read the line starting with "ZEN_MODELS"
+const lines = models.split("\n")
+const oldValues = Array.from({ length: PARTS }, (_, i) => {
+ const value = lines
+ .find((line) => line.startsWith(`ZEN_MODELS${i + 1}=`))
+ ?.split("=")
+ .slice(1)
+ .join("=")
+ if (!value) throw new Error(`ZEN_MODELS${i + 1} not found`)
+ return value
+})
+
+// store the prettified json to a temp file
+const filename = `models-${Date.now()}.json`
+const tempFile = Bun.file(path.join(os.tmpdir(), filename))
+await tempFile.write(JSON.stringify(JSON.parse(oldValues.join("")), null, 2))
+console.log("tempFile", tempFile.name)
+
+// open temp file in vim and read the file on close
+await $`vim ${tempFile.name}`
+const newValue = JSON.stringify(JSON.parse(await tempFile.text()))
+ZenData.validate(JSON.parse(newValue))
+
+// update the secret
+const chunk = Math.ceil(newValue.length / PARTS)
+const newValues = Array.from({ length: PARTS }, (_, i) =>
+ newValue.slice(chunk * i, i === PARTS - 1 ? undefined : chunk * (i + 1)),
+)
+
+const envFile = Bun.file(path.join(os.tmpdir(), `models-${Date.now()}.env`))
+await envFile.write(newValues.map((v, i) => `ZEN_MODELS${i + 1}="${v.replace(/"/g, '\\"')}"`).join("\n"))
+await $`bun sst secret load ${envFile.name} --stage frank`.cwd(root)
diff --git a/packages/console/core/src/account.ts b/packages/console/core/src/account.ts
new file mode 100644
index 0000000..6d1773b
--- /dev/null
+++ b/packages/console/core/src/account.ts
@@ -0,0 +1,32 @@
+import { z } from "zod"
+import { eq } from "drizzle-orm"
+import { fn } from "./util/fn"
+import { Database } from "./drizzle"
+import { Identifier } from "./identifier"
+import { AccountTable } from "./schema/account.sql"
+
+export namespace Account {
+ export const create = fn(
+ z.object({
+ id: z.string().optional(),
+ }),
+ async (input) =>
+ Database.use(async (tx) => {
+ const id = input.id ?? Identifier.create("account")
+ await tx.insert(AccountTable).values({
+ id,
+ })
+ return id
+ }),
+ )
+
+ export const fromID = fn(z.string(), async (id) =>
+ Database.use((tx) =>
+ tx
+ .select()
+ .from(AccountTable)
+ .where(eq(AccountTable.id, id))
+ .then((rows) => rows[0]),
+ ),
+ )
+}
diff --git a/packages/console/core/src/actor.ts b/packages/console/core/src/actor.ts
new file mode 100644
index 0000000..48f4a63
--- /dev/null
+++ b/packages/console/core/src/actor.ts
@@ -0,0 +1,98 @@
+import { Context } from "./context"
+import { UserRole } from "./schema/user.sql"
+import { Log } from "./util/log"
+
+export namespace Actor {
+ interface Account {
+ type: "account"
+ properties: {
+ accountID: string
+ email: string
+ }
+ }
+
+ interface Public {
+ type: "public"
+ properties: {}
+ }
+
+ interface User {
+ type: "user"
+ properties: {
+ userID: string
+ workspaceID: string
+ accountID: string
+ role: (typeof UserRole)[number]
+ }
+ }
+
+ interface System {
+ type: "system"
+ properties: {
+ workspaceID: string
+ }
+ }
+
+ export type Info = Account | Public | User | System
+
+ const ctx = Context.create()
+ export const use = ctx.use
+
+ const log = Log.create().tag("namespace", "actor")
+
+ export function provide(
+ type: T,
+ properties: Extract["properties"],
+ cb: () => R,
+ ) {
+ return ctx.provide(
+ {
+ type,
+ properties,
+ } as any,
+ () => {
+ return Log.provide({ ...properties }, () => {
+ log.info("provided")
+ return cb()
+ })
+ },
+ )
+ }
+
+ export function assert(type: T) {
+ const actor = use()
+ if (actor.type !== type) {
+ throw new Error(`Expected actor type ${type}, got ${actor.type}`)
+ }
+ return actor as Extract
+ }
+
+ export const assertAdmin = () => {
+ if (userRole() === "admin") return
+ throw new Error(`Action not allowed. Ask your workspace admin to perform this action.`)
+ }
+
+ export function workspace() {
+ const actor = use()
+ if ("workspaceID" in actor.properties) {
+ return actor.properties.workspaceID
+ }
+ throw new Error(`actor of type "${actor.type}" is not associated with a workspace`)
+ }
+
+ export function account() {
+ const actor = use()
+ if ("accountID" in actor.properties) {
+ return actor.properties.accountID
+ }
+ throw new Error(`actor of type "${actor.type}" is not associated with an account`)
+ }
+
+ export function userID() {
+ return Actor.assert("user").properties.userID
+ }
+
+ export function userRole() {
+ return Actor.assert("user").properties.role
+ }
+}
diff --git a/packages/console/core/src/aws.ts b/packages/console/core/src/aws.ts
new file mode 100644
index 0000000..a4c1510
--- /dev/null
+++ b/packages/console/core/src/aws.ts
@@ -0,0 +1,65 @@
+import { z } from "zod"
+import { Resource } from "@opencode-ai/console-resource"
+import { AwsClient } from "aws4fetch"
+import { fn } from "./util/fn"
+
+export namespace AWS {
+ let client: AwsClient
+
+ const createClient = () => {
+ if (!client) {
+ client = new AwsClient({
+ accessKeyId: Resource.AWS_SES_ACCESS_KEY_ID.value,
+ secretAccessKey: Resource.AWS_SES_SECRET_ACCESS_KEY.value,
+ region: "us-east-1",
+ })
+ }
+ return client
+ }
+
+ export const sendEmail = fn(
+ z.object({
+ to: z.string(),
+ subject: z.string(),
+ body: z.string(),
+ replyTo: z.string().optional(),
+ }),
+ async (input) => {
+ const res = await createClient().fetch("https://email.us-east-1.amazonaws.com/v2/email/outbound-emails", {
+ method: "POST",
+ headers: {
+ "X-Amz-Target": "SES.SendEmail",
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ FromEmailAddress: `OpenCode Zen `,
+ Destination: {
+ ToAddresses: [input.to],
+ },
+ ...(input.replyTo && { ReplyToAddresses: [input.replyTo] }),
+ Content: {
+ Simple: {
+ Subject: {
+ Charset: "UTF-8",
+ Data: input.subject,
+ },
+ Body: {
+ Text: {
+ Charset: "UTF-8",
+ Data: input.body,
+ },
+ Html: {
+ Charset: "UTF-8",
+ Data: input.body,
+ },
+ },
+ },
+ },
+ }),
+ })
+ if (!res.ok) {
+ throw new Error(`Failed to send email: ${res.statusText}`)
+ }
+ },
+ )
+}
diff --git a/packages/console/core/src/billing.ts b/packages/console/core/src/billing.ts
new file mode 100644
index 0000000..879cd8c
--- /dev/null
+++ b/packages/console/core/src/billing.ts
@@ -0,0 +1,587 @@
+import { Stripe } from "stripe"
+import { and, Database, eq, isNull, sql } from "./drizzle"
+import {
+ BillingTable,
+ CouponTable,
+ CouponType,
+ LiteTable,
+ PaymentTable,
+ SubscriptionTable,
+ UsageTable,
+} from "./schema/billing.sql"
+import { Actor } from "./actor"
+import { fn } from "./util/fn"
+import { z } from "zod"
+import { Resource } from "@opencode-ai/console-resource"
+import { Identifier } from "./identifier"
+import { centsToMicroCents } from "./util/price"
+import { User } from "./user"
+import { BlackData } from "./black"
+import { LiteData } from "./lite"
+
+export namespace Billing {
+ export const ITEM_CREDIT_NAME = "opencode credits"
+ export const ITEM_FEE_NAME = "processing fee"
+ export const RELOAD_AMOUNT = 20
+ export const RELOAD_AMOUNT_MIN = 10
+ export const RELOAD_TRIGGER = 5
+ export const RELOAD_TRIGGER_MIN = 5
+ export const stripe = () =>
+ new Stripe(Resource.STRIPE_SECRET_KEY.value, {
+ apiVersion: "2025-03-31.basil",
+ httpClient: Stripe.createFetchHttpClient(),
+ })
+
+ export const get = async () => {
+ return Database.use(async (tx) =>
+ tx
+ .select()
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, Actor.workspace()))
+ .then((r) => r[0]),
+ )
+ }
+
+ export const payments = async () => {
+ return await Database.use((tx) =>
+ tx
+ .select()
+ .from(PaymentTable)
+ .where(eq(PaymentTable.workspaceID, Actor.workspace()))
+ .orderBy(sql`${PaymentTable.timeCreated} DESC`)
+ .limit(100),
+ )
+ }
+
+ export const usages = async (page = 0, pageSize = 50) => {
+ return await Database.use((tx) =>
+ tx
+ .select()
+ .from(UsageTable)
+ .where(eq(UsageTable.workspaceID, Actor.workspace()))
+ .orderBy(sql`${UsageTable.timeCreated} DESC`)
+ .limit(pageSize)
+ .offset(page * pageSize),
+ )
+ }
+
+ export const calculateFeeInCents = (x: number) => {
+ // math: x = total - (total * 0.044 + 0.30)
+ // math: x = total * (1-0.044) - 0.30
+ // math: (x + 0.30) / 0.956 = total
+ return Math.round(((x + 30) / 0.956) * 0.044 + 30)
+ }
+
+ export const reload = async () => {
+ const billing = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: BillingTable.customerID,
+ paymentMethodID: BillingTable.paymentMethodID,
+ reloadAmount: BillingTable.reloadAmount,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, Actor.workspace()))
+ .then((rows) => rows[0]),
+ )
+ const customerID = billing.customerID
+ const paymentMethodID = billing.paymentMethodID
+ const amountInCents = (billing.reloadAmount ?? Billing.RELOAD_AMOUNT) * 100
+ try {
+ const draft = await Billing.stripe().invoices.create({
+ customer: customerID!,
+ auto_advance: false,
+ default_payment_method: paymentMethodID!,
+ collection_method: "charge_automatically",
+ currency: "usd",
+ metadata: {
+ workspaceID: Actor.workspace(),
+ amount: amountInCents.toString(),
+ },
+ })
+ await Billing.stripe().invoiceItems.create({
+ amount: amountInCents,
+ currency: "usd",
+ customer: customerID!,
+ invoice: draft.id!,
+ description: ITEM_CREDIT_NAME,
+ })
+ await Billing.stripe().invoiceItems.create({
+ amount: calculateFeeInCents(amountInCents),
+ currency: "usd",
+ customer: customerID!,
+ invoice: draft.id!,
+ description: ITEM_FEE_NAME,
+ })
+ await Billing.stripe().invoices.finalizeInvoice(draft.id!)
+ await Billing.stripe().invoices.pay(draft.id!, {
+ off_session: true,
+ payment_method: paymentMethodID!,
+ })
+ } catch (e: any) {
+ console.error(e)
+ await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ reload: false,
+ reloadError: e.message ?? "Payment failed.",
+ timeReloadError: sql`now()`,
+ })
+ .where(eq(BillingTable.workspaceID, Actor.workspace())),
+ )
+ return
+ }
+ }
+
+ export const grantCredit = async (workspaceID: string, dollarAmount: number) => {
+ const amountInMicroCents = centsToMicroCents(dollarAmount * 100)
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ balance: sql`${BillingTable.balance} + ${amountInMicroCents}`,
+ })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+ await tx.insert(PaymentTable).values({
+ workspaceID,
+ id: Identifier.create("payment"),
+ amount: amountInMicroCents,
+ enrichment: {
+ type: "credit",
+ },
+ })
+ })
+ return amountInMicroCents
+ }
+
+ export const subtractLiteUsage = async (workspaceID: string, amountInMicroCents: number) => {
+ await Database.transaction(async (tx) => {
+ const lite = await tx
+ .select({ id: LiteTable.id })
+ .from(LiteTable)
+ .where(and(eq(LiteTable.workspaceID, workspaceID), isNull(LiteTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!lite) throw new Error("Subscribe to Go before applying referral rewards")
+
+ await tx
+ .update(LiteTable)
+ .set({
+ monthlyUsage: sql`GREATEST(0, COALESCE(${LiteTable.monthlyUsage}, 0) - ${amountInMicroCents})`,
+ weeklyUsage: sql`GREATEST(0, COALESCE(${LiteTable.weeklyUsage}, 0) - ${amountInMicroCents})`,
+ rollingUsage: sql`GREATEST(0, COALESCE(${LiteTable.rollingUsage}, 0) - ${amountInMicroCents})`,
+ })
+ .where(and(eq(LiteTable.workspaceID, workspaceID), isNull(LiteTable.timeDeleted)))
+ })
+ }
+
+ export const redeemCoupon = async (email: string, type: (typeof CouponType)[number]) => {
+ // validate coupon type
+ await (async () => {
+ if (type === "GO1MONTH50") return
+ const coupon = await Database.use((tx) =>
+ tx
+ .select()
+ .from(CouponTable)
+ .where(and(eq(CouponTable.email, email), eq(CouponTable.type, type)))
+ .then((rows) => rows[0]),
+ )
+ if (!coupon) throw new Error("Invalid coupon code")
+ if (coupon.timeRedeemed) throw new Error("Coupon already redeemed")
+ })()
+
+ // handle coupon type
+ if (type === "BUILDATHON") await grantCredit(Actor.workspace(), 500)
+
+ await Database.use((tx) =>
+ tx
+ .insert(CouponTable)
+ .values({ email, type, timeRedeemed: sql`now()` })
+ .onDuplicateKeyUpdate({
+ set: {
+ timeRedeemed: sql`now()`,
+ },
+ }),
+ )
+ }
+
+ export const setMonthlyLimit = fn(z.number(), async (input) => {
+ return await Database.use((tx) =>
+ tx
+ .update(BillingTable)
+ .set({
+ monthlyLimit: input,
+ })
+ .where(eq(BillingTable.workspaceID, Actor.workspace())),
+ )
+ })
+
+ export const generateCheckoutUrl = fn(
+ z.object({
+ successUrl: z.string(),
+ cancelUrl: z.string(),
+ amount: z.number().optional(),
+ }),
+ async (input) => {
+ const user = Actor.assert("user")
+ const { successUrl, cancelUrl, amount } = input
+
+ if (amount !== undefined && amount < Billing.RELOAD_AMOUNT_MIN) {
+ throw new Error(`Amount must be at least $${Billing.RELOAD_AMOUNT_MIN}`)
+ }
+
+ const email = await User.getAuthEmail(user.properties.userID)
+ const customer = await Billing.get()
+ const amountInCents = (amount ?? customer.reloadAmount ?? Billing.RELOAD_AMOUNT) * 100
+ const session = await Billing.stripe().checkout.sessions.create({
+ mode: "payment",
+ billing_address_collection: "required",
+ line_items: [
+ {
+ price_data: {
+ currency: "usd",
+ product_data: { name: ITEM_CREDIT_NAME },
+ unit_amount: amountInCents,
+ },
+ quantity: 1,
+ },
+ {
+ price_data: {
+ currency: "usd",
+ product_data: { name: ITEM_FEE_NAME },
+ unit_amount: calculateFeeInCents(amountInCents),
+ },
+ quantity: 1,
+ },
+ ],
+ ...(customer.customerID
+ ? {
+ customer: customer.customerID,
+ customer_update: {
+ name: "auto",
+ address: "auto",
+ },
+ }
+ : {
+ customer_email: email!,
+ customer_creation: "always",
+ }),
+ currency: "usd",
+ invoice_creation: {
+ enabled: true,
+ },
+ payment_method_options: {
+ card: {
+ setup_future_usage: "off_session",
+ },
+ link: {
+ setup_future_usage: "off_session",
+ },
+ },
+ //payment_method_data: {
+ // allow_redisplay: "always",
+ //},
+ tax_id_collection: {
+ enabled: true,
+ },
+ metadata: {
+ workspaceID: Actor.workspace(),
+ amount: amountInCents.toString(),
+ },
+ success_url: successUrl,
+ cancel_url: cancelUrl,
+ })
+
+ return session.url
+ },
+ )
+
+ export const generateLiteCheckoutUrl = fn(
+ z.object({
+ successUrl: z.string(),
+ cancelUrl: z.string(),
+ method: z.enum(["alipay", "upi"]).optional(),
+ }),
+ async (input) => {
+ const user = Actor.assert("user")
+ const { successUrl, cancelUrl, method } = input
+
+ const email = (await User.getAuthEmail(user.properties.userID))!
+ const billing = await Billing.get()
+
+ if (billing.subscriptionID) throw new Error("Already subscribed to Black")
+ if (billing.liteSubscriptionID) throw new Error("Already subscribed to Lite")
+
+ const coupons = await Database.use((tx) =>
+ tx
+ .select({ type: CouponTable.type, timeRedeemed: CouponTable.timeRedeemed })
+ .from(CouponTable)
+ .where(eq(CouponTable.email, email)),
+ )
+
+ const coupon = (() => {
+ if (coupons.some((coupon) => coupon.type === "GO12MONTHS100" && !coupon.timeRedeemed))
+ return LiteData.twelveMonths100Coupon
+ if (coupons.some((coupon) => coupon.type === "GO6MONTHS100" && !coupon.timeRedeemed))
+ return LiteData.sixMonths100Coupon
+ if (coupons.some((coupon) => coupon.type === "GO3MONTHS100" && !coupon.timeRedeemed))
+ return LiteData.threeMonths100Coupon
+ if (coupons.some((coupon) => coupon.type === "GOFREEMONTH" && !coupon.timeRedeemed))
+ return LiteData.firstMonth100Coupon
+ if (!coupons.some((coupon) => coupon.type === "GO1MONTH50")) return LiteData.firstMonth50Coupon
+ return undefined
+ })()
+ const createSession = () =>
+ Billing.stripe().checkout.sessions.create({
+ mode: "subscription",
+ discounts: coupon ? [{ coupon }] : undefined,
+ ...(billing.customerID
+ ? {
+ customer: billing.customerID,
+ customer_update: {
+ name: "auto",
+ address: "auto",
+ },
+ }
+ : {
+ customer_email: email,
+ }),
+ ...(() => {
+ if (method === "alipay") {
+ return {
+ line_items: [{ price: LiteData.priceID(), quantity: 1 }],
+ payment_method_types: ["alipay"],
+ adaptive_pricing: {
+ enabled: false,
+ },
+ }
+ }
+ if (method === "upi") {
+ return {
+ line_items: [
+ {
+ price_data: {
+ currency: "inr",
+ product: LiteData.productID(),
+ recurring: {
+ interval: "month",
+ interval_count: 1,
+ },
+ unit_amount: LiteData.priceInr(),
+ },
+ quantity: 1,
+ },
+ ],
+ payment_method_types: ["upi"] as any,
+ adaptive_pricing: {
+ enabled: false,
+ },
+ }
+ }
+ return {
+ line_items: [{ price: LiteData.priceID(), quantity: 1 }],
+ billing_address_collection: "required",
+ }
+ })(),
+ tax_id_collection: {
+ enabled: true,
+ },
+ success_url: successUrl,
+ cancel_url: cancelUrl,
+ subscription_data: {
+ metadata: {
+ workspaceID: Actor.workspace(),
+ userID: user.properties.userID,
+ userEmail: email,
+ coupon,
+ type: "lite",
+ },
+ },
+ })
+
+ try {
+ const session = await createSession()
+ return session.url
+ } catch (e: any) {
+ if (
+ e.type !== "StripeInvalidRequestError" ||
+ !e.message.includes("You cannot combine currencies on a single customer")
+ )
+ throw e
+
+ // get pending payment intent
+ const intents = await Billing.stripe().paymentIntents.search({
+ query: `-status:'canceled' AND -status:'processing' AND -status:'succeeded' AND customer:'${billing.customerID}'`,
+ })
+ if (intents.data.length === 0) throw e
+
+ for (const intent of intents.data) {
+ // get checkout session
+ const sessions = await Billing.stripe().checkout.sessions.list({
+ customer: billing.customerID!,
+ payment_intent: intent.id,
+ })
+
+ // delete pending payment intent
+ await Billing.stripe().checkout.sessions.expire(sessions.data[0].id)
+ }
+
+ const session = await createSession()
+ return session.url
+ }
+ },
+ )
+
+ export const generateSessionUrl = fn(
+ z.object({
+ returnUrl: z.string(),
+ }),
+ async (input) => {
+ const { returnUrl } = input
+
+ const customer = await Billing.get()
+ if (!customer?.customerID) {
+ throw new Error("No stripe customer ID")
+ }
+
+ const session = await Billing.stripe().billingPortal.sessions.create({
+ customer: customer.customerID,
+ return_url: returnUrl,
+ })
+
+ return session.url
+ },
+ )
+
+ export const generateReceiptUrl = fn(
+ z.object({
+ paymentID: z.string(),
+ }),
+ async (input) => {
+ const { paymentID } = input
+
+ const intent = await Billing.stripe().paymentIntents.retrieve(paymentID)
+ if (!intent.latest_charge) throw new Error("No charge found")
+
+ const charge = await Billing.stripe().charges.retrieve(intent.latest_charge as string)
+ if (!charge.receipt_url) throw new Error("No receipt URL found")
+
+ return charge.receipt_url
+ },
+ )
+
+ export const subscribeBlack = fn(
+ z.object({
+ seats: z.number(),
+ coupon: z.string().optional(),
+ }),
+ async ({ seats, coupon }) => {
+ const user = Actor.assert("user")
+ const billing = await Database.use((tx) =>
+ tx
+ .select({
+ customerID: BillingTable.customerID,
+ paymentMethodID: BillingTable.paymentMethodID,
+ subscriptionID: BillingTable.subscriptionID,
+ subscriptionPlan: BillingTable.subscriptionPlan,
+ timeSubscriptionSelected: BillingTable.timeSubscriptionSelected,
+ })
+ .from(BillingTable)
+ .where(eq(BillingTable.workspaceID, Actor.workspace()))
+ .then((rows) => rows[0]),
+ )
+
+ if (!billing) throw new Error("Billing record not found")
+ if (!billing.timeSubscriptionSelected) throw new Error("Not selected for subscription")
+ if (billing.subscriptionID) throw new Error("Already subscribed")
+ if (!billing.customerID) throw new Error("No customer ID")
+ if (!billing.paymentMethodID) throw new Error("No payment method")
+ if (!billing.subscriptionPlan) throw new Error("No subscription plan")
+
+ const subscription = await Billing.stripe().subscriptions.create({
+ customer: billing.customerID,
+ default_payment_method: billing.paymentMethodID,
+ items: [{ price: BlackData.planToPriceID({ plan: billing.subscriptionPlan }) }],
+ metadata: {
+ workspaceID: Actor.workspace(),
+ },
+ })
+
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({
+ subscriptionID: subscription.id,
+ subscription: {
+ status: "subscribed",
+ coupon,
+ seats,
+ plan: billing.subscriptionPlan!,
+ },
+ subscriptionPlan: null,
+ timeSubscriptionBooked: null,
+ timeSubscriptionSelected: null,
+ })
+ .where(eq(BillingTable.workspaceID, Actor.workspace()))
+
+ await tx.insert(SubscriptionTable).values({
+ workspaceID: Actor.workspace(),
+ id: Identifier.create("subscription"),
+ userID: user.properties.userID,
+ })
+ })
+
+ return subscription.id
+ },
+ )
+
+ export const unsubscribeBlack = fn(
+ z.object({
+ subscriptionID: z.string(),
+ }),
+ async ({ subscriptionID }) => {
+ const workspaceID = await Database.use((tx) =>
+ tx
+ .select({ workspaceID: BillingTable.workspaceID })
+ .from(BillingTable)
+ .where(eq(BillingTable.subscriptionID, subscriptionID))
+ .then((rows) => rows[0]?.workspaceID),
+ )
+ if (!workspaceID) throw new Error("Workspace ID not found for subscription")
+
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({ subscriptionID: null, subscription: null })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+
+ await tx.delete(SubscriptionTable).where(eq(SubscriptionTable.workspaceID, workspaceID))
+ })
+ },
+ )
+
+ export const unsubscribeLite = fn(
+ z.object({
+ subscriptionID: z.string(),
+ }),
+ async ({ subscriptionID }) => {
+ const workspaceID = await Database.use((tx) =>
+ tx
+ .select({ workspaceID: BillingTable.workspaceID })
+ .from(BillingTable)
+ .where(eq(BillingTable.liteSubscriptionID, subscriptionID))
+ .then((rows) => rows[0]?.workspaceID),
+ )
+ if (!workspaceID) throw new Error("Workspace ID not found for subscription")
+
+ await Database.transaction(async (tx) => {
+ await tx
+ .update(BillingTable)
+ .set({ liteSubscriptionID: null, lite: null })
+ .where(eq(BillingTable.workspaceID, workspaceID))
+
+ await tx.delete(LiteTable).where(eq(LiteTable.workspaceID, workspaceID))
+ })
+ },
+ )
+}
diff --git a/packages/console/core/src/black.ts b/packages/console/core/src/black.ts
new file mode 100644
index 0000000..1908403
--- /dev/null
+++ b/packages/console/core/src/black.ts
@@ -0,0 +1,40 @@
+import { z } from "zod"
+import { fn } from "./util/fn"
+import { Resource } from "@opencode-ai/console-resource"
+import { BlackPlans } from "./schema/billing.sql"
+import { Subscription } from "./subscription"
+
+export namespace BlackData {
+ export const getLimits = fn(
+ z.object({
+ plan: z.enum(BlackPlans),
+ }),
+ ({ plan }) => {
+ return Subscription.getLimits()["black"][plan]
+ },
+ )
+
+ export const productID = fn(z.void(), () => Resource.ZEN_BLACK_PRICE.product)
+
+ export const planToPriceID = fn(
+ z.object({
+ plan: z.enum(BlackPlans),
+ }),
+ ({ plan }) => {
+ if (plan === "200") return Resource.ZEN_BLACK_PRICE.plan200
+ if (plan === "100") return Resource.ZEN_BLACK_PRICE.plan100
+ return Resource.ZEN_BLACK_PRICE.plan20
+ },
+ )
+
+ export const priceIDToPlan = fn(
+ z.object({
+ priceID: z.string(),
+ }),
+ ({ priceID }) => {
+ if (priceID === Resource.ZEN_BLACK_PRICE.plan200) return "200"
+ if (priceID === Resource.ZEN_BLACK_PRICE.plan100) return "100"
+ return "20"
+ },
+ )
+}
diff --git a/packages/console/core/src/context.ts b/packages/console/core/src/context.ts
new file mode 100644
index 0000000..59594cb
--- /dev/null
+++ b/packages/console/core/src/context.ts
@@ -0,0 +1,21 @@
+import { AsyncLocalStorage } from "node:async_hooks"
+
+export namespace Context {
+ export class NotFound extends Error {}
+
+ export function create() {
+ const storage = new AsyncLocalStorage()
+ return {
+ use() {
+ const result = storage.getStore()
+ if (!result) {
+ throw new NotFound()
+ }
+ return result
+ },
+ provide(value: T, fn: () => R) {
+ return storage.run(value, fn)
+ },
+ }
+ }
+}
diff --git a/packages/console/core/src/drizzle/index.ts b/packages/console/core/src/drizzle/index.ts
new file mode 100644
index 0000000..d3a4b63
--- /dev/null
+++ b/packages/console/core/src/drizzle/index.ts
@@ -0,0 +1,85 @@
+import { drizzle } from "drizzle-orm/planetscale-serverless"
+import { Resource } from "@opencode-ai/console-resource"
+export * from "drizzle-orm"
+import { Client } from "@planetscale/database"
+
+import { MySqlTransaction, type MySqlTransactionConfig } from "drizzle-orm/mysql-core"
+import type { PlanetScalePreparedQueryHKT, PlanetscaleQueryResultHKT } from "drizzle-orm/planetscale-serverless"
+import { Context } from "../context"
+import { memo } from "../util/memo"
+
+export namespace Database {
+ export type Transaction = MySqlTransaction<
+ PlanetscaleQueryResultHKT,
+ PlanetScalePreparedQueryHKT,
+ Record,
+ any
+ >
+
+ const client = memo(() => {
+ const result = new Client({
+ host: Resource.Database.host,
+ username: Resource.Database.username,
+ password: Resource.Database.password,
+ })
+ const db = drizzle({ client: result })
+ return db
+ })
+
+ export type TxOrDb = Transaction | ReturnType
+
+ const TransactionContext = Context.create<{
+ tx: TxOrDb
+ effects: (() => void | Promise)[]
+ }>()
+
+ export async function use(callback: (trx: TxOrDb) => Promise) {
+ try {
+ const { tx } = TransactionContext.use()
+ return tx.transaction(callback)
+ } catch (err) {
+ if (err instanceof Context.NotFound) {
+ const effects: (() => void | Promise)[] = []
+ const result = await TransactionContext.provide(
+ {
+ effects,
+ tx: client(),
+ },
+ () => callback(client()),
+ )
+ await Promise.all(effects.map((x) => x()))
+ return result
+ }
+ throw err
+ }
+ }
+ export async function fn (callback: (input: Input, trx: TxOrDb) => Promise) {
+ return (input: Input) => use(async (tx) => callback(input, tx))
+ }
+
+ export async function effect(effect: () => any | Promise) {
+ try {
+ const { effects } = TransactionContext.use()
+ effects.push(effect)
+ } catch {
+ await effect()
+ }
+ }
+
+ export async function transaction(callback: (tx: TxOrDb) => Promise, config?: MySqlTransactionConfig) {
+ try {
+ const { tx } = TransactionContext.use()
+ return callback(tx)
+ } catch (err) {
+ if (err instanceof Context.NotFound) {
+ const effects: (() => void | Promise)[] = []
+ const result = await client().transaction(async (tx) => {
+ return TransactionContext.provide({ tx, effects }, () => callback(tx))
+ }, config)
+ await Promise.all(effects.map((x) => x()))
+ return result
+ }
+ throw err
+ }
+ }
+}
diff --git a/packages/console/core/src/drizzle/types.ts b/packages/console/core/src/drizzle/types.ts
new file mode 100644
index 0000000..f16ad5a
--- /dev/null
+++ b/packages/console/core/src/drizzle/types.ts
@@ -0,0 +1,33 @@
+import { sql } from "drizzle-orm"
+import { bigint, timestamp, varchar } from "drizzle-orm/mysql-core"
+
+export const ulid = (name: string) => varchar(name, { length: 30 })
+
+export const workspaceColumns = {
+ get id() {
+ return ulid("id").notNull()
+ },
+ get workspaceID() {
+ return ulid("workspace_id").notNull()
+ },
+}
+
+export const id = () => ulid("id").notNull()
+
+export const utc = (name: string) =>
+ timestamp(name, {
+ fsp: 3,
+ })
+
+export const currency = (name: string) =>
+ bigint(name, {
+ mode: "number",
+ })
+
+export const timestamps = {
+ timeCreated: utc("time_created").notNull().defaultNow(),
+ timeUpdated: utc("time_updated")
+ .notNull()
+ .default(sql`CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)`),
+ timeDeleted: utc("time_deleted"),
+}
diff --git a/packages/console/core/src/identifier.ts b/packages/console/core/src/identifier.ts
new file mode 100644
index 0000000..8fcd681
--- /dev/null
+++ b/packages/console/core/src/identifier.ts
@@ -0,0 +1,33 @@
+import { ulid } from "ulid"
+import { z } from "zod"
+
+export namespace Identifier {
+ const prefixes = {
+ account: "acc",
+ auth: "aut",
+ benchmark: "ben",
+ billing: "bil",
+ key: "key",
+ lite: "lit",
+ model: "mod",
+ payment: "pay",
+ provider: "prv",
+ referral: "ref",
+ subscription: "sub",
+ usage: "usg",
+ user: "usr",
+ workspace: "wrk",
+ } as const
+
+ export function create(prefix: keyof typeof prefixes, given?: string): string {
+ if (given) {
+ if (given.startsWith(prefixes[prefix])) return given
+ throw new Error(`ID ${given} does not start with ${prefixes[prefix]}`)
+ }
+ return [prefixes[prefix], ulid()].join("_")
+ }
+
+ export function schema(prefix: keyof typeof prefixes) {
+ return z.string().startsWith(prefixes[prefix])
+ }
+}
diff --git a/packages/console/core/src/key.ts b/packages/console/core/src/key.ts
new file mode 100644
index 0000000..aef4298
--- /dev/null
+++ b/packages/console/core/src/key.ts
@@ -0,0 +1,92 @@
+import { z } from "zod"
+import { fn } from "./util/fn"
+import { Actor } from "./actor"
+import { and, Database, eq, isNull, sql } from "./drizzle"
+import { Identifier } from "./identifier"
+import { KeyTable } from "./schema/key.sql"
+import { UserTable } from "./schema/user.sql"
+import { AuthTable } from "./schema/auth.sql"
+
+export namespace Key {
+ export const list = fn(z.void(), async () => {
+ const keys = await Database.use((tx) =>
+ tx
+ .select({
+ id: KeyTable.id,
+ name: KeyTable.name,
+ key: KeyTable.key,
+ timeUsed: KeyTable.timeUsed,
+ userID: KeyTable.userID,
+ email: AuthTable.subject,
+ })
+ .from(KeyTable)
+ .innerJoin(UserTable, and(eq(KeyTable.userID, UserTable.id), eq(KeyTable.workspaceID, UserTable.workspaceID)))
+ .innerJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .where(
+ and(
+ eq(KeyTable.workspaceID, Actor.workspace()),
+ isNull(KeyTable.timeDeleted),
+ ...(Actor.userRole() === "admin" ? [] : [eq(KeyTable.userID, Actor.userID())]),
+ ),
+ )
+ .orderBy(sql`${KeyTable.name} DESC`),
+ )
+ // only return value for user's keys
+ return keys.map((key) => ({
+ ...key,
+ key: key.userID === Actor.userID() ? key.key : undefined,
+ keyDisplay: `${key.key.slice(0, 7)}...${key.key.slice(-4)}`,
+ }))
+ })
+
+ export const create = fn(
+ z.object({
+ userID: z.string(),
+ name: z.string().min(1).max(255),
+ }),
+ async (input) => {
+ const { name } = input
+
+ // Generate secret key: sk- + 64 random characters (upper, lower, numbers)
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ let secretKey = "sk-"
+ const array = new Uint32Array(64)
+ crypto.getRandomValues(array)
+ for (let i = 0, l = array.length; i < l; i++) {
+ secretKey += chars[array[i] % chars.length]
+ }
+ const keyID = Identifier.create("key")
+
+ await Database.use((tx) =>
+ tx.insert(KeyTable).values({
+ id: keyID,
+ workspaceID: Actor.workspace(),
+ userID: input.userID,
+ name,
+ key: secretKey,
+ timeUsed: null,
+ }),
+ )
+
+ return keyID
+ },
+ )
+
+ export const remove = fn(z.object({ id: z.string() }), async (input) => {
+ // only admin can remove other user's keys
+ await Database.use((tx) =>
+ tx
+ .update(KeyTable)
+ .set({
+ timeDeleted: sql`now()`,
+ })
+ .where(
+ and(
+ eq(KeyTable.id, input.id),
+ eq(KeyTable.workspaceID, Actor.workspace()),
+ ...(Actor.userRole() === "admin" ? [] : [eq(KeyTable.userID, Actor.userID())]),
+ ),
+ ),
+ )
+ })
+}
diff --git a/packages/console/core/src/lite.ts b/packages/console/core/src/lite.ts
new file mode 100644
index 0000000..717940e
--- /dev/null
+++ b/packages/console/core/src/lite.ts
@@ -0,0 +1,20 @@
+import { z } from "zod"
+import { fn } from "./util/fn"
+import { Resource } from "@opencode-ai/console-resource"
+import { Subscription } from "./subscription"
+
+export namespace LiteData {
+ export const getLimits = fn(z.void(), () => {
+ return Subscription.getLimits()["lite"]
+ })
+
+ export const productID = fn(z.void(), () => Resource.ZEN_LITE_PRICE.product)
+ export const priceID = fn(z.void(), () => Resource.ZEN_LITE_PRICE.price)
+ export const priceInr = fn(z.void(), () => Resource.ZEN_LITE_PRICE.priceInr)
+ export const firstMonth100Coupon = Resource.ZEN_LITE_PRICE.firstMonth100Coupon
+ export const firstMonth50Coupon = Resource.ZEN_LITE_PRICE.firstMonth50Coupon
+ export const threeMonths100Coupon = Resource.ZEN_LITE_PRICE.threeMonths100Coupon
+ export const sixMonths100Coupon = Resource.ZEN_LITE_PRICE.sixMonths100Coupon
+ export const twelveMonths100Coupon = Resource.ZEN_LITE_PRICE.twelveMonths100Coupon
+ export const planName = fn(z.void(), () => "lite")
+}
diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts
new file mode 100644
index 0000000..b0851c4
--- /dev/null
+++ b/packages/console/core/src/model.ts
@@ -0,0 +1,229 @@
+import { z } from "zod"
+import { eq, and } from "drizzle-orm"
+import { Database } from "./drizzle"
+import { ModelTable } from "./schema/model.sql"
+import { Identifier } from "./identifier"
+import { fn } from "./util/fn"
+import { Actor } from "./actor"
+import { Resource } from "@opencode-ai/console-resource"
+
+export namespace ZenData {
+ const FormatSchema = z.enum(["anthropic", "google", "openai", "oa-compat"])
+ export type Format = z.infer
+
+ const ModelCostSchema = z.object({
+ input: z.number(),
+ output: z.number(),
+ cacheRead: z.number().optional(),
+ cacheWrite5m: z.number().optional(),
+ cacheWrite1h: z.number().optional(),
+ })
+
+ const ModelSchema = z.object({
+ name: z.string(),
+ cost: ModelCostSchema,
+ cost200K: ModelCostSchema.optional(),
+ allowAnonymous: z.boolean().optional(),
+ byokProvider: z.enum(["openai", "anthropic", "google"]).optional(),
+ stickyProvider: z.enum(["strict", "prefer"]).optional(),
+ trialProvider: z.string().optional(),
+ trialEnded: z.boolean().optional(),
+ fallbackProvider: z.string().optional(),
+ rateLimit: z.number().optional(),
+ providers: z.array(
+ z.object({
+ id: z.string(),
+ model: z.string(),
+ priority: z.number().optional(),
+ tpmLimit: z.number().optional(),
+ tpsGoal: z.number().optional(),
+ weight: z.number().optional(),
+ disabled: z.boolean().optional(),
+ storeModel: z.string().optional(),
+ payloadModifier: z.record(z.string(), z.any()).optional(),
+ }),
+ ),
+ })
+
+ const ProviderSchema = z.object({
+ displayName: z.string().optional(),
+ api: z.string(),
+ apiKey: z.union([z.string(), z.record(z.string(), z.string())]),
+ format: FormatSchema.optional(),
+ headerMappings: z.record(z.string(), z.string()).optional(),
+ payloadModifier: z.record(z.string(), z.any()).optional(),
+ payloadMappings: z.record(z.string(), z.string()).optional(),
+ adjustCacheUsage: z.boolean().optional(),
+ })
+
+ const ModelsSchema = z.object({
+ zenModels: z.record(
+ z.string(),
+ z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))]),
+ ),
+ liteModels: z.record(
+ z.string(),
+ z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))]),
+ ),
+ providers: z.record(z.string(), ProviderSchema),
+ })
+
+ export const validate = fn(ModelsSchema, (input) => {
+ return input
+ })
+
+ export const list = fn(z.enum(["lite", "full"]), (modelList) => {
+ const json = JSON.parse(
+ Resource.ZEN_MODELS1.value +
+ Resource.ZEN_MODELS2.value +
+ Resource.ZEN_MODELS3.value +
+ Resource.ZEN_MODELS4.value +
+ Resource.ZEN_MODELS5.value +
+ Resource.ZEN_MODELS6.value +
+ Resource.ZEN_MODELS7.value +
+ Resource.ZEN_MODELS8.value +
+ Resource.ZEN_MODELS9.value +
+ Resource.ZEN_MODELS10.value +
+ Resource.ZEN_MODELS11.value +
+ Resource.ZEN_MODELS12.value +
+ Resource.ZEN_MODELS13.value +
+ Resource.ZEN_MODELS14.value +
+ Resource.ZEN_MODELS15.value +
+ Resource.ZEN_MODELS16.value +
+ Resource.ZEN_MODELS17.value +
+ Resource.ZEN_MODELS18.value +
+ Resource.ZEN_MODELS19.value +
+ Resource.ZEN_MODELS20.value +
+ Resource.ZEN_MODELS21.value +
+ Resource.ZEN_MODELS22.value +
+ Resource.ZEN_MODELS23.value +
+ Resource.ZEN_MODELS24.value +
+ Resource.ZEN_MODELS25.value +
+ Resource.ZEN_MODELS26.value +
+ Resource.ZEN_MODELS27.value +
+ Resource.ZEN_MODELS28.value +
+ Resource.ZEN_MODELS29.value +
+ Resource.ZEN_MODELS30.value,
+ )
+ const { zenModels, liteModels, providers } = ModelsSchema.parse(json)
+ const compositeProviders = Object.fromEntries(
+ Object.entries(providers).map(([id, provider]) => [
+ id,
+ typeof provider.apiKey === "string"
+ ? [{ id: id, key: provider.apiKey }]
+ : Object.entries(provider.apiKey).map(([kid, key]) => ({
+ id: `${id}.${kid}`,
+ key,
+ })),
+ ]),
+ )
+ return {
+ providers: Object.fromEntries(
+ Object.entries(providers).flatMap(([providerId, provider]) =>
+ compositeProviders[providerId].map((p) => [p.id, { ...provider, apiKey: p.key }]),
+ ),
+ ),
+ models: (() => {
+ const normalize = (model: z.infer) => {
+ const providers = model.providers.map((p) => ({
+ ...p,
+ priority: p.priority ?? Infinity,
+ weight: p.weight ?? 1,
+ }))
+ const composite = providers.find((p) => compositeProviders[p.id].length > 1)
+ if (!composite)
+ return {
+ trialProvider: model.trialProvider ? [model.trialProvider] : undefined,
+ providers,
+ }
+
+ const weightMulti = compositeProviders[composite.id].length
+
+ return {
+ trialProvider: (() => {
+ if (!model.trialProvider) return undefined
+ if (model.trialProvider === composite.id) return compositeProviders[composite.id].map((p) => p.id)
+ return [model.trialProvider]
+ })(),
+ providers: providers.flatMap((p) =>
+ p.id === composite.id
+ ? compositeProviders[p.id].map((sub) => ({
+ ...p,
+ id: sub.id,
+ }))
+ : [
+ {
+ ...p,
+ weight: p.weight * weightMulti,
+ },
+ ],
+ ),
+ }
+ }
+
+ return Object.fromEntries(
+ Object.entries(modelList === "lite" ? liteModels : zenModels).map(([modelId, model]) => {
+ const n = Array.isArray(model)
+ ? model.map((m) => ({ ...m, ...normalize(m) }))
+ : { ...model, ...normalize(model) }
+ return [modelId, n]
+ }),
+ )
+ })(),
+ }
+ })
+}
+
+export namespace Model {
+ export const enable = fn(z.object({ model: z.string() }), ({ model }) => {
+ Actor.assertAdmin()
+ return Database.use((db) =>
+ db.delete(ModelTable).where(and(eq(ModelTable.workspaceID, Actor.workspace()), eq(ModelTable.model, model))),
+ )
+ })
+
+ export const disable = fn(z.object({ model: z.string() }), ({ model }) => {
+ Actor.assertAdmin()
+ return Database.use((db) =>
+ db
+ .insert(ModelTable)
+ .values({
+ id: Identifier.create("model"),
+ workspaceID: Actor.workspace(),
+ model: model,
+ })
+ .onDuplicateKeyUpdate({
+ set: {
+ timeDeleted: null,
+ },
+ }),
+ )
+ })
+
+ export const listDisabled = fn(z.void(), () => {
+ return Database.use((db) =>
+ db
+ .select({ model: ModelTable.model })
+ .from(ModelTable)
+ .where(eq(ModelTable.workspaceID, Actor.workspace()))
+ .then((rows) => rows.map((row) => row.model)),
+ )
+ })
+
+ export const isDisabled = fn(
+ z.object({
+ model: z.string(),
+ }),
+ ({ model }) => {
+ return Database.use(async (db) => {
+ const result = await db
+ .select()
+ .from(ModelTable)
+ .where(and(eq(ModelTable.workspaceID, Actor.workspace()), eq(ModelTable.model, model)))
+ .limit(1)
+
+ return result.length > 0
+ })
+ },
+ )
+}
diff --git a/packages/console/core/src/provider.ts b/packages/console/core/src/provider.ts
new file mode 100644
index 0000000..8346115
--- /dev/null
+++ b/packages/console/core/src/provider.ts
@@ -0,0 +1,57 @@
+import { z } from "zod"
+import { fn } from "./util/fn"
+import { Actor } from "./actor"
+import { and, Database, eq, isNull } from "./drizzle"
+import { Identifier } from "./identifier"
+import { ProviderTable } from "./schema/provider.sql"
+
+export namespace Provider {
+ export const list = fn(z.void(), () =>
+ Database.use((tx) =>
+ tx
+ .select()
+ .from(ProviderTable)
+ .where(and(eq(ProviderTable.workspaceID, Actor.workspace()), isNull(ProviderTable.timeDeleted))),
+ ),
+ )
+
+ export const create = fn(
+ z.object({
+ provider: z.string().min(1).max(64),
+ credentials: z.string(),
+ }),
+ async ({ provider, credentials }) => {
+ Actor.assertAdmin()
+ return Database.use((tx) =>
+ tx
+ .insert(ProviderTable)
+ .values({
+ id: Identifier.create("provider"),
+ workspaceID: Actor.workspace(),
+ provider,
+ credentials,
+ })
+ .onDuplicateKeyUpdate({
+ set: {
+ credentials,
+ timeDeleted: null,
+ },
+ }),
+ )
+ },
+ )
+
+ export const remove = fn(
+ z.object({
+ provider: z.string(),
+ }),
+ async ({ provider }) => {
+ Actor.assertAdmin()
+ return Database.use((tx) =>
+ tx
+ .delete(ProviderTable)
+ .where(and(eq(ProviderTable.provider, provider), eq(ProviderTable.workspaceID, Actor.workspace()))),
+ )
+ },
+ )
+}
diff --git a/packages/console/core/src/referral.ts b/packages/console/core/src/referral.ts
new file mode 100644
index 0000000..9f781df
--- /dev/null
+++ b/packages/console/core/src/referral.ts
@@ -0,0 +1,424 @@
+import { z } from "zod"
+import { and, asc, eq, inArray, isNull, sql, Database } from "./drizzle"
+import { Actor } from "./actor"
+import { Identifier } from "./identifier"
+import { LiteTable, PaymentTable } from "./schema/billing.sql"
+import { ReferralCodeTable, ReferralRewardTable, ReferralTable } from "./schema/referral.sql"
+import { AuthTable } from "./schema/auth.sql"
+import { UserTable } from "./schema/user.sql"
+import { WorkspaceTable } from "./schema/workspace.sql"
+import { centsToMicroCents, microCentsToCents } from "./util/price"
+import { fn } from "./util/fn"
+import { Billing } from "./billing"
+import { LiteData } from "./lite"
+import { Subscription } from "./subscription"
+import { ulid } from "ulid"
+
+export namespace Referral {
+ export const REWARD_AMOUNT = centsToMicroCents(500)
+ export const CODE_LENGTH = 10
+
+ export function normalizeCode(code?: string | null) {
+ return code
+ ?.toUpperCase()
+ .replace(/[^A-Z0-9]/g, "")
+ .slice(0, CODE_LENGTH)
+ }
+
+ function generateCode() {
+ return ulid().slice(-CODE_LENGTH).toUpperCase()
+ }
+
+ async function ensureCode(workspaceID = Actor.workspace()) {
+ return Database.use(async (db) => {
+ const existing = await db
+ .select({ code: ReferralCodeTable.code })
+ .from(ReferralCodeTable)
+ .where(eq(ReferralCodeTable.workspaceID, workspaceID))
+ .then((rows) => rows[0])
+ if (existing) return { code: existing.code }
+
+ await db.insert(ReferralCodeTable).ignore().values({
+ workspaceID,
+ code: generateCode(),
+ })
+
+ const created = await db
+ .select({ code: ReferralCodeTable.code })
+ .from(ReferralCodeTable)
+ .where(eq(ReferralCodeTable.workspaceID, workspaceID))
+ .then((rows) => rows[0])
+ if (created) return { code: created.code }
+
+ throw new Error("Failed to generate referral code")
+ })
+ }
+
+ export const summary = fn(z.void(), async () => {
+ const workspaceID = Actor.workspace()
+ const accountID = Actor.account()
+ const code = await ensureCode(workspaceID)
+ const rows = await Database.use(async (tx) => {
+ const [rewards, invites, inviteeReferral, inviteeRewards] = await Promise.all([
+ tx
+ .select({
+ referralID: ReferralRewardTable.referralID,
+ workspaceID: ReferralRewardTable.workspaceID,
+ referralWorkspaceID: ReferralTable.workspaceID,
+ inviteeEmail: AuthTable.subject,
+ amount: ReferralRewardTable.amount,
+ timeCreated: ReferralRewardTable.timeCreated,
+ timeApplied: ReferralRewardTable.timeApplied,
+ })
+ .from(ReferralRewardTable)
+ .innerJoin(ReferralTable, eq(ReferralTable.id, ReferralRewardTable.referralID))
+ .innerJoin(
+ AuthTable,
+ and(eq(AuthTable.accountID, ReferralTable.inviteeAccountID), eq(AuthTable.provider, "email")),
+ )
+ .where(
+ and(
+ eq(ReferralRewardTable.workspaceID, workspaceID),
+ isNull(ReferralRewardTable.timeDeleted),
+ isNull(ReferralTable.timeDeleted),
+ ),
+ ),
+ tx
+ .select({ id: ReferralTable.id, inviteeEmail: AuthTable.subject, timeCreated: ReferralTable.timeCreated })
+ .from(ReferralTable)
+ .innerJoin(
+ AuthTable,
+ and(eq(AuthTable.accountID, ReferralTable.inviteeAccountID), eq(AuthTable.provider, "email")),
+ )
+ .where(and(eq(ReferralTable.workspaceID, workspaceID), isNull(ReferralTable.timeDeleted))),
+ tx
+ .select({ id: ReferralTable.id, inviterEmail: AuthTable.subject, timeCreated: ReferralTable.timeCreated })
+ .from(ReferralTable)
+ .leftJoin(
+ UserTable,
+ and(
+ eq(UserTable.workspaceID, ReferralTable.workspaceID),
+ eq(UserTable.role, "admin"),
+ isNull(UserTable.timeDeleted),
+ ),
+ )
+ .leftJoin(AuthTable, and(eq(AuthTable.accountID, UserTable.accountID), eq(AuthTable.provider, "email")))
+ .where(and(eq(ReferralTable.inviteeAccountID, accountID), isNull(ReferralTable.timeDeleted)))
+ .orderBy(asc(UserTable.timeCreated))
+ .then((rows) => rows.find((row) => row.inviterEmail) ?? rows[0]),
+ tx
+ .select({ referralID: ReferralRewardTable.referralID })
+ .from(ReferralRewardTable)
+ .innerJoin(ReferralTable, eq(ReferralTable.id, ReferralRewardTable.referralID))
+ .where(
+ and(
+ eq(ReferralTable.inviteeAccountID, accountID),
+ isNull(ReferralRewardTable.timeDeleted),
+ isNull(ReferralTable.timeDeleted),
+ ),
+ ),
+ ])
+
+ return { inviteeReferral, inviteeRewards, invites, rewards }
+ })
+
+ const rewardReferralIDs = new Set(rows.rewards.map((reward) => reward.referralID))
+ const inviteeRewardReferralIDs = new Set(rows.inviteeRewards.map((reward) => reward.referralID))
+ const rewards = rows.rewards.map((reward) => {
+ const source = reward.workspaceID === reward.referralWorkspaceID ? ("inviter" as const) : ("invitee" as const)
+ return {
+ id: reward.referralID,
+ source,
+ status: reward.timeApplied ? ("applied" as const) : ("available" as const),
+ email: source === "invitee" ? (rows.inviteeReferral?.inviterEmail ?? null) : reward.inviteeEmail,
+ amount: microCentsToCents(reward.amount),
+ timeCreated: reward.timeCreated,
+ timeApplied: reward.timeApplied,
+ }
+ })
+ const pending = [
+ ...rows.invites
+ .filter((referral) => !rewardReferralIDs.has(referral.id))
+ .map((referral) => ({
+ id: `${referral.id}:inviter`,
+ source: "inviter" as const,
+ status: "pending" as const,
+ email: referral.inviteeEmail,
+ amount: microCentsToCents(REWARD_AMOUNT),
+ timeCreated: referral.timeCreated,
+ timeApplied: null,
+ })),
+ ...(rows.inviteeReferral && !inviteeRewardReferralIDs.has(rows.inviteeReferral.id)
+ ? [
+ {
+ id: `${rows.inviteeReferral.id}:invitee`,
+ source: "invitee" as const,
+ status: "pending" as const,
+ email: rows.inviteeReferral.inviterEmail,
+ amount: microCentsToCents(REWARD_AMOUNT),
+ timeCreated: rows.inviteeReferral.timeCreated,
+ timeApplied: null,
+ },
+ ]
+ : []),
+ ]
+ const allRewards = [...pending, ...rewards].sort(
+ (a, b) => new Date(b.timeCreated).getTime() - new Date(a.timeCreated).getTime(),
+ )
+ return {
+ referralCode: code.code,
+ hasReferral: allRewards.length > 0,
+ rewardAmount: microCentsToCents(REWARD_AMOUNT),
+ rewards: allRewards,
+ }
+ })
+
+ export const applyReward = fn(z.object({ referralID: z.string() }), async (input) => {
+ const workspaceID = Actor.workspace()
+
+ return Database.transaction(async (tx) => {
+ const reward = await tx
+ .select({ amount: ReferralRewardTable.amount, timeApplied: ReferralRewardTable.timeApplied })
+ .from(ReferralRewardTable)
+ .where(
+ and(
+ eq(ReferralRewardTable.workspaceID, workspaceID),
+ eq(ReferralRewardTable.referralID, input.referralID),
+ isNull(ReferralRewardTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (!reward) throw new Error("Referral reward not found")
+ if (reward.timeApplied) throw new Error("Referral reward already applied")
+
+ const update = await tx
+ .update(ReferralRewardTable)
+ .set({
+ timeApplied: sql`now()`,
+ })
+ .where(
+ and(
+ eq(ReferralRewardTable.workspaceID, workspaceID),
+ eq(ReferralRewardTable.referralID, input.referralID),
+ isNull(ReferralRewardTable.timeApplied),
+ isNull(ReferralRewardTable.timeDeleted),
+ ),
+ )
+ if (update.rowsAffected === 0) throw new Error("Referral reward already applied")
+
+ await Billing.subtractLiteUsage(workspaceID, reward.amount)
+
+ return { amount: microCentsToCents(reward.amount) }
+ })
+ })
+
+ export const usagePreview = fn(z.object({ referralID: z.string() }), async (input) => {
+ const row = await Database.use((tx) =>
+ tx
+ .select({
+ rewardAmount: ReferralRewardTable.amount,
+ rollingUsage: LiteTable.rollingUsage,
+ weeklyUsage: LiteTable.weeklyUsage,
+ monthlyUsage: LiteTable.monthlyUsage,
+ timeRollingUpdated: LiteTable.timeRollingUpdated,
+ timeWeeklyUpdated: LiteTable.timeWeeklyUpdated,
+ timeMonthlyUpdated: LiteTable.timeMonthlyUpdated,
+ timeCreated: LiteTable.timeCreated,
+ })
+ .from(ReferralRewardTable)
+ .innerJoin(LiteTable, eq(LiteTable.workspaceID, ReferralRewardTable.workspaceID))
+ .where(
+ and(
+ eq(ReferralRewardTable.workspaceID, Actor.workspace()),
+ eq(ReferralRewardTable.referralID, input.referralID),
+ isNull(ReferralRewardTable.timeApplied),
+ isNull(ReferralRewardTable.timeDeleted),
+ isNull(LiteTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0]),
+ )
+ if (!row) return null
+
+ const limits = LiteData.getLimits()
+ return {
+ rollingUsage: usagePreviewItem(
+ Subscription.analyzeRollingUsage({
+ limit: limits.rollingLimit,
+ window: limits.rollingWindow,
+ usage: row.rollingUsage ?? 0,
+ timeUpdated: row.timeRollingUpdated ?? new Date(),
+ }),
+ Subscription.analyzeRollingUsage({
+ limit: limits.rollingLimit,
+ window: limits.rollingWindow,
+ usage: Math.max(0, (row.rollingUsage ?? 0) - row.rewardAmount),
+ timeUpdated: row.timeRollingUpdated ?? new Date(),
+ }),
+ ),
+ weeklyUsage: usagePreviewItem(
+ Subscription.analyzeWeeklyUsage({
+ limit: limits.weeklyLimit,
+ usage: row.weeklyUsage ?? 0,
+ timeUpdated: row.timeWeeklyUpdated ?? new Date(),
+ }),
+ Subscription.analyzeWeeklyUsage({
+ limit: limits.weeklyLimit,
+ usage: Math.max(0, (row.weeklyUsage ?? 0) - row.rewardAmount),
+ timeUpdated: row.timeWeeklyUpdated ?? new Date(),
+ }),
+ ),
+ monthlyUsage: usagePreviewItem(
+ Subscription.analyzeMonthlyUsage({
+ limit: limits.monthlyLimit,
+ usage: row.monthlyUsage ?? 0,
+ timeUpdated: row.timeMonthlyUpdated ?? new Date(),
+ timeSubscribed: row.timeCreated,
+ }),
+ Subscription.analyzeMonthlyUsage({
+ limit: limits.monthlyLimit,
+ usage: Math.max(0, (row.monthlyUsage ?? 0) - row.rewardAmount),
+ timeUpdated: row.timeMonthlyUpdated ?? new Date(),
+ timeSubscribed: row.timeCreated,
+ }),
+ ),
+ }
+ })
+
+ export async function createFromAccount(input: { accountID: string; referralCode?: string }) {
+ const referralCode = normalizeCode(input.referralCode)
+ if (!referralCode) return
+
+ return Database.transaction(async (tx) => {
+ const code = await tx
+ .select({ workspaceID: ReferralCodeTable.workspaceID })
+ .from(ReferralCodeTable)
+ .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, ReferralCodeTable.workspaceID))
+ .where(and(eq(ReferralCodeTable.code, referralCode), isNull(WorkspaceTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!code) throw new Error("Referral code invalid")
+
+ const existingReferral = await tx
+ .select({ id: ReferralTable.id })
+ .from(ReferralTable)
+ .where(and(eq(ReferralTable.inviteeAccountID, input.accountID), isNull(ReferralTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (existingReferral) throw new Error("Referral already redeemed")
+
+ const selfReferral = await tx
+ .select({ id: UserTable.id })
+ .from(UserTable)
+ .where(
+ and(
+ eq(UserTable.workspaceID, code.workspaceID),
+ eq(UserTable.accountID, input.accountID),
+ isNull(UserTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (selfReferral) throw new Error("Self-referral is not allowed")
+
+ const workspaceIDs = await tx
+ .select({ workspaceID: UserTable.workspaceID })
+ .from(UserTable)
+ .where(and(eq(UserTable.accountID, input.accountID), isNull(UserTable.timeDeleted)))
+ .then((rows) => rows.map((row) => row.workspaceID))
+ if (workspaceIDs.length === 0) return
+
+ const activeLite = await tx
+ .select({ id: LiteTable.id })
+ .from(LiteTable)
+ .where(and(inArray(LiteTable.workspaceID, workspaceIDs), isNull(LiteTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (activeLite) return
+
+ const litePayment = await tx
+ .select({ id: PaymentTable.id })
+ .from(PaymentTable)
+ .where(
+ and(
+ inArray(PaymentTable.workspaceID, workspaceIDs),
+ isNull(PaymentTable.timeDeleted),
+ sql`JSON_UNQUOTE(JSON_EXTRACT(${PaymentTable.enrichment}, '$.type')) = 'lite'`,
+ ),
+ )
+ .then((rows) => rows[0])
+ if (litePayment) return
+
+ const referralID = Identifier.create("referral")
+ await tx.insert(ReferralTable).ignore().values({
+ workspaceID: code.workspaceID,
+ id: referralID,
+ inviteeAccountID: input.accountID,
+ })
+
+ const referral = await tx
+ .select({ id: ReferralTable.id, workspaceID: ReferralTable.workspaceID })
+ .from(ReferralTable)
+ .where(and(eq(ReferralTable.inviteeAccountID, input.accountID), isNull(ReferralTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!referral) throw new Error("Referral not created")
+ if (referral.id !== referralID) throw new Error("Referral already redeemed")
+ })
+ }
+
+ export async function completeFromLiteSubscription(input: { workspaceID: string; userID: string }) {
+ return Database.transaction(async (tx) => {
+ const invitee = await tx
+ .select({ accountID: UserTable.accountID })
+ .from(UserTable)
+ .where(
+ and(
+ eq(UserTable.workspaceID, input.workspaceID),
+ eq(UserTable.id, input.userID),
+ isNull(UserTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (!invitee?.accountID) throw new Error("Referral invitee account missing")
+
+ const referral = await tx
+ .select({ id: ReferralTable.id, workspaceID: ReferralTable.workspaceID })
+ .from(ReferralTable)
+ .where(and(eq(ReferralTable.inviteeAccountID, invitee.accountID), isNull(ReferralTable.timeDeleted)))
+ .then((rows) => rows[0])
+ if (!referral) return
+
+ await tx.insert(ReferralRewardTable).ignore().values({
+ workspaceID: referral.workspaceID,
+ referralID: referral.id,
+ amount: REWARD_AMOUNT,
+ })
+
+ const existingInviteeReward = await tx
+ .select({ workspaceID: ReferralRewardTable.workspaceID })
+ .from(ReferralRewardTable)
+ .where(
+ and(
+ eq(ReferralRewardTable.referralID, referral.id),
+ sql`${ReferralRewardTable.workspaceID} <> ${referral.workspaceID}`,
+ isNull(ReferralRewardTable.timeDeleted),
+ ),
+ )
+ .then((rows) => rows[0])
+ if (existingInviteeReward) return
+
+ await tx.insert(ReferralRewardTable).ignore().values({
+ workspaceID: input.workspaceID,
+ referralID: referral.id,
+ amount: REWARD_AMOUNT,
+ })
+ })
+ }
+
+ function usagePreviewItem(
+ before: { usagePercent: number; resetInSec: number },
+ after: { usagePercent: number; resetInSec: number },
+ ) {
+ return {
+ beforePercent: before.usagePercent,
+ afterPercent: after.usagePercent,
+ resetInSec: after.resetInSec,
+ }
+ }
+}
diff --git a/packages/console/core/src/schema/account.sql.ts b/packages/console/core/src/schema/account.sql.ts
new file mode 100644
index 0000000..ce280ab
--- /dev/null
+++ b/packages/console/core/src/schema/account.sql.ts
@@ -0,0 +1,11 @@
+import { mysqlTable, primaryKey } from "drizzle-orm/mysql-core"
+import { id, timestamps } from "../drizzle/types"
+
+export const AccountTable = mysqlTable(
+ "account",
+ {
+ id: id(),
+ ...timestamps,
+ },
+ (table) => [primaryKey({ columns: [table.id] })],
+)
diff --git a/packages/console/core/src/schema/auth.sql.ts b/packages/console/core/src/schema/auth.sql.ts
new file mode 100644
index 0000000..27c926d
--- /dev/null
+++ b/packages/console/core/src/schema/auth.sql.ts
@@ -0,0 +1,20 @@
+import { index, mysqlEnum, mysqlTable, primaryKey, uniqueIndex, varchar } from "drizzle-orm/mysql-core"
+import { id, timestamps, ulid } from "../drizzle/types"
+
+export const AuthProvider = ["email", "github", "google"] as const
+
+export const AuthTable = mysqlTable(
+ "auth",
+ {
+ id: id(),
+ ...timestamps,
+ provider: mysqlEnum("provider", AuthProvider).notNull(),
+ subject: varchar("subject", { length: 255 }).notNull(),
+ accountID: ulid("account_id").notNull(),
+ },
+ (table) => [
+ primaryKey({ columns: [table.id] }),
+ uniqueIndex("provider").on(table.provider, table.subject),
+ index("account_id").on(table.accountID),
+ ],
+)
diff --git a/packages/console/core/src/schema/benchmark.sql.ts b/packages/console/core/src/schema/benchmark.sql.ts
new file mode 100644
index 0000000..8d435ed
--- /dev/null
+++ b/packages/console/core/src/schema/benchmark.sql.ts
@@ -0,0 +1,14 @@
+import { index, mediumtext, mysqlTable, primaryKey, varchar } from "drizzle-orm/mysql-core"
+import { id, timestamps } from "../drizzle/types"
+
+export const BenchmarkTable = mysqlTable(
+ "benchmark",
+ {
+ id: id(),
+ ...timestamps,
+ model: varchar("model", { length: 64 }).notNull(),
+ agent: varchar("agent", { length: 64 }).notNull(),
+ result: mediumtext("result").notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.id] }), index("time_created").on(table.timeCreated)],
+)
diff --git a/packages/console/core/src/schema/billing.sql.ts b/packages/console/core/src/schema/billing.sql.ts
new file mode 100644
index 0000000..915646c
--- /dev/null
+++ b/packages/console/core/src/schema/billing.sql.ts
@@ -0,0 +1,152 @@
+import {
+ bigint,
+ boolean,
+ index,
+ int,
+ json,
+ mysqlEnum,
+ mysqlTable,
+ primaryKey,
+ uniqueIndex,
+ varchar,
+} from "drizzle-orm/mysql-core"
+import { timestamps, ulid, utc, workspaceColumns } from "../drizzle/types"
+import { workspaceIndexes } from "./workspace.sql"
+
+export const BlackPlans = ["20", "100", "200"] as const
+export const BillingTable = mysqlTable(
+ "billing",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ customerID: varchar("customer_id", { length: 255 }),
+ paymentMethodID: varchar("payment_method_id", { length: 255 }),
+ paymentMethodType: varchar("payment_method_type", { length: 32 }),
+ paymentMethodLast4: varchar("payment_method_last4", { length: 4 }),
+ balance: bigint("balance", { mode: "number" }).notNull(),
+ monthlyLimit: int("monthly_limit"),
+ monthlyUsage: bigint("monthly_usage", { mode: "number" }),
+ timeMonthlyUsageUpdated: utc("time_monthly_usage_updated"),
+ reload: boolean("reload"),
+ reloadTrigger: int("reload_trigger"),
+ reloadAmount: int("reload_amount"),
+ reloadError: varchar("reload_error", { length: 255 }),
+ timeReloadError: utc("time_reload_error"),
+ timeReloadLockedTill: utc("time_reload_locked_till"),
+ subscription: json("subscription").$type<{
+ status: "subscribed"
+ seats: number
+ plan: (typeof BlackPlans)[number]
+ useBalance?: boolean
+ coupon?: string
+ }>(),
+ subscriptionID: varchar("subscription_id", { length: 28 }),
+ subscriptionPlan: mysqlEnum("subscription_plan", BlackPlans),
+ timeSubscriptionBooked: utc("time_subscription_booked"),
+ timeSubscriptionSelected: utc("time_subscription_selected"),
+ liteSubscriptionID: varchar("lite_subscription_id", { length: 28 }),
+ lite: json("lite").$type<{
+ useBalance?: boolean
+ }>(),
+ },
+ (table) => [
+ ...workspaceIndexes(table),
+ uniqueIndex("global_customer_id").on(table.customerID),
+ uniqueIndex("global_subscription_id").on(table.subscriptionID),
+ ],
+)
+
+export const SubscriptionTable = mysqlTable(
+ "subscription",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ userID: ulid("user_id").notNull(),
+ rollingUsage: bigint("rolling_usage", { mode: "number" }),
+ fixedUsage: bigint("fixed_usage", { mode: "number" }),
+ timeRollingUpdated: utc("time_rolling_updated"),
+ timeFixedUpdated: utc("time_fixed_updated"),
+ },
+ (table) => [...workspaceIndexes(table), uniqueIndex("workspace_user_id").on(table.workspaceID, table.userID)],
+)
+
+export const LiteTable = mysqlTable(
+ "lite",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ userID: ulid("user_id").notNull(),
+ rollingUsage: bigint("rolling_usage", { mode: "number" }),
+ weeklyUsage: bigint("weekly_usage", { mode: "number" }),
+ monthlyUsage: bigint("monthly_usage", { mode: "number" }),
+ timeRollingUpdated: utc("time_rolling_updated"),
+ timeWeeklyUpdated: utc("time_weekly_updated"),
+ timeMonthlyUpdated: utc("time_monthly_updated"),
+ },
+ (table) => [...workspaceIndexes(table), uniqueIndex("workspace_user_id").on(table.workspaceID, table.userID)],
+)
+
+export const PaymentTable = mysqlTable(
+ "payment",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ customerID: varchar("customer_id", { length: 255 }),
+ invoiceID: varchar("invoice_id", { length: 255 }),
+ paymentID: varchar("payment_id", { length: 255 }),
+ amount: bigint("amount", { mode: "number" }).notNull(),
+ timeRefunded: utc("time_refunded"),
+ enrichment: json("enrichment").$type<
+ | {
+ type: "subscription" | "lite"
+ currency?: "inr"
+ couponID?: string
+ }
+ | {
+ type: "credit"
+ }
+ >(),
+ },
+ (table) => [...workspaceIndexes(table)],
+)
+
+export const UsageTable = mysqlTable(
+ "usage",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ model: varchar("model", { length: 255 }).notNull(),
+ provider: varchar("provider", { length: 255 }).notNull(),
+ inputTokens: int("input_tokens").notNull(),
+ outputTokens: int("output_tokens").notNull(),
+ reasoningTokens: int("reasoning_tokens"),
+ cacheReadTokens: int("cache_read_tokens"),
+ cacheWrite5mTokens: int("cache_write_5m_tokens"),
+ cacheWrite1hTokens: int("cache_write_1h_tokens"),
+ cost: bigint("cost", { mode: "number" }).notNull(),
+ keyID: ulid("key_id"),
+ sessionID: varchar("session_id", { length: 30 }),
+ enrichment: json("enrichment").$type<{
+ plan: "sub" | "byok" | "lite"
+ }>(),
+ },
+ (table) => [...workspaceIndexes(table), index("usage_time_created").on(table.workspaceID, table.timeCreated)],
+)
+
+export const CouponType = [
+ "BUILDATHON",
+ "GO1MONTH50",
+ "GOFREEMONTH",
+ "GO3MONTHS100",
+ "GO6MONTHS100",
+ "GO12MONTHS100",
+] as const
+export const CouponTable = mysqlTable(
+ "coupon",
+ {
+ email: varchar("email", { length: 255 }),
+ type: mysqlEnum("type", CouponType).notNull(),
+ timeRedeemed: utc("time_redeemed"),
+ },
+ (table) => [primaryKey({ columns: [table.email, table.type] })],
+)
diff --git a/packages/console/core/src/schema/ip.sql.ts b/packages/console/core/src/schema/ip.sql.ts
new file mode 100644
index 0000000..a80fa47
--- /dev/null
+++ b/packages/console/core/src/schema/ip.sql.ts
@@ -0,0 +1,63 @@
+import { mysqlTable, int, primaryKey, varchar, bigint } from "drizzle-orm/mysql-core"
+import { timestamps } from "../drizzle/types"
+
+export const IpTable = mysqlTable(
+ "ip",
+ {
+ ip: varchar("ip", { length: 45 }).notNull(),
+ ...timestamps,
+ usage: int("usage"),
+ },
+ (table) => [primaryKey({ columns: [table.ip] })],
+)
+
+export const IpRateLimitTable = mysqlTable(
+ "ip_rate_limit",
+ {
+ ip: varchar("ip", { length: 45 }).notNull(),
+ interval: varchar("interval", { length: 10 }).notNull(),
+ count: int("count").notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.ip, table.interval] })],
+)
+
+export const KeyRateLimitTable = mysqlTable(
+ "key_rate_limit",
+ {
+ key: varchar("key", { length: 255 }).notNull(),
+ interval: varchar("interval", { length: 40 }).notNull(),
+ count: int("count").notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.key, table.interval] })],
+)
+
+export const ModelTpmRateLimitTable = mysqlTable(
+ "model_tpm_rate_limit",
+ {
+ id: varchar("id", { length: 255 }).notNull(),
+ interval: bigint("interval", { mode: "number" }).notNull(),
+ count: int("count").notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.id, table.interval] })],
+)
+
+export const ModelTpsRateLimitTable = mysqlTable(
+ "model_tps_rate_limit",
+ {
+ id: varchar("id", { length: 255 }).notNull(),
+ interval: bigint("interval", { mode: "number" }).notNull(),
+ qualify: int("qualify").notNull(),
+ unqualify: int("unqualify").notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.id, table.interval] })],
+)
+
+export const ModelStickyProviderTable = mysqlTable(
+ "model_sticky_provider",
+ {
+ id: varchar("id", { length: 255 }).notNull(),
+ ...timestamps,
+ providerId: varchar("provider_id", { length: 255 }).notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.id] })],
+)
diff --git a/packages/console/core/src/schema/key.sql.ts b/packages/console/core/src/schema/key.sql.ts
new file mode 100644
index 0000000..107bbd2
--- /dev/null
+++ b/packages/console/core/src/schema/key.sql.ts
@@ -0,0 +1,16 @@
+import { mysqlTable, varchar, uniqueIndex } from "drizzle-orm/mysql-core"
+import { timestamps, ulid, utc, workspaceColumns } from "../drizzle/types"
+import { workspaceIndexes } from "./workspace.sql"
+
+export const KeyTable = mysqlTable(
+ "key",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ name: varchar("name", { length: 255 }).notNull(),
+ key: varchar("key", { length: 255 }).notNull(),
+ userID: ulid("user_id").notNull(),
+ timeUsed: utc("time_used"),
+ },
+ (table) => [...workspaceIndexes(table), uniqueIndex("global_key").on(table.key)],
+)
diff --git a/packages/console/core/src/schema/model.sql.ts b/packages/console/core/src/schema/model.sql.ts
new file mode 100644
index 0000000..1c032aa
--- /dev/null
+++ b/packages/console/core/src/schema/model.sql.ts
@@ -0,0 +1,13 @@
+import { mysqlTable, varchar, uniqueIndex } from "drizzle-orm/mysql-core"
+import { timestamps, workspaceColumns } from "../drizzle/types"
+import { workspaceIndexes } from "./workspace.sql"
+
+export const ModelTable = mysqlTable(
+ "model",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ model: varchar("model", { length: 64 }).notNull(),
+ },
+ (table) => [...workspaceIndexes(table), uniqueIndex("model_workspace_model").on(table.workspaceID, table.model)],
+)
diff --git a/packages/console/core/src/schema/provider.sql.ts b/packages/console/core/src/schema/provider.sql.ts
new file mode 100644
index 0000000..11be5b4
--- /dev/null
+++ b/packages/console/core/src/schema/provider.sql.ts
@@ -0,0 +1,14 @@
+import { mysqlTable, text, uniqueIndex, varchar } from "drizzle-orm/mysql-core"
+import { timestamps, workspaceColumns } from "../drizzle/types"
+import { workspaceIndexes } from "./workspace.sql"
+
+export const ProviderTable = mysqlTable(
+ "provider",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ provider: varchar("provider", { length: 64 }).notNull(),
+ credentials: text("credentials").notNull(),
+ },
+ (table) => [...workspaceIndexes(table), uniqueIndex("workspace_provider").on(table.workspaceID, table.provider)],
+)
diff --git a/packages/console/core/src/schema/referral.sql.ts b/packages/console/core/src/schema/referral.sql.ts
new file mode 100644
index 0000000..9850c92
--- /dev/null
+++ b/packages/console/core/src/schema/referral.sql.ts
@@ -0,0 +1,35 @@
+import { bigint, mysqlTable, primaryKey, uniqueIndex, varchar } from "drizzle-orm/mysql-core"
+import { timestamps, ulid, utc, workspaceColumns } from "../drizzle/types"
+import { workspaceIndexes } from "./workspace.sql"
+
+export const ReferralCodeTable = mysqlTable(
+ "referral_code",
+ {
+ workspaceID: ulid("workspace_id").notNull(),
+ code: varchar("code", { length: 10 }).notNull(),
+ ...timestamps,
+ },
+ (table) => [primaryKey({ columns: [table.workspaceID] }), uniqueIndex("code").on(table.code)],
+)
+
+export const ReferralTable = mysqlTable(
+ "referral",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ inviteeAccountID: ulid("invitee_account_id").notNull(),
+ },
+ (table) => [...workspaceIndexes(table), uniqueIndex("invitee_account_id").on(table.inviteeAccountID)],
+)
+
+export const ReferralRewardTable = mysqlTable(
+ "referral_reward",
+ {
+ workspaceID: ulid("workspace_id").notNull(),
+ referralID: ulid("referral_id").notNull(),
+ ...timestamps,
+ amount: bigint("amount", { mode: "number" }).notNull(),
+ timeApplied: utc("time_applied"),
+ },
+ (table) => [primaryKey({ columns: [table.workspaceID, table.referralID] })],
+)
diff --git a/packages/console/core/src/schema/user.sql.ts b/packages/console/core/src/schema/user.sql.ts
new file mode 100644
index 0000000..7fd7f5e
--- /dev/null
+++ b/packages/console/core/src/schema/user.sql.ts
@@ -0,0 +1,29 @@
+import { mysqlTable, uniqueIndex, varchar, int, mysqlEnum, index, bigint } from "drizzle-orm/mysql-core"
+import { timestamps, ulid, utc, workspaceColumns } from "../drizzle/types"
+import { workspaceIndexes } from "./workspace.sql"
+
+export const UserRole = ["admin", "member"] as const
+
+export const UserTable = mysqlTable(
+ "user",
+ {
+ ...workspaceColumns,
+ ...timestamps,
+ accountID: ulid("account_id"),
+ email: varchar("email", { length: 255 }),
+ name: varchar("name", { length: 255 }).notNull(),
+ timeSeen: utc("time_seen"),
+ color: int("color"),
+ role: mysqlEnum("role", UserRole).notNull(),
+ monthlyLimit: int("monthly_limit"),
+ monthlyUsage: bigint("monthly_usage", { mode: "number" }),
+ timeMonthlyUsageUpdated: utc("time_monthly_usage_updated"),
+ },
+ (table) => [
+ ...workspaceIndexes(table),
+ uniqueIndex("user_account_id").on(table.workspaceID, table.accountID),
+ uniqueIndex("user_email").on(table.workspaceID, table.email),
+ index("global_account_id").on(table.accountID),
+ index("global_email").on(table.email),
+ ],
+)
diff --git a/packages/console/core/src/schema/workspace.sql.ts b/packages/console/core/src/schema/workspace.sql.ts
new file mode 100644
index 0000000..269b62a
--- /dev/null
+++ b/packages/console/core/src/schema/workspace.sql.ts
@@ -0,0 +1,21 @@
+import { primaryKey, mysqlTable, uniqueIndex, varchar } from "drizzle-orm/mysql-core"
+import { timestamps, ulid } from "../drizzle/types"
+
+export const WorkspaceTable = mysqlTable(
+ "workspace",
+ {
+ id: ulid("id").notNull().primaryKey(),
+ slug: varchar("slug", { length: 255 }),
+ name: varchar("name", { length: 255 }).notNull(),
+ ...timestamps,
+ },
+ (table) => [uniqueIndex("slug").on(table.slug)],
+)
+
+export function workspaceIndexes(table: any) {
+ return [
+ primaryKey({
+ columns: [table.workspaceID, table.id],
+ }),
+ ]
+}
diff --git a/packages/console/core/src/subscription.ts b/packages/console/core/src/subscription.ts
new file mode 100644
index 0000000..adbb0a5
--- /dev/null
+++ b/packages/console/core/src/subscription.ts
@@ -0,0 +1,155 @@
+import { z } from "zod"
+import { fn } from "./util/fn"
+import { centsToMicroCents } from "./util/price"
+import { getWeekBounds, getMonthlyBounds } from "./util/date"
+import { Resource } from "@opencode-ai/console-resource"
+
+export namespace Subscription {
+ const LimitsSchema = z.object({
+ free: z.object({
+ promoTokens: z.number().int(),
+ dailyRequests: z.number().int(),
+ dailyRequestsFallback: z.number().int(),
+ checkHeaders: z.record(z.string(), z.string()),
+ }),
+ lite: z.object({
+ rollingLimit: z.number().int(),
+ rollingWindow: z.number().int(),
+ weeklyLimit: z.number().int(),
+ monthlyLimit: z.number().int(),
+ }),
+ black: z.object({
+ "20": z.object({
+ fixedLimit: z.number().int(),
+ rollingLimit: z.number().int(),
+ rollingWindow: z.number().int(),
+ }),
+ "100": z.object({
+ fixedLimit: z.number().int(),
+ rollingLimit: z.number().int(),
+ rollingWindow: z.number().int(),
+ }),
+ "200": z.object({
+ fixedLimit: z.number().int(),
+ rollingLimit: z.number().int(),
+ rollingWindow: z.number().int(),
+ }),
+ }),
+ })
+
+ export const validate = fn(LimitsSchema, (input) => {
+ return input
+ })
+
+ export const getLimits = fn(z.void(), () => {
+ const json = JSON.parse(Resource.ZEN_LIMITS.value)
+ return LimitsSchema.parse(json)
+ })
+
+ export const getFreeLimits = fn(z.void(), () => {
+ return getLimits()["free"]
+ })
+
+ export const analyzeRollingUsage = fn(
+ z.object({
+ limit: z.number().int(),
+ window: z.number().int(),
+ usage: z.number().int(),
+ timeUpdated: z.date(),
+ }),
+ ({ limit, window, usage, timeUpdated }) => {
+ const now = new Date()
+ const rollingWindowMs = window * 3600 * 1000
+ const rollingLimitInMicroCents = centsToMicroCents(limit * 100)
+ const windowStart = new Date(now.getTime() - rollingWindowMs)
+ if (timeUpdated < windowStart) {
+ return {
+ status: "ok" as const,
+ resetInSec: window * 3600,
+ usagePercent: 0,
+ }
+ }
+
+ const windowEnd = new Date(timeUpdated.getTime() + rollingWindowMs)
+ if (usage < rollingLimitInMicroCents) {
+ return {
+ status: "ok" as const,
+ resetInSec: Math.ceil((windowEnd.getTime() - now.getTime()) / 1000),
+ usagePercent: Math.floor(Math.min(100, (usage / rollingLimitInMicroCents) * 100)),
+ }
+ }
+ return {
+ status: "rate-limited" as const,
+ resetInSec: Math.ceil((windowEnd.getTime() - now.getTime()) / 1000),
+ usagePercent: 100,
+ }
+ },
+ )
+
+ export const analyzeWeeklyUsage = fn(
+ z.object({
+ limit: z.number().int(),
+ usage: z.number().int(),
+ timeUpdated: z.date(),
+ }),
+ ({ limit, usage, timeUpdated }) => {
+ const now = new Date()
+ const week = getWeekBounds(now)
+ const fixedLimitInMicroCents = centsToMicroCents(limit * 100)
+ if (timeUpdated < week.start) {
+ return {
+ status: "ok" as const,
+ resetInSec: Math.ceil((week.end.getTime() - now.getTime()) / 1000),
+ usagePercent: 0,
+ }
+ }
+ if (usage < fixedLimitInMicroCents) {
+ return {
+ status: "ok" as const,
+ resetInSec: Math.ceil((week.end.getTime() - now.getTime()) / 1000),
+ usagePercent: Math.floor(Math.min(100, (usage / fixedLimitInMicroCents) * 100)),
+ }
+ }
+
+ return {
+ status: "rate-limited" as const,
+ resetInSec: Math.ceil((week.end.getTime() - now.getTime()) / 1000),
+ usagePercent: 100,
+ }
+ },
+ )
+
+ export const analyzeMonthlyUsage = fn(
+ z.object({
+ limit: z.number().int(),
+ usage: z.number().int(),
+ timeUpdated: z.date(),
+ timeSubscribed: z.date(),
+ }),
+ ({ limit, usage, timeUpdated, timeSubscribed }) => {
+ const now = new Date()
+ const month = getMonthlyBounds(now, timeSubscribed)
+ const fixedLimitInMicroCents = centsToMicroCents(limit * 100)
+ if (timeUpdated < month.start) {
+ return {
+ status: "ok" as const,
+ resetInSec: Math.ceil((month.end.getTime() - now.getTime()) / 1000),
+ usagePercent: 0,
+ }
+ }
+ if (usage < fixedLimitInMicroCents) {
+ return {
+ status: "ok" as const,
+ resetInSec: Math.ceil((month.end.getTime() - now.getTime()) / 1000),
+ usagePercent: Math.floor(Math.min(100, (usage / fixedLimitInMicroCents) * 100)),
+ }
+ }
+
+ return {
+ status: "rate-limited" as const,
+ resetInSec: Math.ceil((month.end.getTime() - now.getTime()) / 1000),
+ usagePercent: 100,
+ }
+ },
+ )
+}
diff --git a/packages/console/core/src/user.ts b/packages/console/core/src/user.ts
new file mode 100644
index 0000000..8b7a96f
--- /dev/null
+++ b/packages/console/core/src/user.ts
@@ -0,0 +1,226 @@
+import { z } from "zod"
+import { and, eq, getTableColumns, isNull, sql } from "drizzle-orm"
+import { fn } from "./util/fn"
+import { Database } from "./drizzle"
+import { UserRole, UserTable } from "./schema/user.sql"
+import { Actor } from "./actor"
+import { Identifier } from "./identifier"
+import { render } from "@jsx-email/render"
+import { AWS } from "./aws"
+import { Key } from "./key"
+import { KeyTable } from "./schema/key.sql"
+import { WorkspaceTable } from "./schema/workspace.sql"
+import { AuthTable } from "./schema/auth.sql"
+
+export namespace User {
+ const assertNotSelf = (id: string) => {
+ if (Actor.userID() !== id) return
+ throw new Error(`Expected not self actor, got self actor`)
+ }
+
+ export const list = fn(z.void(), () =>
+ Database.use((tx) =>
+ tx
+ .select({
+ ...getTableColumns(UserTable),
+ authEmail: AuthTable.subject,
+ })
+ .from(UserTable)
+ .leftJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .where(and(eq(UserTable.workspaceID, Actor.workspace()), isNull(UserTable.timeDeleted))),
+ ),
+ )
+
+ export const fromID = fn(z.string(), (id) =>
+ Database.use((tx) =>
+ tx
+ .select()
+ .from(UserTable)
+ .where(and(eq(UserTable.workspaceID, Actor.workspace()), eq(UserTable.id, id), isNull(UserTable.timeDeleted)))
+ .then((rows) => rows[0]),
+ ),
+ )
+
+ export const getAuthEmail = fn(z.string(), (id) =>
+ Database.use((tx) =>
+ tx
+ .select({
+ email: AuthTable.subject,
+ })
+ .from(UserTable)
+ .leftJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .where(and(eq(UserTable.workspaceID, Actor.workspace()), eq(UserTable.id, id)))
+ .then((rows) => rows[0]?.email),
+ ),
+ )
+
+ export const invite = fn(
+ z.object({
+ email: z.string(),
+ role: z.enum(UserRole),
+ monthlyLimit: z.number().nullable().optional(),
+ }),
+ async ({ email, role, monthlyLimit }) => {
+ Actor.assertAdmin()
+ const workspaceID = Actor.workspace()
+
+ // create user
+ const accountID = await Database.use((tx) =>
+ tx
+ .select({
+ accountID: AuthTable.accountID,
+ })
+ .from(AuthTable)
+ .where(and(eq(AuthTable.provider, "email"), eq(AuthTable.subject, email)))
+ .then((rows) => rows[0]?.accountID),
+ )
+ await Database.use((tx) =>
+ tx
+ .insert(UserTable)
+ .values({
+ id: Identifier.create("user"),
+ name: "",
+ ...(accountID
+ ? {
+ accountID,
+ }
+ : {
+ email,
+ }),
+ workspaceID,
+ role,
+ monthlyLimit,
+ })
+ .onDuplicateKeyUpdate({
+ set: {
+ role,
+ monthlyLimit,
+ timeDeleted: null,
+ },
+ }),
+ )
+
+ // create api key
+ if (accountID) {
+ await Database.use(async (tx) => {
+ const user = await tx
+ .select()
+ .from(UserTable)
+ .where(and(eq(UserTable.workspaceID, workspaceID), eq(UserTable.accountID, accountID)))
+ .then((rows) => rows[0])
+
+ const key = await tx
+ .select()
+ .from(KeyTable)
+ .where(and(eq(KeyTable.workspaceID, workspaceID), eq(KeyTable.userID, user.id)))
+ .then((rows) => rows[0])
+
+ if (key) return
+
+ await Key.create({ userID: user.id, name: "Default API Key" })
+ })
+ }
+
+ // send email, ignore errors
+ try {
+ const emailInfo = await Database.use((tx) =>
+ tx
+ .select({
+ inviterEmail: AuthTable.subject,
+ workspaceName: WorkspaceTable.name,
+ })
+ .from(UserTable)
+ .innerJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
+ .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, workspaceID))
+ .where(
+ and(eq(UserTable.workspaceID, workspaceID), eq(UserTable.id, Actor.assert("user").properties.userID)),
+ )
+ .then((rows) => rows[0]),
+ )
+
+ const { InviteEmail } = await import("@opencode-ai/console-mail/InviteEmail.jsx")
+ await AWS.sendEmail({
+ to: email,
+ subject: `You've been invited to join the ${emailInfo.workspaceName} workspace on OpenCode`,
+ body: render(
+ // @ts-ignore
+ InviteEmail({
+ inviter: emailInfo.inviterEmail,
+ assetsUrl: `https://opencode.ai/email`,
+ workspaceID: workspaceID,
+ workspaceName: emailInfo.workspaceName,
+ }),
+ ),
+ })
+ } catch (e) {
+ console.error(e)
+ }
+ },
+ )
+
+ export const joinInvitedWorkspaces = fn(z.void(), async () => {
+ const account = Actor.assert("account")
+ const invitations = await Database.use(async (tx) => {
+ const invitations = await tx
+ .select({
+ id: UserTable.id,
+ workspaceID: UserTable.workspaceID,
+ })
+ .from(UserTable)
+ .where(eq(UserTable.email, account.properties.email))
+
+ await tx
+ .update(UserTable)
+ .set({
+ accountID: account.properties.accountID,
+ email: null,
+ })
+ .where(eq(UserTable.email, account.properties.email))
+ return invitations
+ })
+
+ await Promise.all(
+ invitations.map((invite) =>
+ Actor.provide(
+ "system",
+ {
+ workspaceID: invite.workspaceID,
+ },
+ () => Key.create({ userID: invite.id, name: "Default API Key" }),
+ ),
+ ),
+ )
+ })
+
+ export const update = fn(
+ z.object({
+ id: z.string(),
+ role: z.enum(UserRole),
+ monthlyLimit: z.number().nullable(),
+ }),
+ async ({ id, role, monthlyLimit }) => {
+ Actor.assertAdmin()
+ if (role === "member") assertNotSelf(id)
+ return await Database.use((tx) =>
+ tx
+ .update(UserTable)
+ .set({ role, monthlyLimit })
+ .where(and(eq(UserTable.id, id), eq(UserTable.workspaceID, Actor.workspace()))),
+ )
+ },
+ )
+
+ export const remove = fn(z.string(), async (id) => {
+ Actor.assertAdmin()
+ assertNotSelf(id)
+
+ return await Database.use((tx) =>
+ tx
+ .update(UserTable)
+ .set({
+ timeDeleted: sql`now()`,
+ })
+ .where(and(eq(UserTable.id, id), eq(UserTable.workspaceID, Actor.workspace()))),
+ )
+ })
+}
diff --git a/packages/console/core/src/util/crypto.ts b/packages/console/core/src/util/crypto.ts
new file mode 100644
index 0000000..46f53ae
--- /dev/null
+++ b/packages/console/core/src/util/crypto.ts
@@ -0,0 +1,8 @@
+import { timingSafeEqual } from "node:crypto"
+
+export function safeEqual(a: string, b: string): boolean {
+ const encoder = new TextEncoder()
+ const aBytes = encoder.encode(a)
+ const bBytes = encoder.encode(b)
+ return aBytes.length === bBytes.length && timingSafeEqual(aBytes, bBytes)
+}
diff --git a/packages/console/core/src/util/date.ts b/packages/console/core/src/util/date.ts
new file mode 100644
index 0000000..dea9c39
--- /dev/null
+++ b/packages/console/core/src/util/date.ts
@@ -0,0 +1,38 @@
+export function getWeekBounds(date: Date) {
+ const offset = (date.getUTCDay() + 6) % 7
+ const start = new Date(date)
+ start.setUTCDate(date.getUTCDate() - offset)
+ start.setUTCHours(0, 0, 0, 0)
+ const end = new Date(start)
+ end.setUTCDate(start.getUTCDate() + 7)
+ return { start, end }
+}
+
+export function getMonthlyBounds(now: Date, subscribed: Date) {
+ const day = subscribed.getUTCDate()
+ const hh = subscribed.getUTCHours()
+ const mm = subscribed.getUTCMinutes()
+ const ss = subscribed.getUTCSeconds()
+ const ms = subscribed.getUTCMilliseconds()
+
+ function anchor(year: number, month: number) {
+ const max = new Date(Date.UTC(year, month + 1, 0)).getUTCDate()
+ return new Date(Date.UTC(year, month, Math.min(day, max), hh, mm, ss, ms))
+ }
+
+ function shift(year: number, month: number, delta: number) {
+ const total = year * 12 + month + delta
+ return [Math.floor(total / 12), ((total % 12) + 12) % 12] as const
+ }
+
+ let y = now.getUTCFullYear()
+ let m = now.getUTCMonth()
+ let start = anchor(y, m)
+ if (start > now) {
+ ;[y, m] = shift(y, m, -1)
+ start = anchor(y, m)
+ }
+ const [ny, nm] = shift(y, m, 1)
+ const end = anchor(ny, nm)
+ return { start, end }
+}
diff --git a/packages/console/core/src/util/env.cloudflare.ts b/packages/console/core/src/util/env.cloudflare.ts
new file mode 100644
index 0000000..336ce12
--- /dev/null
+++ b/packages/console/core/src/util/env.cloudflare.ts
@@ -0,0 +1 @@
+export {}
diff --git a/packages/console/core/src/util/fn.ts b/packages/console/core/src/util/fn.ts
new file mode 100644
index 0000000..9efe462
--- /dev/null
+++ b/packages/console/core/src/util/fn.ts
@@ -0,0 +1,11 @@
+import { z } from "zod"
+
+export function fn(schema: T, cb: (input: z.infer) => Result) {
+ const result = (input: z.infer) => {
+ const parsed = schema.parse(input)
+ return cb(parsed)
+ }
+ result.force = (input: z.infer) => cb(input)
+ result.schema = schema
+ return result
+}
diff --git a/packages/console/core/src/util/log.ts b/packages/console/core/src/util/log.ts
new file mode 100644
index 0000000..ef3ad85
--- /dev/null
+++ b/packages/console/core/src/util/log.ts
@@ -0,0 +1,55 @@
+import { Context } from "../context"
+
+export namespace Log {
+ const ctx = Context.create<{
+ tags: Record
+ }>()
+
+ export function create(tags?: Record) {
+ tags = tags || {}
+
+ const result = {
+ info(message?: any, extra?: Record) {
+ const prefix = Object.entries({
+ ...use().tags,
+ ...tags,
+ ...extra,
+ })
+ .map(([key, value]) => `${key}=${value}`)
+ .join(" ")
+ console.log(prefix, message)
+ return result
+ },
+ tag(key: string, value: string) {
+ if (tags) tags[key] = value
+ return result
+ },
+ clone() {
+ return Log.create({ ...tags })
+ },
+ }
+
+ return result
+ }
+
+ export function provide(tags: Record, cb: () => R) {
+ const existing = use()
+ return ctx.provide(
+ {
+ tags: {
+ ...existing.tags,
+ ...tags,
+ },
+ },
+ cb,
+ )
+ }
+
+ function use() {
+ try {
+ return ctx.use()
+ } catch {
+ return { tags: {} }
+ }
+ }
+}
diff --git a/packages/console/core/src/util/memo.ts b/packages/console/core/src/util/memo.ts
new file mode 100644
index 0000000..4904301
--- /dev/null
+++ b/packages/console/core/src/util/memo.ts
@@ -0,0 +1,18 @@
+export function memo(fn: () => T, cleanup?: (input: T) => Promise) {
+ let value: T | undefined
+ let loaded = false
+
+ const result = (): T => {
+ if (loaded) return value as T
+ loaded = true
+ value = fn()
+ return value as T
+ }
+ result.reset = async () => {
+ if (cleanup && value) await cleanup(value)
+ loaded = false
+ value = undefined
+ }
+
+ return result
+}
diff --git a/packages/console/core/src/util/price.ts b/packages/console/core/src/util/price.ts
new file mode 100644
index 0000000..ff7a576
--- /dev/null
+++ b/packages/console/core/src/util/price.ts
@@ -0,0 +1,7 @@
+export function centsToMicroCents(amount: number) {
+ return Math.round(amount * 1000000)
+}
+
+export function microCentsToCents(amount: number) {
+ return Math.round(amount / 1000000)
+}
diff --git a/packages/console/core/src/workspace.ts b/packages/console/core/src/workspace.ts
new file mode 100644
index 0000000..655112a
--- /dev/null
+++ b/packages/console/core/src/workspace.ts
@@ -0,0 +1,76 @@
+import { z } from "zod"
+import { fn } from "./util/fn"
+import { Actor } from "./actor"
+import { Database } from "./drizzle"
+import { Identifier } from "./identifier"
+import { UserTable } from "./schema/user.sql"
+import { BillingTable } from "./schema/billing.sql"
+import { WorkspaceTable } from "./schema/workspace.sql"
+import { Key } from "./key"
+import { eq, sql } from "drizzle-orm"
+
+export namespace Workspace {
+ export const create = fn(
+ z.object({
+ name: z.string().min(1),
+ }),
+ async ({ name }) => {
+ const account = Actor.assert("account")
+ const workspaceID = Identifier.create("workspace")
+ const userID = Identifier.create("user")
+ await Database.transaction(async (tx) => {
+ await tx.insert(WorkspaceTable).values({
+ id: workspaceID,
+ name,
+ })
+ await tx.insert(UserTable).values({
+ workspaceID,
+ id: userID,
+ accountID: account.properties.accountID,
+ name: "",
+ role: "admin",
+ })
+ await tx.insert(BillingTable).values({
+ workspaceID,
+ id: Identifier.create("billing"),
+ balance: 0,
+ })
+ })
+ await Actor.provide(
+ "system",
+ {
+ workspaceID,
+ },
+ () => Key.create({ userID, name: "Default API Key" }),
+ )
+ return workspaceID
+ },
+ )
+
+ export const update = fn(
+ z.object({
+ name: z.string().min(1).max(255),
+ }),
+ async ({ name }) => {
+ Actor.assertAdmin()
+ const workspaceID = Actor.workspace()
+ return await Database.use((tx) =>
+ tx
+ .update(WorkspaceTable)
+ .set({
+ name,
+ })
+ .where(eq(WorkspaceTable.id, workspaceID)),
+ )
+ },
+ )
+
+ export const remove = fn(z.void(), async () => {
+ await Database.use((tx) =>
+ tx
+ .update(WorkspaceTable)
+ .set({ timeDeleted: sql`now()` })
+ .where(eq(WorkspaceTable.id, Actor.workspace())),
+ )
+ })
+}
diff --git a/packages/console/core/sst-env.d.ts b/packages/console/core/sst-env.d.ts
new file mode 100644
index 0000000..301538c
--- /dev/null
+++ b/packages/console/core/sst-env.d.ts
@@ -0,0 +1,10 @@
+/* This file is auto-generated by SST. Do not edit. */
+/* tslint:disable */
+/* eslint-disable */
+/* deno-fmt-ignore-file */
+/* biome-ignore-all lint: auto-generated */
+
+///
+
+import "sst"
+export {}
\ No newline at end of file
diff --git a/packages/console/core/test/date.test.ts b/packages/console/core/test/date.test.ts
new file mode 100644
index 0000000..e5a0a90
--- /dev/null
+++ b/packages/console/core/test/date.test.ts
@@ -0,0 +1,76 @@
+import { describe, expect, test } from "bun:test"
+import { getWeekBounds, getMonthlyBounds } from "../src/util/date"
+
+describe("util.date.getWeekBounds", () => {
+ test("returns a Monday-based week for Sunday dates", () => {
+ const date = new Date("2026-01-18T12:00:00Z")
+ const bounds = getWeekBounds(date)
+
+ expect(bounds.start.toISOString()).toBe("2026-01-12T00:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-01-19T00:00:00.000Z")
+ })
+
+ test("returns a seven day window", () => {
+ const date = new Date("2026-01-14T12:00:00Z")
+ const bounds = getWeekBounds(date)
+
+ const span = bounds.end.getTime() - bounds.start.getTime()
+ expect(span).toBe(7 * 24 * 60 * 60 * 1000)
+ })
+})
+
+describe("util.date.getMonthlyBounds", () => {
+ test("resets on subscription day mid-month", () => {
+ const now = new Date("2026-03-20T10:00:00Z")
+ const subscribed = new Date("2026-01-15T08:00:00Z")
+ const bounds = getMonthlyBounds(now, subscribed)
+
+ expect(bounds.start.toISOString()).toBe("2026-03-15T08:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-04-15T08:00:00.000Z")
+ })
+
+ test("before subscription day in current month uses previous month anchor", () => {
+ const now = new Date("2026-03-10T10:00:00Z")
+ const subscribed = new Date("2026-01-15T08:00:00Z")
+ const bounds = getMonthlyBounds(now, subscribed)
+
+ expect(bounds.start.toISOString()).toBe("2026-02-15T08:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-03-15T08:00:00.000Z")
+ })
+
+ test("clamps day for short months", () => {
+ const now = new Date("2026-03-01T10:00:00Z")
+ const subscribed = new Date("2026-01-31T12:00:00Z")
+ const bounds = getMonthlyBounds(now, subscribed)
+
+ expect(bounds.start.toISOString()).toBe("2026-02-28T12:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-03-31T12:00:00.000Z")
+ })
+
+ test("handles subscription on the 1st", () => {
+ const now = new Date("2026-04-15T00:00:00Z")
+ const subscribed = new Date("2026-01-01T00:00:00Z")
+ const bounds = getMonthlyBounds(now, subscribed)
+
+ expect(bounds.start.toISOString()).toBe("2026-04-01T00:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-05-01T00:00:00.000Z")
+ })
+
+ test("exactly on the reset boundary uses current period", () => {
+ const now = new Date("2026-03-15T08:00:00Z")
+ const subscribed = new Date("2026-01-15T08:00:00Z")
+ const bounds = getMonthlyBounds(now, subscribed)
+
+ expect(bounds.start.toISOString()).toBe("2026-03-15T08:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-04-15T08:00:00.000Z")
+ })
+
+ test("february to march with day 30 subscription", () => {
+ const now = new Date("2026-02-15T06:00:00Z")
+ const subscribed = new Date("2025-12-30T06:00:00Z")
+ const bounds = getMonthlyBounds(now, subscribed)
+
+ expect(bounds.start.toISOString()).toBe("2026-01-30T06:00:00.000Z")
+ expect(bounds.end.toISOString()).toBe("2026-02-28T06:00:00.000Z")
+ })
+})
diff --git a/packages/console/core/test/subscription.test.ts b/packages/console/core/test/subscription.test.ts
new file mode 100644
index 0000000..57e63f9
--- /dev/null
+++ b/packages/console/core/test/subscription.test.ts
@@ -0,0 +1,106 @@
+import { describe, expect, test, setSystemTime, afterEach } from "bun:test"
+import { Subscription } from "../src/subscription"
+import { centsToMicroCents } from "../src/util/price"
+
+afterEach(() => {
+ setSystemTime()
+})
+
+describe("Subscription.analyzeMonthlyUsage", () => {
+ const subscribed = new Date("2026-01-15T08:00:00Z")
+
+ test("returns ok with 0% when usage was last updated before current period", () => {
+ setSystemTime(new Date("2026-03-20T10:00:00Z"))
+ const result = Subscription.analyzeMonthlyUsage({
+ limit: 10,
+ usage: centsToMicroCents(500),
+ timeUpdated: new Date("2026-02-10T00:00:00Z"),
+ timeSubscribed: subscribed,
+ })
+
+ expect(result.status).toBe("ok")
+ expect(result.usagePercent).toBe(0)
+ // reset should be seconds until 2026-04-15T08:00:00Z
+ const expected = Math.ceil(
+ (new Date("2026-04-15T08:00:00Z").getTime() - new Date("2026-03-20T10:00:00Z").getTime()) / 1000,
+ )
+ expect(result.resetInSec).toBe(expected)
+ })
+
+ test("returns ok with usage percent when under limit", () => {
+ setSystemTime(new Date("2026-03-20T10:00:00Z"))
+ const limit = 10 // $10
+ const half = centsToMicroCents(10 * 100) / 2
+ const result = Subscription.analyzeMonthlyUsage({
+ limit,
+ usage: half,
+ timeUpdated: new Date("2026-03-18T00:00:00Z"),
+ timeSubscribed: subscribed,
+ })
+
+ expect(result.status).toBe("ok")
+ expect(result.usagePercent).toBe(50)
+ })
+
+ test("returns rate-limited when at or over limit", () => {
+ setSystemTime(new Date("2026-03-20T10:00:00Z"))
+ const limit = 10
+ const result = Subscription.analyzeMonthlyUsage({
+ limit,
+ usage: centsToMicroCents(limit * 100),
+ timeUpdated: new Date("2026-03-18T00:00:00Z"),
+ timeSubscribed: subscribed,
+ })
+
+ expect(result.status).toBe("rate-limited")
+ expect(result.usagePercent).toBe(100)
+ })
+
+ test("resets usage when crossing monthly boundary", () => {
+ // subscribed on 15th, now is April 16th — period is Apr 15 to May 15
+ // timeUpdated is March 20 (previous period)
+ setSystemTime(new Date("2026-04-16T10:00:00Z"))
+ const result = Subscription.analyzeMonthlyUsage({
+ limit: 10,
+ usage: centsToMicroCents(10 * 100),
+ timeUpdated: new Date("2026-03-20T00:00:00Z"),
+ timeSubscribed: subscribed,
+ })
+
+ expect(result.status).toBe("ok")
+ expect(result.usagePercent).toBe(0)
+ })
+
+ test("caps usage percent at 100", () => {
+ setSystemTime(new Date("2026-03-20T10:00:00Z"))
+ const limit = 10
+ const result = Subscription.analyzeMonthlyUsage({
+ limit,
+ usage: centsToMicroCents(limit * 100) - 1,
+ timeUpdated: new Date("2026-03-18T00:00:00Z"),
+ timeSubscribed: subscribed,
+ })
+
+ expect(result.status).toBe("ok")
+ expect(result.usagePercent).toBeLessThanOrEqual(100)
+ })
+
+ test("handles subscription day 31 in short month", () => {
+ const sub31 = new Date("2026-01-31T12:00:00Z")
+ // now is March 1 — period should be Feb 28 to Mar 31
+ setSystemTime(new Date("2026-03-01T10:00:00Z"))
+ const result = Subscription.analyzeMonthlyUsage({
+ limit: 10,
+ usage: 0,
+ timeUpdated: new Date("2026-03-01T09:00:00Z"),
+ timeSubscribed: sub31,
+ })
+
+ expect(result.status).toBe("ok")
+ expect(result.usagePercent).toBe(0)
+ const expected = Math.ceil(
+ (new Date("2026-03-31T12:00:00Z").getTime() - new Date("2026-03-01T10:00:00Z").getTime()) / 1000,
+ )
+ expect(result.resetInSec).toBe(expected)
+ })
+})
diff --git a/packages/console/core/tsconfig.json b/packages/console/core/tsconfig.json
new file mode 100644
index 0000000..3218dd7
--- /dev/null
+++ b/packages/console/core/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "@tsconfig/node22/tsconfig.json",
+ "compilerOptions": {
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "jsx": "preserve",
+ "jsxImportSource": "react",
+ "types": ["@cloudflare/workers-types", "node"]
+ }
+}
diff --git a/packages/console/function/package.json b/packages/console/function/package.json
new file mode 100644
index 0000000..2eeff77
--- /dev/null
+++ b/packages/console/function/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@opencode-ai/console-function",
+ "version": "1.17.4",
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "type": "module",
+ "license": "MIT",
+ "scripts": {
+ "typecheck": "tsgo --noEmit"
+ },
+ "devDependencies": {
+ "@cloudflare/workers-types": "catalog:",
+ "@tsconfig/node22": "22.0.2",
+ "@types/node": "catalog:",
+ "openai": "5.11.0",
+ "typescript": "catalog:",
+ "@typescript/native-preview": "catalog:"
+ },
+ "dependencies": {
+ "@ai-sdk/anthropic": "3.0.82",
+ "@ai-sdk/openai": "3.0.48",
+ "@ai-sdk/openai-compatible": "2.0.37",
+ "@opencode-ai/console-core": "workspace:*",
+ "@opencode-ai/console-resource": "workspace:*",
+ "@openauthjs/openauth": "0.0.0-20250322224806",
+ "ai": "catalog:",
+ "zod": "catalog:"
+ }
+}
diff --git a/packages/console/function/src/auth.ts b/packages/console/function/src/auth.ts
new file mode 100644
index 0000000..6d56b96
--- /dev/null
+++ b/packages/console/function/src/auth.ts
@@ -0,0 +1,226 @@
+import type { KVNamespace } from "@cloudflare/workers-types"
+import { z } from "zod"
+import { issuer } from "@openauthjs/openauth"
+import type { Theme } from "@openauthjs/openauth/ui/theme"
+import { createSubjects } from "@openauthjs/openauth/subject"
+import { THEME_OPENAUTH } from "@openauthjs/openauth/ui/theme"
+import { GithubProvider } from "@openauthjs/openauth/provider/github"
+import { GoogleOidcProvider } from "@openauthjs/openauth/provider/google"
+import { CloudflareStorage } from "@openauthjs/openauth/storage/cloudflare"
+import { Account } from "@opencode-ai/console-core/account.js"
+import { Workspace } from "@opencode-ai/console-core/workspace.js"
+import { Actor } from "@opencode-ai/console-core/actor.js"
+import { Resource } from "@opencode-ai/console-resource"
+import { User } from "@opencode-ai/console-core/user.js"
+import { and, Database, eq, isNull, or } from "@opencode-ai/console-core/drizzle/index.js"
+import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
+import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
+import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js"
+import { Identifier } from "@opencode-ai/console-core/identifier.js"
+
+type Env = {
+ AuthStorage: KVNamespace
+}
+
+export const subjects = createSubjects({
+ account: z.object({
+ accountID: z.string(),
+ email: z.string(),
+ newAccount: z.boolean().optional(),
+ }),
+ user: z.object({
+ userID: z.string(),
+ workspaceID: z.string(),
+ }),
+})
+
+const MY_THEME: Theme = {
+ ...THEME_OPENAUTH,
+ logo: "https://opencode.ai/favicon-v3.svg",
+}
+
+export default {
+ async fetch(request: Request, env: Env, ctx: ExecutionContext) {
+ const result = await issuer({
+ theme: MY_THEME,
+ providers: {
+ github: GithubProvider({
+ clientID: Resource.GITHUB_CLIENT_ID_CONSOLE.value,
+ clientSecret: Resource.GITHUB_CLIENT_SECRET_CONSOLE.value,
+ scopes: ["read:user", "user:email"],
+ }),
+ google: GoogleOidcProvider({
+ clientID: Resource.GOOGLE_CLIENT_ID.value,
+ scopes: ["openid", "email"],
+ }),
+ // email: CodeProvider({
+ // async request(req, state, form, error) {
+ // console.log(state)
+ // const params = new URLSearchParams()
+ // if (error) {
+ // params.set("error", error.type)
+ // }
+ // if (state.type === "start") {
+ // return Response.redirect(process.env.AUTH_FRONTEND_URL + "/auth/email?" + params.toString(), 302)
+ // }
+ //
+ // if (state.type === "code") {
+ // return Response.redirect(process.env.AUTH_FRONTEND_URL + "/auth/code?" + params.toString(), 302)
+ // }
+ //
+ // return new Response("ok")
+ // },
+ // async sendCode(claims, code) {
+ // const email = z.string().email().parse(claims.email)
+ // const cmd = new SendEmailCommand({
+ // Destination: {
+ // ToAddresses: [email],
+ // },
+ // FromEmailAddress: `SST `,
+ // Content: {
+ // Simple: {
+ // Body: {
+ // Html: {
+ // Data: `Your pin code is ${code} `,
+ // },
+ // Text: {
+ // Data: `Your pin code is ${code}`,
+ // },
+ // },
+ // Subject: {
+ // Data: "SST Console Pin Code: " + code,
+ // },
+ // },
+ // },
+ // })
+ // await ses.send(cmd)
+ // },
+ // }),
+ },
+ storage: CloudflareStorage({
+ // @ts-ignore
+ namespace: env.AuthStorage,
+ }),
+ subjects,
+ async success(ctx, response) {
+ console.log(response)
+
+ let subject: string | undefined
+ let email: string | undefined
+
+ if (response.provider === "github") {
+ const emails = (await fetch("https://api.github.com/user/emails", {
+ headers: {
+ Authorization: `Bearer ${response.tokenset.access}`,
+ "User-Agent": "opencode",
+ Accept: "application/vnd.github+json",
+ },
+ }).then((x) => x.json())) as any
+ const user = (await fetch("https://api.github.com/user", {
+ headers: {
+ Authorization: `Bearer ${response.tokenset.access}`,
+ "User-Agent": "opencode",
+ Accept: "application/vnd.github+json",
+ },
+ }).then((x) => x.json())) as any
+ subject = user.id.toString()
+
+ const primaryEmail = emails.find((x: any) => x.primary)
+ if (!primaryEmail) throw new Error("No primary email found for GitHub user")
+ if (!primaryEmail.verified) throw new Error("Primary email for GitHub user not verified")
+ email = primaryEmail.email
+ } else if (response.provider === "google") {
+ if (!response.id.email_verified) throw new Error("Google email not verified")
+ subject = response.id.sub as string
+ email = response.id.email as string
+ } else throw new Error("Unsupported provider")
+
+ if (!email) throw new Error("No email found")
+ if (!subject) throw new Error("No subject found")
+
+ if (Resource.App.stage !== "production" && !email.endsWith("@anoma.ly")) {
+ throw new Error("Invalid email")
+ }
+
+ // Get account
+ let newAccount = false
+ const accountID = await (async () => {
+ const matches = await Database.use(async (tx) =>
+ tx
+ .select({
+ provider: AuthTable.provider,
+ accountID: AuthTable.accountID,
+ })
+ .from(AuthTable)
+ .where(
+ or(
+ and(eq(AuthTable.provider, response.provider), eq(AuthTable.subject, subject)),
+ and(eq(AuthTable.provider, "email"), eq(AuthTable.subject, email)),
+ ),
+ ),
+ )
+ const idByProvider = matches.find((x) => x.provider === response.provider)?.accountID
+ const idByEmail = matches.find((x) => x.provider === "email")?.accountID
+ if (idByProvider && idByEmail) return idByProvider
+
+ // create account if not found
+ let accountID = idByProvider ?? idByEmail
+ if (!accountID) {
+ console.log("creating account for", email)
+ accountID = await Account.create({})
+ newAccount = true
+ }
+
+ await Database.use(async (tx) =>
+ tx
+ .insert(AuthTable)
+ .values([
+ {
+ id: Identifier.create("auth"),
+ accountID,
+ provider: response.provider,
+ subject,
+ },
+ {
+ id: Identifier.create("auth"),
+ accountID,
+ provider: "email",
+ subject: email,
+ },
+ ])
+ .onDuplicateKeyUpdate({
+ set: {
+ timeDeleted: null,
+ },
+ }),
+ )
+
+ return accountID
+ })()
+
+ // Get workspace
+ await Actor.provide("account", { accountID, email }, async () => {
+ await User.joinInvitedWorkspaces()
+ const workspaces = await Database.use((tx) =>
+ tx
+ .select({ id: WorkspaceTable.id })
+ .from(WorkspaceTable)
+ .innerJoin(UserTable, eq(UserTable.workspaceID, WorkspaceTable.id))
+ .where(
+ and(
+ eq(UserTable.accountID, accountID),
+ isNull(UserTable.timeDeleted),
+ isNull(WorkspaceTable.timeDeleted),
+ ),
+ ),
+ )
+ if (workspaces.length === 0) {
+ await Workspace.create({ name: "Default" })
+ }
+ })
+ return ctx.subject("account", accountID, { accountID, email, newAccount })
+ },
+ }).fetch(request, env, ctx)
+ return result
+ },
+}
diff --git a/packages/console/function/src/log-processor.ts b/packages/console/function/src/log-processor.ts
new file mode 100644
index 0000000..c26f98f
--- /dev/null
+++ b/packages/console/function/src/log-processor.ts
@@ -0,0 +1,209 @@
+import { Resource } from "@opencode-ai/console-resource"
+import type { TraceItem } from "@cloudflare/workers-types"
+
+export default {
+ async tail(events: TraceItem[]) {
+ for (const event of events) {
+ if (!event.event) continue
+ if (!("request" in event.event)) continue
+ if (event.event.request.method !== "POST") continue
+
+ const url = new URL(event.event.request.url)
+ if (
+ url.pathname !== "/zen/v1/chat/completions" &&
+ url.pathname !== "/zen/v1/messages" &&
+ url.pathname !== "/zen/v1/responses" &&
+ !url.pathname.startsWith("/zen/v1/models/") &&
+ url.pathname !== "/zen/go/v1/chat/completions" &&
+ url.pathname !== "/zen/go/v1/messages" &&
+ url.pathname !== "/zen/go/v1/responses" &&
+ !url.pathname.startsWith("/zen/go/v1/models/")
+ )
+ continue
+
+ const ip = event.event.request.headers["x-real-ip"]
+ let data: Record = {
+ "cf.continent": event.event.request.cf?.continent,
+ "cf.country": event.event.request.cf?.country,
+ "cf.city": event.event.request.cf?.city,
+ "cf.region": event.event.request.cf?.region,
+ "cf.latitude": event.event.request.cf?.latitude,
+ "cf.longitude": event.event.request.cf?.longitude,
+ "cf.timezone": event.event.request.cf?.timezone,
+ duration: event.wallTime,
+ request_length: parseInt(event.event.request.headers["content-length"] ?? "0"),
+ status: event.event.response?.status ?? 0,
+ ip,
+ "ip.prefix": ipPrefix(ip),
+ }
+ const time = new Date(event.eventTimestamp ?? Date.now()).toISOString()
+ const events = [
+ ...event.logs.flatMap((log) =>
+ log.message.flatMap((message: string) => {
+ if (!message.startsWith("_metric:")) return []
+ const json = JSON.parse(message.slice(8)) as Record
+ data = { ...data, ...json }
+ if ("llm.error.code" in json) {
+ return [{ time, data: { ...data, event_type: "llm.error" } }]
+ }
+ return []
+ }),
+ ),
+ { time, data: { ...data, event_type: "completions" } },
+ ]
+ console.log(JSON.stringify(data, null, 2))
+
+ const lakeIngest = getLakeIngest()
+ const [honeycomb, lake] = await Promise.all([
+ fetch("https://api.honeycomb.io/1/batch/zen", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-Honeycomb-Team": Resource.HONEYCOMB_API_KEY.value,
+ },
+ body: JSON.stringify(events),
+ }),
+ ...(lakeIngest
+ ? [
+ fetch(lakeIngest.url, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${lakeIngest.secret}`,
+ },
+ body: JSON.stringify({ events: events.map((event) => toLakeEvent(event.time, event.data)) }),
+ }),
+ ]
+ : []),
+ ])
+ console.log(honeycomb.status)
+ console.log(await honeycomb.text())
+ if (lake) {
+ console.log(lake.status)
+ console.log(await lake.text())
+ }
+ }
+ },
+}
+
+function getLakeIngest(): { url: string; secret: string } | undefined {
+ try {
+ return Resource.LakeIngest
+ } catch {
+ return undefined
+ }
+}
+
+function toLakeEvent(time: string, data: Record) {
+ return {
+ _datalake_key: "inference.event",
+ event_timestamp: time,
+ event_date: time.slice(0, 10),
+ event_type: string(data, "event_type"),
+ dataset: "zen",
+ cf_continent: string(data, "cf.continent"),
+ cf_country: string(data, "cf.country"),
+ cf_city: string(data, "cf.city"),
+ cf_region: string(data, "cf.region"),
+ cf_latitude: number(data, "cf.latitude"),
+ cf_longitude: number(data, "cf.longitude"),
+ cf_timezone: string(data, "cf.timezone"),
+ duration: number(data, "duration"),
+ request_length: integer(data, "request_length"),
+ status: integer(data, "status"),
+ ip: string(data, "ip"),
+ ip_prefix: string(data, "ip.prefix"),
+ is_stream: boolean(data, "is_stream"),
+ session: string(data, "session"),
+ request: string(data, "request"),
+ client: string(data, "client"),
+ user_agent: string(data, "user_agent"),
+ model_variant: string(data, "model.variant"),
+ source: string(data, "source"),
+ provider: string(data, "provider"),
+ provider_model: string(data, "provider.model"),
+ model: string(data, "model"),
+ llm_error_code: integer(data, "llm.error.code"),
+ llm_error_message: string(data, "llm.error.message"),
+ error_response: string(data, "error.response"),
+ error_type: string(data, "error.type"),
+ error_message: string(data, "error.message"),
+ error_cause: string(data, "error.cause"),
+ error_cause2: string(data, "error.cause2"),
+ api_key: string(data, "api_key"),
+ workspace: string(data, "workspace"),
+ is_subscription: boolean(data, "isSubscription"), // removed
+ subscription: string(data, "subscription"),
+ response_length: integer(data, "response_length"),
+ time_to_first_byte: integer(data, "time_to_first_byte"),
+ timestamp_first_byte: integer(data, "timestamp.first_byte"),
+ timestamp_last_byte: integer(data, "timestamp.last_byte"),
+ tokens_input: integer(data, "tokens.input"),
+ tokens_output: integer(data, "tokens.output"),
+ tokens_reasoning: integer(data, "tokens.reasoning"),
+ tokens_cache_read: integer(data, "tokens.cache_read"),
+ tokens_cache_write_5m: integer(data, "tokens.cache_write_5m"),
+ tokens_cache_write_1h: integer(data, "tokens.cache_write_1h"),
+ cost_input_microcents: integer(data, "cost.input.microcents"),
+ cost_output_microcents: integer(data, "cost.output.microcents"),
+ cost_cache_read_microcents: integer(data, "cost.cache_read.microcents"),
+ cost_cache_write_microcents: integer(data, "cost.cache_write.microcents"),
+ cost_total_microcents: integer(data, "cost.total.microcents"),
+ }
+}
+
+// Returns a stable lookup key for an IP address.
+// IPv4: full address as /32 (e.g. "203.0.113.45/32").
+// IPv6: the /64 network prefix (e.g. "2001:db8:abcd:1234::/64"). ISPs commonly
+// rotate the lower 64 host bits via SLAAC privacy extensions (RFC 8981), so
+// grouping by /64 collapses those rotations into one key.
+function ipPrefix(ip: string | undefined) {
+ if (!ip) return undefined
+ if (ip.includes(".") && !ip.includes(":")) return `${ip}/32`
+ if (!ip.includes(":")) return undefined
+
+ // Expand "::" to its full form, then keep the first 4 hextets.
+ const [head, tail] = ip.split("::") as [string, string | undefined]
+ const headParts = head ? head.split(":") : []
+ const tailParts = tail !== undefined ? tail.split(":") : []
+ const missing = 8 - headParts.length - tailParts.length
+ if (missing < 0) return undefined
+ const full = [...headParts, ...new Array(missing).fill("0"), ...tailParts]
+ if (full.length !== 8) return undefined
+
+ const prefix = full
+ .slice(0, 4)
+ .map((part) => part.toLowerCase().replace(/^0+(?=.)/, ""))
+ .join(":")
+ return `${prefix}::/64`
+}
+
+function string(data: Record, key: string) {
+ const value = data[key]
+ if (typeof value === "string") return value
+ if (typeof value === "number" || typeof value === "boolean") return String(value)
+ return undefined
+}
+
+function boolean(data: Record