diff --git a/.claude/worktrees/festive-mclaren-0555d3 b/.claude/worktrees/festive-mclaren-0555d3 deleted file mode 160000 index cab5646af..000000000 --- a/.claude/worktrees/festive-mclaren-0555d3 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cab5646af79ee7227f73d825392e540f44047dbb diff --git a/.gcloudignore b/.gcloudignore index 6168d67ff..321a1d445 100644 --- a/.gcloudignore +++ b/.gcloudignore @@ -25,5 +25,8 @@ test-agents tmp-chrome-procs.txt tmp-playwright-* .npmrc +# Root .npmrc contains only the public legacy-peer-deps install policy. +!/.npmrc .env* -!python-mcp-servers/langgraph_agent/.env +packages/mcp-local/.mcpregistry_registry_token +packages/mcp-local/.mcpregistry_github_token diff --git a/.github/workflows/attrition-qa.yml b/.github/workflows/attrition-qa.yml index 8e2b91c83..12c82c472 100644 --- a/.github/workflows/attrition-qa.yml +++ b/.github/workflows/attrition-qa.yml @@ -20,8 +20,9 @@ jobs: - uses: actions/checkout@v6 - name: Crawl all surfaces + env: + BASE: ${{ github.event.inputs.api_url || 'https://scratchnode.live' }} run: | - BASE="${{ github.event.inputs.api_url || 'https://scratchnode.live' }}" if [[ "$BASE" == https://vercel.com/* ]]; then BASE="https://scratchnode.live" fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31d2c9e05..6ebe26ce7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,7 @@ jobs: node-version-file: ".nvmrc" - name: Install dependencies + id: typecheck_dependencies run: npm install --no-audit --no-fund - name: Convex bundle analysis (codegen) @@ -55,8 +56,24 @@ jobs: CONVEX_DEPLOY_KEY: ${{ secrets.CONVEX_DEPLOY_KEY }} run: npx convex codegen - - name: App typecheck - run: npx tsc --noEmit --pretty false + - name: Installed Convex generator contracts + if: ${{ !cancelled() && steps.typecheck_dependencies.outcome == 'success' }} + run: npm run test:convex-api-codegen + + - name: App typecheck and generated API call contracts + # Codegen also typechecks the legacy backend. Keep that failure, but + # still collect the independent application result after installation. + if: ${{ !cancelled() && steps.typecheck_dependencies.outcome == 'success' }} + run: npm run typecheck:app + + - name: Preserve actual application typecheck evidence + if: always() + uses: actions/upload-artifact@v4 + with: + name: app-typecheck-evidence + path: .tmp/app-typecheck/ + if-no-files-found: warn + retention-days: 14 - name: Convex typecheck run: npx tsc -p backend/convex --noEmit --pretty false @@ -76,6 +93,9 @@ jobs: - name: Install dependencies run: npm install --no-audit --no-fund + - name: Workflow event data scenarios + run: node --test scripts/nodebench-packet-contracts.node.mjs + - name: Runtime smoke tests run: > npx vitest run @@ -91,6 +111,21 @@ jobs: backend/convex/domains/mcp/mcpSourcingDraft.integration.test.ts backend/convex/domains/mcp/mcpExecutionTraceEndpoints.integration.test.ts backend/convex/domains/agents/mcp_tools/models/modelResolver.test.ts + backend/convex/domains/pipelines/pipelineOwnership.auth.test.ts + backend/convex/domains/operations/__tests__/privacyAdmission.auth.test.ts + backend/convex/domains/operations/__tests__/privacyExecution.transactions.test.ts + backend/convex/domains/integrations/__tests__/telegramAdmission.test.ts + backend/convex/domains/agents/__tests__/delegationRegistration.test.ts + apps/web/src/lib/__tests__/convexApiQuery.test.tsx + backend/convex/domains/product/__tests__/preferencesReturnContract.test.ts + apps/web/src/lib/__tests__/preferencesReturnContract.test.tsx + apps/web/src/components/ai-ui/__tests__/sheet.test.tsx + apps/web/src/features/entities/components/EntityNotebookView.test.tsx + apps/web/src/features/entities/components/notebook/EntityNotebookLive.empty-state.test.tsx + apps/web/src/features/me/views/MeHome.test.tsx + apps/web/src/features/nudges/views/NudgesHome.test.tsx + apps/web/src/layouts/cockpitRails.test.tsx + backend/convex/domains/pipelines/pipelineTruthIsolation.test.ts apps/web/src/features/agents/components/FastAgentPanel/__tests__/RunState.test.tsx backend/convex/domains/agents/autonomy/autonomy.integration.test.ts backend/convex/domains/agents/autonomy/autonomyTasteBench.integration.test.ts @@ -108,6 +143,16 @@ jobs: apps/web/src/features/redesign/components/UniversalComposer.test.tsx apps/web/src/features/redesign/surfaces/ScratchnodeEventsSurface.test.tsx + - name: Shared code renderer contracts + run: > + npx vitest run + apps/web/src/components/ai-elements/code-block.test.tsx + apps/web/src/shared/components/LazyCodeBlock.test.tsx + apps/web/src/shared/components/LazyCodeBlock.load-failure.test.tsx + apps/web/src/features/strategy/views/ExecutionTraceView.test.tsx + apps/web/src/features/strategy/views/ProductDirectionMemoView.test.tsx + --maxWorkers=2 --minWorkers=1 --no-file-parallelism + scratchnode-launch-gates: name: ScratchNode launch gates runs-on: ubuntu-latest diff --git a/.github/workflows/convex-mcp-eval-gate.yml b/.github/workflows/convex-mcp-eval-gate.yml index 76e5f0d06..2efae50eb 100644 --- a/.github/workflows/convex-mcp-eval-gate.yml +++ b/.github/workflows/convex-mcp-eval-gate.yml @@ -5,6 +5,7 @@ on: paths: - 'packages/convex-mcp-nodebench/**' - 'scripts/eval-harness/**' + - '.github/workflows/convex-mcp-eval-gate.yml' schedule: # Nightly at 4 AM UTC - cron: '0 4 * * *' @@ -19,7 +20,7 @@ on: default: 'tier1' type: string backend: - description: 'Agent backend (stub/anthropic/openai)' + description: 'Requested agent backend (anthropic/openai; execution not yet implemented)' default: 'anthropic' type: string @@ -47,13 +48,10 @@ jobs: working-directory: packages/convex-mcp-nodebench run: npm test - - name: Run eval harness (Tier 1 deterministic) + - name: List evaluation task catalog (no agent execution) run: | - echo "=== Eval Harness: Tier 1 Tasks ===" - npx tsx scripts/eval-harness/runner.ts --list - echo "---" - echo "Gate check: convex-mcp-nodebench builds clean and all 16 tools / 27 tests pass." - echo "Full eval runs require agent invocation which is done in nightly CI." + node packages/convex-mcp-nodebench/node_modules/tsx/dist/cli.mjs scripts/eval-harness/runner.ts --list + echo "Package build and tests are checked above. This catalog does not certify provider-backed evaluations." - name: Upload eval results if: always() @@ -85,7 +83,7 @@ jobs: working-directory: packages/convex-mcp-nodebench run: npm run build - - name: Run nightly eval suite (real agent invocation) + - name: Require provider-backed evaluation execution env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} @@ -99,9 +97,7 @@ jobs: echo "Backend: $EVAL_BACKEND" echo "Seeds: $EVAL_SEEDS" echo "Tasks: $EVAL_TASKS" - npx tsx scripts/eval-harness/runner.ts --list - # TODO: Replace --list with actual run once agentInvoker API calls are live: - # npx tsx scripts/eval-harness/runner.ts --task $EVAL_TASKS --seeds $EVAL_SEEDS + node packages/convex-mcp-nodebench/node_modules/tsx/dist/cli.mjs scripts/eval-harness/runner.ts --all --tasks "$EVAL_TASKS" --seeds "$EVAL_SEEDS" - name: Upload nightly results if: always() diff --git a/.github/workflows/nodebench-packet.yml b/.github/workflows/nodebench-packet.yml index 0e195c78a..c856a69dd 100644 --- a/.github/workflows/nodebench-packet.yml +++ b/.github/workflows/nodebench-packet.yml @@ -1,6 +1,6 @@ name: NodeBench Packet -# Trigger: comment "@nodebench " on any PR or issue -# Result: posts a structured intelligence packet as a comment +# A human comment "@nodebench " requests a packet on an issue or PR. +# Event and response text stay data; this privileged job checks out no source. on: issue_comment: @@ -12,65 +12,77 @@ permissions: jobs: nodebench-packet: - if: contains(github.event.comment.body, '@nodebench') + if: contains(github.event.comment.body, '@nodebench') && github.event.comment.user.type != 'Bot' runs-on: ubuntu-latest + timeout-minutes: 3 steps: - - name: Extract query from comment - id: extract - run: | - COMMENT="${{ github.event.comment.body }}" - QUERY=$(echo "$COMMENT" | sed 's/.*@nodebench //' | head -1 | tr -d '\n') - echo "query=$QUERY" >> $GITHUB_OUTPUT - echo "Extracted query: $QUERY" - - - name: Run NodeBench search - id: search + - name: Request and post packet + uses: actions/github-script@v9 env: NODEBENCH_API: ${{ secrets.NODEBENCH_API_URL || 'https://langgraph-agent-873372783709.us-central1.run.app' }} - run: | - RESULT=$(curl -sS -X POST "$NODEBENCH_API/api/pipeline/search" \ - -H "Content-Type: application/json" \ - -d "{\"query\": \"${{ steps.extract.outputs.query }}\", \"lens\": \"founder\"}" \ - --max-time 60) - - ENTITY=$(echo "$RESULT" | jq -r '.entityName // "Unknown"') - CONFIDENCE=$(echo "$RESULT" | jq -r '.confidence // 0') - ANSWER=$(echo "$RESULT" | jq -r '.answer // "No results"' | head -5) - SIGNALS=$(echo "$RESULT" | jq -r '.variables // [] | length') - SOURCES=$(echo "$RESULT" | jq -r '.sourceRefs // [] | length') - - # Build markdown comment - cat << 'COMMENT_EOF' > comment.md - ## NodeBench Intelligence Packet - - **Entity:** $ENTITY - **Confidence:** $CONFIDENCE% - **Sources:** $SOURCES | **Signals:** $SIGNALS - - ### Summary - $ANSWER - - --- - *Generated by [NodeBench](https://nodebenchai.com) Pipeline v2* - COMMENT_EOF - - # Replace variables - sed -i "s/\$ENTITY/$ENTITY/g" comment.md - sed -i "s/\$CONFIDENCE/$CONFIDENCE/g" comment.md - sed -i "s/\$SOURCES/$SOURCES/g" comment.md - sed -i "s/\$SIGNALS/$SIGNALS/g" comment.md - sed -i "s/\$ANSWER/$ANSWER/g" comment.md - - - name: Post comment - uses: actions/github-script@v9 with: script: | - const fs = require('fs'); - const body = fs.readFileSync('comment.md', 'utf8'); - const issueNumber = context.issue.number; + const comment = context.payload.comment.body; + const query = comment.match(/[\s\S]*@nodebench([^\r\n]*)/i)?.[1]?.trim() || ''; + if (!query || query.length > 2000) { + throw new Error('Supply a query of 1 to 2000 characters after @nodebench.'); + } + const base = new URL(process.env.NODEBENCH_API); + if (base.protocol !== 'https:' || base.username || base.password || + base.pathname !== '/' || base.search || base.hash) { + throw new Error('NODEBENCH_API must be a trusted HTTPS origin without credentials.'); + } + const response = await fetch(new URL('/api/pipeline/search', base), { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query, lens: 'founder' }), + redirect: 'error', + signal: AbortSignal.timeout(60000), + }); + if (!response.ok) { + await response.body?.cancel(); + throw new Error(`NodeBench search failed with HTTP ${response.status}.`); + } + const reader = response.body.getReader(); + const decoder = new TextDecoder('utf-8', { fatal: true }); + let bytes = 0; + let text = ''; + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + bytes += value.byteLength; + if (bytes > 256 * 1024) throw new Error('NodeBench response exceeds 256 KiB.'); + text += decoder.decode(value, { stream: true }); + } + text += decoder.decode(); + } finally { + await reader.cancel().catch(() => {}); + reader.releaseLock(); + } + const packet = JSON.parse(text); + if (!packet || typeof packet !== 'object' || Array.isArray(packet) || + packet.success === false || typeof packet.answer !== 'string') { + throw new Error('NodeBench returned an unsuccessful or malformed packet.'); + } + const confidence = Number.isFinite(packet.confidence) && + packet.confidence >= 0 && packet.confidence <= 100 + ? `${packet.confidence}%` : 'Unavailable'; + const entity = typeof packet.entityName === 'string' + ? packet.entityName.slice(0, 300) : 'Not supplied'; + const sources = Array.isArray(packet.sourceRefs) ? packet.sourceRefs.length : 'Unavailable'; + const signals = Array.isArray(packet.variables) ? packet.variables.length : 'Unavailable'; + const answer = packet.answer.split('\n', 5).join('\n').slice(0, 4000); + const body = [ + '## NodeBench Intelligence Packet', '', + `**Entity:** ${entity}`, `**Confidence:** ${confidence}`, + `**Sources:** ${sources} | **Signals:** ${signals}`, '', + '### Summary', answer, '', '---', + '*Generated by [NodeBench](https://nodebenchai.com) Pipeline v2*', + ].join('\n'); await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, - issue_number: issueNumber, - body: body, + issue_number: context.issue.number, + body, }); diff --git a/.github/workflows/vercel-preflight.yml b/.github/workflows/vercel-preflight.yml index ac142f277..1d6cbfba7 100644 --- a/.github/workflows/vercel-preflight.yml +++ b/.github/workflows/vercel-preflight.yml @@ -33,7 +33,7 @@ jobs: env: CONVEX_DEPLOY_KEY: ${{ secrets.CONVEX_DEPLOY_KEY }} VITE_CONVEX_URL: ${{ secrets.VITE_CONVEX_URL || vars.VITE_CONVEX_URL || vars.CONVEX_URL || secrets.CONVEX_URL }} - NODE_OPTIONS: --max-old-space-size=4096 + NODE_OPTIONS: --max-old-space-size=6144 steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/worker-container.yml b/.github/workflows/worker-container.yml new file mode 100644 index 000000000..cc9011b27 --- /dev/null +++ b/.github/workflows/worker-container.yml @@ -0,0 +1,137 @@ +name: Worker container + +on: + pull_request: + branches: [main] + paths: + - 'workers/node/**' + - 'packages/mcp-local/**' + - 'package.json' + - 'package-lock.json' + - '.npmrc' + - '.nvmrc' + - '.dockerignore' + - '.gcloudignore' + - 'scripts/worker-container-smoke.mjs' + - 'scripts/oss-stats-http-contracts.node.mjs' + - 'scripts/patch-oss-stats-token-log.mjs' + - 'scripts/patch-convex-api-codegen.mjs' + - 'scripts/oss-stats-token-contracts.node.mjs' + - 'scripts/ai-sdk-download-contracts.node.mjs' + - 'scripts/ai-sdk-public-download-proof.mjs' + - 'scripts/anthropic-client-contracts.node.mjs' + - 'scripts/anthropic-memory-contracts.node.mjs' + - 'scripts/anthropic-memory-before-fixture.mjs' + - '.github/workflows/worker-container.yml' + workflow_dispatch: + inputs: + baseline_sha: + description: 'Optional full commit SHA for a diagnostic before-build comparison' + required: false + +permissions: + contents: read + +concurrency: + group: worker-container-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: false + +jobs: + worker-container: + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 2 + persist-credentials: false + + - name: Diagnose the base build + if: github.event_name == 'pull_request' || (github.event_name == 'workflow_dispatch' && inputs.baseline_sha != '') + env: + BASELINE_SHA: ${{ github.event.pull_request.base.sha || inputs.baseline_sha }} + run: | + set -euo pipefail + [[ "$BASELINE_SHA" =~ ^[0-9a-f]{40}$ ]] || { echo 'Expected a full commit SHA'; exit 1; } + mkdir -p "$RUNNER_TEMP/worker-baseline" worker-build-evidence + git cat-file -e "${BASELINE_SHA}^{commit}" || git fetch --depth=1 origin "$BASELINE_SHA" + git archive "$BASELINE_SHA" | tar -x --exclude='.env*' --exclude='*/.env*' --exclude='*/.mcpregistry_*' -C "$RUNNER_TEMP/worker-baseline" + set +e + docker build --progress=plain -f "$RUNNER_TEMP/worker-baseline/workers/node/Dockerfile" "$RUNNER_TEMP/worker-baseline" >worker-build-evidence/baseline-build.log 2>&1 + result=$? + set -e + printf '%s\n' "$result" >worker-build-evidence/baseline-exit-code.txt + echo "Baseline build exit code: $result (diagnostic only; candidate must pass)" + + - name: Build the clean worker image + run: | + set -euo pipefail + mkdir -p worker-build-evidence + docker build --progress=plain --iidfile worker-build-evidence/image-id.txt -f workers/node/Dockerfile -t nodebench-worker-proof:ci . 2>&1 | tee worker-build-evidence/candidate-build.log + + - name: Prepare the historical memory-permission canary + run: | + set -euo pipefail + mkdir "$RUNNER_TEMP/anthropic-memory-before" + timeout 30s node scripts/anthropic-memory-before-fixture.mjs "$RUNNER_TEMP/anthropic-memory-before/sdk.tgz" 2>&1 | tee worker-build-evidence/anthropic-before-fixture.log + tar -xzf "$RUNNER_TEMP/anthropic-memory-before/sdk.tgz" -C "$RUNNER_TEMP/anthropic-memory-before" package/package.json package/tools/memory/node.mjs package/helpers/beta/memory.mjs + + - name: Verify startup without external network or provider credentials + run: | + set -euo pipefail + docker run -d --name nodebench-worker-proof --network none --memory 2g --cpus 2 nodebench-worker-proof:ci + docker exec -i nodebench-worker-proof node --input-type=module &1 | tee worker-build-evidence/smoke.log + docker cp scripts/oss-stats-http-contracts.node.mjs nodebench-worker-proof:/tmp/oss-stats-http-contracts.node.mjs + docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/oss-stats-http-contracts.node.mjs 2>&1 | tee worker-build-evidence/oss-client.log + docker cp scripts/oss-stats-token-contracts.node.mjs nodebench-worker-proof:/tmp/oss-stats-token-contracts.node.mjs + docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/oss-stats-token-contracts.node.mjs 2>&1 | tee worker-build-evidence/oss-token.log + docker cp scripts/ai-sdk-download-contracts.node.mjs nodebench-worker-proof:/tmp/ai-sdk-download-contracts.node.mjs + docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/ai-sdk-download-contracts.node.mjs 2>&1 | tee worker-build-evidence/ai-sdk-download.log + docker cp scripts/anthropic-client-contracts.node.mjs nodebench-worker-proof:/tmp/anthropic-client-contracts.node.mjs + docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/anthropic-client-contracts.node.mjs 2>&1 | tee worker-build-evidence/anthropic-client.log + docker cp scripts/anthropic-memory-contracts.node.mjs nodebench-worker-proof:/tmp/anthropic-memory-contracts.node.mjs + docker cp "$RUNNER_TEMP/anthropic-memory-before/package" nodebench-worker-proof:/tmp/anthropic-memory-before + set +e + docker exec -e NODEBENCH_ANTHROPIC_PROOF_PACKAGE=/tmp/anthropic-memory-before -e NODEBENCH_EXPECTED_ANTHROPIC=0.90.0 nodebench-worker-proof node --test --test-concurrency=1 /tmp/anthropic-memory-contracts.node.mjs 2>&1 | tee worker-build-evidence/anthropic-memory-before.log + before_result=${PIPESTATUS[0]} + set -e + printf '%s\n' "$before_result" >worker-build-evidence/anthropic-memory-before-exit.txt + test "$before_result" -eq 1 + grep -q '^# pass 4$' worker-build-evidence/anthropic-memory-before.log + grep -q '^# fail 2$' worker-build-evidence/anthropic-memory-before.log + grep -q '^# skipped 0$' worker-build-evidence/anthropic-memory-before.log + test "$(grep -c '^not ok [56] - POSIX owner-only creation' worker-build-evidence/anthropic-memory-before.log)" -eq 2 + docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/anthropic-memory-contracts.node.mjs 2>&1 | tee worker-build-evidence/anthropic-memory.log + docker logs nodebench-worker-proof >worker-build-evidence/worker.log 2>&1 + if grep -E 'ERR_MODULE_NOT_FOUND|MODULE_NOT_FOUND|Failed to load tools|No tools loaded' worker-build-evidence/worker.log; then + echo 'Worker bootstrap has unresolved module/tool loading failures' + exit 1 + fi + + - name: Verify one bounded public SDK download + run: | + set -euo pipefail + timeout 30s docker run --rm -i --name nodebench-download-public-proof --memory 1g --cpus 1 nodebench-worker-proof:ci node --input-type=module &1 | tee worker-build-evidence/public-download.log + + - name: Capture failure logs and close the owned containers + if: always() + run: | + mkdir -p worker-build-evidence + if docker inspect nodebench-worker-proof >/dev/null 2>&1; then + docker logs nodebench-worker-proof >worker-build-evidence/worker.log 2>&1 + docker inspect --format '{{.State.Status}} exit={{.State.ExitCode}}' nodebench-worker-proof >worker-build-evidence/container-state.txt + docker rm -f nodebench-worker-proof + fi + + if docker inspect nodebench-download-public-proof >/dev/null 2>&1; then + docker logs nodebench-download-public-proof >worker-build-evidence/public-container.log 2>&1 + docker inspect --format '{{.State.Status}} exit={{.State.ExitCode}}' nodebench-download-public-proof >worker-build-evidence/public-container-state.txt + docker rm -f nodebench-download-public-proof + fi + + - name: Upload build and startup evidence + if: always() + uses: actions/upload-artifact@v7 + with: + name: worker-container-evidence + path: worker-build-evidence/ diff --git a/.gitignore b/.gitignore index 59f909208..0f05c4a0a 100644 --- a/.gitignore +++ b/.gitignore @@ -43,8 +43,10 @@ android/local.properties *.sln *.sw? -# Ignored for the template, you probably want to remove it: +# Nested package locks retain their existing policy. The root application +# lock is required for clean worker builds and reproducible npm ci. package-lock.json +!/package-lock.json *storybook.log storybook-static diff --git a/AGENTS.md b/AGENTS.md index e23983059..a502bd74c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,9 @@ # NodeBench Agent Workflow +## Telegram storage and webhook admission + +When changing the Telegram integration, read `docs/runbooks/TELEGRAM_WEBHOOK_ADMISSION.md`. Keep chat data and bot administration internal; admit the public webhook only with its configured secret before bounded parsing. Propagate failed delivery honestly, test with synthetic providers, and include the actual Telegram admission scenarios in runtime smoke. A local pass does not authorize real messages, credential retrieval or an out-of-band Convex deployment. + ## Agent coordination (Codex ↔ Claude) — read FIRST `AGENT_COORDINATION.md` (repo root) is the live ledger of **who is editing what right now** diff --git a/AGENT_COORDINATION.md b/AGENT_COORDINATION.md index 77fea1df0..da121a2aa 100644 --- a/AGENT_COORDINATION.md +++ b/AGENT_COORDINATION.md @@ -57,6 +57,12 @@ Server Error) for an unknown slug. ## Active claims (who is editing what RIGHT NOW) +- **2026-09-09 · Codex /root E98 + preservation_worker** · `schema.ts#Telegram table registrations`, `domains/integrations/telegram.ts`, `telegramAgent.ts`, local Telegram HTTP helper and admission scenarios · PR621. Register the existing Telegram tables together with internal-only data/admin functions, authenticated bounded webhook admission and truthful delivery failures. Root owns tests/CI/docs; worker owns this implementation region. No founder episode registration, private data access, provider activation or out-of-band deployment. + +- **2026-09-08 · Codex /root E87** · `privacyEnforcement.ts`, `schema.ts#deletionRequests.execution`, privacy transaction/admission scenarios, CI smoke and the type-contract runbook · PR621. Add optional versioned execution progress; replace unsafe deletion processing with bounded transactions and truthful unsupported-coverage holds. No production deletion or out-of-band deployment. + +- **2026-09-08 · Codex /root** · `privacyEnforcement.ts`, `citationValidator.ts`, `schema.ts#deletionRequests` and privacy admission scenarios · PR621 `fix/worker-clean-build-20260908`. Authenticate deletion admission, persist optional server-authored `authorizedBy: Id<"users">`, reject legacy unverified requests, and restrict workflow-only reads. No production deletion or out-of-band Convex deployment. Other schemas and UI regions are outside this claim. + - **2026-09-05 · Codex /root** · `domains/mcp/mcpSourcingDraft` (new), gateway sourcing allowlist/audit completion, ledger sourcing budget, and task-manager atomic service completion · bounded review-only China sourcing draft using the existing service owner and trace · branch `codex/sourcing-provider-20260904`. No shared-table/schema changes and no out-of-band deployment. Provider adapter follows the additive backend contract. > **STANDARD-TREE MIGRATION (2026-07-19, feat/standard-tree-migration): repo paths moved.** @@ -79,6 +85,10 @@ Server Error) for an unknown slug. ## Hand-offs (built + ready for the other agent to call) +- **2026-09-09 · Codex /root E98 → Telegram maintainers** · PR621 registers `telegramUsers` and `telegramMessages` together with internal-only data/admin functions. The public `/telegram/webhook` now requires the configured `TELEGRAM_WEBHOOK_SECRET` header match before bounded parsing; the internal `domains/integrations/telegram:setWebhook({webhookUrl})` registers that same secret without dropping pending updates. `/start` and `/stop` update the admitted chat's notification preference; failed provider acknowledgments propagate and research remains explicitly unavailable. Read `docs/runbooks/TELEGRAM_WEBHOOK_ADMISSION.md`. Independent 51-scenario approval is scoped to this candidate; default app typing still fails and no provider or production deployment was performed. + +- **2026-09-08 · Codex /root → privacy maintenance consumers** · PR621 contains authenticated `api.domains.operations.privacyEnforcement.createDeletionRequest({scope,subject,recordIds?,requestedBy?})`; `requestedBy` is ignored in favor of the session user. Self `user_data` is allowed, broader scopes require an existing owner/admin. Optional `deletionRequests.authorizedBy` is server-authored; legacy rows require review/resubmission and must not be backfilled from the untrusted actor string. Retention/citation helper reads are now internal. Admission scenarios12 plus neighboring26 pass; backend1088/app1396 diagnostics and broader erasure runtime defects remain open. Draft only, not deployed; no out-of-band Convex deploy. + - **2026-07-30 - Codex `/root` -> execution-trace and MCP consumers** - **Supersedes the 2026-07-29 combined-snapshot hand-off.** The NodeKit native identity contract now has exactly three Caseflow-canonical artifacts diff --git a/apps/web/src/components/ai-elements/code-block.test.tsx b/apps/web/src/components/ai-elements/code-block.test.tsx index f971e8e23..615eb5824 100644 --- a/apps/web/src/components/ai-elements/code-block.test.tsx +++ b/apps/web/src/components/ai-elements/code-block.test.tsx @@ -1,44 +1,173 @@ -import { describe, expect, it, vi } from "vitest"; +import { act, cleanup, render } from "@testing-library/react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("shiki", () => ({ - createHighlighter: vi.fn(async () => ({ - getLoadedLanguages: () => ["typescript"], - codeToTokens: (code: string) => ({ - bg: "transparent", - fg: "inherit", - tokens: [[{ color: "inherit", content: code }]], - }), - })), + bundledLanguages: { json: () => {}, typescript: () => {} }, + codeToTokens: vi.fn(), })); -import { highlightCode } from "./code-block"; +import { codeToTokens } from "shiki"; +import { CodeBlockContent } from "./code-block"; -type HighlightResult = NonNullable>; +const tokenize = vi.mocked(codeToTokens); +const result = (code: string) => ({ + bg: "transparent", + fg: "inherit", + tokens: code + .split("\n") + .map((content) => [{ content, color: "#123456", offset: 0 }]), +}); +const deferred = () => { + let resolve!: (value: ReturnType) => void; + let reject!: (reason: Error) => void; + const promise = new Promise>((yes, no) => { + resolve = yes; + reject = no; + }); + return { promise, resolve, reject }; +}; +const content = (container: HTMLElement) => + container.querySelector("pre code")?.textContent; + +beforeEach(() => { + tokenize.mockReset(); + tokenize.mockImplementation(async (code) => result(code) as any); +}); +afterEach(cleanup); -const resolveHighlight = (code: string): Promise => - new Promise((resolve) => { - const immediate = highlightCode(code, "typescript", resolve); - if (immediate) { - resolve(immediate); +describe("A reviewer reads exact agent output while highlighting is optional", () => { + it("never shows an older equal-length source when its delayed highlight finishes last", async () => { + const first = deferred(), + second = deferred(); + tokenize + .mockReturnValueOnce(first.promise as any) + .mockReturnValueOnce(second.promise as any); + const edges = "edge".repeat(40); + const a = `${edges}const x = 1;${edges}`, + b = `${edges}const y = 2;${edges}`; + expect(a.length).toBe(b.length); + const view = render(); + expect(content(view.container)).toBe(a); + view.rerender(); + expect(content(view.container)).toBe(b); + await act(async () => second.resolve(result(b))); + await act(async () => first.resolve(result(a))); + expect(content(view.container)).toBe(b); + expect( + view.container.querySelector('[style*="rgb(18, 52, 86)"]'), + ).not.toBeNull(); + }); + + it("keeps 12 concurrent reviews distinct when their highlighting completes in reverse order", async () => { + const jobs = Array.from({ length: 12 }, deferred); + jobs.forEach((job) => tokenize.mockReturnValueOnce(job.promise as any)); + const codes = jobs.map((_, i) => + JSON.stringify( + { reviewer: i, source: `青山 ${i}`, note: "" }, + null, + 2, + ), + ); + const view = render( + <> + {codes.map((code, i) => ( + + ))} + , + ); + await act(async () => { + for (let i = jobs.length - 1; i >= 0; i--) + jobs[i].resolve(result(codes[i])); + }); + expect( + [...view.container.querySelectorAll("pre code")].map( + (el) => el.textContent, + ), + ).toEqual(codes); + expect(view.container.querySelector("script")).toBeNull(); + }); + + it("preserves 256 sustained source updates without reusing an earlier snippet", async () => { + const view = render(); + for (let i = 0; i < 256; i++) { + const code = `\n\n{ "revision": ${i}, "source": "中文 🧭" }\n`; + await act(async () => + view.rerender(), + ); + expect(content(view.container)).toBe(code); } + expect(view.container.querySelectorAll("pre")).toHaveLength(1); }); -const renderedText = (result: HighlightResult) => - result.tokens.flat().map((token) => token.content).join(""); + it("shows the exact source after a rejected grammar load and can highlight a later source", async () => { + tokenize.mockRejectedValueOnce(new Error("controlled grammar failure")); + const view = render( + , + ); + await act(async () => {}); + expect(content(view.container)).toBe("unavailable\n\n"); + await act(async () => + view.rerender(), + ); + expect(content(view.container)).toBe("recovered\n"); + expect( + view.container.querySelector('[style*="rgb(18, 52, 86)"]'), + ).not.toBeNull(); + }); -describe("highlightCode token cache", () => { - it("does not reuse tokens for equal-length snippets with matching edges", async () => { - const prefix = "p".repeat(100); - const suffix = "s".repeat(100); - const firstCode = `${prefix}const x = 1;${suffix}`; - const secondCode = `${prefix}const y = 2;${suffix}`; + it("uses readable source for unknown, prototype-shaped, and plain-text language labels", () => { + const view = render( + , + ); + for (const language of [ + "text", + "plaintext", + "constructor", + "__proto__", + "unknown-language", + ]) { + view.rerender( + , + ); + expect(content(view.container)).toBe("literal\n\n 中文\n"); + } + expect(tokenize).not.toHaveBeenCalled(); + }); - expect(firstCode).toHaveLength(secondCode.length); + it("preserves an oversized trace entirely without sending it to a synchronous grammar", () => { + const code = "large trace\n".repeat(6000) + "尾部"; + const view = render(); + expect(content(view.container)).toBe(code); + expect(tokenize).not.toHaveBeenCalled(); + }); - const first = await resolveHighlight(firstCode); - const second = await resolveHighlight(secondCode); + it("keeps blank lines, indentation, trailing newlines and HTML-like input as selectable text", async () => { + const code = + '\nconst markup = "";\n\n 中文 🧭\n'; + const view = render( + , + ); + expect(content(view.container)).toBe(code); + await act(async () => {}); + expect(content(view.container)).toBe(code); + expect(view.container.querySelector("img")).toBeNull(); + expect(view.getByRole("region")).toHaveAttribute("tabindex", "0"); + }); - expect(renderedText(first)).toBe(firstCode); - expect(renderedText(second)).toBe(secondCode); + it("ignores results belonging to an unmounted reviewer", async () => { + const pending = deferred(); + tokenize.mockReturnValueOnce(pending.promise as any); + const old = render( + , + ); + old.unmount(); + const current = render( + , + ); + await act(async () => pending.resolve(result("closed review"))); + expect(content(current.container)).toBe("current review"); }); }); diff --git a/apps/web/src/components/ai-elements/code-block.tsx b/apps/web/src/components/ai-elements/code-block.tsx index 9ab10f798..8a126de7f 100644 --- a/apps/web/src/components/ai-elements/code-block.tsx +++ b/apps/web/src/components/ai-elements/code-block.tsx @@ -12,6 +12,7 @@ import { cn } from "@/lib/utils"; import { CheckIcon, CopyIcon } from "lucide-react"; import type { ComponentProps, CSSProperties, HTMLAttributes } from "react"; import { + Fragment, createContext, memo, useCallback, @@ -21,13 +22,8 @@ import { useRef, useState, } from "react"; -import type { - BundledLanguage, - BundledTheme, - HighlighterGeneric, - ThemedToken, -} from "shiki"; -import { createHighlighter } from "shiki"; +import type { BundledLanguage, ThemedToken } from "shiki"; +import { bundledLanguages, codeToTokens } from "shiki"; // Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline // oxlint-disable-next-line eslint(no-bitwise) @@ -78,7 +74,6 @@ const TokenSpan = ({ token }: { token: ThemedToken }) => ( // Line number styles using CSS counters const LINE_NUMBER_CLASSES = cn( - "block", "before:content-[counter(line)]", "before:inline-block", "before:[counter-increment:line]", @@ -87,7 +82,7 @@ const LINE_NUMBER_CLASSES = cn( "before:text-right", "before:text-muted-foreground/50", "before:font-mono", - "before:select-none" + "before:select-none", ); // Line rendering component @@ -98,19 +93,17 @@ const LineSpan = ({ keyedLine: KeyedLine; showLineNumbers: boolean; }) => ( - - {keyedLine.tokens.length === 0 - ? "\n" - : keyedLine.tokens.map(({ token, key }) => ( - - ))} + + {keyedLine.tokens.map(({ token, key }) => ( + + ))} ); // Types type CodeBlockProps = HTMLAttributes & { code: string; - language: BundledLanguage; + language: string; showLineNumbers?: boolean; }; @@ -129,43 +122,6 @@ const CodeBlockContext = createContext({ code: "", }); -// Highlighter cache (singleton per language) -const highlighterCache = new Map< - string, - Promise> ->(); - -// Token cache -const tokensCache = new Map(); - -// Subscribers for async token updates -const subscribers = new Map void>>(); - -const getTokensCacheKey = (code: string, language: BundledLanguage) => { - // The rendered tokens must be keyed by the complete source. A truncated - // prefix/suffix fingerprint can collide for equal-length snippets that only - // differ in the middle, which makes the UI display cached code that does not - // match the source passed to the Copy action. - return `${language}\0${code}`; -}; - -const getHighlighter = ( - language: BundledLanguage -): Promise> => { - const cached = highlighterCache.get(language); - if (cached) { - return cached; - } - - const highlighterPromise = createHighlighter({ - langs: [language], - themes: ["github-light", "github-dark"], - }); - - highlighterCache.set(language, highlighterPromise); - return highlighterPromise; -}; - // Create raw tokens for immediate display while highlighting loads const createRawTokens = (code: string): TokenizedCode => ({ bg: "transparent", @@ -178,75 +134,10 @@ const createRawTokens = (code: string): TokenizedCode => ({ color: "inherit", content: line, } as ThemedToken, - ] + ], ), }); -// Synchronous highlight with callback for async results -export const highlightCode = ( - code: string, - language: BundledLanguage, - // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks) - callback?: (result: TokenizedCode) => void -): TokenizedCode | null => { - const tokensCacheKey = getTokensCacheKey(code, language); - - // Return cached result if available - const cached = tokensCache.get(tokensCacheKey); - if (cached) { - return cached; - } - - // Subscribe callback if provided - if (callback) { - if (!subscribers.has(tokensCacheKey)) { - subscribers.set(tokensCacheKey, new Set()); - } - subscribers.get(tokensCacheKey)?.add(callback); - } - - // Start highlighting in background - fire-and-forget async pattern - getHighlighter(language) - // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then) - .then((highlighter) => { - const availableLangs = highlighter.getLoadedLanguages(); - const langToUse = availableLangs.includes(language) ? language : "text"; - - const result = highlighter.codeToTokens(code, { - lang: langToUse, - themes: { - dark: "github-dark", - light: "github-light", - }, - }); - - const tokenized: TokenizedCode = { - bg: result.bg ?? "transparent", - fg: result.fg ?? "inherit", - tokens: result.tokens, - }; - - // Cache the result - tokensCache.set(tokensCacheKey, tokenized); - - // Notify all subscribers - const subs = subscribers.get(tokensCacheKey); - if (subs) { - for (const sub of subs) { - sub(tokenized); - } - subscribers.delete(tokensCacheKey); - } - }) - // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks) - .catch((error) => { - console.error("Failed to highlight code:", error); - subscribers.delete(tokensCacheKey); - }); - - return null; -}; - const CodeBlockBody = memo( ({ tokenized, @@ -262,34 +153,37 @@ const CodeBlockBody = memo( backgroundColor: tokenized.bg, color: tokenized.fg, }), - [tokenized.bg, tokenized.fg] + [tokenized.bg, tokenized.fg], ); const keyedLines = useMemo( () => addKeysToTokens(tokenized.tokens), - [tokenized.tokens] + [tokenized.tokens], ); return (
         
-          {keyedLines.map((keyedLine) => (
-            
+          {keyedLines.map((keyedLine, index) => (
+            
+              
+              {index < keyedLines.length - 1 ? "\n" : null}
+            
           ))}
         
       
@@ -298,7 +192,7 @@ const CodeBlockBody = memo( (prevProps, nextProps) => prevProps.tokenized === nextProps.tokenized && prevProps.showLineNumbers === nextProps.showLineNumbers && - prevProps.className === nextProps.className + prevProps.className === nextProps.className, ); CodeBlockBody.displayName = "CodeBlockBody"; @@ -312,7 +206,7 @@ export const CodeBlockContainer = ({
@@ -379,49 +273,68 @@ export const CodeBlockContent = ({ showLineNumbers = false, }: { code: string; - language: BundledLanguage; + language: string; showLineNumbers?: boolean; }) => { - // Memoized raw tokens for immediate display const rawTokens = useMemo(() => createRawTokens(code), [code]); - - // Synchronous cache lookup — avoids setState in effect for cached results - const syncTokens = useMemo( - () => highlightCode(code, language) ?? rawTokens, - [code, language, rawTokens] - ); - - // Async highlighting result (populated after shiki loads) - const [asyncTokens, setAsyncTokens] = useState(null); - const asyncKeyRef = useRef({ code, language }); - - // Invalidate stale async tokens synchronously during render - if ( - asyncKeyRef.current.code !== code || - asyncKeyRef.current.language !== language - ) { - asyncKeyRef.current = { code, language }; - setAsyncTokens(null); - } + const [highlighted, setHighlighted] = useState<{ + code: string; + language: string; + tokens: TokenizedCode; + } | null>(null); useEffect(() => { let cancelled = false; + // Large agent outputs stay fully readable and copyable without asking a + // synchronous grammar to process an unbounded amount of text on the UI thread. + if ( + !code || + code.length > 64_000 || + !Object.prototype.hasOwnProperty.call(bundledLanguages, language) + ) { + return; + } - highlightCode(code, language, (result) => { - if (!cancelled) { - setAsyncTokens(result); - } - }); + // Shiki owns one lazily loaded grammar/theme singleton. Keep source and + // tokens only in this mounted component, not lifetime module-level caches. + void codeToTokens(code, { + lang: language as BundledLanguage, + themes: { dark: "github-dark", light: "github-light" }, + }) + .then((result) => { + if (!cancelled) { + setHighlighted({ + code, + language, + tokens: { + bg: result.bg ?? "transparent", + fg: result.fg ?? "inherit", + tokens: result.tokens, + }, + }); + } + }) + .catch(() => { + // Highlighting is optional. Preserve the exact, readable raw source. + }); return () => { cancelled = true; }; }, [code, language]); - const tokenized = asyncTokens ?? syncTokens; + const tokenized = + highlighted?.code === code && highlighted.language === language + ? highlighted.tokens + : rawTokens; return ( -
+
); @@ -482,7 +395,7 @@ export const CodeBlockCopyButton = ({ onCopy?.(); timeoutRef.current = window.setTimeout( () => setIsCopied(false), - timeout + timeout, ); } } catch (error) { @@ -494,7 +407,7 @@ export const CodeBlockCopyButton = ({ () => () => { window.clearTimeout(timeoutRef.current); }, - [] + [], ); const Icon = isCopied ? CheckIcon : CopyIcon; @@ -515,7 +428,7 @@ export const CodeBlockCopyButton = ({ export type CodeBlockLanguageSelectorProps = ComponentProps; export const CodeBlockLanguageSelector = ( - props: CodeBlockLanguageSelectorProps + props: CodeBlockLanguageSelectorProps, ) => + + ); + const trigger = screen.getByRole("button", { name: "Open composed sheet" }); await user.click(trigger); + const dialog = screen.getByRole("dialog", { name: "Composed sheet" }); + expect(dialog.tagName).toBe("SECTION"); expect(ref.current).toBe(dialog); + expect(dialog).toHaveAttribute("data-owner", "caller"); expect(dialog).toHaveClass("caller-content"); + expect(dialog).toContainElement(screen.getByRole("button", { name: "Close" })); + await user.click(screen.getByRole("button", { name: "Close" })); + await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument()); + expect(trigger).toHaveFocus(); + }); + + it("retains the automatic title and default Close for an ordinary sheet", async () => { + const user = userEvent.setup(); + render(Open ordinary sheet + + ); + await user.click(screen.getByRole("button", { name: "Open ordinary sheet" })); + expect(screen.getByRole("heading", { name: "Ordinary sheet" })).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Close" })); + await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument()); + }); +}); + +describe.each([false, true])("a person uses the real dialog with reduced motion=%s", reduced => { + it.each(["Escape", "Close", "backdrop"] as const)("returns to the opener after %s conditionally unmounts the overlay", async method => { + setMotion(reduced); const user = userEvent.setup(); const closed = vi.fn(); + function ConditionalCaller() { + const [open, setOpen] = useState(false); + const close = () => { closed(); setOpen(false); }; + return <> + {open && }; + } + render(); + const opener = screen.getByRole("button", { name: "Open conditional dialog" }); await user.click(opener); + expect(screen.getByRole("button", { name: "Close conditional dialog" })).toHaveFocus(); + if (method === "Escape") await user.keyboard("{Escape}"); + else if (method === "Close") await user.click(screen.getByRole("button", { name: "Close conditional dialog" })); + else { await new Promise(resolve => setTimeout(resolve, 0)); fireEvent.pointerDown(document.body, { pointerType: "mouse", button: 0 }); } + await waitFor(() => expect(opener).toHaveFocus()); + expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); expect(closed).toHaveBeenCalledTimes(1); + expect(document.body).not.toHaveAttribute("data-scroll-locked"); + }); + + it("does not focus a removed opener when the caller changes while the dialog is open", async () => { + setMotion(reduced); const user = userEvent.setup(); + function RemovedCaller() { + const [open, setOpen] = useState(false); const [showOpener, setShowOpener] = useState(true); + return <>{showOpener && } + {open && setOpen(false)} ariaLabel="Removed opener"> + + }; + } + render(); const opener = screen.getByRole("button", { name: "Open removable dialog" }); await user.click(opener); + await user.click(screen.getByRole("button", { name: "Remove opener" })); expect(opener.isConnected).toBe(false); + await user.click(screen.getByRole("button", { name: "Close removed dialog" })); + await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument()); + expect(opener).not.toHaveFocus(); expect(document.activeElement?.isConnected).toBe(true); + expect(document.body).not.toHaveAttribute("data-scroll-locked"); + }); + + it.each([false, true])("respects closeOnEscape=%s without substituting the Radix boundary", async allowed => { + setMotion(reduced); const onClose = vi.fn(); + render(); + expect(screen.getByRole("dialog", { name: "Escape contract" })).toContainElement(document.activeElement as HTMLElement); + fireEvent.keyDown(document.activeElement ?? document, { key: "Escape" }); + expect(onClose).toHaveBeenCalledTimes(allowed ? 1 : 0); + }); + + it.each([false, true])("respects closeOnBackdrop=%s through an actual outside pointer event", async allowed => { + setMotion(reduced); const onClose = vi.fn(); + render(); + // Radix defers attaching its outside-pointer listener until the opening event completes. + await waitFor(() => expect(document.body.style.pointerEvents).toBe("none")); + await new Promise(resolve => setTimeout(resolve, 0)); + fireEvent.pointerDown(document.body, { pointerType: "mouse", button: 0 }); + expect(onClose).toHaveBeenCalledTimes(allowed ? 1 : 0); + }); + + it("honors autofocus opt-out and releases portals and scroll locks across twenty reopen cycles", async () => { + setMotion(reduced); const user = userEvent.setup(); + function Reopen() { + const [open, setOpen] = useState(false); + return <> + setOpen(false)} ariaLabel="Loop contract" autoFocus={false}> + + ; + } + const view = render(); + for (let cycle = 0; cycle < 20; cycle++) { + await user.click(screen.getByRole("button", { name: "Open loop" })); + expect(screen.getAllByRole("dialog")).toHaveLength(1); + expect(screen.getByRole("button", { name: "Close loop" })).not.toHaveFocus(); + expect(document.body).toHaveAttribute("data-scroll-locked"); + await user.click(screen.getByRole("button", { name: "Close loop" })); + await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument()); + expect(document.body).not.toHaveAttribute("data-scroll-locked"); + } + view.unmount(); expect(document.body.style.pointerEvents).not.toBe("none"); + }); +}); diff --git a/apps/web/src/components/ai-ui/sheet.tsx b/apps/web/src/components/ai-ui/sheet.tsx index 7ef4834f4..4f15d17c5 100644 --- a/apps/web/src/components/ai-ui/sheet.tsx +++ b/apps/web/src/components/ai-ui/sheet.tsx @@ -2,6 +2,7 @@ import * as React from "react" import * as DialogPrimitive from "@radix-ui/react-dialog" +import { Slottable } from "@radix-ui/react-slot" import { X } from "lucide-react" import { cn } from "@/lib/utils" @@ -38,7 +39,7 @@ const SheetContent = React.forwardRef< {!props.asChild && props["aria-label"] && !props["aria-labelledby"] ? ( {props["aria-label"]} ) : null} - {children} + {children} {showCloseButton ? ( diff --git a/apps/web/src/features/agents/authority/NotebookAuthorityControl.tsx b/apps/web/src/features/agents/authority/NotebookAuthorityControl.tsx index aff7a28e8..a6fca5bee 100644 --- a/apps/web/src/features/agents/authority/NotebookAuthorityControl.tsx +++ b/apps/web/src/features/agents/authority/NotebookAuthorityControl.tsx @@ -1,8 +1,8 @@ import { useMemo, useState } from "react"; -import { useMutation, useQuery } from "convex/react"; +import { useMutation } from "convex/react"; import type { Id } from "@convex/_generated/dataModel"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { AuthorityControl } from "./AuthorityControl"; import type { @@ -74,12 +74,12 @@ export function NotebookAuthorityControl({ const [pendingAction, setPendingAction] = useState(null); const [error, setError] = useState(null); - const authority = useQuery( - api?.domains.agents.autonomy.grants.getAuthorityState ?? "skip", + const authority = useOptionalQuery( + api?.domains.agents.autonomy.grants.getAuthorityState, api && isOwner ? { entityId } : "skip", ) as AuthorityState | undefined; - const receipts = useQuery( - api?.domains.agents.autonomy.proposals.listReceipts ?? "skip", + const receipts = useOptionalQuery( + api?.domains.agents.autonomy.proposals.listReceipts, api && isOwner ? { entityId, limit: 8 } : "skip", ) as ReceiptRow[] | undefined; diff --git a/apps/web/src/features/agents/components/FastAgentPanel/FastAgentPanel.BriefTab.tsx b/apps/web/src/features/agents/components/FastAgentPanel/FastAgentPanel.BriefTab.tsx index 18017833c..78e793bea 100644 --- a/apps/web/src/features/agents/components/FastAgentPanel/FastAgentPanel.BriefTab.tsx +++ b/apps/web/src/features/agents/components/FastAgentPanel/FastAgentPanel.BriefTab.tsx @@ -168,16 +168,12 @@ export function BriefTab() { const memory = selectedDate ? dateMemory : latestMemory; const results = useQuery( - memory - ? api.domains.research.dailyBriefMemoryQueries.listTaskResultsByMemory - : "skip", + api.domains.research.dailyBriefMemoryQueries.listTaskResultsByMemory, memory ? { memoryId: memory._id } : "skip", ); const overlay = useQuery( - memory - ? api.domains.research.dailyBriefPersonalOverlayQueries.getOverlay - : "skip", + api.domains.research.dailyBriefPersonalOverlayQueries.getOverlay, memory ? { memoryId: memory._id } : "skip", ); diff --git a/apps/web/src/features/chat/components/AgentResilienceConnector.tsx b/apps/web/src/features/chat/components/AgentResilienceConnector.tsx index 6d70d3034..55d788e78 100644 --- a/apps/web/src/features/chat/components/AgentResilienceConnector.tsx +++ b/apps/web/src/features/chat/components/AgentResilienceConnector.tsx @@ -36,9 +36,9 @@ */ import { useCallback, useMemo, useState } from "react"; -import { useMutation, useQuery } from "convex/react"; +import { useMutation } from "convex/react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { useAnonymousSession } from "@/features/agents/hooks/useAnonymousSession"; import { ResilienceSettings, @@ -131,8 +131,8 @@ export function AgentResilienceConnector({ // ─── Budget query + mutation ──────────────────────────────────────── const budgetQueryRef = api?.domains?.agents?.budget?.budgetGate?.getBudgetForOwner; - const budgetRow = useQuery( - budgetQueryRef ?? "skip", + const budgetRow = useOptionalQuery( + budgetQueryRef, budgetQueryRef && ownerKey ? { ownerKey } : "skip", ); const upsertBudgetRef = @@ -172,8 +172,8 @@ export function AgentResilienceConnector({ // ─── Lessons query + mutations ────────────────────────────────────── const lessonsQueryRef = api?.domains?.agents?.lessons?.lessonsPublic?.listAllLessonsForThreadPublic; - const lessonRows = useQuery( - lessonsQueryRef ?? "skip", + const lessonRows = useOptionalQuery( + lessonsQueryRef, lessonsQueryRef && effectiveThreadId ? { threadId: effectiveThreadId } : "skip", diff --git a/apps/web/src/features/designKit/exact/ExactKit.tsx b/apps/web/src/features/designKit/exact/ExactKit.tsx index 64ed66563..19627d128 100644 --- a/apps/web/src/features/designKit/exact/ExactKit.tsx +++ b/apps/web/src/features/designKit/exact/ExactKit.tsx @@ -3,7 +3,7 @@ import { useNavigate, useSearchParams } from "react-router-dom"; import { useConvex, useConvexAuth, useMutation, useQuery } from "convex/react"; import { useAuthActions } from "@convex-dev/auth/react"; import { api as generatedApi } from "@convex/_generated/api"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { getAnonymousProductSessionId } from "@/features/product/lib/productIdentity"; import { useFastAgent } from "@/features/agents/context/FastAgentContext"; import { @@ -295,14 +295,14 @@ function NBTodayIntel({ liveEntities }: { liveEntities?: Array }) { : []; const api = useConvexApi(); - const freshSignals = useQuery( - api?.domains.ai.morningDigestQueries.getFreshCriticalSignals ?? "skip", + const freshSignals = useOptionalQuery( + api?.domains.ai.morningDigestQueries.getFreshCriticalSignals, api?.domains.ai.morningDigestQueries.getFreshCriticalSignals ? { lookbackHours: 48, maxSignals: 6 } : "skip", ); - const digest = useQuery( - api?.domains.ai.morningDigestQueries.getDigestData ?? "skip", + const digest = useOptionalQuery( + api?.domains.ai.morningDigestQueries.getDigestData, api?.domains.ai.morningDigestQueries.getDigestData ? {} : "skip", ); const liveSignalItems: Array<{ hd: string; meta: string }> = ((freshSignals as any)?.signals as any[] | undefined) @@ -387,8 +387,8 @@ function NBTodayIntel({ liveEntities }: { liveEntities?: Array }) { function NBActiveEvent() { const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); - const snapshot = useQuery( - api?.domains.product.entities.getActiveEventSnapshot ?? "skip", + const snapshot = useOptionalQuery( + api?.domains.product.entities.getActiveEventSnapshot, api?.domains.product.entities.getActiveEventSnapshot ? { anonymousSessionId } : "skip", @@ -568,8 +568,8 @@ export function ExactHomeSurface(_props: WebSurfaceProps) { const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); - const entities = useQuery( - api?.domains.product.entities.listEntities ?? "skip", + const entities = useOptionalQuery( + api?.domains.product.entities.listEntities, api?.domains.product.entities.listEntities ? { anonymousSessionId, search: "", filter: "All" } : "skip", @@ -935,8 +935,8 @@ export function ExactReportDetailSurface({ reportId, onBack }: { reportId: strin // missing rather than substituting a completed dossier. const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); - const liveWorkspace = useQuery( - api?.domains.product.entities.getEntityWorkspace ?? "skip", + const liveWorkspace = useOptionalQuery( + api?.domains.product.entities.getEntityWorkspace, api?.domains.product.entities.getEntityWorkspace ? { anonymousSessionId, entitySlug: reportId } : "skip", @@ -1097,8 +1097,8 @@ export function ExactReportsSurface() { const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); - const entities = useQuery( - api?.domains.product.entities.listEntities ?? "skip", + const entities = useOptionalQuery( + api?.domains.product.entities.listEntities, api?.domains.product.entities.listEntities ? { anonymousSessionId, search: "", filter: "All" } : "skip", @@ -1436,8 +1436,8 @@ export function ExactAvatarMenu({ const loggedInUser = useQuery( (api as any)?.domains?.auth?.auth?.loggedInUser ?? "skip", ) as { name?: string; email?: string } | null | undefined; - const recentEntities = useQuery( - api?.domains.product.entities.listEntities ?? "skip", + const recentEntities = useOptionalQuery( + api?.domains.product.entities.listEntities, api?.domains.product.entities.listEntities ? { anonymousSessionId, search: "", filter: "All" } : "skip", @@ -1445,8 +1445,8 @@ export function ExactAvatarMenu({ const liveEntitiesArr = recentEntities as Array | undefined; const recordSession = useMutation(api?.domains.product.entities.recordCurrentSession); - const recentSessions = useQuery( - api?.domains.product.entities.listRecentSessions ?? "skip", + const recentSessions = useOptionalQuery( + api?.domains.product.entities.listRecentSessions, api?.domains.product.entities.listRecentSessions ? { anonymousSessionId } : "skip", @@ -2014,8 +2014,8 @@ export function ExactChatSurface() { // Otherwise start from an honest live-ready state, not a synthetic answer. const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); - const liveThread = useQuery( - api?.domains.product.entities.getMostRecentChatThread ?? "skip", + const liveThread = useOptionalQuery( + api?.domains.product.entities.getMostRecentChatThread, api?.domains.product.entities.getMostRecentChatThread ? { anonymousSessionId } : "skip", @@ -2274,8 +2274,8 @@ export function ExactInboxSurface() { const api = useConvexApi(); const convex = useConvex(); const anonymousSessionId = getAnonymousProductSessionId(); - const snapshot = useQuery( - api?.domains.product.nudges.getNudgesSnapshot ?? "skip", + const snapshot = useOptionalQuery( + api?.domains.product.nudges.getNudgesSnapshot, api?.domains.product.nudges.getNudgesSnapshot ? { anonymousSessionId } : "skip", ); @@ -2457,8 +2457,8 @@ export function ExactMeSurface() { const loggedInUser = useQuery( (api as any)?.domains?.auth?.auth?.loggedInUser ?? "skip", ) as { name?: string; email?: string } | null | undefined; - const liveEntities = useQuery( - api?.domains.product.entities.listEntities ?? "skip", + const liveEntities = useOptionalQuery( + api?.domains.product.entities.listEntities, api?.domains.product.entities.listEntities ? { anonymousSessionId, search: "", filter: "All" } : "skip", diff --git a/apps/web/src/features/entities/components/EntityNotebookView.test.tsx b/apps/web/src/features/entities/components/EntityNotebookView.test.tsx index 3b0d67f8b..931e75946 100644 --- a/apps/web/src/features/entities/components/EntityNotebookView.test.tsx +++ b/apps/web/src/features/entities/components/EntityNotebookView.test.tsx @@ -19,6 +19,8 @@ vi.mock("react-router-dom", async () => { }); vi.mock("@/lib/convexApi", () => ({ + useOptionalQuery: (query: unknown, ...args: unknown[]) => + query == null || args[0] === "skip" ? undefined : useQueryMock(query, ...args), useConvexApi: () => ({ domains: { product: { diff --git a/apps/web/src/features/entities/components/EntityNotebookView.tsx b/apps/web/src/features/entities/components/EntityNotebookView.tsx index b60db09dd..6cc2f5c6d 100644 --- a/apps/web/src/features/entities/components/EntityNotebookView.tsx +++ b/apps/web/src/features/entities/components/EntityNotebookView.tsx @@ -1,8 +1,8 @@ import { useMemo, useState } from "react"; -import { useQuery } from "convex/react"; + import { useNavigate } from "react-router-dom"; import { ChevronRight, ExternalLink, Link2, Network, Sparkles } from "lucide-react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { getAnonymousProductSessionId } from "@/features/product/lib/productIdentity"; import { buildEntityPath } from "@/features/entities/lib/entityExport"; @@ -109,14 +109,14 @@ export function EntityNotebookView({ entitySlug, shareToken, canOpenLive = false const api = useConvexApi(); const navigate = useNavigate(); const anonymousSessionId = getAnonymousProductSessionId(); - const snapshot = useQuery( - api?.domains.product.blocks.getEntityNotebook ?? "skip", + const snapshot = useOptionalQuery( + api?.domains.product.blocks.getEntityNotebook, api?.domains.product.blocks.getEntityNotebook ? { anonymousSessionId, shareToken, entitySlug } : "skip", ); - const backlinks = useQuery( - api?.domains.product.blocks.listBacklinksForEntity ?? "skip", + const backlinks = useOptionalQuery( + api?.domains.product.blocks.listBacklinksForEntity, api?.domains.product.blocks.listBacklinksForEntity ? { anonymousSessionId, shareToken, entitySlug } : "skip", diff --git a/apps/web/src/features/entities/components/notebook/EntityNotebookLive.empty-state.test.tsx b/apps/web/src/features/entities/components/notebook/EntityNotebookLive.empty-state.test.tsx index 5d165f689..5f4149b78 100644 --- a/apps/web/src/features/entities/components/notebook/EntityNotebookLive.empty-state.test.tsx +++ b/apps/web/src/features/entities/components/notebook/EntityNotebookLive.empty-state.test.tsx @@ -126,9 +126,14 @@ vi.mock("convex/react", () => ({ }), })); -vi.mock("@/lib/convexApi", () => ({ - useConvexApi: () => api, -})); +vi.mock("@/lib/convexApi", async () => { + const { useQuery } = await import("convex/react"); + return { + useConvexApi: () => api, + useOptionalQuery: (...args: Parameters) => + args[0] == null || args[1] === "skip" ? undefined : useQuery(args[0], args[1]), + }; +}); vi.mock("@/shared/ui", () => ({ useToast: () => ({ diff --git a/apps/web/src/features/entities/components/notebook/EntityNotebookLive.tsx b/apps/web/src/features/entities/components/notebook/EntityNotebookLive.tsx index 6b7ed0e63..0cb9eaf55 100644 --- a/apps/web/src/features/entities/components/notebook/EntityNotebookLive.tsx +++ b/apps/web/src/features/entities/components/notebook/EntityNotebookLive.tsx @@ -44,7 +44,7 @@ export { parseNotebookMutationError, shouldRefreshAgentNotebookProjection, }; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { getAnonymousProductSessionId } from "@/features/product/lib/productIdentity"; import { useStreamingSearch } from "@/hooks/useStreamingSearch"; import { publishNotebookAlert } from "@/lib/notebookAlerts"; @@ -258,28 +258,28 @@ export function EntityNotebookLive({ viewerOwnerKey && authorityBlock?.ownerKey === viewerOwnerKey, ); - const authorityState = useQuery( - api?.domains?.agents?.autonomy?.grants?.getAuthorityState ?? "skip", + const authorityState = useOptionalQuery( + api?.domains?.agents?.autonomy?.grants?.getAuthorityState, api && isAuthorityOwner && authorityEntityId ? { entityId: authorityEntityId } : "skip", ) as NotebookAuthorityState | undefined; - const authorityOperationStates = useQuery( - api?.domains?.agents?.autonomy?.proposals?.listOperationStates ?? "skip", + const authorityOperationStates = useOptionalQuery( + api?.domains?.agents?.autonomy?.proposals?.listOperationStates, api && isAuthorityOwner && authorityEntityId ? { entityId: authorityEntityId, limit: 50 } : "skip", ) as NotebookAuthorityServerOperationState[] | undefined; - const snapshot = useQuery( - api?.domains.product.blocks.getEntityNotebook ?? "skip", + const snapshot = useOptionalQuery( + api?.domains.product.blocks.getEntityNotebook, api?.domains.product.blocks.getEntityNotebook ? { anonymousSessionId, shareToken, entitySlug } : "skip", ); - const blockSummary = useQuery( - api?.domains.product.blocks.getEntityBlockSummary ?? "skip", + const blockSummary = useOptionalQuery( + api?.domains.product.blocks.getEntityBlockSummary, api?.domains.product.blocks.getEntityBlockSummary ? { anonymousSessionId, shareToken, entitySlug } : "skip", @@ -500,8 +500,8 @@ export function EntityNotebookLive({ const authorityAcceptInFlightRef = useRef>(new Set()); const authorityCandidateAvailableRef = useRef(false); - const presence = useQuery( - api?.domains.product.notebookPresence.notebookPresenceList ?? "skip", + const presence = useOptionalQuery( + api?.domains.product.notebookPresence.notebookPresenceList, api?.domains.product.notebookPresence.notebookPresenceList && presenceRoomToken ? { roomToken: presenceRoomToken } diff --git a/apps/web/src/features/home/views/HomeLanding.tsx b/apps/web/src/features/home/views/HomeLanding.tsx index cb14f3888..33a9bf64d 100644 --- a/apps/web/src/features/home/views/HomeLanding.tsx +++ b/apps/web/src/features/home/views/HomeLanding.tsx @@ -6,7 +6,7 @@ import { useConvex, useMutation, useQuery } from "convex/react"; import { toast } from "sonner"; import { ArrowUpRight, Clock3, Eye, FileText, Sparkles } from "lucide-react"; import { trackEvent } from "@/lib/analytics"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { buildCockpitPath } from "@/lib/registry/viewRegistry"; import { staggerDelay } from "@/lib/ui/stagger"; import { LENSES, type LensId } from "@/features/controlPlane/components/searchTypes"; @@ -246,21 +246,21 @@ export function HomeLanding() { const saveContextCapture = useMutation( api?.domains.product.me.saveContextCapture ?? ("skip" as any), ); - const meSnapshot = useQuery( - api?.domains.product.me.getMeSnapshot ?? "skip", + const meSnapshot = useOptionalQuery( + api?.domains.product.me.getMeSnapshot, api?.domains.product.me.getMeSnapshot ? { anonymousSessionId: getAnonymousProductSessionId() } : "skip", ); - const savedReports = useQuery( - api?.domains.product.reports.listReports ?? "skip", + const savedReports = useOptionalQuery( + api?.domains.product.reports.listReports, api?.domains.product.reports.listReports ? { anonymousSessionId: getAnonymousProductSessionId() } : "skip", ); - const systemReports = useQuery( - api?.domains?.product?.systemIntelligence?.listSystemReportCards ?? "skip", + const systemReports = useOptionalQuery( + api?.domains?.product?.systemIntelligence?.listSystemReportCards, api?.domains?.product?.systemIntelligence?.listSystemReportCards ? { filter: "All" } : "skip", diff --git a/apps/web/src/features/me/components/wiki/WikiLanding.tsx b/apps/web/src/features/me/components/wiki/WikiLanding.tsx index af75eabc7..6e30cda4e 100644 --- a/apps/web/src/features/me/components/wiki/WikiLanding.tsx +++ b/apps/web/src/features/me/components/wiki/WikiLanding.tsx @@ -7,9 +7,9 @@ * Contract per docs/architecture/ME_PAGE_WIKI_SPEC.md §3. */ import { useMemo, useState } from "react"; -import { useQuery } from "convex/react"; + import { Link } from "react-router-dom"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { WikiFreshnessBadge, type FreshnessState } from "./WikiFreshnessBadge"; type WikiPageType = @@ -54,15 +54,15 @@ export function WikiLanding({ ownerKey }: { ownerKey: string }) { const api = useConvexApi(); const [tab, setTab] = useState<"all" | WikiPageType>("all"); - const pages = useQuery( - api?.domains?.product?.userWikiMaintainer?.listPagesForOwner ?? "skip", + const pages = useOptionalQuery( + api?.domains?.product?.userWikiMaintainer?.listPagesForOwner, api?.domains?.product?.userWikiMaintainer?.listPagesForOwner ? { ownerKey, pageType: tab === "all" ? undefined : tab, limit: 50 } : "skip", ) as WikiPageRow[] | undefined; - const contradicting = useQuery( - api?.domains?.product?.userWikiMaintainer?.listContradictingPages ?? "skip", + const contradicting = useOptionalQuery( + api?.domains?.product?.userWikiMaintainer?.listContradictingPages, api?.domains?.product?.userWikiMaintainer?.listContradictingPages ? { ownerKey, limit: 10 } : "skip", diff --git a/apps/web/src/features/me/components/wiki/WikiNotesEditor.tsx b/apps/web/src/features/me/components/wiki/WikiNotesEditor.tsx index b434f1fd1..5e2c6be49 100644 --- a/apps/web/src/features/me/components/wiki/WikiNotesEditor.tsx +++ b/apps/web/src/features/me/components/wiki/WikiNotesEditor.tsx @@ -11,10 +11,10 @@ */ import { useState, useCallback, useEffect } from "react"; -import { useMutation, useQuery } from "convex/react"; +import { useMutation } from "convex/react"; import { Save, Lock, FileText } from "lucide-react"; import { toast } from "sonner"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; const MAX_BYTES = 65_536; @@ -33,8 +33,8 @@ export function WikiNotesEditor({ pageId: string; }) { const api = useConvexApi(); - const existing = useQuery( - api?.domains?.product?.wikiStagingMutations?.getUserWikiNotes ?? "skip", + const existing = useOptionalQuery( + api?.domains?.product?.wikiStagingMutations?.getUserWikiNotes, api?.domains?.product?.wikiStagingMutations?.getUserWikiNotes ? { ownerKey, pageId: pageId as any } : "skip", diff --git a/apps/web/src/features/me/components/wiki/WikiPageDetailContainer.tsx b/apps/web/src/features/me/components/wiki/WikiPageDetailContainer.tsx index 437553bb3..841c735d1 100644 --- a/apps/web/src/features/me/components/wiki/WikiPageDetailContainer.tsx +++ b/apps/web/src/features/me/components/wiki/WikiPageDetailContainer.tsx @@ -2,8 +2,8 @@ * Route-level container for a single wiki page. Fetches via Convex live * query and delegates rendering to the presentational WikiPageDetail. */ -import { useQuery } from "convex/react"; -import { useConvexApi } from "@/lib/convexApi"; + +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { WikiPageDetail, type WikiPageDoc, type WikiRevisionDoc } from "./WikiPageDetail"; export function WikiPageDetailContainer({ @@ -14,8 +14,8 @@ export function WikiPageDetailContainer({ slug: string; }) { const api = useConvexApi(); - const result = useQuery( - api?.domains?.product?.userWikiMaintainer?.getPageBySlug ?? "skip", + const result = useOptionalQuery( + api?.domains?.product?.userWikiMaintainer?.getPageBySlug, api?.domains?.product?.userWikiMaintainer?.getPageBySlug ? { ownerKey, slug } : "skip", diff --git a/apps/web/src/features/me/components/wiki/WikiThemesPanel.tsx b/apps/web/src/features/me/components/wiki/WikiThemesPanel.tsx index e884860ac..6ff04f9f9 100644 --- a/apps/web/src/features/me/components/wiki/WikiThemesPanel.tsx +++ b/apps/web/src/features/me/components/wiki/WikiThemesPanel.tsx @@ -5,10 +5,10 @@ * They help users discover connections across their wiki pages. */ -import { useQuery } from "convex/react"; + import { Sparkles } from "lucide-react"; import { Link } from "react-router-dom"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; interface Theme { _id: string; @@ -21,8 +21,8 @@ interface Theme { export function WikiThemesPanel({ ownerKey }: { ownerKey: string }) { const api = useConvexApi(); - const themes = useQuery( - api?.domains?.product?.wikiStagingMutations?.listWikiThemes ?? "skip", + const themes = useOptionalQuery( + api?.domains?.product?.wikiStagingMutations?.listWikiThemes, api?.domains?.product?.wikiStagingMutations?.listWikiThemes ? { ownerKey, limit: 10 } : "skip", diff --git a/apps/web/src/features/me/views/MeHome.test.tsx b/apps/web/src/features/me/views/MeHome.test.tsx index 6c6aede67..79f004e29 100644 --- a/apps/web/src/features/me/views/MeHome.test.tsx +++ b/apps/web/src/features/me/views/MeHome.test.tsx @@ -23,6 +23,8 @@ vi.mock("react-router-dom", async () => { }); vi.mock("@/lib/convexApi", () => ({ + useOptionalQuery: (query: unknown, ...args: unknown[]) => + query == null || args[0] === "skip" ? undefined : useQueryMock(query, ...args), useConvexApi: () => ({ domains: { product: { diff --git a/apps/web/src/features/me/views/MeHome.tsx b/apps/web/src/features/me/views/MeHome.tsx index b96742995..7ad153f0d 100644 --- a/apps/web/src/features/me/views/MeHome.tsx +++ b/apps/web/src/features/me/views/MeHome.tsx @@ -1,9 +1,9 @@ import { useCallback, useEffect, useMemo, useRef, useState, type ChangeEvent } from "react"; import { useNavigate, useSearchParams } from "react-router-dom"; -import { useMutation, useQuery } from "convex/react"; +import { useMutation } from "convex/react"; import { BookOpen, FileText, Plus, Save, Upload } from "lucide-react"; import { toast } from "sonner"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { buildCockpitPath } from "@/lib/registry/viewRegistry"; import MobileMeSurface from "@/features/me/views/MobileMeSurface"; import { usePwaInstallPrompt } from "@/hooks/usePwaInstallPrompt"; @@ -150,12 +150,12 @@ export function MeHome() { const { canInstall, isInstalled, promptToInstall } = usePwaInstallPrompt(); // ── Queries ── - const snapshot = useQuery( - api?.domains.product.me.getMeSnapshot ?? "skip", + const snapshot = useOptionalQuery( + api?.domains.product.me.getMeSnapshot, api?.domains.product.me.getMeSnapshot ? { anonymousSessionId } : "skip", ); - const nudgesSnapshot = useQuery( - api?.domains.product.nudges.getNudgesSnapshot ?? "skip", + const nudgesSnapshot = useOptionalQuery( + api?.domains.product.nudges.getNudgesSnapshot, api?.domains.product.nudges.getNudgesSnapshot ? { anonymousSessionId } : "skip", ); @@ -163,8 +163,8 @@ export function MeHome() { const generateUploadUrl = useMutation(api?.domains.product.me.generateUploadUrl ?? ("skip" as any)); const saveFileMutation = useMutation(api?.domains.product.me.saveFile ?? ("skip" as any)); const updateProfileMutation = useMutation(api?.domains.product.me.updateProfile ?? ("skip" as any)); - const realFiles = useQuery( - api?.domains.product.me.listFiles ?? "skip", + const realFiles = useOptionalQuery( + api?.domains.product.me.listFiles, api?.domains.product.me.listFiles ? { anonymousSessionId } : "skip", ); diff --git a/apps/web/src/features/nudges/views/NudgesHome.test.tsx b/apps/web/src/features/nudges/views/NudgesHome.test.tsx index edd9f29f5..60bd871a8 100644 --- a/apps/web/src/features/nudges/views/NudgesHome.test.tsx +++ b/apps/web/src/features/nudges/views/NudgesHome.test.tsx @@ -22,6 +22,8 @@ vi.mock("react-router-dom", async () => { }); vi.mock("@/lib/convexApi", () => ({ + useOptionalQuery: (query: unknown, ...args: unknown[]) => + query == null || args[0] === "skip" ? undefined : useQueryMock(query, ...args), useConvexApi: () => ({ domains: { product: { diff --git a/apps/web/src/features/nudges/views/NudgesHome.tsx b/apps/web/src/features/nudges/views/NudgesHome.tsx index 310358df6..bb0943ed9 100644 --- a/apps/web/src/features/nudges/views/NudgesHome.tsx +++ b/apps/web/src/features/nudges/views/NudgesHome.tsx @@ -1,9 +1,9 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { ArrowUpRight, Bell, CheckCircle2, Clock3, Eye, Repeat2, X, Zap, type LucideIcon } from "lucide-react"; import { MobileInboxSurface } from "./MobileInboxSurface"; -import { useConvex, useQuery } from "convex/react"; +import { useConvex } from "convex/react"; import { useNavigate } from "react-router-dom"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { buildCockpitPath } from "@/lib/registry/viewRegistry"; import { getAnonymousProductSessionId } from "@/features/product/lib/productIdentity"; import { useProductBootstrap } from "@/features/product/lib/useProductBootstrap"; @@ -249,8 +249,8 @@ export function NudgesHome() { const navigate = useNavigate(); const anonymousSessionId = getAnonymousProductSessionId(); - const snapshot = useQuery( - api?.domains.product.nudges.getNudgesSnapshot ?? "skip", + const snapshot = useOptionalQuery( + api?.domains.product.nudges.getNudgesSnapshot, api?.domains.product.nudges.getNudgesSnapshot ? { anonymousSessionId } : "skip", diff --git a/apps/web/src/features/product/components/ProductFileAssetPicker.tsx b/apps/web/src/features/product/components/ProductFileAssetPicker.tsx index 2bfb3ffaa..bcc3344e5 100644 --- a/apps/web/src/features/product/components/ProductFileAssetPicker.tsx +++ b/apps/web/src/features/product/components/ProductFileAssetPicker.tsx @@ -1,7 +1,7 @@ import { useMemo, useState } from "react"; -import { useQuery } from "convex/react"; + import { Search, X } from "lucide-react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { getAnonymousProductSessionId } from "@/features/product/lib/productIdentity"; import { Dialog, @@ -48,8 +48,8 @@ export function ProductFileAssetPicker({ const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); const [query, setQuery] = useState(""); - const files = useQuery( - api?.domains?.product?.me?.listFiles ?? "skip", + const files = useOptionalQuery( + api?.domains?.product?.me?.listFiles, api?.domains?.product?.me?.listFiles ? { anonymousSessionId } : "skip", ) as ProductFileAsset[] | undefined; diff --git a/apps/web/src/features/reports/views/ReportsHome.tsx b/apps/web/src/features/reports/views/ReportsHome.tsx index 0adeb4024..1d5f4892b 100644 --- a/apps/web/src/features/reports/views/ReportsHome.tsx +++ b/apps/web/src/features/reports/views/ReportsHome.tsx @@ -4,7 +4,7 @@ import { useMutation, useQuery } from "convex/react"; import { Check, Link2, Search, Building2, User, Briefcase, TrendingUp, FileText, X } from "lucide-react"; import { toast } from "sonner"; import { trackEvent } from "@/lib/analytics"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { cn } from "@/lib/utils"; import { ProductThumbnail } from "@/features/product/components/ProductThumbnail"; import { @@ -452,8 +452,8 @@ export function ReportsHome() { : "skip", ) as any; - const entities = useQuery( - api?.domains.product.entities.listEntities ?? "skip", + const entities = useOptionalQuery( + api?.domains.product.entities.listEntities, api?.domains.product.entities.listEntities ? { anonymousSessionId, search: query, filter: "All" } : "skip", @@ -487,8 +487,8 @@ export function ReportsHome() { })), [entities], ); - const systemEntities = useQuery( - api?.domains?.product?.systemIntelligence?.listSystemReportCards ?? "skip", + const systemEntities = useOptionalQuery( + api?.domains?.product?.systemIntelligence?.listSystemReportCards, api?.domains?.product?.systemIntelligence?.listSystemReportCards ? { search: query, filter: "All" } : "skip", diff --git a/apps/web/src/features/research/types/index.ts b/apps/web/src/features/research/types/index.ts index f5465b49d..18abab417 100644 --- a/apps/web/src/features/research/types/index.ts +++ b/apps/web/src/features/research/types/index.ts @@ -24,7 +24,7 @@ export type { DashboardState, AgentDashboardUpdate, StorySection -} from "./"; +} from "../types"; // Export Daily Brief canonical schema export type { diff --git a/apps/web/src/features/strategy/views/ExecutionTraceView.test.tsx b/apps/web/src/features/strategy/views/ExecutionTraceView.test.tsx index a8a7d5a08..e83deb2ca 100644 --- a/apps/web/src/features/strategy/views/ExecutionTraceView.test.tsx +++ b/apps/web/src/features/strategy/views/ExecutionTraceView.test.tsx @@ -54,12 +54,12 @@ describe("ExecutionTraceView", () => { expect(screen.getByText(/Spreadsheet workflow: inspect, research, edit, verify, export/i)).toBeInTheDocument(); expect(screen.getAllByText(/Explicit demo trace/i).length).toBeGreaterThan(0); - expect(screen.getByRole("tab", { name: /Outcome/i })).toBeInTheDocument(); + expect(screen.getByRole("radio", { name: /Outcome/i })).toBeInTheDocument(); expect(screen.getByText(/Primary result/i)).toBeInTheDocument(); expect(screen.getByText(/Trust Boundary/i)).toBeInTheDocument(); - fireEvent.click(screen.getByRole("tab", { name: /Full Trace/i })); - fireEvent.click(screen.getByRole("tab", { name: /json contract/i })); + fireEvent.click(screen.getByRole("radio", { name: /Full Trace/i })); + fireEvent.keyDown(screen.getByRole("tab", { name: /json contract/i }), { key: "Enter" }); expect(screen.getByText(/Typed Output/i)).toBeInTheDocument(); expect(screen.getByText(/Schema Contract/i)).toBeInTheDocument(); @@ -135,7 +135,7 @@ describe("ExecutionTraceView", () => { expect(screen.getByText(/Live saved run/i)).toBeInTheDocument(); expect(screen.getByText(/1 trace reconstructed from saved runs/i)).toBeInTheDocument(); - fireEvent.click(screen.getByRole("tab", { name: /Why/i })); + fireEvent.click(screen.getByRole("radio", { name: /Why/i })); expect(screen.getByText(/Why this outcome/i)).toBeInTheDocument(); expect(screen.getByText(/Evidence boundary/i)).toBeInTheDocument(); }); diff --git a/apps/web/src/features/strategy/views/ProductDirectionMemoView.test.tsx b/apps/web/src/features/strategy/views/ProductDirectionMemoView.test.tsx index 94463258c..377c7ad89 100644 --- a/apps/web/src/features/strategy/views/ProductDirectionMemoView.test.tsx +++ b/apps/web/src/features/strategy/views/ProductDirectionMemoView.test.tsx @@ -11,7 +11,7 @@ describe("ProductDirectionMemoView", () => { expect(screen.getByText(/Recommended direction/i)).toBeInTheDocument(); expect(screen.getByText(/Best-fit product name/i)).toBeInTheDocument(); - fireEvent.click(screen.getByRole("tab", { name: /json contract/i })); + fireEvent.keyDown(screen.getByRole("tab", { name: /json contract/i }), { key: "Enter" }); expect(screen.getByText(/Typed Output/i)).toBeInTheDocument(); expect(screen.getByText(/Schema Contract/i)).toBeInTheDocument(); diff --git a/apps/web/src/layouts/CommandBar.tsx b/apps/web/src/layouts/CommandBar.tsx index 014adf703..a8cb120c6 100644 --- a/apps/web/src/layouts/CommandBar.tsx +++ b/apps/web/src/layouts/CommandBar.tsx @@ -9,7 +9,7 @@ import { useNavigate } from "react-router-dom"; import { memo, useCallback, useMemo } from "react"; import { useConvexAuth, useQuery} from "convex/react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { MessageSquare } from "lucide-react"; import { ICON_MAP, @@ -43,10 +43,10 @@ function useBadgeCounts(): Partial> { : "skip", isAuthenticated ? {} : "skip", ); - const pendingHITL = useQuery( + const pendingHITL = useOptionalQuery( isAuthenticated && api?.domains.hitl.adjudicationWorkflow.getPendingAdjudicationRequests ? api.domains.hitl.adjudicationWorkflow.getPendingAdjudicationRequests - : "skip", + : undefined, isAuthenticated ? {} : "skip", ); return useMemo(() => { diff --git a/apps/web/src/layouts/WorkspaceRail.tsx b/apps/web/src/layouts/WorkspaceRail.tsx index fe58ff470..eb22d991e 100644 --- a/apps/web/src/layouts/WorkspaceRail.tsx +++ b/apps/web/src/layouts/WorkspaceRail.tsx @@ -1,6 +1,6 @@ import { memo } from "react"; import { useNavigate } from "react-router-dom"; -import { useConvexAuth, useQuery} from "convex/react"; +import { useConvexAuth} from "convex/react"; import { useAuthActions } from "@convex-dev/auth/react"; import { Bell, @@ -17,7 +17,7 @@ import { Settings, } from "lucide-react"; import type { LucideIcon } from "lucide-react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import type { CockpitSurfaceId } from "@/lib/registry/viewRegistry"; import { buildCockpitPath } from "@/lib/registry/viewRegistry"; import { getAnonymousProductSessionId } from "@/features/product/lib/productIdentity"; @@ -66,10 +66,10 @@ export const WorkspaceRail = memo(function WorkspaceRail({ const api = useConvexApi(); const anonymousSessionId = getAnonymousProductSessionId(); - const shellSnapshot = useQuery( + const shellSnapshot = useOptionalQuery( api?.domains.product.shell.getWorkspaceRailSnapshot ? api.domains.product.shell.getWorkspaceRailSnapshot - : "skip", + : undefined, api?.domains.product.shell.getWorkspaceRailSnapshot ? { anonymousSessionId } : "skip", diff --git a/apps/web/src/layouts/chrome/CommandPalette.tsx b/apps/web/src/layouts/chrome/CommandPalette.tsx index 86db0e5b1..c011b9937 100644 --- a/apps/web/src/layouts/chrome/CommandPalette.tsx +++ b/apps/web/src/layouts/chrome/CommandPalette.tsx @@ -10,8 +10,8 @@ import { CommandList, CommandShortcut, } from "@/components/ai-ui/command"; -import { useQuery} from "convex/react"; -import { useConvexApi } from "@/lib/convexApi"; + +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { Search, Bell, @@ -72,10 +72,10 @@ export function CommandPalette({ onClose(); }, [navigate, onClose]); - const recentDocs = useQuery( + const recentDocs = useOptionalQuery( api?.domains.documents.documents.getSidebar ? api.domains.documents.documents.getSidebar - : "skip", + : undefined, api?.domains.documents.documents.getSidebar ? {} : "skip", ); diff --git a/apps/web/src/layouts/cockpitRails.test.tsx b/apps/web/src/layouts/cockpitRails.test.tsx index 6b0545a1b..8d906d4b1 100644 --- a/apps/web/src/layouts/cockpitRails.test.tsx +++ b/apps/web/src/layouts/cockpitRails.test.tsx @@ -21,6 +21,8 @@ vi.mock("@convex-dev/auth/react", () => ({ })); vi.mock("@/lib/convexApi", () => ({ + useOptionalQuery: (query: unknown, ...args: unknown[]) => + query == null || args[0] === "skip" ? undefined : mockUseQuery(query, ...args), useConvexApi: () => mockUseConvexApi(), })); @@ -42,6 +44,11 @@ describe("cockpit rails", () => { mockUseConvexApi.mockReset(); mockUseOnlineStatus.mockReset(); vi.stubGlobal("fetch", vi.fn(() => new Promise(() => {}))); + vi.stubGlobal("ResizeObserver", class { + observe() {} + unobserve() {} + disconnect() {} + }); mockUseConvexAuth.mockReturnValue({ isAuthenticated: true, isLoading: false }); mockConvexMutation.mockResolvedValue(undefined); mockUseConvex.mockReturnValue({ mutation: mockConvexMutation }); @@ -190,7 +197,7 @@ describe("cockpit rails", () => { , ); - fireEvent.click(screen.getByText("Runtime document").closest("button")!); + fireEvent.click(screen.getByRole("option", { name: "Runtime document Open recent document" })); expect(onOpenDocument).toHaveBeenCalledTimes(1); expect((onOpenDocument.mock.calls[0][0] as CustomEvent).detail).toEqual({ diff --git a/apps/web/src/layouts/settings/SettingsModal.tsx b/apps/web/src/layouts/settings/SettingsModal.tsx index 41058668b..dc0501fe6 100644 --- a/apps/web/src/layouts/settings/SettingsModal.tsx +++ b/apps/web/src/layouts/settings/SettingsModal.tsx @@ -1,7 +1,7 @@ import React, { useMemo, useState, useEffect } from "react"; import { useThemeSafe } from "../../contexts/ThemeContext"; -import { useQuery, useMutation, useAction} from "convex/react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useMutation, useAction} from "convex/react"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { toast } from "sonner"; import { Checkbox } from "@/components/ai-ui/checkbox"; import { Switch } from "@/components/ai-ui/switch"; @@ -79,8 +79,8 @@ function SmsUsageStats() { // anonymous fallback: when api is undefined (Convex API not yet loaded), // useQuery should skip rather than receive a fake args object that // could silently degrade to seed data in an authenticated path. - const smsUsage = useQuery(api?.domains.integrations.sms.getSmsUsageStats ?? "skip", { days: 30 }); - const costBreakdown = useQuery(api?.domains.integrations.sms.getSmsCostBreakdown); + const smsUsage = useOptionalQuery(api?.domains.integrations.sms.getSmsUsageStats, { days: 30 }); + const costBreakdown = useOptionalQuery(api?.domains.integrations.sms.getSmsCostBreakdown); if (!smsUsage && !costBreakdown) { return null; @@ -232,21 +232,21 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { return () => window.removeEventListener("keydown", onKeyDown); }, [isOpen, onClose]); - const keyStatuses = useQuery(api?.domains.auth.apiKeys.listApiKeyStatuses ?? "skip", { + const keyStatuses = useOptionalQuery(api?.domains.auth.apiKeys.listApiKeyStatuses, { providers: PROVIDERS, }); // Auth state to gate saving/deleting keys and show hints - const user = useQuery(api?.domains.auth.auth.loggedInUser); + const user = useOptionalQuery(api?.domains.auth.auth.loggedInUser); // Usage (daily + 14-day series) per provider - const dailyOpenAI = useQuery(api?.domains.auth.usage.getDailyUsagePublic ?? "skip", { provider: "openai" }); - const dailyGemini = useQuery(api?.domains.auth.usage.getDailyUsagePublic ?? "skip", { provider: "gemini" }); - const seriesOpenAI = useQuery(api?.domains.auth.usage.getUsageSeries ?? "skip", { provider: "openai", days: 14 }); - const seriesGemini = useQuery(api?.domains.auth.usage.getUsageSeries ?? "skip", { provider: "gemini", days: 14 }); + const dailyOpenAI = useOptionalQuery(api?.domains.auth.usage.getDailyUsagePublic, { provider: "openai" }); + const dailyGemini = useOptionalQuery(api?.domains.auth.usage.getDailyUsagePublic, { provider: "gemini" }); + const seriesOpenAI = useOptionalQuery(api?.domains.auth.usage.getUsageSeries, { provider: "openai", days: 14 }); + const seriesGemini = useOptionalQuery(api?.domains.auth.usage.getUsageSeries, { provider: "gemini", days: 14 }); // Billing - const subscription = useQuery(api?.domains.billing.billing.getSubscription); + const subscription = useOptionalQuery(api?.domains.billing.billing.getSubscription); const saveEncryptedApiKey = useMutation(api?.domains.auth.apiKeys.saveEncryptedApiKeyPublic); const deleteApiKey = useMutation(api?.domains.auth.apiKeys.deleteApiKey); @@ -255,12 +255,12 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { const runGcalSync = useAction(api.domains.integrations.gcal.syncPrimaryCalendar); // Gmail connection status and OAuth - const gmailConnection = useQuery(api?.domains.integrations.gmail.getConnection ?? "skip", {}); + const gmailConnection = useOptionalQuery(api?.domains.integrations.gmail.getConnection, {}); const getGmailOAuthUrl = useAction(api.domains.integrations.gmail.getOAuthUrl); const [connectingGmail, setConnectingGmail] = useState(false); // Calendar UI prefs (timezone) - const calendarPrefs = useQuery(api?.domains.auth.userPreferences.getCalendarUiPrefs ?? "skip", {}); + const calendarPrefs = useOptionalQuery(api?.domains.auth.userPreferences.getCalendarUiPrefs, {}); const _saveTimeZone = useMutation(api?.domains.auth.userPreferences.setTimeZonePreference); const browserTz = useMemo(() => { try { @@ -315,7 +315,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { }, [calendarPrefs, browserTz, selectedTz]); // User preferences (for reminders) - const userPreferences = useQuery(api?.domains.auth.userPreferences.getUserPreferences); + const userPreferences = useOptionalQuery(api?.domains.auth.userPreferences.getUserPreferences); const updateUserPreferences = useMutation(api?.domains.auth.userPreferences.updateUserPreferences); const updateUngroupedSectionName = useMutation(api?.domains.auth.userPreferences.updateUngroupedSectionName); const updateUngroupedExpandedState = useMutation(api?.domains.auth.userPreferences.updateUngroupedExpandedState); @@ -324,7 +324,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { const upsertCalendarHubSizePct = useMutation(api?.domains.auth.userPreferences.upsertCalendarHubSizePct); // SMS notification preferences - const smsPreferences = useQuery(api?.domains.auth.userPreferences.getSmsPreferences); + const smsPreferences = useOptionalQuery(api?.domains.auth.userPreferences.getSmsPreferences); const updateSmsPreferences = useMutation(api?.domains.auth.userPreferences.updateSmsPreferences); const [smsPhoneInput, setSmsPhoneInput] = useState(""); const [savingSmsPrefs, setSavingSmsPrefs] = useState(false); @@ -336,11 +336,11 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { } }, [smsPreferences?.phoneNumber, smsPhoneInput]); // OSS Stats integration - const githubOwner = useQuery(api?.domains.analytics.ossStats.getGithubOwner ?? "skip", { owner: "get-convex" }); - const npmOrg = useQuery(api?.domains.analytics.ossStats.getNpmOrg ?? "skip", { name: "convex-dev" }); + const githubOwner = useOptionalQuery(api?.domains.analytics.ossStats.getGithubOwner, { owner: "get-convex" }); + const npmOrg = useOptionalQuery(api?.domains.analytics.ossStats.getNpmOrg, { name: "convex-dev" }); const syncOssStats = useAction(api.domains.analytics.ossStats.syncDefault); const syncOssStatsWithUserToken = useAction(api.domains.analytics.ossStats.syncPreferUserToken); - const ghEncryptedKey = useQuery(api?.domains.auth.apiKeys.getEncryptedApiKeyPublic ?? "skip", { provider: "github_access_token" }); + const ghEncryptedKey = useOptionalQuery(api?.domains.auth.apiKeys.getEncryptedApiKeyPublic, { provider: "github_access_token" }); const [syncingStats, setSyncingStats] = useState(false); const [savingReminder, setSavingReminder] = useState(false); const [savingSectionName, setSavingSectionName] = useState(false); @@ -351,8 +351,8 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { const [showGithubConfig, setShowGithubConfig] = useState(false); // Account & Security - const sessions = useQuery(api?.domains.auth.account.listSessions); - const linkedAccounts = useQuery(api?.domains.auth.account.listLinkedAccounts); + const sessions = useOptionalQuery(api?.domains.auth.account.listSessions); + const linkedAccounts = useOptionalQuery(api?.domains.auth.account.listLinkedAccounts); const signOutOtherSessions = useAction(api.domains.auth.account.signOutOtherSessions); const signOutSession = useMutation(api?.domains.auth.account.signOutSession); const [signingOutOthers, setSigningOutOthers] = useState(false); @@ -549,10 +549,10 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { on {new Date(linkedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })} )}
-
+
setKeyInputs((p) => ({ ...p, [provider]: e.target.value }))} @@ -609,9 +609,9 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) { backdropClassName="bg-black/50" positionClassName="fixed inset-0 z-50 flex items-center justify-center p-4" > -
+
{/* Header */} -
+
Settings Hub @@ -626,14 +626,14 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
-
+
{/* Left Nav */} -
+
{navItems.map((item) => (
-
+
Auto-sync sources
Gmail (events from email) and Google Calendar
@@ -1584,7 +1584,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
-
+
Auto-add mode {["auto", "propose"].map((mode) => (
-
+
{/* Slack Integration */} -
+
@@ -1685,7 +1685,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
{/* Discord Integration */} -
+
@@ -1706,7 +1706,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
{/* Email Integration */} -
+
@@ -1760,7 +1760,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
setSmsPhoneInput(e.target.value)} @@ -1940,7 +1940,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
{/* GitHub OSS Stats Integration */}
-
+
@@ -2017,7 +2017,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
{/* NPM OSS Stats Integration */} -
+
@@ -2053,7 +2053,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
{/* Webhook Integration */} -
+
@@ -2074,7 +2074,7 @@ export function SettingsModal({ isOpen, onClose, initialTab }: Props) {
{/* Tool Server Integration */} -
+
diff --git a/apps/web/src/layouts/settings/WebMcpSettingsPanel.tsx b/apps/web/src/layouts/settings/WebMcpSettingsPanel.tsx index 90e0a0fd8..a97bb3398 100644 --- a/apps/web/src/layouts/settings/WebMcpSettingsPanel.tsx +++ b/apps/web/src/layouts/settings/WebMcpSettingsPanel.tsx @@ -9,8 +9,8 @@ */ import React, { useState, useCallback } from "react"; -import { useQuery, useMutation} from "convex/react"; -import { useConvexApi } from "@/lib/convexApi"; +import { useMutation} from "convex/react"; +import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; import { toast } from "sonner"; import { Globe, Plus, Trash2, ChevronDown, ChevronRight, ToggleLeft, ToggleRight } from "lucide-react"; @@ -19,7 +19,7 @@ const PROVIDER_KEY = "nodebench_webmcp_provider_enabled"; export function WebMcpSettingsPanel() { const api = useConvexApi(); - const origins = useQuery(api?.domains.mcp.webmcpOriginManager.listApprovedOrigins); + const origins = useOptionalQuery(api?.domains.mcp.webmcpOriginManager.listApprovedOrigins); const approve = useMutation(api?.domains.mcp.webmcpOriginManager.approveOrigin); const revoke = useMutation(api?.domains.mcp.webmcpOriginManager.revokeOrigin); diff --git a/apps/web/src/lib/__tests__/convexApiQuery.test.tsx b/apps/web/src/lib/__tests__/convexApiQuery.test.tsx new file mode 100644 index 000000000..f76d23f20 --- /dev/null +++ b/apps/web/src/lib/__tests__/convexApiQuery.test.tsx @@ -0,0 +1,240 @@ +import React from "react"; +import { act, cleanup, renderHook, waitFor } from "@testing-library/react"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { ConvexProvider, ConvexReactClient, useQuery, type Watch, type WatchQueryOptions } from "convex/react"; +import { getFunctionName, type ArgsAndOptions, type FunctionReference, type FunctionReturnType } from "convex/server"; +import * as generated from "@convex/_generated/api"; +import type { Id } from "@convex/_generated/dataModel"; +import { useOptionalQuery } from "../convexApi"; + +const { api, internal } = generated; +const filesQuery = api.domains.product.me.listFiles; + +const clients: ConvexReactClient[] = []; +afterEach(async () => { + cleanup(); + await Promise.all(clients.splice(0).map((client) => client.close())); + vi.doUnmock("@convex/_generated/api"); + vi.restoreAllMocks(); +}); + +function controlledClient() { + const client = new ConvexReactClient("http://127.0.0.1:1", { unsavedChangesWarning: false }); + clients.push(client); + // Actual SDK hooks and QueriesObserver; only local watch results are controlled. + // No websocket, deployment, provider or persistent state is used. + const active = new Map<() => void, string>(); + const values = new Map(); + const key = (name: string, args: unknown) => `${name}:${JSON.stringify(args ?? {})}`; + vi.spyOn(client, "watchQuery").mockImplementation(>(reference: Query, ...argsAndOptions: ArgsAndOptions): Watch> => { + const [args] = argsAndOptions; + const address = key(getFunctionName(reference), args); + return { + onUpdate: (listener) => { active.set(listener, address); return () => { active.delete(listener); }; }, + localQueryResult: () => { + const value = values.get(address); + if (value instanceof Error) throw value; + return value as FunctionReturnType | undefined; + }, + journal: () => undefined, + }; + }); + const publish = (name: string, args: unknown, value: unknown) => { + const address = key(name, args); + values.set(address, value); + for (const [listener, subscribed] of active) if (subscribed === address) listener(); + }; + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + return { client, active, publish, wrapper }; +} + +class QueryErrorBoundary extends React.Component<{ children: React.ReactNode }, { error: Error | null }> { + state = { error: null as Error | null }; + static getDerivedStateFromError(error: Error) { return { error }; } + render() { return this.state.error ?
{this.state.error.message}
: this.props.children; } +} + +describe("an owner opens a screen before the lazy API arrives", () => { + it("does not subscribe to an endpoint named skip while waiting", () => { + const control = controlledClient(); + const absent: typeof api.domains.product.me.listFiles | undefined = undefined; + renderHook(() => { + return useOptionalQuery(absent, { anonymousSessionId: "local-fixture" }); + }, { wrapper: control.wrapper }); + expect(control.active.size).toBe(0); + }); + + it("can render a missing reference without throwing", () => { + const control = controlledClient(); + expect(() => renderHook(() => { + return useOptionalQuery(undefined); + }, { wrapper: control.wrapper })).not.toThrow(); + }); +}); + +describe("optional queries retain the current viewer's lifecycle", () => { + it("waits for the actual lazy import before subscribing with the original arguments", async () => { + vi.resetModules(); + let release: (() => void) | undefined; + vi.doMock("@convex/_generated/api", () => new Promise((resolve) => { + release = () => resolve(generated); + })); + const lazy = await import("../convexApi"); + const control = controlledClient(); + const view = renderHook(() => { + const loaded = lazy.useConvexApi(); + return lazy.useOptionalQuery(loaded?.domains.product.me.listFiles, { anonymousSessionId: "waiting-owner" }); + }, { wrapper: control.wrapper }); + expect(view.result.current).toBeUndefined(); + expect(control.active.size).toBe(0); + await waitFor(() => expect(release).toBeTypeOf("function")); + await act(async () => { release?.(); }); + expect([...control.active.values()]).toEqual([`${getFunctionName(filesQuery)}:{"anonymousSessionId":"waiting-owner"}`]); + }); + + it("keeps non-owners skipped and clears prior data on revocation and entity change", () => { + const control = controlledClient(); + const ref = api.domains.agents.autonomy.grants.getAuthorityState; + type Props = { owner: boolean; entityId: Id<"productEntities"> }; + const initialProps: Props = { owner: false, entityId: "entity-a" as Id<"productEntities"> }; + const view = renderHook(({ owner, entityId }: Props) => useOptionalQuery(ref, owner ? { entityId } : "skip"), { initialProps, wrapper: control.wrapper }); + expect(control.active.size).toBe(0); + view.rerender({ ...initialProps, owner: true }); + const ownerResult = { mode: "review", grant: null }; + act(() => control.publish(getFunctionName(ref), { entityId: initialProps.entityId }, ownerResult)); + expect(view.result.current).toBe(ownerResult); + view.rerender(initialProps); + expect(view.result.current).toBeUndefined(); + expect(control.active.size).toBe(0); + view.rerender({ owner: true, entityId: "entity-b" as Id<"productEntities"> }); + expect(view.result.current).toBeUndefined(); + expect(control.active.size).toBe(1); + expect([...control.active.values()][0]).toContain("entity-b"); + }); + + it("changes thread arguments and query references without retaining the previous result", () => { + const control = controlledClient(); + const ref = api.domains.agents.lessons.lessonsPublic.listAllLessonsForThreadPublic; + const view = renderHook(({ threadId }: { threadId: string | null }) => useOptionalQuery(ref, threadId ? { threadId } : "skip"), { initialProps: { threadId: "a" as string | null }, wrapper: control.wrapper }); + act(() => control.publish(getFunctionName(ref), { threadId: "a" }, ["first-thread"])); + view.rerender({ threadId: "b" }); + expect(view.result.current).toBeUndefined(); + expect(control.active.size).toBe(1); + view.rerender({ threadId: null }); + expect(view.result.current).toBeUndefined(); + expect(control.active.size).toBe(0); + view.unmount(); + const sameShape = api.domains.product.me.getMeSnapshot; + const switched = renderHook(({ alternate }: { alternate: boolean }) => useOptionalQuery(alternate ? sameShape : filesQuery, { anonymousSessionId: "viewer" }), { initialProps: { alternate: false }, wrapper: control.wrapper }); + act(() => control.publish(getFunctionName(filesQuery), { anonymousSessionId: "viewer" }, ["files"])); + switched.rerender({ alternate: true }); + expect(switched.result.current).toBeUndefined(); + expect([...control.active.values()][0]).toContain(getFunctionName(sameShape)); + }); + + it("preserves loading, updates and falsy values without resubscribing on equal arguments", () => { + const control = controlledClient(); + const args = { anonymousSessionId: "viewer" }; + const view = renderHook(() => useOptionalQuery(filesQuery, { ...args }), { wrapper: control.wrapper }); + expect(view.result.current).toBeUndefined(); + const subscription = [...control.active.keys()][0]; + for (const value of [[], null, false, 0, "", ["updated"]]) { + act(() => control.publish(getFunctionName(filesQuery), args, value)); + expect(view.result.current).toBe(value); + view.rerender(); + expect([...control.active.keys()]).toEqual([subscription]); + } + }); + + it("throws query failures to the error boundary instead of returning an Error as data", () => { + const control = controlledClient(); + const consoleError = vi.spyOn(console, "error").mockImplementation(() => {}); + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + renderHook(() => useOptionalQuery(filesQuery, {}), { wrapper }); + act(() => control.publish(getFunctionName(filesQuery), {}, new Error("local query failure"))); + expect(document.querySelector('[role="alert"]')?.textContent).toBe("local query failure"); + expect(control.active.size).toBe(0); + consoleError.mockRestore(); + }); + + it("defaults a no-argument query to empty arguments and retains the provider requirement", () => { + const control = controlledClient(); + renderHook(() => useOptionalQuery(api.domains.auth.auth.loggedInUser), { wrapper: control.wrapper }); + expect([...control.active.values()]).toEqual([`${getFunctionName(api.domains.auth.auth.loggedInUser)}:{}`]); + const consoleError = vi.spyOn(console, "error").mockImplementation(() => {}); + expect(() => renderHook(() => useOptionalQuery(undefined, "skip"))).toThrow(/Convex client/); + consoleError.mockRestore(); + }); + + it("releases the old provider and every watch on unmount", () => { + const first = controlledClient(); + const second = controlledClient(); + let client = first.client; + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + const view = renderHook(() => useOptionalQuery(filesQuery, {}), { wrapper }); + expect(first.active.size).toBe(1); + client = second.client; + view.rerender(); + expect(first.active.size).toBe(0); + expect(second.active.size).toBe(1); + view.unmount(); + expect(second.active.size).toBe(0); + }); + + it("bounds active watches across 20 concurrent consumers and 20 ownership cycles", () => { + const control = controlledClient(); + const views = Array.from({ length: 20 }, (_, i) => renderHook(({ enabled, cycle }: { enabled: boolean; cycle: number }) => useOptionalQuery(filesQuery, enabled ? { anonymousSessionId: `owner-${i}-${cycle}` } : "skip"), { initialProps: { enabled: false, cycle: 0 }, wrapper: control.wrapper })); + for (let cycle = 0; cycle < 20; cycle++) { + for (const view of views) view.rerender({ enabled: true, cycle }); + expect(control.active.size).toBe(20); + for (const view of views) view.rerender({ enabled: false, cycle }); + expect(control.active.size).toBe(0); + for (const view of views) expect(view.result.current).toBeUndefined(); + } + for (const view of views) view.unmount(); + expect(control.active.size).toBe(0); + }); + + it("retains the existing static BriefTab reference and memory argument gate", () => { + const control = controlledClient(); + const ref = api.domains.research.dailyBriefMemoryQueries.listTaskResultsByMemory; + const view = renderHook(({ memoryId }: { memoryId: Id<"dailyBriefMemories"> | null }) => useQuery(ref, memoryId ? { memoryId } : "skip"), { initialProps: { memoryId: null as Id<"dailyBriefMemories"> | null }, wrapper: control.wrapper }); + expect(control.active.size).toBe(0); + view.rerender({ memoryId: "memory-a" as Id<"dailyBriefMemories"> }); + expect(control.active.size).toBe(1); + view.rerender({ memoryId: null }); + expect(control.active.size).toBe(0); + }); +}); + +// Compile-only consumers, included by tsconfig.app.json. Vitest transpilation +// alone does not establish these negative contracts. +export function optionalQueryCompilerContracts(entityId: Id<"productEntities">, userId: Id<"users">) { + const required = api.domains.agents.autonomy.proposals.listOperationStates; + useOptionalQuery(required, { entityId }); + useOptionalQuery(required, "skip"); + useOptionalQuery(api.domains.auth.auth.loggedInUser); + const files = useOptionalQuery(filesQuery, {}); + const typedFiles: FunctionReturnType | undefined = files; + type IsAny = 0 extends (1 & T) ? true : false; + const resultIsConcrete: IsAny = false; + const internalQuery = internal.domains.agents.agentDelegations.listByRunInternal; + const internalVisibility: "internal" = internalQuery._visibility; + // @ts-expect-error Required arguments cannot be omitted. + useOptionalQuery(required); + // @ts-expect-error Entity identity must come from the correct table. + useOptionalQuery(required, { entityId: userId }); + // @ts-expect-error The limit retains its numeric type. + useOptionalQuery(required, { entityId, limit: "all" }); + // @ts-expect-error Unknown arguments must not become a permissive record. + useOptionalQuery(required, { entityId, unexpected: true }); + // @ts-expect-error Mutations are not queries. + useOptionalQuery(api.domains.product.me.saveFile, "skip"); + // @ts-expect-error Internal functions are not client public queries. + useOptionalQuery(internalQuery, "skip"); + // @ts-expect-error A string is not a callable query reference. + useOptionalQuery("skip", {}); + // @ts-expect-error Query return members stay concrete. + files?.nonexistentResultMember; + return { resultIsConcrete, typedFiles, internalVisibility }; +} diff --git a/apps/web/src/lib/__tests__/preferencesReturnContract.test.tsx b/apps/web/src/lib/__tests__/preferencesReturnContract.test.tsx new file mode 100644 index 000000000..0a2d5d2ec --- /dev/null +++ b/apps/web/src/lib/__tests__/preferencesReturnContract.test.tsx @@ -0,0 +1,217 @@ +import React from "react"; +import { act, cleanup, fireEvent, render, renderHook, screen, waitFor, within } from "@testing-library/react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { MemoryRouter, useLocation } from "react-router-dom"; +import { ConvexProvider, ConvexReactClient, type Watch, type WatchQueryOptions } from "convex/react"; +import { getFunctionName, type ArgsAndOptions, type FunctionReference, type FunctionReturnType } from "convex/server"; +import { convexTest } from "convex-test"; +import { api } from "@convex/_generated/api"; +import schema from "@convex/schema"; +import type { Id } from "@convex/_generated/dataModel"; +import { getApi, useOptionalQuery } from "../convexApi"; +import { SettingsModal } from "@/layouts/settings/SettingsModal"; +import { MeHome } from "@/features/me/views/MeHome"; +import { HomeLanding } from "@/features/home/views/HomeLanding"; + +// Only unrelated providers/panels are held. The actual controls, SDK hooks, +// QueriesObserver and optional-query adapter remain mounted. +vi.mock("@convex-dev/auth/react", () => ({ useAuthActions: () => ({ signOut: vi.fn() }) })); +vi.mock("@/layouts/settings/WebMcpSettingsPanel", () => ({ WebMcpSettingsPanel: () => null })); +vi.mock("@/features/admin/components/ApiUsageDisplay", () => ({ ApiUsageDisplay: () => null })); +vi.mock("@/features/agents/components/NotificationActivityPanel", () => ({ NotificationActivityPanel: () => null })); +vi.mock("@/features/chat/components/AgentResilienceConnector", () => ({ AgentResilienceConnector: () => null })); +vi.mock("@/layouts/settings/ThemeCustomizer", () => ({ ThemeCustomizer: () => null })); +vi.mock("@/features/product/lib/useProductBootstrap", () => ({ useProductBootstrap: () => undefined })); +vi.mock("@/features/product/lib/productIdentity", () => ({ getAnonymousProductSessionId: () => "preferences-fixture" })); + +const modules = { + "_generated/server.js": () => import("@convex/_generated/server"), + "domains/product/me.ts": () => import("@convex/domains/product/me"), + "domains/auth/userPreferences.ts": () => import("@convex/domains/auth/userPreferences"), + "domains/operations/personaChangeTracking.ts": () => import("@convex/domains/operations/personaChangeTracking"), +}; +const prefs = api.domains.auth.userPreferences; +const me = api.domains.product.me; +const clients: ConvexReactClient[] = []; +beforeEach(async () => { + localStorage.clear(); await getApi(); + // Scope these DOM controls to the existing reduced-motion branch. The + // normal-motion SheetContent slot failure is retained separately, not fixed here. + const original = window.matchMedia.bind(window); + vi.spyOn(window, "matchMedia").mockImplementation((query) => ({ ...original(query), matches: query === "(prefers-reduced-motion: reduce)" })); +}); +afterEach(async () => { cleanup(); await Promise.all(clients.splice(0).map((client) => client.close())); vi.restoreAllMocks(); }); + +async function owner() { + const t = convexTest(schema, modules); + const userId = await t.run((ctx) => ctx.db.insert("users", { name: "Local preference viewer" })); + return { t, userId, viewer: t.withIdentity({ subject: userId }) }; +} + +function control(viewer: Awaited>["viewer"]) { + const client = new ConvexReactClient("http://127.0.0.1:1", { unsavedChangesWarning: false }); + clients.push(client); + const active = new Map<() => void, string>(); + const values = new Map(); + const key = (ref: FunctionReference<"query">, args: unknown) => `${getFunctionName(ref)}:${JSON.stringify(args ?? {})}`; + vi.spyOn(client, "watchQuery").mockImplementation(>(ref: Query, ...rest: ArgsAndOptions): Watch> => { + const address = key(ref, rest[0]); + return { + onUpdate: (listener) => { active.set(listener, address); return () => { active.delete(listener); }; }, + localQueryResult: () => { const value = values.get(address); if (value instanceof Error) throw value; return value as FunctionReturnType | undefined; }, + journal: () => undefined, + }; + }); + const publish = (ref: FunctionReference<"query">, args: unknown, result: unknown) => { + const address = key(ref, args); values.set(address, result); + for (const [listener, watching] of active) if (watching === address) listener(); + }; + const actions = vi.spyOn(client, "action").mockImplementation(async () => { throw new Error("Provider actions are outside this fixture"); }); + const mutations = vi.spyOn(client, "mutation").mockImplementation(async (ref, ...argsAndOptions) => { + const [args] = argsAndOptions; + if (getFunctionName(ref) !== getFunctionName(prefs.updateUserPreferences)) throw new Error("Unexpected mutation in preference controls"); + const result = await viewer.mutation(prefs.updateUserPreferences, args); + publish(prefs.getUserPreferences, {}, await viewer.query(prefs.getUserPreferences, {})); + return result as never; + }); + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + return { client, active, publish, wrapper, actions, mutations }; +} +function assertCalendar(gmail: boolean, gcal: boolean, mode: "auto" | "propose") { + expect(screen.getByRole("checkbox", { name: "Gmail" })).toHaveAttribute("aria-checked", String(gmail)); + expect(screen.getByRole("checkbox", { name: "Google Calendar" })).toHaveAttribute("aria-checked", String(gcal)); + expect(screen.getByRole("button", { name: mode === "auto" ? "Auto-add" : "Propose first" }).className).toContain("bg-blue-600"); +} +class QueryBoundary extends React.Component<{ children: React.ReactNode }, { error: Error | null }> { + state = { error: null as Error | null }; + static getDerivedStateFromError(error: Error) { return { error }; } + render() { return this.state.error ?
{this.state.error.message}
: this.props.children; } +} +function LocationReadback() { + const location = useLocation(); + return {location.pathname + location.search}; +} + +describe("a person reopens calendar settings after saving", () => { + it.each(["reduce", "no-preference"] as const)("shows saved false/false/auto in the actual controls and completes a native control save (motion=%s)", async (motion) => { + vi.mocked(window.matchMedia).mockImplementation((query) => ({ + matches: query === "(prefers-reduced-motion: reduce)" && motion === "reduce", media: query, onchange: null, + addListener: vi.fn(), removeListener: vi.fn(), addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: () => false, + })); + const { viewer } = await owner(); + await viewer.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: false, gcalSyncEnabled: false, calendarAutoAddMode: "auto" }); + const c = control(viewer); + render( {}} initialTab="connections" />, { wrapper: c.wrapper }); + assertCalendar(true, true, "propose"); // Existing loading defaults are intentional. + const returned = await viewer.query(prefs.getUserPreferences, {}); + await act(async () => { c.publish(prefs.getUserPreferences, {}, returned); }); + console.info("PREFERENCE_UI_OBSERVATION", JSON.stringify({ returned, gmail: screen.getByRole("checkbox", { name: "Gmail" }).getAttribute("aria-checked"), gcal: screen.getByRole("checkbox", { name: "Google Calendar" }).getAttribute("aria-checked"), autoSelected: screen.getByRole("button", { name: "Auto-add" }).className.includes("bg-blue-600") })); + assertCalendar(false, false, "auto"); + fireEvent.click(screen.getByRole("checkbox", { name: "Gmail" })); + await waitFor(() => assertCalendar(true, false, "auto")); + fireEvent.click(screen.getByRole("button", { name: "Propose first" })); + await waitFor(() => assertCalendar(true, false, "propose")); + expect(await viewer.query(prefs.getUserPreferences, {})).toMatchObject({ gmailIngestEnabled: true, gcalSyncEnabled: false, calendarAutoAddMode: "propose" }); + expect(c.mutations).toHaveBeenCalledTimes(2); + expect(c.actions).not.toHaveBeenCalled(); + }); + + it("retains existing empty defaults, accepts actual optional-row defaults, and surfaces a query failure", async () => { + const { t, viewer, userId } = await owner(); const c = control(viewer); + render( {}} initialTab="connections" />, { wrapper: c.wrapper }); + for (const result of [await t.query(prefs.getUserPreferences, {}), await viewer.query(prefs.getUserPreferences, {})]) { + await act(async () => { c.publish(prefs.getUserPreferences, {}, result); }); assertCalendar(true, true, "propose"); + } + await t.run((ctx) => ctx.db.insert("userPreferences", { userId, createdAt: 1, updatedAt: 1 })); + await act(async () => { c.publish(prefs.getUserPreferences, {}, await viewer.query(prefs.getUserPreferences, {})); }); + assertCalendar(true, true, "propose"); + vi.spyOn(console, "error").mockImplementation(() => {}); + await act(async () => { c.publish(prefs.getUserPreferences, {}, new Error("Preference read unavailable")); }); + expect(screen.getByRole("alert")).toHaveTextContent("Preference read unavailable"); + expect(c.active.size).toBe(0); expect(c.actions).not.toHaveBeenCalled(); + }); + + it("keeps two viewers isolated across twenty real saved updates and subscription/unmount cycles", async () => { + const a = await owner(); const b = await owner(); const ca = control(a.viewer); const cb = control(b.viewer); + for (let cycle = 0; cycle < 20; cycle++) { + const enabled = cycle % 2 === 0; + await Promise.all([a.viewer.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: enabled, calendarAutoAddMode: enabled ? "auto" : "propose" }), b.viewer.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: !enabled, calendarAutoAddMode: enabled ? "propose" : "auto" })]); + const left = renderHook(() => useOptionalQuery(prefs.getUserPreferences), { wrapper: ca.wrapper }); + const right = renderHook(() => useOptionalQuery(prefs.getUserPreferences), { wrapper: cb.wrapper }); + await act(async () => { ca.publish(prefs.getUserPreferences, {}, await a.viewer.query(prefs.getUserPreferences, {})); cb.publish(prefs.getUserPreferences, {}, await b.viewer.query(prefs.getUserPreferences, {})); }); + expect(left.result.current).toMatchObject({ gmailIngestEnabled: enabled, calendarAutoAddMode: enabled ? "auto" : "propose" }); + expect(right.result.current).toMatchObject({ gmailIngestEnabled: !enabled, calendarAutoAddMode: enabled ? "propose" : "auto" }); + expect(ca.active.size).toBe(1); expect(cb.active.size).toBe(1); + left.unmount(); right.unmount(); expect(ca.active.size).toBe(0); expect(cb.active.size).toBe(0); + } + expect(ca.actions).not.toHaveBeenCalled(); expect(cb.actions).not.toHaveBeenCalled(); + }); +}); + +describe("an owner sees their stored research profile", () => { + it("hydrates Me lens, roles and explicit false tone and retains migrated-profile defaults", async () => { + const { viewer, t, userId } = await owner(); const c = control(viewer); + await viewer.mutation(me.updateProfile, { preferredLens: "banker", rolesOfInterest: ["Analyst", "Operator"], preferences: { communicationStyle: "concise", evidenceStyle: "citation_heavy", avoidCorporateTone: false } }); + const args = { anonymousSessionId: "preferences-fixture" }; + c.publish(me.getMeSnapshot, args, await viewer.query(me.getMeSnapshot, args)); + const view = render(, { wrapper: c.wrapper }); + await waitFor(() => expect(screen.getByDisplayValue("banker")).toHaveAttribute("id", "me-preferred-lens")); + expect(screen.getByDisplayValue("Analyst, Operator")).toBeInTheDocument(); + expect(screen.getByDisplayValue("concise")).toBeInTheDocument(); + expect(screen.getByDisplayValue("citation_heavy")).toBeInTheDocument(); + expect(screen.getByLabelText(/avoid corporate/i)).not.toBeChecked(); + view.unmount(); + const profile = await t.run((ctx) => ctx.db.query("productProfileSummaries").withIndex("by_owner", (q) => q.eq("ownerKey", `user:${userId}`)).unique()); + await t.run((ctx) => ctx.db.patch(profile!._id, { preferences: { theme: "dark", legacy: "retained" } })); + c.publish(me.getMeSnapshot, args, await viewer.query(me.getMeSnapshot, args)); + const migrated = render(, { wrapper: c.wrapper }); + expect(within(screen.getByRole("radiogroup", { name: /communication style/i })).getByRole("radio", { name: "Balanced" })).toHaveAttribute("aria-checked", "true"); + expect(screen.getByLabelText(/avoid corporate/i)).not.toBeChecked(); migrated.unmount(); + c.publish(me.getMeSnapshot, args, await t.query(me.getMeSnapshot, {})); + render(, { wrapper: c.wrapper }); + expect(screen.getByDisplayValue("founder")).toBeInTheDocument(); + expect(c.actions).not.toHaveBeenCalled(); + }); + + it("uses a saved Home lens while preserving an explicit URL query's chosen lens", async () => { + const { viewer } = await owner(); const c = control(viewer); + await viewer.mutation(me.updateProfile, { preferredLens: "legal" }); + c.publish(me.getMeSnapshot, { anonymousSessionId: "preferences-fixture" }, await viewer.query(me.getMeSnapshot, {})); + const view = render(, { wrapper: c.wrapper }); + await waitFor(() => expect(screen.getByText("legal")).toBeInTheDocument()); + fireEvent.change(screen.getByPlaceholderText("Ask anything - a company, a market, a question..."), { target: { value: "fixture research" } }); + fireEvent.click(screen.getByRole("button", { name: "Open workspace" })); + await waitFor(() => expect(screen.getByTestId("location-readback").textContent).toContain("lens=legal")); + view.unmount(); + render(, { wrapper: c.wrapper }); + await waitFor(() => expect(screen.getByTestId("location-readback").textContent).toContain("lens=student")); + expect(c.actions).not.toHaveBeenCalled(); + }); +}); + +// Included by tsconfig.app.json; native Vitest alone is not compiler proof. +export function preferencesCompilerContracts(userId: Id<"users">) { + const snapshot = useOptionalQuery(me.getMeSnapshot, {}); + type IsAny = 0 extends (1 & T) ? true : false; + const concrete: IsAny["profile"]>> = false; + if (snapshot?.profile) { + const lens: "founder" | "investor" | "banker" | "ceo" | "legal" | "student" = snapshot.profile.preferredLens; + const roles: string[] = snapshot.profile.rolesOfInterest; + // @ts-expect-error no invented top-level profile field + snapshot.profile.nonexistentPreference; + // @ts-expect-error stored lens cannot be a new enum value + const invalidLens: typeof lens = "invented"; + void [roles, invalidLens]; + } + const result = useOptionalQuery(prefs.getUserPreferences); + const enabled: boolean | undefined = result?.gmailIngestEnabled; + const synced: boolean | undefined = result?.gcalSyncEnabled; + const mode: "auto" | "propose" | undefined = result?.calendarAutoAddMode; + // @ts-expect-error preferences cannot be queried for an arbitrary owner + useOptionalQuery(prefs.getUserPreferences, { userId }); + // @ts-expect-error calendar flag is boolean + const badFlag: NonNullable = "false"; + // @ts-expect-error unknown mode is not accepted + const badMode: NonNullable = "always"; + return [concrete, synced, badFlag, badMode]; +} diff --git a/apps/web/src/lib/convexApi.ts b/apps/web/src/lib/convexApi.ts index 4614dfa75..a8a826d12 100644 --- a/apps/web/src/lib/convexApi.ts +++ b/apps/web/src/lib/convexApi.ts @@ -15,13 +15,37 @@ * convex.query(api.domains.foo.bar, { ... }); * * Or for hooks (synchronous): - * import { useConvexApi } from "@/lib/convexApi"; + * import { useConvexApi, useOptionalQuery } from "@/lib/convexApi"; * const api = useConvexApi(); * // api is null on first render, populated after dynamic import - * const data = useQuery(api?.domains.foo.bar ?? "skip", args); + * const data = useOptionalQuery(api?.domains.foo.bar, args); */ -import { useState, useEffect } from "react"; +import { useState, useEffect, useMemo } from "react"; +import { useQueries, type OptionalRestArgsOrSkip, type RequestForQueries } from "convex/react"; +import { getFunctionName, type FunctionReference, type FunctionReturnType } from "convex/server"; +import { convexToJson } from "convex/values"; + +/** Keep hook order stable while a public query reference is loading. */ +export function useOptionalQuery>( + query: Query | null | undefined, + ...args: OptionalRestArgsOrSkip +): FunctionReturnType | undefined { + const skip = query == null || args[0] === "skip"; + const queryName = query == null ? undefined : getFunctionName(query); + const argsObject = args[0] === "skip" ? {} : args[0] ?? {}; + const requests = useMemo( + (): RequestForQueries => query != null && !skip ? { query: { query, args: argsObject } } : {}, + // Match useQuery's semantic identity rather than fresh proxy/argument objects. + // eslint-disable-next-line react-hooks/exhaustive-deps + [queryName, JSON.stringify(convexToJson(argsObject)), skip], + ); + const results = useQueries(requests); + const result: unknown = results.query; + if (result instanceof Error) throw result; + // useQueries erases the map's result types; this key contains only Query. + return result as FunctionReturnType | undefined; +} type ConvexApi = typeof import("@convex/_generated/api")["api"]; diff --git a/apps/web/src/shared/components/DialogOverlay.tsx b/apps/web/src/shared/components/DialogOverlay.tsx index 5941570be..47bd12d17 100644 --- a/apps/web/src/shared/components/DialogOverlay.tsx +++ b/apps/web/src/shared/components/DialogOverlay.tsx @@ -1,4 +1,4 @@ -import type { ReactNode } from "react"; +import { useRef, type ReactNode } from "react"; import { motion } from "framer-motion"; import { Sheet, @@ -61,6 +61,7 @@ export function DialogOverlay({ backdropClassName, contentClassName, }: Props) { + const openerRef = useRef(null); const reduced = prefersReducedMotion(); return ( { + const active = document.activeElement; + openerRef.current = active instanceof HTMLElement && active.isConnected ? active : null; if (!autoFocus) event.preventDefault(); }} + onCloseAutoFocus={(event) => { + const opener = openerRef.current; + openerRef.current = null; + if (opener?.isConnected) { + event.preventDefault(); + opener.focus({ preventScroll: true }); + } + }} > {reduced ? (
{children}
diff --git a/apps/web/src/shared/components/LazyCodeBlock.load-failure.test.tsx b/apps/web/src/shared/components/LazyCodeBlock.load-failure.test.tsx new file mode 100644 index 000000000..788007433 --- /dev/null +++ b/apps/web/src/shared/components/LazyCodeBlock.load-failure.test.tsx @@ -0,0 +1,33 @@ +import { cleanup, fireEvent, render } from "@testing-library/react"; +import { afterEach, expect, it, vi } from "vitest"; +import { LazyCodeBlock } from "./LazyCodeBlock"; + +vi.mock("@/components/ai-elements/code-block", () => { + throw new Error("controlled missing renderer chunk"); +}); +afterEach(() => { + cleanup(); + vi.restoreAllMocks(); +}); + +it("keeps a review's source and copy action when its renderer chunk cannot load", async () => { + const errors = vi.spyOn(console, "error").mockImplementation(() => {}); + const writeText = vi.fn().mockResolvedValue(undefined); + Object.defineProperty(navigator, "clipboard", { + configurable: true, + value: { writeText }, + }); + const code = "first\n\n 中文 \n"; + const view = render(); + expect( + await view.findByText( + "Syntax highlighting unavailable. Code can still be copied.", + ), + ).toBeVisible(); + expect(view.container.querySelector("pre code")?.textContent).toBe(code); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + await view.findByRole("button", { name: "Code copied" }); + expect(writeText).toHaveBeenCalledWith(code); + expect(view.container.querySelector("script")).toBeNull(); + expect(errors).toHaveBeenCalled(); // React reports the caught chunk failure. +}); diff --git a/apps/web/src/shared/components/LazyCodeBlock.test.tsx b/apps/web/src/shared/components/LazyCodeBlock.test.tsx new file mode 100644 index 000000000..7c13be40b --- /dev/null +++ b/apps/web/src/shared/components/LazyCodeBlock.test.tsx @@ -0,0 +1,153 @@ +import { + act, + cleanup, + fireEvent, + render, + waitFor, +} from "@testing-library/react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { LazyCodeBlock } from "./LazyCodeBlock"; + +vi.mock("shiki", () => ({ + bundledLanguages: { json: () => {} }, + codeToTokens: vi.fn(async (code: string) => ({ + bg: "transparent", + fg: "inherit", + tokens: code.split("\n").map((content) => [{ content, color: "inherit" }]), + })), +})); + +const writeText = vi.fn<(code: string) => Promise>(); +beforeEach(() => { + writeText.mockReset().mockResolvedValue(undefined); + Object.defineProperty(navigator, "clipboard", { + configurable: true, + value: { writeText }, + }); +}); +afterEach(() => { + cleanup(); + vi.useRealTimers(); +}); + +describe("A trace reviewer copies the source being shown", () => { + it("keeps a named copy action and caller styling while the lazy renderer loads", async () => { + const code = "青山 🧭\n\n \n"; + const view = render( + , + ); + expect(view.getByRole("button", { name: "Copy code" })).toHaveTextContent( + "Copy", + ); + expect(view.container.querySelector(".trace-code")).not.toBeNull(); + expect(view.container.querySelector("pre code")?.textContent).toBe(code); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + await view.findByRole("button", { name: "Code copied" }); + expect(writeText).toHaveBeenCalledWith(code); + expect(view.container.querySelector("script")).toBeNull(); + }); + + it("announces permission failure and lets the same reviewer retry", async () => { + writeText.mockRejectedValueOnce( + new DOMException("denied", "NotAllowedError"), + ); + const view = render(); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + expect(await view.findByRole("alert")).toHaveTextContent( + "Try again or select the code manually", + ); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + await view.findByRole("button", { name: "Code copied" }); + expect(view.queryByRole("alert")).toBeNull(); + expect(writeText.mock.calls).toEqual([ + ["retry source\n"], + ["retry source\n"], + ]); + }); + + it("does not mark a changed source copied when an older clipboard request resolves", async () => { + let finish!: () => void; + writeText.mockReturnValueOnce( + new Promise((resolve) => { + finish = resolve; + }), + ); + const view = render(); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + view.rerender(); + await act(async () => finish()); + expect(view.queryByRole("button", { name: "Code copied" })).toBeNull(); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + await view.findByRole("button", { name: "Code copied" }); + expect(writeText.mock.calls).toEqual([["old source"], ["new source"]]); + }); + + it("coalesces a burst of 12 clicks while one clipboard request is pending", async () => { + let finish!: () => void; + writeText.mockReturnValueOnce( + new Promise((resolve) => { + finish = resolve; + }), + ); + const view = render(); + const button = view.getByRole("button", { name: "Copy code" }); + for (let i = 0; i < 12; i++) fireEvent.click(button); + expect(writeText).toHaveBeenCalledTimes(1); + expect(button).toBeDisabled(); + await act(async () => finish()); + expect( + view.getByRole("button", { name: "Code copied" }), + ).not.toBeDisabled(); + }); + + it("clears copied feedback and timers over 24 source changes and unmount", async () => { + vi.useFakeTimers(); + const view = render(); + for (let i = 0; i < 24; i++) { + view.rerender(); + await act(async () => + fireEvent.click(view.getByRole("button", { name: "Copy code" })), + ); + expect(view.getByRole("button", { name: "Code copied" })).toBeVisible(); + view.rerender(); + expect(view.getByRole("button", { name: "Copy code" })).toBeVisible(); + act(() => vi.advanceTimersByTime(2500)); + expect(view.queryByRole("button", { name: "Code copied" })).toBeNull(); + } + view.unmount(); + expect(vi.getTimerCount()).toBe(0); + }); + + it("offers manual selection when the browser has no clipboard API", async () => { + Object.defineProperty(navigator, "clipboard", { + configurable: true, + value: undefined, + }); + const view = render(); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + expect(await view.findByRole("alert")).toHaveTextContent( + "select the code manually", + ); + expect(view.container.querySelector("pre code")?.textContent).toBe( + "manual\n\n source\n", + ); + }); + + it("copies an empty source without submitting its surrounding review form", async () => { + const submit = vi.fn((event) => event.preventDefault()); + const view = render( +
+ + , + ); + fireEvent.click(view.getByRole("button", { name: "Copy code" })); + await waitFor(() => expect(writeText).toHaveBeenCalledWith("")); + expect(submit).not.toHaveBeenCalled(); + expect(view.container.querySelector("pre code")?.textContent).toBe(""); + }); +}); diff --git a/apps/web/src/shared/components/LazyCodeBlock.tsx b/apps/web/src/shared/components/LazyCodeBlock.tsx index b9db53012..88a33ddbe 100644 --- a/apps/web/src/shared/components/LazyCodeBlock.tsx +++ b/apps/web/src/shared/components/LazyCodeBlock.tsx @@ -1,32 +1,24 @@ -/** - * LazyCodeBlock - Performance-optimized code block with lazy-loaded syntax highlighting - * - * This component defers loading of the heavy Prism/react-syntax-highlighter bundle - * until actually needed, reducing initial bundle size by ~230KB gzipped. - * - * Features: - * - Lazy loading with Suspense fallback - * - Minimal initial render (plain
 with loading state)
- * - Copy to clipboard functionality
- * - Language detection
- */
+import {
+  Component,
+  Fragment,
+  lazy,
+  Suspense,
+  useEffect,
+  useRef,
+  useState,
+} from "react";
+import type { ReactNode } from "react";
+import { Check, Copy } from "lucide-react";
+import { cn } from "@/lib/utils";
 
-import React, { Suspense, useState, useCallback, lazy } from 'react';
-import { Copy, Check } from 'lucide-react';
-
-// Lazy load the syntax highlighter only when needed
-const SyntaxHighlighter = lazy(() =>
-  import('react-syntax-highlighter').then((mod) => ({
-    default: mod.Prism,
-  }))
+const HighlightedContent = lazy(() =>
+  import("@/components/ai-elements/code-block").then(
+    ({ CodeBlockContent }) => ({
+      default: CodeBlockContent,
+    }),
+  ),
 );
 
-// Lazy load the style separately
-const getStyle = () =>
-  import('react-syntax-highlighter/dist/esm/styles/prism').then(
-    (mod) => mod.vscDarkPlus
-  );
-
 interface LazyCodeBlockProps {
   code: string;
   language?: string;
@@ -34,119 +26,167 @@ interface LazyCodeBlockProps {
   className?: string;
 }
 
-/**
- * Simple fallback while syntax highlighter loads
- */
-function CodeBlockFallback({ code, language }: { code: string; language?: string }) {
+function PlainCode({ code, showLineNumbers }: LazyCodeBlockProps) {
+  const lines = code.split("\n");
   return (
-    
-
- {language || 'code'} -
-
-        {code}
-      
-
+
+      
+        {lines.map((line, index) => (
+          
+            
+              {line}
+            
+            {index < lines.length - 1 ? "\n" : null}
+          
+        ))}
+      
+    
); } -/** - * Highlighted code block component (loaded lazily) - */ -function HighlightedCodeBlock({ +class HighlightBoundary extends Component< + { children: ReactNode; fallback: ReactNode }, + { failed: boolean } +> { + state = { failed: false }; + + static getDerivedStateFromError() { + return { failed: true }; + } + + render() { + return this.state.failed ? ( + <> +

+ Syntax highlighting unavailable. Code can still be copied. +

+ {this.props.fallback} + + ) : ( + this.props.children + ); + } +} + +/** A stable, copyable source display while the shared Shiki renderer loads. */ +export function LazyCodeBlock({ code, - language = 'text', + language = "text", showLineNumbers = false, - style, -}: LazyCodeBlockProps & { style: any }) { - const [copied, setCopied] = useState(false); + className, +}: LazyCodeBlockProps) { + const [feedback, setFeedback] = useState<{ + code: string; + state: "idle" | "copying" | "copied" | "failed"; + }>({ code, state: "idle" }); + const request = useRef(0); + const copying = useRef(false); + const timer = useRef | undefined>(undefined); + const state = feedback.code === code ? feedback.state : "idle"; - const handleCopy = useCallback(async () => { + useEffect(() => { + setFeedback({ code, state: "idle" }); + return () => { + request.current += 1; + copying.current = false; + clearTimeout(timer.current); + }; + }, [code]); + + async function copyCode() { + if (copying.current) return; + copying.current = true; + const current = ++request.current; + clearTimeout(timer.current); + setFeedback({ code, state: "copying" }); try { + if (!navigator.clipboard?.writeText) + throw new Error("Clipboard unavailable"); await navigator.clipboard.writeText(code); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - } catch (err) { - console.error('Failed to copy:', err); + if (request.current !== current) return; + setFeedback({ code, state: "copied" }); + timer.current = setTimeout( + () => setFeedback({ code, state: "idle" }), + 2000, + ); + } catch { + if (request.current === current) setFeedback({ code, state: "failed" }); + } finally { + if (request.current === current) copying.current = false; } - }, [code]); + } + const fallback = ; return ( -
- {/* Header bar */} -
- +
+
+ {language}
- - {/* Code block with extra padding for header */} -
- - {code} - -
+

+ {state === "failed" + ? "Could not copy. Try again or select the code manually." + : state === "copied" + ? "Code copied." + : ""} +

+ + + + +
); } -/** - * Wrapper component that handles lazy loading - */ -function LazyHighlightedCodeBlock(props: LazyCodeBlockProps) { - const [style, setStyle] = React.useState(null); - - React.useEffect(() => { - getStyle().then(setStyle); - }, []); - - if (!style) { - return ; - } - - return ; -} - -/** - * Main export - LazyCodeBlock with Suspense boundary - */ -export function LazyCodeBlock(props: LazyCodeBlockProps) { - return ( - }> - - - ); -} - export default LazyCodeBlock; diff --git a/backend/convex/_generated/api.d.ts b/backend/convex/_generated/api.d.ts index d92b24c42..d53e80108 100644 --- a/backend/convex/_generated/api.d.ts +++ b/backend/convex/_generated/api.d.ts @@ -469,14 +469,14 @@ import type * as domains_evaluation_dogfood_videoQa from "../domains/evaluation/ import type * as domains_evaluation_dogfood_videoQaMutations from "../domains/evaluation/dogfood/videoQaMutations.js"; import type * as domains_evaluation_dogfood_videoQaQueries from "../domains/evaluation/dogfood/videoQaQueries.js"; import type * as domains_evaluation_e2eValidation from "../domains/evaluation/e2eValidation.js"; -import type * as domains_evaluation_evalHarness from "../domains/evaluation/evalHarness.js"; -import type * as domains_evaluation_evalRunTracking from "../domains/evaluation/evalRunTracking.js"; import type * as domains_evaluation_eval_evalHelpers from "../domains/evaluation/eval/evalHelpers.js"; import type * as domains_evaluation_eval_evalMutations from "../domains/evaluation/eval/evalMutations.js"; import type * as domains_evaluation_eval_evalStorage from "../domains/evaluation/eval/evalStorage.js"; import type * as domains_evaluation_eval_productionTestCases from "../domains/evaluation/eval/productionTestCases.js"; import type * as domains_evaluation_eval_runBatch from "../domains/evaluation/eval/runBatch.js"; import type * as domains_evaluation_eval_runBatchNative from "../domains/evaluation/eval/runBatchNative.js"; +import type * as domains_evaluation_evalHarness from "../domains/evaluation/evalHarness.js"; +import type * as domains_evaluation_evalRunTracking from "../domains/evaluation/evalRunTracking.js"; import type * as domains_evaluation_evaluationPrompts from "../domains/evaluation/evaluationPrompts.js"; import type * as domains_evaluation_evaluationSafeResponse from "../domains/evaluation/evaluationSafeResponse.js"; import type * as domains_evaluation_evidencePlanner from "../domains/evaluation/evidencePlanner.js"; @@ -561,19 +561,6 @@ import type * as domains_evaluation_ultraLongChat_scenarios from "../domains/eva import type * as domains_evaluation_ultraLongChat_storage from "../domains/evaluation/ultraLongChat/storage.js"; import type * as domains_evaluation_validators from "../domains/evaluation/validators.js"; import type * as domains_evaluation_workbenchQueries from "../domains/evaluation/workbenchQueries.js"; -import type * as domains_financialOperator_attFixture from "../domains/financialOperator/attFixture.js"; -import type * as domains_financialOperator_extractors from "../domains/financialOperator/extractors.js"; -import type * as domains_financialOperator_fixtures_covenantFixture from "../domains/financialOperator/fixtures/covenantFixture.js"; -import type * as domains_financialOperator_fixtures_crmFixture from "../domains/financialOperator/fixtures/crmFixture.js"; -import type * as domains_financialOperator_fixtures_varianceFixture from "../domains/financialOperator/fixtures/varianceFixture.js"; -import type * as domains_financialOperator_index from "../domains/financialOperator/index.js"; -import type * as domains_financialOperator_orchestrator from "../domains/financialOperator/orchestrator.js"; -import type * as domains_financialOperator_orchestratorExamples from "../domains/financialOperator/orchestratorExamples.js"; -import type * as domains_financialOperator_realExtractors from "../domains/financialOperator/realExtractors.js"; -import type * as domains_financialOperator_runOps from "../domains/financialOperator/runOps.js"; -import type * as domains_financialOperator_sandbox from "../domains/financialOperator/sandbox.js"; -import type * as domains_financialOperator_types from "../domains/financialOperator/types.js"; -import type * as domains_financialOperator_validators from "../domains/financialOperator/validators.js"; import type * as domains_financial_balanceSheetFetcher from "../domains/financial/balanceSheetFetcher.js"; import type * as domains_financial_corporateActions from "../domains/financial/corporateActions.js"; import type * as domains_financial_corrections from "../domains/financial/corrections.js"; @@ -599,6 +586,19 @@ import type * as domains_financial_sensitivityAnalysis from "../domains/financia import type * as domains_financial_taxonomyManagement from "../domains/financial/taxonomyManagement.js"; import type * as domains_financial_validation from "../domains/financial/validation.js"; import type * as domains_financial_xbrlParser from "../domains/financial/xbrlParser.js"; +import type * as domains_financialOperator_attFixture from "../domains/financialOperator/attFixture.js"; +import type * as domains_financialOperator_extractors from "../domains/financialOperator/extractors.js"; +import type * as domains_financialOperator_fixtures_covenantFixture from "../domains/financialOperator/fixtures/covenantFixture.js"; +import type * as domains_financialOperator_fixtures_crmFixture from "../domains/financialOperator/fixtures/crmFixture.js"; +import type * as domains_financialOperator_fixtures_varianceFixture from "../domains/financialOperator/fixtures/varianceFixture.js"; +import type * as domains_financialOperator_index from "../domains/financialOperator/index.js"; +import type * as domains_financialOperator_orchestrator from "../domains/financialOperator/orchestrator.js"; +import type * as domains_financialOperator_orchestratorExamples from "../domains/financialOperator/orchestratorExamples.js"; +import type * as domains_financialOperator_realExtractors from "../domains/financialOperator/realExtractors.js"; +import type * as domains_financialOperator_runOps from "../domains/financialOperator/runOps.js"; +import type * as domains_financialOperator_sandbox from "../domains/financialOperator/sandbox.js"; +import type * as domains_financialOperator_types from "../domains/financialOperator/types.js"; +import type * as domains_financialOperator_validators from "../domains/financialOperator/validators.js"; import type * as domains_forecasting_actions_computeCalibration from "../domains/forecasting/actions/computeCalibration.js"; import type * as domains_forecasting_actions_createForecast from "../domains/forecasting/actions/createForecast.js"; import type * as domains_forecasting_actions_refreshForecast from "../domains/forecasting/actions/refreshForecast.js"; @@ -837,6 +837,7 @@ import type * as domains_narrative_tests_validatePipeline from "../domains/narra import type * as domains_narrative_truth_truthStateManager from "../domains/narrative/truth/truthStateManager.js"; import type * as domains_narrative_validators from "../domains/narrative/validators.js"; import type * as domains_observability_dashboardData from "../domains/observability/dashboardData.js"; +import type * as domains_observability_goldenMetrics from "../domains/observability/goldenMetrics.js"; import type * as domains_observability_healthMonitor from "../domains/observability/healthMonitor.js"; import type * as domains_observability_index from "../domains/observability/index.js"; import type * as domains_observability_selfHealer from "../domains/observability/selfHealer.js"; @@ -879,6 +880,7 @@ import type * as domains_operations_monitoring_industryUpdates from "../domains/ import type * as domains_operations_monitoring_industryUpdatesEnhanced from "../domains/operations/monitoring/industryUpdatesEnhanced.js"; import type * as domains_operations_monitoring_integrationHelpers from "../domains/operations/monitoring/integrationHelpers.js"; import type * as domains_operations_observability_dashboardData from "../domains/operations/observability/dashboardData.js"; +import type * as domains_operations_observability_goldenMetrics from "../domains/operations/observability/goldenMetrics.js"; import type * as domains_operations_observability_healthMonitor from "../domains/operations/observability/healthMonitor.js"; import type * as domains_operations_observability_index from "../domains/operations/observability/index.js"; import type * as domains_operations_observability_selfHealer from "../domains/operations/observability/selfHealer.js"; @@ -896,6 +898,11 @@ import type * as domains_operations_sloFramework from "../domains/operations/slo import type * as domains_operations_taskManager_cronWrapper from "../domains/operations/taskManager/cronWrapper.js"; import type * as domains_operations_taskManager_index from "../domains/operations/taskManager/index.js"; import type * as domains_operations_taskManager_mutations from "../domains/operations/taskManager/mutations.js"; +import type * as domains_operations_taskManager_nodeKitNativeIdentityMigration from "../domains/operations/taskManager/nodeKitNativeIdentityMigration.js"; +import type * as domains_operations_taskManager_nodeKitRunEvents from "../domains/operations/taskManager/nodeKitRunEvents.js"; +import type * as domains_operations_taskManager_nodeKitRunExport from "../domains/operations/taskManager/nodeKitRunExport.js"; +import type * as domains_operations_taskManager_nodeKitRunRetention from "../domains/operations/taskManager/nodeKitRunRetention.js"; +import type * as domains_operations_taskManager_nodeKitRuntimeIdentity from "../domains/operations/taskManager/nodeKitRuntimeIdentity.js"; import type * as domains_operations_taskManager_proofPack from "../domains/operations/taskManager/proofPack.js"; import type * as domains_operations_taskManager_queries from "../domains/operations/taskManager/queries.js"; import type * as domains_operations_tasks_dailyNotes from "../domains/operations/tasks/dailyNotes.js"; @@ -952,8 +959,8 @@ import type * as domains_proactive_adapters_emailEventAdapter from "../domains/p import type * as domains_proactive_adminQueries from "../domains/proactive/adminQueries.js"; import type * as domains_proactive_agentDispatch from "../domains/proactive/agentDispatch.js"; import type * as domains_proactive_consentMutations from "../domains/proactive/consentMutations.js"; -import type * as domains_proactive_deliveryOrchestrator from "../domains/proactive/deliveryOrchestrator.js"; import type * as domains_proactive_delivery_slackDelivery from "../domains/proactive/delivery/slackDelivery.js"; +import type * as domains_proactive_deliveryOrchestrator from "../domains/proactive/deliveryOrchestrator.js"; import type * as domains_proactive_detectors_BaseDetector from "../domains/proactive/detectors/BaseDetector.js"; import type * as domains_proactive_detectors_dailyBriefDetector from "../domains/proactive/detectors/dailyBriefDetector.js"; import type * as domains_proactive_detectors_executor from "../domains/proactive/detectors/executor.js"; @@ -1278,6 +1285,7 @@ import type * as domains_social_linkedinOAuth from "../domains/social/linkedinOA import type * as domains_social_linkedinPosting from "../domains/social/linkedinPosting.js"; import type * as domains_social_linkedinPrePostVerification from "../domains/social/linkedinPrePostVerification.js"; import type * as domains_social_linkedinQualityJudge from "../domains/social/linkedinQualityJudge.js"; +import type * as domains_social_linkedinQualityJudgePolicy from "../domains/social/linkedinQualityJudgePolicy.js"; import type * as domains_social_linkedinScheduleGrid from "../domains/social/linkedinScheduleGrid.js"; import type * as domains_social_linkedinUnknownCompanyFixes from "../domains/social/linkedinUnknownCompanyFixes.js"; import type * as domains_social_postDedup from "../domains/social/postDedup.js"; @@ -1417,12 +1425,12 @@ import type * as tests_fastAgentPanelStreamingTests from "../tests/fastAgentPane import type * as tests_fusionSearchContractTests from "../tests/fusionSearchContractTests.js"; import type * as tools_arbitrage_analyzeWithArbitrage from "../tools/arbitrage/analyzeWithArbitrage.js"; import type * as tools_arbitrage_index from "../tools/arbitrage/index.js"; -import type * as tools_calendarIcs from "../tools/calendarIcs.js"; -import type * as tools_calendarIcsMutations from "../tools/calendarIcsMutations.js"; import type * as tools_calendar_calendarCrudTools from "../tools/calendar/calendarCrudTools.js"; import type * as tools_calendar_confirmEventSelection from "../tools/calendar/confirmEventSelection.js"; import type * as tools_calendar_emailEventExtractor from "../tools/calendar/emailEventExtractor.js"; import type * as tools_calendar_recentEventSearch from "../tools/calendar/recentEventSearch.js"; +import type * as tools_calendarIcs from "../tools/calendarIcs.js"; +import type * as tools_calendarIcsMutations from "../tools/calendarIcsMutations.js"; import type * as tools_context_nodebenchContextTools from "../tools/context/nodebenchContextTools.js"; import type * as tools_context_resourceLinks from "../tools/context/resourceLinks.js"; import type * as tools_context_retrieveArtifact from "../tools/context/retrieveArtifact.js"; @@ -1515,8 +1523,8 @@ import type * as tools_sendSms from "../tools/sendSms.js"; import type * as tools_shared_structuredOutput from "../tools/shared/structuredOutput.js"; import type * as tools_social_instagramTools from "../tools/social/instagramTools.js"; import type * as tools_social_linkedinTools from "../tools/social/linkedinTools.js"; -import type * as tools_spreadsheetOperationTypes from "../tools/spreadsheetOperationTypes.js"; import type * as tools_spreadsheet_spreadsheetCrudTools from "../tools/spreadsheet/spreadsheetCrudTools.js"; +import type * as tools_spreadsheetOperationTypes from "../tools/spreadsheetOperationTypes.js"; import type * as tools_teachability_index from "../tools/teachability/index.js"; import type * as tools_teachability_learnUserSkill from "../tools/teachability/learnUserSkill.js"; import type * as tools_teachability_teachingAnalyzer from "../tools/teachability/teachingAnalyzer.js"; @@ -1547,1554 +1555,17 @@ import type * as workflows_sendMockBankerDigest from "../workflows/sendMockBanke import type * as workflows_specializedLinkedInPosts from "../workflows/specializedLinkedInPosts.js"; import type * as workflows_testDailyBrief from "../workflows/testDailyBrief.js"; import type * as workflows_weeklySourceSummary from "../workflows/weeklySourceSummary.js"; - import type { ApiFromModules, FilterApi, FunctionReference, } from "convex/server"; - -declare const fullApi: ApiFromModules<{ - "actions/coordinatorWorkflowActions": typeof actions_coordinatorWorkflowActions; - "actions/externalOrchestrator": typeof actions_externalOrchestrator; - "actions/openbbActions": typeof actions_openbbActions; - "actions/parallelDelegation": typeof actions_parallelDelegation; - "actions/researchMcpActions": typeof actions_researchMcpActions; - "actions/spreadsheetActions": typeof actions_spreadsheetActions; - agentOS: typeof agentOS; - agentsPrefs: typeof agentsPrefs; - auth: typeof auth; - "config/autonomousConfig": typeof config_autonomousConfig; - crons: typeof crons; - "crons/dailyDossierCron": typeof crons_dailyDossierCron; - "crons/emailIntelligenceCron": typeof crons_emailIntelligenceCron; - "crons/proactiveCalendarIngestion": typeof crons_proactiveCalendarIngestion; - "crons/proactiveDelivery": typeof crons_proactiveDelivery; - "crons/proactiveDetectorRuns": typeof crons_proactiveDetectorRuns; - "crons/proactiveEmailIngestion": typeof crons_proactiveEmailIngestion; - "crons/sloCalculation": typeof crons_sloCalculation; - dataAudit: typeof dataAudit; - debugEnv: typeof debugEnv; - "domains/agents/adapters/anthropic/anthropicReasoningAdapter": typeof domains_agents_adapters_anthropic_anthropicReasoningAdapter; - "domains/agents/adapters/anthropic/promptCacheHelpers": typeof domains_agents_adapters_anthropic_promptCacheHelpers; - "domains/agents/adapters/convex/convexAgentAdapter": typeof domains_agents_adapters_convex_convexAgentAdapter; - "domains/agents/adapters/google/googleInteractionsAdapter": typeof domains_agents_adapters_google_googleInteractionsAdapter; - "domains/agents/adapters/handoffBridge": typeof domains_agents_adapters_handoffBridge; - "domains/agents/adapters/index": typeof domains_agents_adapters_index; - "domains/agents/adapters/langgraph/langgraphAdapter": typeof domains_agents_adapters_langgraph_langgraphAdapter; - "domains/agents/adapters/multiSdkDelegation": typeof domains_agents_adapters_multiSdkDelegation; - "domains/agents/adapters/openai/openaiAgentsAdapter": typeof domains_agents_adapters_openai_openaiAgentsAdapter; - "domains/agents/adapters/registerDefaultAdapters": typeof domains_agents_adapters_registerDefaultAdapters; - "domains/agents/adapters/registry": typeof domains_agents_adapters_registry; - "domains/agents/adapters/routing/personaRouter": typeof domains_agents_adapters_routing_personaRouter; - "domains/agents/adapters/types": typeof domains_agents_adapters_types; - "domains/agents/adapters/vercel/vercelAiSdkAdapter": typeof domains_agents_adapters_vercel_vercelAiSdkAdapter; - "domains/agents/agentActions": typeof domains_agents_agentActions; - "domains/agents/agentChat": typeof domains_agents_agentChat; - "domains/agents/agentChatActions": typeof domains_agents_agentChatActions; - "domains/agents/agentDelegations": typeof domains_agents_agentDelegations; - "domains/agents/agentFeedRanking": typeof domains_agents_agentFeedRanking; - "domains/agents/agentFeedTraversal": typeof domains_agents_agentFeedTraversal; - "domains/agents/agentHubQueries": typeof domains_agents_agentHubQueries; - "domains/agents/agentInitializer": typeof domains_agents_agentInitializer; - "domains/agents/agentLoop": typeof domains_agents_agentLoop; - "domains/agents/agentLoopQueries": typeof domains_agents_agentLoopQueries; - "domains/agents/agentMarketplace": typeof domains_agents_agentMarketplace; - "domains/agents/agentMemory": typeof domains_agents_agentMemory; - "domains/agents/agentMemorySummary": typeof domains_agents_agentMemorySummary; - "domains/agents/agentNavigation": typeof domains_agents_agentNavigation; - "domains/agents/agentPlanSummary": typeof domains_agents_agentPlanSummary; - "domains/agents/agentPlanning": typeof domains_agents_agentPlanning; - "domains/agents/agentPostingPipeline": typeof domains_agents_agentPostingPipeline; - "domains/agents/agentRouter": typeof domains_agents_agentRouter; - "domains/agents/agentRunPresentation": typeof domains_agents_agentRunPresentation; - "domains/agents/agentScratchpads": typeof domains_agents_agentScratchpads; - "domains/agents/agentTimelines": typeof domains_agents_agentTimelines; - "domains/agents/agentViewManifest": typeof domains_agents_agentViewManifest; - "domains/agents/arbitrage/agent": typeof domains_agents_arbitrage_agent; - "domains/agents/arbitrage/config": typeof domains_agents_arbitrage_config; - "domains/agents/arbitrage/index": typeof domains_agents_arbitrage_index; - "domains/agents/arbitrage/tools/contradictionDetection": typeof domains_agents_arbitrage_tools_contradictionDetection; - "domains/agents/arbitrage/tools/deltaDetection": typeof domains_agents_arbitrage_tools_deltaDetection; - "domains/agents/arbitrage/tools/index": typeof domains_agents_arbitrage_tools_index; - "domains/agents/arbitrage/tools/sourceHealthCheck": typeof domains_agents_arbitrage_tools_sourceHealthCheck; - "domains/agents/arbitrage/tools/sourceQualityRanking": typeof domains_agents_arbitrage_tools_sourceQualityRanking; - "domains/agents/autonomousCrons": typeof domains_agents_autonomousCrons; - "domains/agents/autonomousCronsQueries": typeof domains_agents_autonomousCronsQueries; - "domains/agents/autonomy/commits": typeof domains_agents_autonomy_commits; - "domains/agents/autonomy/evidence": typeof domains_agents_autonomy_evidence; - "domains/agents/autonomy/grants": typeof domains_agents_autonomy_grants; - "domains/agents/autonomy/hash": typeof domains_agents_autonomy_hash; - "domains/agents/autonomy/policy": typeof domains_agents_autonomy_policy; - "domains/agents/autonomy/proposals": typeof domains_agents_autonomy_proposals; - "domains/agents/autonomy/remainders": typeof domains_agents_autonomy_remainders; - "domains/agents/batchAPI": typeof domains_agents_batchAPI; - "domains/agents/budget/budgetGate": typeof domains_agents_budget_budgetGate; - "domains/agents/canonicalPlanner": typeof domains_agents_canonicalPlanner; - "domains/agents/canonicalRuntimeMutations": typeof domains_agents_canonicalRuntimeMutations; - "domains/agents/canonicalRuntimeQueries": typeof domains_agents_canonicalRuntimeQueries; - "domains/agents/chatPanelBackend": typeof domains_agents_chatPanelBackend; - "domains/agents/chatThreads": typeof domains_agents_chatThreads; - "domains/agents/checkpointing": typeof domains_agents_checkpointing; - "domains/agents/consistencyIndex": typeof domains_agents_consistencyIndex; - "domains/agents/consistencyIndexQueries": typeof domains_agents_consistencyIndexQueries; - "domains/agents/coordinator/agent": typeof domains_agents_coordinator_agent; - "domains/agents/coordinator/config": typeof domains_agents_coordinator_config; - "domains/agents/coordinator/contextPack": typeof domains_agents_coordinator_contextPack; - "domains/agents/coordinator/contextPackMutations": typeof domains_agents_coordinator_contextPackMutations; - "domains/agents/coordinator/contextPackQueries": typeof domains_agents_coordinator_contextPackQueries; - "domains/agents/coordinator/index": typeof domains_agents_coordinator_index; - "domains/agents/coordinator/tools/delegationTools": typeof domains_agents_coordinator_tools_delegationTools; - "domains/agents/coordinator/tools/index": typeof domains_agents_coordinator_tools_index; - "domains/agents/core/coordinatorAgent": typeof domains_agents_core_coordinatorAgent; - "domains/agents/core/delegation/delegationHelpers": typeof domains_agents_core_delegation_delegationHelpers; - "domains/agents/core/delegation/delegationTools": typeof domains_agents_core_delegation_delegationTools; - "domains/agents/core/delegation/temporalContext": typeof domains_agents_core_delegation_temporalContext; - "domains/agents/core/multiAgentWorkflow": typeof domains_agents_core_multiAgentWorkflow; - "domains/agents/core/prompts": typeof domains_agents_core_prompts; - "domains/agents/core/subagents/comment_harvester/index": typeof domains_agents_core_subagents_comment_harvester_index; - "domains/agents/core/subagents/comment_harvester/mutations": typeof domains_agents_core_subagents_comment_harvester_mutations; - "domains/agents/core/subagents/document_subagent/documentAgent": typeof domains_agents_core_subagents_document_subagent_documentAgent; - "domains/agents/core/subagents/document_subagent/documentAgentWithMetaTools": typeof domains_agents_core_subagents_document_subagent_documentAgentWithMetaTools; - "domains/agents/core/subagents/document_subagent/tools/deepAgentEditTools": typeof domains_agents_core_subagents_document_subagent_tools_deepAgentEditTools; - "domains/agents/core/subagents/document_subagent/tools/documentTools": typeof domains_agents_core_subagents_document_subagent_tools_documentTools; - "domains/agents/core/subagents/document_subagent/tools/geminiFileSearch": typeof domains_agents_core_subagents_document_subagent_tools_geminiFileSearch; - "domains/agents/core/subagents/document_subagent/tools/hashtagSearchTools": typeof domains_agents_core_subagents_document_subagent_tools_hashtagSearchTools; - "domains/agents/core/subagents/document_subagent/tools/index": typeof domains_agents_core_subagents_document_subagent_tools_index; - "domains/agents/core/subagents/dossier_subagent/dossierAgent": typeof domains_agents_core_subagents_dossier_subagent_dossierAgent; - "domains/agents/core/subagents/dossier_subagent/tools/enrichDataPoint": typeof domains_agents_core_subagents_dossier_subagent_tools_enrichDataPoint; - "domains/agents/core/subagents/dossier_subagent/tools/generateAnnotation": typeof domains_agents_core_subagents_dossier_subagent_tools_generateAnnotation; - "domains/agents/core/subagents/dossier_subagent/tools/getChartContext": typeof domains_agents_core_subagents_dossier_subagent_tools_getChartContext; - "domains/agents/core/subagents/dossier_subagent/tools/index": typeof domains_agents_core_subagents_dossier_subagent_tools_index; - "domains/agents/core/subagents/dossier_subagent/tools/updateFocusState": typeof domains_agents_core_subagents_dossier_subagent_tools_updateFocusState; - "domains/agents/core/subagents/dossier_subagent/tools/updateNarrativeSection": typeof domains_agents_core_subagents_dossier_subagent_tools_updateNarrativeSection; - "domains/agents/core/subagents/entity_subagent/entityResearchAgent": typeof domains_agents_core_subagents_entity_subagent_entityResearchAgent; - "domains/agents/core/subagents/media_subagent/mediaAgent": typeof domains_agents_core_subagents_media_subagent_mediaAgent; - "domains/agents/core/subagents/media_subagent/tools/index": typeof domains_agents_core_subagents_media_subagent_tools_index; - "domains/agents/core/subagents/media_subagent/tools/linkupSearch": typeof domains_agents_core_subagents_media_subagent_tools_linkupSearch; - "domains/agents/core/subagents/media_subagent/tools/mediaTools": typeof domains_agents_core_subagents_media_subagent_tools_mediaTools; - "domains/agents/core/subagents/media_subagent/tools/youtubeSearch": typeof domains_agents_core_subagents_media_subagent_tools_youtubeSearch; - "domains/agents/core/subagents/openbb_subagent/openbbAgent": typeof domains_agents_core_subagents_openbb_subagent_openbbAgent; - "domains/agents/core/subagents/openbb_subagent/tools/adminTools": typeof domains_agents_core_subagents_openbb_subagent_tools_adminTools; - "domains/agents/core/subagents/openbb_subagent/tools/cryptoTools": typeof domains_agents_core_subagents_openbb_subagent_tools_cryptoTools; - "domains/agents/core/subagents/openbb_subagent/tools/economyTools": typeof domains_agents_core_subagents_openbb_subagent_tools_economyTools; - "domains/agents/core/subagents/openbb_subagent/tools/equityTools": typeof domains_agents_core_subagents_openbb_subagent_tools_equityTools; - "domains/agents/core/subagents/openbb_subagent/tools/index": typeof domains_agents_core_subagents_openbb_subagent_tools_index; - "domains/agents/core/subagents/openbb_subagent/tools/newsTools": typeof domains_agents_core_subagents_openbb_subagent_tools_newsTools; - "domains/agents/core/subagents/research_subagent/multiSourceResearchAgent": typeof domains_agents_core_subagents_research_subagent_multiSourceResearchAgent; - "domains/agents/core/subagents/sec_subagent/secAgent": typeof domains_agents_core_subagents_sec_subagent_secAgent; - "domains/agents/core/subagents/sec_subagent/tools/index": typeof domains_agents_core_subagents_sec_subagent_tools_index; - "domains/agents/core/subagents/sec_subagent/tools/secCompanySearch": typeof domains_agents_core_subagents_sec_subagent_tools_secCompanySearch; - "domains/agents/core/subagents/sec_subagent/tools/secFilingTools": typeof domains_agents_core_subagents_sec_subagent_tools_secFilingTools; - "domains/agents/core/subagents/thread_curator/index": typeof domains_agents_core_subagents_thread_curator_index; - "domains/agents/core/subagents/thread_curator/queries": typeof domains_agents_core_subagents_thread_curator_queries; - "domains/agents/core/tools/externalOrchestratorTools": typeof domains_agents_core_tools_externalOrchestratorTools; - "domains/agents/dataAccess/agent": typeof domains_agents_dataAccess_agent; - "domains/agents/dataAccess/config": typeof domains_agents_dataAccess_config; - "domains/agents/dataAccess/index": typeof domains_agents_dataAccess_index; - "domains/agents/dataAccess/tools/calendarTools": typeof domains_agents_dataAccess_tools_calendarTools; - "domains/agents/dataAccess/tools/index": typeof domains_agents_dataAccess_tools_index; - "domains/agents/dataAccess/tools/taskTools": typeof domains_agents_dataAccess_tools_taskTools; - "domains/agents/decisionMemory": typeof domains_agents_decisionMemory; - "domains/agents/decisionMemoryQueries": typeof domains_agents_decisionMemoryQueries; - "domains/agents/decorationPreferences": typeof domains_agents_decorationPreferences; - "domains/agents/deliberationToEvolution": typeof domains_agents_deliberationToEvolution; - "domains/agents/digestAgent": typeof domains_agents_digestAgent; - "domains/agents/dueDiligence/branches/companyProfile": typeof domains_agents_dueDiligence_branches_companyProfile; - "domains/agents/dueDiligence/branches/conditionalBranches": typeof domains_agents_dueDiligence_branches_conditionalBranches; - "domains/agents/dueDiligence/branches/marketCompetitive": typeof domains_agents_dueDiligence_branches_marketCompetitive; - "domains/agents/dueDiligence/branches/teamDeepResearch": typeof domains_agents_dueDiligence_branches_teamDeepResearch; - "domains/agents/dueDiligence/crossChecker": typeof domains_agents_dueDiligence_crossChecker; - "domains/agents/dueDiligence/ddBranchHandoff": typeof domains_agents_dueDiligence_ddBranchHandoff; - "domains/agents/dueDiligence/ddContextEngine": typeof domains_agents_dueDiligence_ddContextEngine; - "domains/agents/dueDiligence/ddEnhancedOrchestrator": typeof domains_agents_dueDiligence_ddEnhancedOrchestrator; - "domains/agents/dueDiligence/ddMutations": typeof domains_agents_dueDiligence_ddMutations; - "domains/agents/dueDiligence/ddOrchestrator": typeof domains_agents_dueDiligence_ddOrchestrator; - "domains/agents/dueDiligence/ddTriggerQueries": typeof domains_agents_dueDiligence_ddTriggerQueries; - "domains/agents/dueDiligence/ddTriggers": typeof domains_agents_dueDiligence_ddTriggers; - "domains/agents/dueDiligence/deepResearch/agents/newsVerificationAgent": typeof domains_agents_dueDiligence_deepResearch_agents_newsVerificationAgent; - "domains/agents/dueDiligence/deepResearch/agents/personResearchAgent": typeof domains_agents_dueDiligence_deepResearch_agents_personResearchAgent; - "domains/agents/dueDiligence/deepResearch/claimClassifier": typeof domains_agents_dueDiligence_deepResearch_claimClassifier; - "domains/agents/dueDiligence/deepResearch/deepResearchOrchestrator": typeof domains_agents_dueDiligence_deepResearch_deepResearchOrchestrator; - "domains/agents/dueDiligence/deepResearch/hypothesisEngine": typeof domains_agents_dueDiligence_deepResearch_hypothesisEngine; - "domains/agents/dueDiligence/deepResearch/index": typeof domains_agents_dueDiligence_deepResearch_index; - "domains/agents/dueDiligence/deepResearch/queryDecomposer": typeof domains_agents_dueDiligence_deepResearch_queryDecomposer; - "domains/agents/dueDiligence/deepResearch/types": typeof domains_agents_dueDiligence_deepResearch_types; - "domains/agents/dueDiligence/index": typeof domains_agents_dueDiligence_index; - "domains/agents/dueDiligence/investorPlaybook/agenticPlaybook": typeof domains_agents_dueDiligence_investorPlaybook_agenticPlaybook; - "domains/agents/dueDiligence/investorPlaybook/branches/claimVerificationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_claimVerificationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/enhancedClaimVerification": typeof domains_agents_dueDiligence_investorPlaybook_branches_enhancedClaimVerification; - "domains/agents/dueDiligence/investorPlaybook/branches/enhancedNewsVerification": typeof domains_agents_dueDiligence_investorPlaybook_branches_enhancedNewsVerification; - "domains/agents/dueDiligence/investorPlaybook/branches/entityVerificationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_entityVerificationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/fdaVerificationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_fdaVerificationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/financial/dealMemoSynthesis": typeof domains_agents_dueDiligence_investorPlaybook_branches_financial_dealMemoSynthesis; - "domains/agents/dueDiligence/investorPlaybook/branches/financial/fundPerformanceVerification": typeof domains_agents_dueDiligence_investorPlaybook_branches_financial_fundPerformanceVerification; - "domains/agents/dueDiligence/investorPlaybook/branches/finraValidationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_finraValidationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/index": typeof domains_agents_dueDiligence_investorPlaybook_branches_index; - "domains/agents/dueDiligence/investorPlaybook/branches/industry/clinicalTrialVerification": typeof domains_agents_dueDiligence_investorPlaybook_branches_industry_clinicalTrialVerification; - "domains/agents/dueDiligence/investorPlaybook/branches/industry/literatureTriangulation": typeof domains_agents_dueDiligence_investorPlaybook_branches_industry_literatureTriangulation; - "domains/agents/dueDiligence/investorPlaybook/branches/moneyFlowBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_moneyFlowBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/newsVerificationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_newsVerificationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/personVerificationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_personVerificationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/scientificClaimVerificationBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_scientificClaimVerificationBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/secEdgarBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_secEdgarBranch; - "domains/agents/dueDiligence/investorPlaybook/branches/strategic/economicIndicatorVerification": typeof domains_agents_dueDiligence_investorPlaybook_branches_strategic_economicIndicatorVerification; - "domains/agents/dueDiligence/investorPlaybook/branches/strategic/maActivityVerification": typeof domains_agents_dueDiligence_investorPlaybook_branches_strategic_maActivityVerification; - "domains/agents/dueDiligence/investorPlaybook/branches/usptoBranch": typeof domains_agents_dueDiligence_investorPlaybook_branches_usptoBranch; - "domains/agents/dueDiligence/investorPlaybook/evalPlaybook": typeof domains_agents_dueDiligence_investorPlaybook_evalPlaybook; - "domains/agents/dueDiligence/investorPlaybook/index": typeof domains_agents_dueDiligence_investorPlaybook_index; - "domains/agents/dueDiligence/investorPlaybook/playbookActions": typeof domains_agents_dueDiligence_investorPlaybook_playbookActions; - "domains/agents/dueDiligence/investorPlaybook/playbookMutations": typeof domains_agents_dueDiligence_investorPlaybook_playbookMutations; - "domains/agents/dueDiligence/investorPlaybook/playbookOrchestrator": typeof domains_agents_dueDiligence_investorPlaybook_playbookOrchestrator; - "domains/agents/dueDiligence/investorPlaybook/types": typeof domains_agents_dueDiligence_investorPlaybook_types; - "domains/agents/dueDiligence/investorProtection/index": typeof domains_agents_dueDiligence_investorProtection_index; - "domains/agents/dueDiligence/investorProtection/investorProtectionMutations": typeof domains_agents_dueDiligence_investorProtection_investorProtectionMutations; - "domains/agents/dueDiligence/investorProtection/investorProtectionOrchestrator": typeof domains_agents_dueDiligence_investorProtection_investorProtectionOrchestrator; - "domains/agents/dueDiligence/investorProtection/investorProtectionOwnership": typeof domains_agents_dueDiligence_investorProtection_investorProtectionOwnership; - "domains/agents/dueDiligence/investorProtection/phases/claimsExtraction": typeof domains_agents_dueDiligence_investorProtection_phases_claimsExtraction; - "domains/agents/dueDiligence/investorProtection/types": typeof domains_agents_dueDiligence_investorProtection_types; - "domains/agents/dueDiligence/memoSynthesizer": typeof domains_agents_dueDiligence_memoSynthesizer; - "domains/agents/dueDiligence/microBranches": typeof domains_agents_dueDiligence_microBranches; - "domains/agents/dueDiligence/riskScoring": typeof domains_agents_dueDiligence_riskScoring; - "domains/agents/dueDiligence/types": typeof domains_agents_dueDiligence_types; - "domains/agents/emailAgent": typeof domains_agents_emailAgent; - "domains/agents/evolutionVerification": typeof domains_agents_evolutionVerification; - "domains/agents/fastAgentChat": typeof domains_agents_fastAgentChat; - "domains/agents/fastAgentChatHelpers": typeof domains_agents_fastAgentChatHelpers; - "domains/agents/fastAgentDocumentCreation": typeof domains_agents_fastAgentDocumentCreation; - "domains/agents/fastAgentDocumentCreationOwnership": typeof domains_agents_fastAgentDocumentCreationOwnership; - "domains/agents/fastAgentPanelStreaming": typeof domains_agents_fastAgentPanelStreaming; - "domains/agents/glmFlashWithReasoning": typeof domains_agents_glmFlashWithReasoning; - "domains/agents/glmHybridApproach": typeof domains_agents_glmHybridApproach; - "domains/agents/hitl/config": typeof domains_agents_hitl_config; - "domains/agents/hitl/index": typeof domains_agents_hitl_index; - "domains/agents/hitl/interruptManager": typeof domains_agents_hitl_interruptManager; - "domains/agents/hitl/tools/askHuman": typeof domains_agents_hitl_tools_askHuman; - "domains/agents/hitl/tools/index": typeof domains_agents_hitl_tools_index; - "domains/agents/humanInTheLoop": typeof domains_agents_humanInTheLoop; - "domains/agents/index": typeof domains_agents_index; - "domains/agents/lessons/captureLesson": typeof domains_agents_lessons_captureLesson; - "domains/agents/lessons/getRelevantLessons": typeof domains_agents_lessons_getRelevantLessons; - "domains/agents/lessons/infraPreferIds": typeof domains_agents_lessons_infraPreferIds; - "domains/agents/lessons/lessonInjection": typeof domains_agents_lessons_lessonInjection; - "domains/agents/lessons/lessonsPublic": typeof domains_agents_lessons_lessonsPublic; - "domains/agents/lessons/systemPromptBuilder": typeof domains_agents_lessons_systemPromptBuilder; - "domains/agents/mcp_tools/context/contextInitializerTool": typeof domains_agents_mcp_tools_context_contextInitializerTool; - "domains/agents/mcp_tools/context/index": typeof domains_agents_mcp_tools_context_index; - "domains/agents/mcp_tools/index": typeof domains_agents_mcp_tools_index; - "domains/agents/mcp_tools/models/healthcheck": typeof domains_agents_mcp_tools_models_healthcheck; - "domains/agents/mcp_tools/models/index": typeof domains_agents_mcp_tools_models_index; - "domains/agents/mcp_tools/models/migration": typeof domains_agents_mcp_tools_models_migration; - "domains/agents/mcp_tools/models/modelResolver": typeof domains_agents_mcp_tools_models_modelResolver; - "domains/agents/mcp_tools/models/promptCaching": typeof domains_agents_mcp_tools_models_promptCaching; - "domains/agents/mcp_tools/reasoningTool": typeof domains_agents_mcp_tools_reasoningTool; - "domains/agents/mcp_tools/testReasoningPersonas": typeof domains_agents_mcp_tools_testReasoningPersonas; - "domains/agents/mcp_tools/tracking/index": typeof domains_agents_mcp_tools_tracking_index; - "domains/agents/mcp_tools/tracking/taskTrackerTool": typeof domains_agents_mcp_tools_tracking_taskTrackerTool; - "domains/agents/orchestrator/geminiVideoWrapper": typeof domains_agents_orchestrator_geminiVideoWrapper; - "domains/agents/orchestrator/passportEnforcement": typeof domains_agents_orchestrator_passportEnforcement; - "domains/agents/orchestrator/passportEnforcementQueries": typeof domains_agents_orchestrator_passportEnforcementQueries; - "domains/agents/orchestrator/queueProtocol": typeof domains_agents_orchestrator_queueProtocol; - "domains/agents/orchestrator/secEdgarWrapper": typeof domains_agents_orchestrator_secEdgarWrapper; - "domains/agents/orchestrator/toolHealth": typeof domains_agents_orchestrator_toolHealth; - "domains/agents/orchestrator/toolRouter": typeof domains_agents_orchestrator_toolRouter; - "domains/agents/orchestrator/worker": typeof domains_agents_orchestrator_worker; - "domains/agents/parallelTaskTree": typeof domains_agents_parallelTaskTree; - "domains/agents/promptEnhancer": typeof domains_agents_promptEnhancer; - "domains/agents/publicWrappers": typeof domains_agents_publicWrappers; - "domains/agents/receipts/actionReceipts": typeof domains_agents_receipts_actionReceipts; - "domains/agents/receipts/emitWithReceipt": typeof domains_agents_receipts_emitWithReceipt; - "domains/agents/researchJobs": typeof domains_agents_researchJobs; - "domains/agents/responseFlywheel": typeof domains_agents_responseFlywheel; - "domains/agents/runtimeRouting": typeof domains_agents_runtimeRouting; - "domains/agents/runtimeTierFallback": typeof domains_agents_runtimeTierFallback; - "domains/agents/safety/artifactDecisionGate": typeof domains_agents_safety_artifactDecisionGate; - "domains/agents/safety/lowConfidenceGuard": typeof domains_agents_safety_lowConfidenceGuard; - "domains/agents/safety/rateLimitGuard": typeof domains_agents_safety_rateLimitGuard; - "domains/agents/safety/singleflightMap": typeof domains_agents_safety_singleflightMap; - "domains/agents/selfEvolution": typeof domains_agents_selfEvolution; - "domains/agents/selfEvolutionQueries": typeof domains_agents_selfEvolutionQueries; - "domains/agents/snapshots/rollbackToCheckpoint": typeof domains_agents_snapshots_rollbackToCheckpoint; - "domains/agents/snapshots/snapshotCheckpoint": typeof domains_agents_snapshots_snapshotCheckpoint; - "domains/agents/spiral/spiralDetector": typeof domains_agents_spiral_spiralDetector; - "domains/agents/swarmDeliberation": typeof domains_agents_swarmDeliberation; - "domains/agents/swarmDeliberationQueries": typeof domains_agents_swarmDeliberationQueries; - "domains/agents/swarmMutations": typeof domains_agents_swarmMutations; - "domains/agents/swarmOrchestrator": typeof domains_agents_swarmOrchestrator; - "domains/agents/swarmOrchestratorEnhanced": typeof domains_agents_swarmOrchestratorEnhanced; - "domains/agents/swarmQueries": typeof domains_agents_swarmQueries; - "domains/agents/testGlmFlash": typeof domains_agents_testGlmFlash; - "domains/agents/testGlmFlashFix": typeof domains_agents_testGlmFlashFix; - "domains/agents/testOrchestratorReasoningIntegration": typeof domains_agents_testOrchestratorReasoningIntegration; - "domains/agents/testParallelOrchestrator": typeof domains_agents_testParallelOrchestrator; - "domains/agents/tools/createDCFSpreadsheet": typeof domains_agents_tools_createDCFSpreadsheet; - "domains/agents/tools/editDCFSpreadsheet": typeof domains_agents_tools_editDCFSpreadsheet; - "domains/agents/traceAuditLog": typeof domains_agents_traceAuditLog; - "domains/agents/traceOrchestrator": typeof domains_agents_traceOrchestrator; - "domains/agents/traceTypes": typeof domains_agents_traceTypes; - "domains/agents/types": typeof domains_agents_types; - "domains/agents/unified": typeof domains_agents_unified; - "domains/ai/ai": typeof domains_ai_ai; - "domains/ai/genai": typeof domains_ai_genai; - "domains/ai/metadataAnalyzer": typeof domains_ai_metadataAnalyzer; - "domains/ai/models/autonomousModelResolver": typeof domains_ai_models_autonomousModelResolver; - "domains/ai/models/capabilityRegistry": typeof domains_ai_models_capabilityRegistry; - "domains/ai/models/chainResolver": typeof domains_ai_models_chainResolver; - "domains/ai/models/freeModelDiscovery": typeof domains_ai_models_freeModelDiscovery; - "domains/ai/models/index": typeof domains_ai_models_index; - "domains/ai/models/livePerformanceEval": typeof domains_ai_models_livePerformanceEval; - "domains/ai/models/modelRouter": typeof domains_ai_models_modelRouter; - "domains/ai/models/modelRouterQueries": typeof domains_ai_models_modelRouterQueries; - "domains/ai/morningDigest": typeof domains_ai_morningDigest; - "domains/ai/morningDigestQueries": typeof domains_ai_morningDigestQueries; - "domains/ai/realtimeTranscription": typeof domains_ai_realtimeTranscription; - "domains/ai/whisperTranscribe": typeof domains_ai_whisperTranscribe; - "domains/analytics/analytics": typeof domains_analytics_analytics; - "domains/analytics/componentMetrics": typeof domains_analytics_componentMetrics; - "domains/analytics/intentSignals": typeof domains_analytics_intentSignals; - "domains/analytics/ossStats": typeof domains_analytics_ossStats; - "domains/artifacts/evidenceIndex": typeof domains_artifacts_evidenceIndex; - "domains/artifacts/evidenceIndexActions": typeof domains_artifacts_evidenceIndexActions; - "domains/artifacts/evidencePacks": typeof domains_artifacts_evidencePacks; - "domains/artifacts/evidenceSearch": typeof domains_artifacts_evidenceSearch; - "domains/artifacts/sourceArtifacts": typeof domains_artifacts_sourceArtifacts; - "domains/auth/account": typeof domains_auth_account; - "domains/auth/apiKeys": typeof domains_auth_apiKeys; - "domains/auth/apiKeysActions": typeof domains_auth_apiKeysActions; - "domains/auth/auth": typeof domains_auth_auth; - "domains/auth/index": typeof domains_auth_index; - "domains/auth/onboarding": typeof domains_auth_onboarding; - "domains/auth/personas/index": typeof domains_auth_personas_index; - "domains/auth/personas/multiPersonaSynthesizer": typeof domains_auth_personas_multiPersonaSynthesizer; - "domains/auth/personas/personaAutonomousAgent": typeof domains_auth_personas_personaAutonomousAgent; - "domains/auth/presence": typeof domains_auth_presence; - "domains/auth/usage": typeof domains_auth_usage; - "domains/auth/userPreferences": typeof domains_auth_userPreferences; - "domains/auth/userStats": typeof domains_auth_userStats; - "domains/auth/users": typeof domains_auth_users; - "domains/batchAutopilot/deltaCollector": typeof domains_batchAutopilot_deltaCollector; - "domains/batchAutopilot/mutations": typeof domains_batchAutopilot_mutations; - "domains/batchAutopilot/promptBuilder": typeof domains_batchAutopilot_promptBuilder; - "domains/batchAutopilot/queries": typeof domains_batchAutopilot_queries; - "domains/batchAutopilot/runner": typeof domains_batchAutopilot_runner; - "domains/batchAutopilot/scheduler": typeof domains_batchAutopilot_scheduler; - "domains/billing/apiUsageTracking": typeof domains_billing_apiUsageTracking; - "domains/billing/billing": typeof domains_billing_billing; - "domains/billing/index": typeof domains_billing_index; - "domains/billing/rateLimiting": typeof domains_billing_rateLimiting; - "domains/blips/blipClaimExtraction": typeof domains_blips_blipClaimExtraction; - "domains/blips/blipGeneration": typeof domains_blips_blipGeneration; - "domains/blips/blipIngestion": typeof domains_blips_blipIngestion; - "domains/blips/blipMutations": typeof domains_blips_blipMutations; - "domains/blips/blipPersonaLens": typeof domains_blips_blipPersonaLens; - "domains/blips/blipPipeline": typeof domains_blips_blipPipeline; - "domains/blips/blipQueries": typeof domains_blips_blipQueries; - "domains/blips/blipVerification": typeof domains_blips_blipVerification; - "domains/blips/index": typeof domains_blips_index; - "domains/blips/types": typeof domains_blips_types; - "domains/calendar/calendar": typeof domains_calendar_calendar; - "domains/calendar/events": typeof domains_calendar_events; - "domains/calendar/holidays": typeof domains_calendar_holidays; - "domains/calendar/holidaysActions": typeof domains_calendar_holidaysActions; - "domains/calendar/index": typeof domains_calendar_index; - "domains/canonicalization/duplicateDetection": typeof domains_canonicalization_duplicateDetection; - "domains/channels/channelIntelligence": typeof domains_channels_channelIntelligence; - "domains/channels/engagementOptimizer": typeof domains_channels_engagementOptimizer; - "domains/channels/index": typeof domains_channels_index; - "domains/deepTrace/causalChainEngine": typeof domains_deepTrace_causalChainEngine; - "domains/deepTrace/dimensionEngine": typeof domains_deepTrace_dimensionEngine; - "domains/deepTrace/dimensionModel": typeof domains_deepTrace_dimensionModel; - "domains/deepTrace/dimensions": typeof domains_deepTrace_dimensions; - "domains/deepTrace/heuristics": typeof domains_deepTrace_heuristics; - "domains/deepTrace/integrations": typeof domains_deepTrace_integrations; - "domains/deepTrace/researchCell": typeof domains_deepTrace_researchCell; - "domains/documents/artifacts/evidenceIndex": typeof domains_documents_artifacts_evidenceIndex; - "domains/documents/artifacts/evidenceIndexActions": typeof domains_documents_artifacts_evidenceIndexActions; - "domains/documents/artifacts/evidencePacks": typeof domains_documents_artifacts_evidencePacks; - "domains/documents/artifacts/evidenceSearch": typeof domains_documents_artifacts_evidenceSearch; - "domains/documents/artifacts/ingestionPipeline": typeof domains_documents_artifacts_ingestionPipeline; - "domains/documents/artifacts/sourceArtifacts": typeof domains_documents_artifacts_sourceArtifacts; - "domains/documents/batchOperations": typeof domains_documents_batchOperations; - "domains/documents/calendar/calendar": typeof domains_documents_calendar_calendar; - "domains/documents/calendar/events": typeof domains_documents_calendar_events; - "domains/documents/calendar/holidays": typeof domains_documents_calendar_holidays; - "domains/documents/calendar/holidaysActions": typeof domains_documents_calendar_holidaysActions; - "domains/documents/calendar/index": typeof domains_documents_calendar_index; - "domains/documents/chunks": typeof domains_documents_chunks; - "domains/documents/citationValidator": typeof domains_documents_citationValidator; - "domains/documents/citations": typeof domains_documents_citations; - "domains/documents/documentEvents": typeof domains_documents_documentEvents; - "domains/documents/documentMetadataParser": typeof domains_documents_documentMetadataParser; - "domains/documents/documentTasks": typeof domains_documents_documentTasks; - "domains/documents/documentVersions": typeof domains_documents_documentVersions; - "domains/documents/documents": typeof domains_documents_documents; - "domains/documents/dossier/annotations": typeof domains_documents_dossier_annotations; - "domains/documents/dossier/enrichment": typeof domains_documents_dossier_enrichment; - "domains/documents/dossier/focusState": typeof domains_documents_dossier_focusState; - "domains/documents/dossier/index": typeof domains_documents_dossier_index; - "domains/documents/exportDocument": typeof domains_documents_exportDocument; - "domains/documents/fileAnalysis": typeof domains_documents_fileAnalysis; - "domains/documents/fileDocuments": typeof domains_documents_fileDocuments; - "domains/documents/fileQueries": typeof domains_documents_fileQueries; - "domains/documents/fileSearch": typeof domains_documents_fileSearch; - "domains/documents/fileSearchData": typeof domains_documents_fileSearchData; - "domains/documents/files": typeof domains_documents_files; - "domains/documents/folders": typeof domains_documents_folders; - "domains/documents/gridProjects": typeof domains_documents_gridProjects; - "domains/documents/index": typeof domains_documents_index; - "domains/documents/mcpDocumentEndpoints": typeof domains_documents_mcpDocumentEndpoints; - "domains/documents/pdfAnalysis": typeof domains_documents_pdfAnalysis; - "domains/documents/pdfInsights": typeof domains_documents_pdfInsights; - "domains/documents/pendingEdits": typeof domains_documents_pendingEdits; - "domains/documents/prosemirror": typeof domains_documents_prosemirror; - "domains/documents/quickCapture/index": typeof domains_documents_quickCapture_index; - "domains/documents/quickCapture/quickCapture": typeof domains_documents_quickCapture_quickCapture; - "domains/documents/quickCapture/voiceMemos": typeof domains_documents_quickCapture_voiceMemos; - "domains/documents/reportDocuments": typeof domains_documents_reportDocuments; - "domains/documents/search": typeof domains_documents_search; - "domains/documents/smartDateExtraction": typeof domains_documents_smartDateExtraction; - "domains/documents/sync": typeof domains_documents_sync; - "domains/documents/syncMutations": typeof domains_documents_syncMutations; - "domains/dogfood/screenshotQa": typeof domains_dogfood_screenshotQa; - "domains/dogfood/videoQa": typeof domains_dogfood_videoQa; - "domains/dogfood/videoQaMutations": typeof domains_dogfood_videoQaMutations; - "domains/dogfood/videoQaQueries": typeof domains_dogfood_videoQaQueries; - "domains/dossier/annotations": typeof domains_dossier_annotations; - "domains/dossier/enrichment": typeof domains_dossier_enrichment; - "domains/dossier/focusState": typeof domains_dossier_focusState; - "domains/dossier/index": typeof domains_dossier_index; - "domains/encounters/encounterCapture": typeof domains_encounters_encounterCapture; - "domains/encounters/encounterFastPass": typeof domains_encounters_encounterFastPass; - "domains/encounters/encounterMutations": typeof domains_encounters_encounterMutations; - "domains/encounters/encounterQueries": typeof domains_encounters_encounterQueries; - "domains/encounters/index": typeof domains_encounters_index; - "domains/encounters/types": typeof domains_encounters_types; - "domains/enrichment/backfillMetadata": typeof domains_enrichment_backfillMetadata; - "domains/enrichment/betterSectorClassifier": typeof domains_enrichment_betterSectorClassifier; - "domains/enrichment/canonicalization/duplicateDetection": typeof domains_enrichment_canonicalization_duplicateDetection; - "domains/enrichment/dataCleanup": typeof domains_enrichment_dataCleanup; - "domains/enrichment/deleteDuplicates": typeof domains_enrichment_deleteDuplicates; - "domains/enrichment/documentStore": typeof domains_enrichment_documentStore; - "domains/enrichment/enrichmentQueue": typeof domains_enrichment_enrichmentQueue; - "domains/enrichment/enrichmentWorker": typeof domains_enrichment_enrichmentWorker; - "domains/enrichment/entityBackfill": typeof domains_enrichment_entityBackfill; - "domains/enrichment/entityLinkingJudge": typeof domains_enrichment_entityLinkingJudge; - "domains/enrichment/entityLinkingMutations": typeof domains_enrichment_entityLinkingMutations; - "domains/enrichment/entityLinkingQueries": typeof domains_enrichment_entityLinkingQueries; - "domains/enrichment/entityLinkingService": typeof domains_enrichment_entityLinkingService; - "domains/enrichment/entityPromotion": typeof domains_enrichment_entityPromotion; - "domains/enrichment/fundingDetection": typeof domains_enrichment_fundingDetection; - "domains/enrichment/fundingMutations": typeof domains_enrichment_fundingMutations; - "domains/enrichment/fundingQueries": typeof domains_enrichment_fundingQueries; - "domains/enrichment/fundingVerification": typeof domains_enrichment_fundingVerification; - "domains/enrichment/llmCompanyExtraction": typeof domains_enrichment_llmCompanyExtraction; - "domains/enrichment/llmEnrichment": typeof domains_enrichment_llmEnrichment; - "domains/enrichment/quickVerificationUpgrade": typeof domains_enrichment_quickVerificationUpgrade; - "domains/enrichment/signals/index": typeof domains_enrichment_signals_index; - "domains/enrichment/signals/signalIngester": typeof domains_enrichment_signals_signalIngester; - "domains/enrichment/signals/signalProcessor": typeof domains_enrichment_signals_signalProcessor; - "domains/enrichment/testQueries": typeof domains_enrichment_testQueries; - "domains/enrichment/useOfProceedsExtractor": typeof domains_enrichment_useOfProceedsExtractor; - "domains/enrichment/workpools": typeof domains_enrichment_workpools; - "domains/entities/decayManager": typeof domains_entities_decayManager; - "domains/entities/entityLifecycle": typeof domains_entities_entityLifecycle; - "domains/entities/index": typeof domains_entities_index; - "domains/eval/evalHelpers": typeof domains_eval_evalHelpers; - "domains/eval/evalMutations": typeof domains_eval_evalMutations; - "domains/eval/evalStorage": typeof domains_eval_evalStorage; - "domains/eval/productionTestCases": typeof domains_eval_productionTestCases; - "domains/eval/runBatch": typeof domains_eval_runBatch; - "domains/eval/runBatchNative": typeof domains_eval_runBatchNative; - "domains/evaluation/agentRunJudge": typeof domains_evaluation_agentRunJudge; - "domains/evaluation/benchmarkHarness": typeof domains_evaluation_benchmarkHarness; - "domains/evaluation/booleanEvaluator": typeof domains_evaluation_booleanEvaluator; - "domains/evaluation/comprehensiveEval": typeof domains_evaluation_comprehensiveEval; - "domains/evaluation/cronHandlers": typeof domains_evaluation_cronHandlers; - "domains/evaluation/ddEvaluation": typeof domains_evaluation_ddEvaluation; - "domains/evaluation/dogfood/screenshotQa": typeof domains_evaluation_dogfood_screenshotQa; - "domains/evaluation/dogfood/videoQa": typeof domains_evaluation_dogfood_videoQa; - "domains/evaluation/dogfood/videoQaMutations": typeof domains_evaluation_dogfood_videoQaMutations; - "domains/evaluation/dogfood/videoQaQueries": typeof domains_evaluation_dogfood_videoQaQueries; - "domains/evaluation/e2eValidation": typeof domains_evaluation_e2eValidation; - "domains/evaluation/evalHarness": typeof domains_evaluation_evalHarness; - "domains/evaluation/evalRunTracking": typeof domains_evaluation_evalRunTracking; - "domains/evaluation/eval/evalHelpers": typeof domains_evaluation_eval_evalHelpers; - "domains/evaluation/eval/evalMutations": typeof domains_evaluation_eval_evalMutations; - "domains/evaluation/eval/evalStorage": typeof domains_evaluation_eval_evalStorage; - "domains/evaluation/eval/productionTestCases": typeof domains_evaluation_eval_productionTestCases; - "domains/evaluation/eval/runBatch": typeof domains_evaluation_eval_runBatch; - "domains/evaluation/eval/runBatchNative": typeof domains_evaluation_eval_runBatchNative; - "domains/evaluation/evaluationPrompts": typeof domains_evaluation_evaluationPrompts; - "domains/evaluation/evaluationSafeResponse": typeof domains_evaluation_evaluationSafeResponse; - "domains/evaluation/evidencePlanner": typeof domains_evaluation_evidencePlanner; - "domains/evaluation/financial/corrections": typeof domains_evaluation_financial_corrections; - "domains/evaluation/financial/dcfComparison": typeof domains_evaluation_financial_dcfComparison; - "domains/evaluation/financial/dcfEngine": typeof domains_evaluation_financial_dcfEngine; - "domains/evaluation/financial/evaluationOrchestrator": typeof domains_evaluation_financial_evaluationOrchestrator; - "domains/evaluation/financial/index": typeof domains_evaluation_financial_index; - "domains/evaluation/financial/reproPack": typeof domains_evaluation_financial_reproPack; - "domains/evaluation/financial/seedData": typeof domains_evaluation_financial_seedData; - "domains/evaluation/financial/sourceQuality": typeof domains_evaluation_financial_sourceQuality; - "domains/evaluation/financial/types": typeof domains_evaluation_financial_types; - "domains/evaluation/fixtures/shipDemoDayFixtures": typeof domains_evaluation_fixtures_shipDemoDayFixtures; - "domains/evaluation/groundTruth": typeof domains_evaluation_groundTruth; - "domains/evaluation/groundTruth/auditLog": typeof domains_evaluation_groundTruth_auditLog; - "domains/evaluation/groundTruth/versions": typeof domains_evaluation_groundTruth_versions; - "domains/evaluation/index": typeof domains_evaluation_index; - "domains/evaluation/inference/becPlaybook": typeof domains_evaluation_inference_becPlaybook; - "domains/evaluation/inference/index": typeof domains_evaluation_inference_index; - "domains/evaluation/inference/llmJudge": typeof domains_evaluation_inference_llmJudge; - "domains/evaluation/inference/personaInferenceEval": typeof domains_evaluation_inference_personaInferenceEval; - "domains/evaluation/judgeMetrics": typeof domains_evaluation_judgeMetrics; - "domains/evaluation/liveApiSmoke": typeof domains_evaluation_liveApiSmoke; - "domains/evaluation/liveEval": typeof domains_evaluation_liveEval; - "domains/evaluation/llmJudge": typeof domains_evaluation_llmJudge; - "domains/evaluation/mediaContextScenarios": typeof domains_evaluation_mediaContextScenarios; - "domains/evaluation/memoryFirstScenarios": typeof domains_evaluation_memoryFirstScenarios; - "domains/evaluation/migrateEvaluationScenarios": typeof domains_evaluation_migrateEvaluationScenarios; - "domains/evaluation/multiTurnScenarios": typeof domains_evaluation_multiTurnScenarios; - "domains/evaluation/operations": typeof domains_evaluation_operations; - "domains/evaluation/personaEpisodeEval": typeof domains_evaluation_personaEpisodeEval; - "domains/evaluation/personaInferenceScenarios": typeof domains_evaluation_personaInferenceScenarios; - "domains/evaluation/personaLiveEval": typeof domains_evaluation_personaLiveEval; - "domains/evaluation/personas/financial/financialGroundTruth": typeof domains_evaluation_personas_financial_financialGroundTruth; - "domains/evaluation/personas/financial/jpmBankerEval": typeof domains_evaluation_personas_financial_jpmBankerEval; - "domains/evaluation/personas/financial/lpAllocatorEval": typeof domains_evaluation_personas_financial_lpAllocatorEval; - "domains/evaluation/personas/financial/quantPMEval": typeof domains_evaluation_personas_financial_quantPMEval; - "domains/evaluation/personas/financial/quantPMGroundTruth": typeof domains_evaluation_personas_financial_quantPMGroundTruth; - "domains/evaluation/personas/identityAssurance": typeof domains_evaluation_personas_identityAssurance; - "domains/evaluation/personas/index": typeof domains_evaluation_personas_index; - "domains/evaluation/personas/industry/academicRDEval": typeof domains_evaluation_personas_industry_academicRDEval; - "domains/evaluation/personas/industry/industryGroundTruth": typeof domains_evaluation_personas_industry_industryGroundTruth; - "domains/evaluation/personas/industry/pharmaBDEval": typeof domains_evaluation_personas_industry_pharmaBDEval; - "domains/evaluation/personas/media/journalistEval": typeof domains_evaluation_personas_media_journalistEval; - "domains/evaluation/personas/media/mediaGroundTruth": typeof domains_evaluation_personas_media_mediaGroundTruth; - "domains/evaluation/personas/strategic/corpDevEval": typeof domains_evaluation_personas_strategic_corpDevEval; - "domains/evaluation/personas/strategic/founderStrategyEval": typeof domains_evaluation_personas_strategic_founderStrategyEval; - "domains/evaluation/personas/strategic/founderStrategyGroundTruth": typeof domains_evaluation_personas_strategic_founderStrategyGroundTruth; - "domains/evaluation/personas/strategic/macroStratEval": typeof domains_evaluation_personas_strategic_macroStratEval; - "domains/evaluation/personas/strategic/strategicGroundTruth": typeof domains_evaluation_personas_strategic_strategicGroundTruth; - "domains/evaluation/personas/technical/ctoTechLeadEval": typeof domains_evaluation_personas_technical_ctoTechLeadEval; - "domains/evaluation/personas/technical/technicalGroundTruth": typeof domains_evaluation_personas_technical_technicalGroundTruth; - "domains/evaluation/personas/types": typeof domains_evaluation_personas_types; - "domains/evaluation/personas/unifiedPersonaHarness": typeof domains_evaluation_personas_unifiedPersonaHarness; - "domains/evaluation/promptEnhancerScenarios": typeof domains_evaluation_promptEnhancerScenarios; - "domains/evaluation/runBenchmark": typeof domains_evaluation_runBenchmark; - "domains/evaluation/scenarioQueries": typeof domains_evaluation_scenarioQueries; - "domains/evaluation/scenarios/researchToolEval": typeof domains_evaluation_scenarios_researchToolEval; - "domains/evaluation/scenarios/researchUltraLongChatEval": typeof domains_evaluation_scenarios_researchUltraLongChatEval; - "domains/evaluation/scenarios/ultraLongChatRealPathEval": typeof domains_evaluation_scenarios_ultraLongChatRealPathEval; - "domains/evaluation/scoring/benchmarkSuite": typeof domains_evaluation_scoring_benchmarkSuite; - "domains/evaluation/scoring/claimLifecycle": typeof domains_evaluation_scoring_claimLifecycle; - "domains/evaluation/scoring/personaWeights": typeof domains_evaluation_scoring_personaWeights; - "domains/evaluation/scoring/riskCalibration": typeof domains_evaluation_scoring_riskCalibration; - "domains/evaluation/scoring/scoringFramework": typeof domains_evaluation_scoring_scoringFramework; - "domains/evaluation/scoring/sourceCitations": typeof domains_evaluation_scoring_sourceCitations; - "domains/evaluation/sourceQuality": typeof domains_evaluation_sourceQuality; - "domains/evaluation/systemE2E": typeof domains_evaluation_systemE2E; - "domains/evaluation/tasteBench": typeof domains_evaluation_tasteBench; - "domains/evaluation/tasteBenchPolicy": typeof domains_evaluation_tasteBenchPolicy; - "domains/evaluation/tasteBenchSchema": typeof domains_evaluation_tasteBenchSchema; - "domains/evaluation/testAgentDirect": typeof domains_evaluation_testAgentDirect; - "domains/evaluation/testAgentQueries": typeof domains_evaluation_testAgentQueries; - "domains/evaluation/testAnthropicApi": typeof domains_evaluation_testAnthropicApi; - "domains/evaluation/testDirectApi": typeof domains_evaluation_testDirectApi; - "domains/evaluation/testLlmJudge": typeof domains_evaluation_testLlmJudge; - "domains/evaluation/testing/testingFramework": typeof domains_evaluation_testing_testingFramework; - "domains/evaluation/ultraLongChat/batchRunner": typeof domains_evaluation_ultraLongChat_batchRunner; - "domains/evaluation/ultraLongChat/judge": typeof domains_evaluation_ultraLongChat_judge; - "domains/evaluation/ultraLongChat/regressionGate": typeof domains_evaluation_ultraLongChat_regressionGate; - "domains/evaluation/ultraLongChat/scenarios": typeof domains_evaluation_ultraLongChat_scenarios; - "domains/evaluation/ultraLongChat/storage": typeof domains_evaluation_ultraLongChat_storage; - "domains/evaluation/validators": typeof domains_evaluation_validators; - "domains/evaluation/workbenchQueries": typeof domains_evaluation_workbenchQueries; - "domains/financialOperator/attFixture": typeof domains_financialOperator_attFixture; - "domains/financialOperator/extractors": typeof domains_financialOperator_extractors; - "domains/financialOperator/fixtures/covenantFixture": typeof domains_financialOperator_fixtures_covenantFixture; - "domains/financialOperator/fixtures/crmFixture": typeof domains_financialOperator_fixtures_crmFixture; - "domains/financialOperator/fixtures/varianceFixture": typeof domains_financialOperator_fixtures_varianceFixture; - "domains/financialOperator/index": typeof domains_financialOperator_index; - "domains/financialOperator/orchestrator": typeof domains_financialOperator_orchestrator; - "domains/financialOperator/orchestratorExamples": typeof domains_financialOperator_orchestratorExamples; - "domains/financialOperator/realExtractors": typeof domains_financialOperator_realExtractors; - "domains/financialOperator/runOps": typeof domains_financialOperator_runOps; - "domains/financialOperator/sandbox": typeof domains_financialOperator_sandbox; - "domains/financialOperator/types": typeof domains_financialOperator_types; - "domains/financialOperator/validators": typeof domains_financialOperator_validators; - "domains/financial/balanceSheetFetcher": typeof domains_financial_balanceSheetFetcher; - "domains/financial/corporateActions": typeof domains_financial_corporateActions; - "domains/financial/corrections": typeof domains_financial_corrections; - "domains/financial/dcfBuilder": typeof domains_financial_dcfBuilder; - "domains/financial/dcfEvaluator": typeof domains_financial_dcfEvaluator; - "domains/financial/dcfOrchestrator": typeof domains_financial_dcfOrchestrator; - "domains/financial/dcfProgress": typeof domains_financial_dcfProgress; - "domains/financial/dcfSpreadsheetAdapter": typeof domains_financial_dcfSpreadsheetAdapter; - "domains/financial/dcfSpreadsheetMapping": typeof domains_financial_dcfSpreadsheetMapping; - "domains/financial/dcfTools": typeof domains_financial_dcfTools; - "domains/financial/financialAnalystAgent": typeof domains_financial_financialAnalystAgent; - "domains/financial/fundamentals": typeof domains_financial_fundamentals; - "domains/financial/groundTruthFetcher": typeof domains_financial_groundTruthFetcher; - "domains/financial/groundTruthManager": typeof domains_financial_groundTruthManager; - "domains/financial/inconclusiveOnFailure": typeof domains_financial_inconclusiveOnFailure; - "domains/financial/index": typeof domains_financial_index; - "domains/financial/interactiveDCFSession": typeof domains_financial_interactiveDCFSession; - "domains/financial/modelRiskGovernance": typeof domains_financial_modelRiskGovernance; - "domains/financial/reportGenerator": typeof domains_financial_reportGenerator; - "domains/financial/restatementPolicy": typeof domains_financial_restatementPolicy; - "domains/financial/secEdgarClient": typeof domains_financial_secEdgarClient; - "domains/financial/sensitivityAnalysis": typeof domains_financial_sensitivityAnalysis; - "domains/financial/taxonomyManagement": typeof domains_financial_taxonomyManagement; - "domains/financial/validation": typeof domains_financial_validation; - "domains/financial/xbrlParser": typeof domains_financial_xbrlParser; - "domains/forecasting/actions/computeCalibration": typeof domains_forecasting_actions_computeCalibration; - "domains/forecasting/actions/createForecast": typeof domains_forecasting_actions_createForecast; - "domains/forecasting/actions/refreshForecast": typeof domains_forecasting_actions_refreshForecast; - "domains/forecasting/actions/resolveForecast": typeof domains_forecasting_actions_resolveForecast; - "domains/forecasting/cronHandlers/dailyForecastRefresh": typeof domains_forecasting_cronHandlers_dailyForecastRefresh; - "domains/forecasting/cronHandlers/resolutionCheck": typeof domains_forecasting_cronHandlers_resolutionCheck; - "domains/forecasting/cronHandlers/weeklyCalibration": typeof domains_forecasting_cronHandlers_weeklyCalibration; - "domains/forecasting/forecastManager": typeof domains_forecasting_forecastManager; - "domains/forecasting/scoringEngine": typeof domains_forecasting_scoringEngine; - "domains/forecasting/signalMatcher": typeof domains_forecasting_signalMatcher; - "domains/forecasting/traceWrapper": typeof domains_forecasting_traceWrapper; - "domains/forecasting/validators": typeof domains_forecasting_validators; - "domains/founder/ambientIntelligenceJobs": typeof domains_founder_ambientIntelligenceJobs; - "domains/founder/ambientIntelligenceOps": typeof domains_founder_ambientIntelligenceOps; - "domains/founder/backgroundJobs": typeof domains_founder_backgroundJobs; - "domains/founder/causalMemoryJobs": typeof domains_founder_causalMemoryJobs; - "domains/founder/causalMemoryOps": typeof domains_founder_causalMemoryOps; - "domains/founder/founderHarnessOps": typeof domains_founder_founderHarnessOps; - "domains/founder/index": typeof domains_founder_index; - "domains/founder/operations": typeof domains_founder_operations; - "domains/founder/seed": typeof domains_founder_seed; - "domains/founder/seedTrigger": typeof domains_founder_seedTrigger; - "domains/founder/sharedContextOps": typeof domains_founder_sharedContextOps; - "domains/governance/provenanceExplainer": typeof domains_governance_provenanceExplainer; - "domains/governance/quarantine": typeof domains_governance_quarantine; - "domains/governance/trustPolicy": typeof domains_governance_trustPolicy; - "domains/graph/applyGraphPatch": typeof domains_graph_applyGraphPatch; - "domains/graph/autoExtractMentions": typeof domains_graph_autoExtractMentions; - "domains/graph/backlinkQueries": typeof domains_graph_backlinkQueries; - "domains/graph/expandEntity": typeof domains_graph_expandEntity; - "domains/graph/expansionQueries": typeof domains_graph_expansionQueries; - "domains/graph/index": typeof domains_graph_index; - "domains/groundTruth/auditLog": typeof domains_groundTruth_auditLog; - "domains/groundTruth/versions": typeof domains_groundTruth_versions; - "domains/hitl/adjudicationWorkflow": typeof domains_hitl_adjudicationWorkflow; - "domains/hitl/decisions": typeof domains_hitl_decisions; - "domains/hitl/distributionDriftDetection": typeof domains_hitl_distributionDriftDetection; - "domains/hitl/labelerCalibration": typeof domains_hitl_labelerCalibration; - "domains/hitl/labelingQueue": typeof domains_hitl_labelingQueue; - "domains/hitl/validationWorkspaceEnforcement": typeof domains_hitl_validationWorkspaceEnforcement; - "domains/hyperloop/operations": typeof domains_hyperloop_operations; - "domains/hyperloop/policy": typeof domains_hyperloop_policy; - "domains/integrations/billing/apiUsageTracking": typeof domains_integrations_billing_apiUsageTracking; - "domains/integrations/billing/billing": typeof domains_integrations_billing_billing; - "domains/integrations/billing/index": typeof domains_integrations_billing_index; - "domains/integrations/billing/rateLimiting": typeof domains_integrations_billing_rateLimiting; - "domains/integrations/discord": typeof domains_integrations_discord; - "domains/integrations/discordAgent": typeof domains_integrations_discordAgent; - "domains/integrations/email": typeof domains_integrations_email; - "domains/integrations/email/dailyEmailReport": typeof domains_integrations_email_dailyEmailReport; - "domains/integrations/email/dossierEmailExample": typeof domains_integrations_email_dossierEmailExample; - "domains/integrations/email/dossierEmailTemplate": typeof domains_integrations_email_dossierEmailTemplate; - "domains/integrations/email/emailAdmin": typeof domains_integrations_email_emailAdmin; - "domains/integrations/email/emailAdminActions": typeof domains_integrations_email_emailAdminActions; - "domains/integrations/email/emailEncounterIngest": typeof domains_integrations_email_emailEncounterIngest; - "domains/integrations/email/emailQueries": typeof domains_integrations_email_emailQueries; - "domains/integrations/email/emailService": typeof domains_integrations_email_emailService; - "domains/integrations/email/emailWebhook": typeof domains_integrations_email_emailWebhook; - "domains/integrations/email/morningDigestEmailTemplate": typeof domains_integrations_email_morningDigestEmailTemplate; - "domains/integrations/gcal": typeof domains_integrations_gcal; - "domains/integrations/gmail": typeof domains_integrations_gmail; - "domains/integrations/gmail/types": typeof domains_integrations_gmail_types; - "domains/integrations/index": typeof domains_integrations_index; - "domains/integrations/integrations": typeof domains_integrations_integrations; - "domains/integrations/landing/landingPageLog": typeof domains_integrations_landing_landingPageLog; - "domains/integrations/macro/fredSeed": typeof domains_integrations_macro_fredSeed; - "domains/integrations/ntfy": typeof domains_integrations_ntfy; - "domains/integrations/polar": typeof domains_integrations_polar; - "domains/integrations/resend": typeof domains_integrations_resend; - "domains/integrations/slack/encounterMutations": typeof domains_integrations_slack_encounterMutations; - "domains/integrations/slack/encounterParser": typeof domains_integrations_slack_encounterParser; - "domains/integrations/slack/encounterResearch": typeof domains_integrations_slack_encounterResearch; - "domains/integrations/slack/encounterResearchQueries": typeof domains_integrations_slack_encounterResearchQueries; - "domains/integrations/slack/encounterResolver": typeof domains_integrations_slack_encounterResolver; - "domains/integrations/slack/index": typeof domains_integrations_slack_index; - "domains/integrations/slack/slackAgent": typeof domains_integrations_slack_slackAgent; - "domains/integrations/slack/slackBlocks": typeof domains_integrations_slack_slackBlocks; - "domains/integrations/slack/slackWebhook": typeof domains_integrations_slack_slackWebhook; - "domains/integrations/sms": typeof domains_integrations_sms; - "domains/integrations/spreadsheets": typeof domains_integrations_spreadsheets; - "domains/integrations/telegram": typeof domains_integrations_telegram; - "domains/integrations/telegramAgent": typeof domains_integrations_telegramAgent; - "domains/integrations/video/oembedFetcher": typeof domains_integrations_video_oembedFetcher; - "domains/integrations/video/oembedFetcherQueries": typeof domains_integrations_video_oembedFetcherQueries; - "domains/integrations/voice/costLedger": typeof domains_integrations_voice_costLedger; - "domains/integrations/voice/editionTts": typeof domains_integrations_voice_editionTts; - "domains/integrations/voice/realtimeAudit": typeof domains_integrations_voice_realtimeAudit; - "domains/integrations/voice/realtimeGateway": typeof domains_integrations_voice_realtimeGateway; - "domains/integrations/voice/voiceActions": typeof domains_integrations_voice_voiceActions; - "domains/integrations/voice/voiceAgent": typeof domains_integrations_voice_voiceAgent; - "domains/integrations/voice/voiceMutations": typeof domains_integrations_voice_voiceMutations; - "domains/intelligence/operations": typeof domains_intelligence_operations; - "domains/knowledge/adaptiveEntityEnrichment": typeof domains_knowledge_adaptiveEntityEnrichment; - "domains/knowledge/adaptiveEntityQueries": typeof domains_knowledge_adaptiveEntityQueries; - "domains/knowledge/entityContexts": typeof domains_knowledge_entityContexts; - "domains/knowledge/entityInsights": typeof domains_knowledge_entityInsights; - "domains/knowledge/index": typeof domains_knowledge_index; - "domains/knowledge/knowledgeGraph": typeof domains_knowledge_knowledgeGraph; - "domains/knowledge/learning/adaptiveLearning": typeof domains_knowledge_learning_adaptiveLearning; - "domains/knowledge/nodes": typeof domains_knowledge_nodes; - "domains/knowledge/relationTypes": typeof domains_knowledge_relationTypes; - "domains/knowledge/relations": typeof domains_knowledge_relations; - "domains/knowledge/relationshipGraph": typeof domains_knowledge_relationshipGraph; - "domains/knowledge/sourceDiffs": typeof domains_knowledge_sourceDiffs; - "domains/knowledge/sourceRegistry": typeof domains_knowledge_sourceRegistry; - "domains/knowledge/tags": typeof domains_knowledge_tags; - "domains/knowledge/teachability/index": typeof domains_knowledge_teachability_index; - "domains/landing/landingPageLog": typeof domains_landing_landingPageLog; - "domains/learning/adaptiveLearning": typeof domains_learning_adaptiveLearning; - "domains/mcp/apiKeys": typeof domains_mcp_apiKeys; - "domains/mcp/apiKeysSchema": typeof domains_mcp_apiKeysSchema; - "domains/mcp/mcp": typeof domains_mcp_mcp; - "domains/mcp/mcpAuth": typeof domains_mcp_mcpAuth; - "domains/mcp/mcpBridgeHttp": typeof domains_mcp_mcpBridgeHttp; - "domains/mcp/mcpBridgeQueries": typeof domains_mcp_mcpBridgeQueries; - "domains/mcp/mcpClient": typeof domains_mcp_mcpClient; - "domains/mcp/mcpExecutionTraceEndpoints": typeof domains_mcp_mcpExecutionTraceEndpoints; - "domains/mcp/mcpGatewayDispatcher": typeof domains_mcp_mcpGatewayDispatcher; - "domains/mcp/mcpHttpAuth": typeof domains_mcp_mcpHttpAuth; - "domains/mcp/mcpHybridSearch": typeof domains_mcp_mcpHybridSearch; - "domains/mcp/mcpLearning": typeof domains_mcp_mcpLearning; - "domains/mcp/mcpMemory": typeof domains_mcp_mcpMemory; - "domains/mcp/mcpMemoryHttp": typeof domains_mcp_mcpMemoryHttp; - "domains/mcp/mcpNarrativeEndpoints": typeof domains_mcp_mcpNarrativeEndpoints; - "domains/mcp/mcpPlans": typeof domains_mcp_mcpPlans; - "domains/mcp/mcpPlansHttp": typeof domains_mcp_mcpPlansHttp; - "domains/mcp/mcpResearchEndpoints": typeof domains_mcp_mcpResearchEndpoints; - "domains/mcp/mcpSourcingContract": typeof domains_mcp_mcpSourcingContract; - "domains/mcp/mcpSourcingDraft": typeof domains_mcp_mcpSourcingDraft; - "domains/mcp/mcpToolLedger": typeof domains_mcp_mcpToolLedger; - "domains/mcp/mcpToolRegistry": typeof domains_mcp_mcpToolRegistry; - "domains/mcp/mcpVerificationEndpoints": typeof domains_mcp_mcpVerificationEndpoints; - "domains/mcp/webmcpOriginManager": typeof domains_mcp_webmcpOriginManager; - "domains/messaging/channelPreferencesManager": typeof domains_messaging_channelPreferencesManager; - "domains/messaging/channelProvider": typeof domains_messaging_channelProvider; - "domains/messaging/channels/channelIntelligence": typeof domains_messaging_channels_channelIntelligence; - "domains/messaging/channels/engagementOptimizer": typeof domains_messaging_channels_engagementOptimizer; - "domains/messaging/channels/index": typeof domains_messaging_channels_index; - "domains/messaging/inboundPipeline": typeof domains_messaging_inboundPipeline; - "domains/messaging/messagingObservability": typeof domains_messaging_messagingObservability; - "domains/messaging/messagingSecurity": typeof domains_messaging_messagingSecurity; - "domains/messaging/outboundPipeline": typeof domains_messaging_outboundPipeline; - "domains/messaging/providerRegistry": typeof domains_messaging_providerRegistry; - "domains/messaging/providers/discordProvider": typeof domains_messaging_providers_discordProvider; - "domains/messaging/providers/emailProvider": typeof domains_messaging_providers_emailProvider; - "domains/messaging/providers/ntfyProvider": typeof domains_messaging_providers_ntfyProvider; - "domains/messaging/providers/openclawGatewayClient": typeof domains_messaging_providers_openclawGatewayClient; - "domains/messaging/providers/openclawProvider": typeof domains_messaging_providers_openclawProvider; - "domains/messaging/providers/slackProvider": typeof domains_messaging_providers_slackProvider; - "domains/messaging/providers/smsProvider": typeof domains_messaging_providers_smsProvider; - "domains/messaging/providers/telegramProvider": typeof domains_messaging_providers_telegramProvider; - "domains/messaging/providers/uiProvider": typeof domains_messaging_providers_uiProvider; - "domains/missions/costQueries": typeof domains_missions_costQueries; - "domains/missions/index": typeof domains_missions_index; - "domains/missions/missionOrchestrator": typeof domains_missions_missionOrchestrator; - "domains/missions/preExecutionGate": typeof domains_missions_preExecutionGate; - "domains/missions/preExecutionGateQueries": typeof domains_missions_preExecutionGateQueries; - "domains/models/autonomousModelResolver": typeof domains_models_autonomousModelResolver; - "domains/models/freeModelDiscovery": typeof domains_models_freeModelDiscovery; - "domains/models/index": typeof domains_models_index; - "domains/models/livePerformanceEval": typeof domains_models_livePerformanceEval; - "domains/models/modelRouter": typeof domains_models_modelRouter; - "domains/models/modelRouterQueries": typeof domains_models_modelRouterQueries; - "domains/monitoring/gdeltSeed": typeof domains_monitoring_gdeltSeed; - "domains/monitoring/industryUpdates": typeof domains_monitoring_industryUpdates; - "domains/monitoring/industryUpdatesEnhanced": typeof domains_monitoring_industryUpdatesEnhanced; - "domains/monitoring/integrationHelpers": typeof domains_monitoring_integrationHelpers; - "domains/monitoring/publicTrendingSeed": typeof domains_monitoring_publicTrendingSeed; - "domains/monitoring/worldMonitor": typeof domains_monitoring_worldMonitor; - "domains/narrative/actions/competingExplanations": typeof domains_narrative_actions_competingExplanations; - "domains/narrative/actions/hypothesisLifecycle": typeof domains_narrative_actions_hypothesisLifecycle; - "domains/narrative/adapters/briefAdapter": typeof domains_narrative_adapters_briefAdapter; - "domains/narrative/adapters/feedAdapter": typeof domains_narrative_adapters_feedAdapter; - "domains/narrative/adapters/index": typeof domains_narrative_adapters_index; - "domains/narrative/adapters/linkedinAdapter": typeof domains_narrative_adapters_linkedinAdapter; - "domains/narrative/adapters/pipelineQueries": typeof domains_narrative_adapters_pipelineQueries; - "domains/narrative/adapters/types": typeof domains_narrative_adapters_types; - "domains/narrative/contracts/eventClassificationContract": typeof domains_narrative_contracts_eventClassificationContract; - "domains/narrative/cronHandlers": typeof domains_narrative_cronHandlers; - "domains/narrative/crons": typeof domains_narrative_crons; - "domains/narrative/didYouKnow": typeof domains_narrative_didYouKnow; - "domains/narrative/didYouKnowSources": typeof domains_narrative_didYouKnowSources; - "domains/narrative/experiments/freshNewsDidYouKnowExperiment": typeof domains_narrative_experiments_freshNewsDidYouKnowExperiment; - "domains/narrative/guards/claimClassificationGate": typeof domains_narrative_guards_claimClassificationGate; - "domains/narrative/guards/claimClassificationGateQueries": typeof domains_narrative_guards_claimClassificationGateQueries; - "domains/narrative/guards/claimClassifier": typeof domains_narrative_guards_claimClassifier; - "domains/narrative/guards/contentRights": typeof domains_narrative_guards_contentRights; - "domains/narrative/guards/index": typeof domains_narrative_guards_index; - "domains/narrative/guards/injectionContainment": typeof domains_narrative_guards_injectionContainment; - "domains/narrative/guards/quarantine": typeof domains_narrative_guards_quarantine; - "domains/narrative/guards/selfCitationGuard": typeof domains_narrative_guards_selfCitationGuard; - "domains/narrative/guards/trustScoring": typeof domains_narrative_guards_trustScoring; - "domains/narrative/guards/truthMaintenance": typeof domains_narrative_guards_truthMaintenance; - "domains/narrative/index": typeof domains_narrative_index; - "domains/narrative/integrations/hooks": typeof domains_narrative_integrations_hooks; - "domains/narrative/mutations/correlations": typeof domains_narrative_mutations_correlations; - "domains/narrative/mutations/dedup": typeof domains_narrative_mutations_dedup; - "domains/narrative/mutations/disputes": typeof domains_narrative_mutations_disputes; - "domains/narrative/mutations/events": typeof domains_narrative_mutations_events; - "domains/narrative/mutations/evidence": typeof domains_narrative_mutations_evidence; - "domains/narrative/mutations/hypotheses": typeof domains_narrative_mutations_hypotheses; - "domains/narrative/mutations/policyEnforcedOps": typeof domains_narrative_mutations_policyEnforcedOps; - "domains/narrative/mutations/posts": typeof domains_narrative_mutations_posts; - "domains/narrative/mutations/replies": typeof domains_narrative_mutations_replies; - "domains/narrative/mutations/searchLog": typeof domains_narrative_mutations_searchLog; - "domains/narrative/mutations/signalMetrics": typeof domains_narrative_mutations_signalMetrics; - "domains/narrative/mutations/temporalFacts": typeof domains_narrative_mutations_temporalFacts; - "domains/narrative/mutations/threads": typeof domains_narrative_mutations_threads; - "domains/narrative/mutations/toolReplay": typeof domains_narrative_mutations_toolReplay; - "domains/narrative/mutations/workflowTrace": typeof domains_narrative_mutations_workflowTrace; - "domains/narrative/newsroom/agents/analystAgent": typeof domains_narrative_newsroom_agents_analystAgent; - "domains/narrative/newsroom/agents/commentHarvester": typeof domains_narrative_newsroom_agents_commentHarvester; - "domains/narrative/newsroom/agents/curatorAgent": typeof domains_narrative_newsroom_agents_curatorAgent; - "domains/narrative/newsroom/agents/historianAgent": typeof domains_narrative_newsroom_agents_historianAgent; - "domains/narrative/newsroom/agents/index": typeof domains_narrative_newsroom_agents_index; - "domains/narrative/newsroom/agents/publisherAgent": typeof domains_narrative_newsroom_agents_publisherAgent; - "domains/narrative/newsroom/agents/scoutAgent": typeof domains_narrative_newsroom_agents_scoutAgent; - "domains/narrative/newsroom/agents/signalCollectorAgent": typeof domains_narrative_newsroom_agents_signalCollectorAgent; - "domains/narrative/newsroom/recordReplayLane": typeof domains_narrative_newsroom_recordReplayLane; - "domains/narrative/newsroom/state": typeof domains_narrative_newsroom_state; - "domains/narrative/newsroom/workflow": typeof domains_narrative_newsroom_workflow; - "domains/narrative/policies/contentRights": typeof domains_narrative_policies_contentRights; - "domains/narrative/queries/correlations": typeof domains_narrative_queries_correlations; - "domains/narrative/queries/disputes": typeof domains_narrative_queries_disputes; - "domains/narrative/queries/events": typeof domains_narrative_queries_events; - "domains/narrative/queries/hypotheses": typeof domains_narrative_queries_hypotheses; - "domains/narrative/queries/posts": typeof domains_narrative_queries_posts; - "domains/narrative/queries/searchLog": typeof domains_narrative_queries_searchLog; - "domains/narrative/queries/signalMetrics": typeof domains_narrative_queries_signalMetrics; - "domains/narrative/queries/threads": typeof domains_narrative_queries_threads; - "domains/narrative/safety/abuseResistance": typeof domains_narrative_safety_abuseResistance; - "domains/narrative/tests/goldenSets/generatedCases": typeof domains_narrative_tests_goldenSets_generatedCases; - "domains/narrative/tests/goldenSets/types": typeof domains_narrative_tests_goldenSets_types; - "domains/narrative/tests/qaFramework": typeof domains_narrative_tests_qaFramework; - "domains/narrative/tests/validatePipeline": typeof domains_narrative_tests_validatePipeline; - "domains/narrative/truth/truthStateManager": typeof domains_narrative_truth_truthStateManager; - "domains/narrative/validators": typeof domains_narrative_validators; - "domains/observability/dashboardData": typeof domains_observability_dashboardData; - "domains/observability/healthMonitor": typeof domains_observability_healthMonitor; - "domains/observability/index": typeof domains_observability_index; - "domains/observability/selfHealer": typeof domains_observability_selfHealer; - "domains/observability/telemetry": typeof domains_observability_telemetry; - "domains/observability/traces": typeof domains_observability_traces; - "domains/openclaw/executionEngine": typeof domains_openclaw_executionEngine; - "domains/openclaw/forecastHandoffPolicy": typeof domains_openclaw_forecastHandoffPolicy; - "domains/openclaw/monitoring": typeof domains_openclaw_monitoring; - "domains/openclaw/sessionManager": typeof domains_openclaw_sessionManager; - "domains/openclaw/tools/openclawAgentTools": typeof domains_openclaw_tools_openclawAgentTools; - "domains/openclaw/workflowManager": typeof domains_openclaw_workflowManager; - "domains/operations/adminAuditLog": typeof domains_operations_adminAuditLog; - "domains/operations/autonomousControlTower": typeof domains_operations_autonomousControlTower; - "domains/operations/batchAutopilot/deltaCollector": typeof domains_operations_batchAutopilot_deltaCollector; - "domains/operations/batchAutopilot/mutations": typeof domains_operations_batchAutopilot_mutations; - "domains/operations/batchAutopilot/promptBuilder": typeof domains_operations_batchAutopilot_promptBuilder; - "domains/operations/batchAutopilot/queries": typeof domains_operations_batchAutopilot_queries; - "domains/operations/batchAutopilot/runner": typeof domains_operations_batchAutopilot_runner; - "domains/operations/batchAutopilot/scheduler": typeof domains_operations_batchAutopilot_scheduler; - "domains/operations/bugLoop": typeof domains_operations_bugLoop; - "domains/operations/encounters/encounterCapture": typeof domains_operations_encounters_encounterCapture; - "domains/operations/encounters/encounterFastPass": typeof domains_operations_encounters_encounterFastPass; - "domains/operations/encounters/encounterMutations": typeof domains_operations_encounters_encounterMutations; - "domains/operations/encounters/encounterQueries": typeof domains_operations_encounters_encounterQueries; - "domains/operations/encounters/index": typeof domains_operations_encounters_index; - "domains/operations/encounters/types": typeof domains_operations_encounters_types; - "domains/operations/gameDayTracking": typeof domains_operations_gameDayTracking; - "domains/operations/governance/provenanceExplainer": typeof domains_operations_governance_provenanceExplainer; - "domains/operations/governance/quarantine": typeof domains_operations_governance_quarantine; - "domains/operations/governance/trustPolicy": typeof domains_operations_governance_trustPolicy; - "domains/operations/hitl/adjudicationWorkflow": typeof domains_operations_hitl_adjudicationWorkflow; - "domains/operations/hitl/decisions": typeof domains_operations_hitl_decisions; - "domains/operations/hitl/distributionDriftDetection": typeof domains_operations_hitl_distributionDriftDetection; - "domains/operations/hitl/labelerCalibration": typeof domains_operations_hitl_labelerCalibration; - "domains/operations/hitl/labelingQueue": typeof domains_operations_hitl_labelingQueue; - "domains/operations/hitl/validationWorkspaceEnforcement": typeof domains_operations_hitl_validationWorkspaceEnforcement; - "domains/operations/mcpRateLimiting": typeof domains_operations_mcpRateLimiting; - "domains/operations/mcpSecurity": typeof domains_operations_mcpSecurity; - "domains/operations/monitoring/industryUpdates": typeof domains_operations_monitoring_industryUpdates; - "domains/operations/monitoring/industryUpdatesEnhanced": typeof domains_operations_monitoring_industryUpdatesEnhanced; - "domains/operations/monitoring/integrationHelpers": typeof domains_operations_monitoring_integrationHelpers; - "domains/operations/observability/dashboardData": typeof domains_operations_observability_dashboardData; - "domains/operations/observability/healthMonitor": typeof domains_operations_observability_healthMonitor; - "domains/operations/observability/index": typeof domains_operations_observability_index; - "domains/operations/observability/selfHealer": typeof domains_operations_observability_selfHealer; - "domains/operations/observability/telemetry": typeof domains_operations_observability_telemetry; - "domains/operations/observability/traces": typeof domains_operations_observability_traces; - "domains/operations/personaChangeTracking": typeof domains_operations_personaChangeTracking; - "domains/operations/postExecutionHygiene": typeof domains_operations_postExecutionHygiene; - "domains/operations/privacyEnforcement": typeof domains_operations_privacyEnforcement; - "domains/operations/selfMaintenance": typeof domains_operations_selfMaintenance; - "domains/operations/selfMaintenanceChecks": typeof domains_operations_selfMaintenanceChecks; - "domains/operations/sloCalculation": typeof domains_operations_sloCalculation; - "domains/operations/sloCollector": typeof domains_operations_sloCollector; - "domains/operations/sloDashboardQueries": typeof domains_operations_sloDashboardQueries; - "domains/operations/sloFramework": typeof domains_operations_sloFramework; - "domains/operations/taskManager/cronWrapper": typeof domains_operations_taskManager_cronWrapper; - "domains/operations/taskManager/index": typeof domains_operations_taskManager_index; - "domains/operations/taskManager/mutations": typeof domains_operations_taskManager_mutations; - "domains/operations/taskManager/proofPack": typeof domains_operations_taskManager_proofPack; - "domains/operations/taskManager/queries": typeof domains_operations_taskManager_queries; - "domains/operations/tasks/dailyNotes": typeof domains_operations_tasks_dailyNotes; - "domains/operations/tasks/eventTaskDocuments": typeof domains_operations_tasks_eventTaskDocuments; - "domains/operations/tasks/index": typeof domains_operations_tasks_index; - "domains/operations/tasks/userEvents": typeof domains_operations_tasks_userEvents; - "domains/operations/tasks/work": typeof domains_operations_tasks_work; - "domains/operations/tasks/workflows/bankingMemoWorkflow": typeof domains_operations_tasks_workflows_bankingMemoWorkflow; - "domains/operations/tasks/workflows/coordinatorWorkflow": typeof domains_operations_tasks_workflows_coordinatorWorkflow; - "domains/operations/tasks/workflows/index": typeof domains_operations_tasks_workflows_index; - "domains/operations/telemetry/disclosureEvents": typeof domains_operations_telemetry_disclosureEvents; - "domains/operations/utilities/migrations": typeof domains_operations_utilities_migrations; - "domains/operations/utilities/seedGoldenDataset": typeof domains_operations_utilities_seedGoldenDataset; - "domains/operations/utilities/snapshotMigrations": typeof domains_operations_utilities_snapshotMigrations; - "domains/operations/validationWorkflow": typeof domains_operations_validationWorkflow; - "domains/operatorProfile/filesystemSync": typeof domains_operatorProfile_filesystemSync; - "domains/operatorProfile/manifest": typeof domains_operatorProfile_manifest; - "domains/operatorProfile/mutations": typeof domains_operatorProfile_mutations; - "domains/operatorProfile/parser": typeof domains_operatorProfile_parser; - "domains/operatorProfile/queries": typeof domains_operatorProfile_queries; - "domains/operatorProfile/template": typeof domains_operatorProfile_template; - "domains/oracle/index": typeof domains_oracle_index; - "domains/oracle/mutations": typeof domains_oracle_mutations; - "domains/oracle/queries": typeof domains_oracle_queries; - "domains/personas/index": typeof domains_personas_index; - "domains/personas/multiPersonaSynthesizer": typeof domains_personas_multiPersonaSynthesizer; - "domains/personas/personaAutonomousAgent": typeof domains_personas_personaAutonomousAgent; - "domains/pipelines/codeGenPipeline": typeof domains_pipelines_codeGenPipeline; - "domains/pipelines/composedPipeline": typeof domains_pipelines_composedPipeline; - "domains/pipelines/designGenPipeline": typeof domains_pipelines_designGenPipeline; - "domains/pipelines/linkupAdapter": typeof domains_pipelines_linkupAdapter; - "domains/pipelines/piRuntime": typeof domains_pipelines_piRuntime; - "domains/pipelines/pipelineAdmission": typeof domains_pipelines_pipelineAdmission; - "domains/pipelines/pipelineAttempt": typeof domains_pipelines_pipelineAttempt; - "domains/pipelines/pipelineDocumentHandoff": typeof domains_pipelines_pipelineDocumentHandoff; - "domains/pipelines/pipelineEvalQueries": typeof domains_pipelines_pipelineEvalQueries; - "domains/pipelines/pipelineMcpHttp": typeof domains_pipelines_pipelineMcpHttp; - "domains/pipelines/pipelineOwnership": typeof domains_pipelines_pipelineOwnership; - "domains/pipelines/pipelineRunsMutations": typeof domains_pipelines_pipelineRunsMutations; - "domains/pipelines/pipelineRunsQueries": typeof domains_pipelines_pipelineRunsQueries; - "domains/pipelines/pipelineSchedule": typeof domains_pipelines_pipelineSchedule; - "domains/pipelines/pipelineStreamMutations": typeof domains_pipelines_pipelineStreamMutations; - "domains/pipelines/pipelineTrace": typeof domains_pipelines_pipelineTrace; - "domains/pipelines/pipelineWorkflow": typeof domains_pipelines_pipelineWorkflow; - "domains/pipelines/researchPipeline": typeof domains_pipelines_researchPipeline; - "domains/pipelines/researchProvenance": typeof domains_pipelines_researchProvenance; - "domains/proactive/actions/emailDraftGenerator": typeof domains_proactive_actions_emailDraftGenerator; - "domains/proactive/actions/gmailDraftActions": typeof domains_proactive_actions_gmailDraftActions; - "domains/proactive/actions/testDraftGenerator": typeof domains_proactive_actions_testDraftGenerator; - "domains/proactive/actions/testOpenRouterProvider": typeof domains_proactive_actions_testOpenRouterProvider; - "domains/proactive/actions/testSimpleDraft": typeof domains_proactive_actions_testSimpleDraft; - "domains/proactive/adapters/calendarEventAdapter": typeof domains_proactive_adapters_calendarEventAdapter; - "domains/proactive/adapters/emailEventAdapter": typeof domains_proactive_adapters_emailEventAdapter; - "domains/proactive/adminQueries": typeof domains_proactive_adminQueries; - "domains/proactive/agentDispatch": typeof domains_proactive_agentDispatch; - "domains/proactive/consentMutations": typeof domains_proactive_consentMutations; - "domains/proactive/deliveryOrchestrator": typeof domains_proactive_deliveryOrchestrator; - "domains/proactive/delivery/slackDelivery": typeof domains_proactive_delivery_slackDelivery; - "domains/proactive/detectors/BaseDetector": typeof domains_proactive_detectors_BaseDetector; - "domains/proactive/detectors/dailyBriefDetector": typeof domains_proactive_detectors_dailyBriefDetector; - "domains/proactive/detectors/executor": typeof domains_proactive_detectors_executor; - "domains/proactive/detectors/followUpDetector": typeof domains_proactive_detectors_followUpDetector; - "domains/proactive/detectors/meetingPrepDetector": typeof domains_proactive_detectors_meetingPrepDetector; - "domains/proactive/detectors/registry": typeof domains_proactive_detectors_registry; - "domains/proactive/detectors/types": typeof domains_proactive_detectors_types; - "domains/proactive/mutations": typeof domains_proactive_mutations; - "domains/proactive/policyGateway": typeof domains_proactive_policyGateway; - "domains/proactive/queries": typeof domains_proactive_queries; - "domains/proactive/recomm/feedback": typeof domains_proactive_recomm_feedback; - "domains/proactive/recommendations/behaviorTracking": typeof domains_proactive_recommendations_behaviorTracking; - "domains/proactive/recommendations/index": typeof domains_proactive_recommendations_index; - "domains/proactive/recommendations/recommendationEngine": typeof domains_proactive_recommendations_recommendationEngine; - "domains/proactive/seedAdmins": typeof domains_proactive_seedAdmins; - "domains/product/activity": typeof domains_product_activity; - "domains/product/blockOrdering": typeof domains_product_blockOrdering; - "domains/product/blockProsemirror": typeof domains_product_blockProsemirror; - "domains/product/blocks": typeof domains_product_blocks; - "domains/product/bootstrap": typeof domains_product_bootstrap; - "domains/product/chat": typeof domains_product_chat; - "domains/product/delivery": typeof domains_product_delivery; - "domains/product/diligenceCheckpointStructuring": typeof domains_product_diligenceCheckpointStructuring; - "domains/product/diligenceJudge": typeof domains_product_diligenceJudge; - "domains/product/diligenceLlmJudgeRuns": typeof domains_product_diligenceLlmJudgeRuns; - "domains/product/diligenceProjectionRuntime": typeof domains_product_diligenceProjectionRuntime; - "domains/product/diligenceProjections": typeof domains_product_diligenceProjections; - "domains/product/diligenceRunTelemetry": typeof domains_product_diligenceRunTelemetry; - "domains/product/diligenceScratchpads": typeof domains_product_diligenceScratchpads; - "domains/product/documents": typeof domains_product_documents; - "domains/product/entities": typeof domains_product_entities; - "domains/product/entityMemory": typeof domains_product_entityMemory; - "domains/product/eventWorkspace": typeof domains_product_eventWorkspace; - "domains/product/extendedThinking": typeof domains_product_extendedThinking; - "domains/product/helpers": typeof domains_product_helpers; - "domains/product/home": typeof domains_product_home; - "domains/product/me": typeof domains_product_me; - "domains/product/notebookPresence": typeof domains_product_notebookPresence; - "domains/product/notebookTracking": typeof domains_product_notebookTracking; - "domains/product/nudgeHelpers": typeof domains_product_nudgeHelpers; - "domains/product/nudges": typeof domains_product_nudges; - "domains/product/pipelineReliability": typeof domains_product_pipelineReliability; - "domains/product/pipelineRetryDispatcher": typeof domains_product_pipelineRetryDispatcher; - "domains/product/publicShares": typeof domains_product_publicShares; - "domains/product/pulseReports": typeof domains_product_pulseReports; - "domains/product/reports": typeof domains_product_reports; - "domains/product/scratchnodeImport": typeof domains_product_scratchnodeImport; - "domains/product/sessionArtifacts": typeof domains_product_sessionArtifacts; - "domains/product/shares": typeof domains_product_shares; - "domains/product/shell": typeof domains_product_shell; - "domains/product/systemIntelligence": typeof domains_product_systemIntelligence; - "domains/product/userWikiMaintainer": typeof domains_product_userWikiMaintainer; - "domains/product/userWikiSchema": typeof domains_product_userWikiSchema; - "domains/product/visibilityBackfill": typeof domains_product_visibilityBackfill; - "domains/product/wikiDreamingEvalProduction": typeof domains_product_wikiDreamingEvalProduction; - "domains/product/wikiDreamingEvaluation": typeof domains_product_wikiDreamingEvaluation; - "domains/product/wikiDreamingEvaluationNatural": typeof domains_product_wikiDreamingEvaluationNatural; - "domains/product/wikiDreamingGraph": typeof domains_product_wikiDreamingGraph; - "domains/product/wikiDreamingQueries": typeof domains_product_wikiDreamingQueries; - "domains/product/wikiStagingMutations": typeof domains_product_wikiStagingMutations; - "domains/profiler/mutations": typeof domains_profiler_mutations; - "domains/profiler/queries": typeof domains_profiler_queries; - "domains/publicResearch/actions": typeof domains_publicResearch_actions; - "domains/publicResearch/core": typeof domains_publicResearch_core; - "domains/publishing/deliveryQueue": typeof domains_publishing_deliveryQueue; - "domains/publishing/index": typeof domains_publishing_index; - "domains/publishing/publishingOrchestrator": typeof domains_publishing_publishingOrchestrator; - "domains/quickCapture/index": typeof domains_quickCapture_index; - "domains/quickCapture/quickCapture": typeof domains_quickCapture_quickCapture; - "domains/quickCapture/voiceMemos": typeof domains_quickCapture_voiceMemos; - "domains/recomm/feedback": typeof domains_recomm_feedback; - "domains/recommendations/behaviorTracking": typeof domains_recommendations_behaviorTracking; - "domains/recommendations/index": typeof domains_recommendations_index; - "domains/recommendations/recommendationEngine": typeof domains_recommendations_recommendationEngine; - "domains/redesign/agentRunFeedback": typeof domains_redesign_agentRunFeedback; - "domains/redesign/chatRuns": typeof domains_redesign_chatRuns; - "domains/redesign/documentPatches": typeof domains_redesign_documentPatches; - "domains/redesign/inboxSnoozes": typeof domains_redesign_inboxSnoozes; - "domains/redesign/reportGraphNeighborhood": typeof domains_redesign_reportGraphNeighborhood; - "domains/redesign/reportTopology": typeof domains_redesign_reportTopology; - "domains/redesign/reportTopologyRuntime": typeof domains_redesign_reportTopologyRuntime; - "domains/redesign/styleProfile": typeof domains_redesign_styleProfile; - "domains/redesign/universes": typeof domains_redesign_universes; - "domains/research/angleRegistry": typeof domains_research_angleRegistry; - "domains/research/autonomousResearcher": typeof domains_research_autonomousResearcher; - "domains/research/briefGenerator": typeof domains_research_briefGenerator; - "domains/research/dailyBriefInitializer": typeof domains_research_dailyBriefInitializer; - "domains/research/dailyBriefMemoryMutations": typeof domains_research_dailyBriefMemoryMutations; - "domains/research/dailyBriefMemoryQueries": typeof domains_research_dailyBriefMemoryQueries; - "domains/research/dailyBriefPersonalOverlay": typeof domains_research_dailyBriefPersonalOverlay; - "domains/research/dailyBriefPersonalOverlayMutations": typeof domains_research_dailyBriefPersonalOverlayMutations; - "domains/research/dailyBriefPersonalOverlayQueries": typeof domains_research_dailyBriefPersonalOverlayQueries; - "domains/research/dailyBriefSourceVerification": typeof domains_research_dailyBriefSourceVerification; - "domains/research/dailyBriefWorker": typeof domains_research_dailyBriefWorker; - "domains/research/dashboardMetrics": typeof domains_research_dashboardMetrics; - "domains/research/dashboardMutations": typeof domains_research_dashboardMutations; - "domains/research/dashboardQueries": typeof domains_research_dashboardQueries; - "domains/research/dealFlow": typeof domains_research_dealFlow; - "domains/research/dealFlowQueries": typeof domains_research_dealFlowQueries; - "domains/research/documentDiscovery": typeof domains_research_documentDiscovery; - "domains/research/editionQueries": typeof domains_research_editionQueries; - "domains/research/editionScoreboardSeed": typeof domains_research_editionScoreboardSeed; - "domains/research/entities/decayManager": typeof domains_research_entities_decayManager; - "domains/research/entities/entityLifecycle": typeof domains_research_entities_entityLifecycle; - "domains/research/entities/index": typeof domains_research_entities_index; - "domains/research/executiveBrief": typeof domains_research_executiveBrief; - "domains/research/expandResource": typeof domains_research_expandResource; - "domains/research/financial/balanceSheetFetcher": typeof domains_research_financial_balanceSheetFetcher; - "domains/research/financial/corporateActions": typeof domains_research_financial_corporateActions; - "domains/research/financial/corrections": typeof domains_research_financial_corrections; - "domains/research/financial/dcfBuilder": typeof domains_research_financial_dcfBuilder; - "domains/research/financial/dcfEvaluator": typeof domains_research_financial_dcfEvaluator; - "domains/research/financial/dcfOrchestrator": typeof domains_research_financial_dcfOrchestrator; - "domains/research/financial/dcfProgress": typeof domains_research_financial_dcfProgress; - "domains/research/financial/dcfSpreadsheetAdapter": typeof domains_research_financial_dcfSpreadsheetAdapter; - "domains/research/financial/dcfSpreadsheetMapping": typeof domains_research_financial_dcfSpreadsheetMapping; - "domains/research/financial/dcfTools": typeof domains_research_financial_dcfTools; - "domains/research/financial/financialAnalystAgent": typeof domains_research_financial_financialAnalystAgent; - "domains/research/financial/fundamentals": typeof domains_research_financial_fundamentals; - "domains/research/financial/groundTruthFetcher": typeof domains_research_financial_groundTruthFetcher; - "domains/research/financial/groundTruthManager": typeof domains_research_financial_groundTruthManager; - "domains/research/financial/inconclusiveOnFailure": typeof domains_research_financial_inconclusiveOnFailure; - "domains/research/financial/index": typeof domains_research_financial_index; - "domains/research/financial/interactiveDCFSession": typeof domains_research_financial_interactiveDCFSession; - "domains/research/financial/modelRiskGovernance": typeof domains_research_financial_modelRiskGovernance; - "domains/research/financial/reportGenerator": typeof domains_research_financial_reportGenerator; - "domains/research/financial/restatementPolicy": typeof domains_research_financial_restatementPolicy; - "domains/research/financial/secEdgarClient": typeof domains_research_financial_secEdgarClient; - "domains/research/financial/sensitivityAnalysis": typeof domains_research_financial_sensitivityAnalysis; - "domains/research/financial/taxonomyManagement": typeof domains_research_financial_taxonomyManagement; - "domains/research/financial/validation": typeof domains_research_financial_validation; - "domains/research/financial/xbrlParser": typeof domains_research_financial_xbrlParser; - "domains/research/forYouFeed": typeof domains_research_forYouFeed; - "domains/research/forecasting/actions/computeCalibration": typeof domains_research_forecasting_actions_computeCalibration; - "domains/research/forecasting/actions/createForecast": typeof domains_research_forecasting_actions_createForecast; - "domains/research/forecasting/actions/refreshForecast": typeof domains_research_forecasting_actions_refreshForecast; - "domains/research/forecasting/actions/resolveForecast": typeof domains_research_forecasting_actions_resolveForecast; - "domains/research/forecasting/cronHandlers/dailyForecastRefresh": typeof domains_research_forecasting_cronHandlers_dailyForecastRefresh; - "domains/research/forecasting/cronHandlers/resolutionCheck": typeof domains_research_forecasting_cronHandlers_resolutionCheck; - "domains/research/forecasting/cronHandlers/weeklyCalibration": typeof domains_research_forecasting_cronHandlers_weeklyCalibration; - "domains/research/forecasting/forecastManager": typeof domains_research_forecasting_forecastManager; - "domains/research/forecasting/scoringEngine": typeof domains_research_forecasting_scoringEngine; - "domains/research/forecasting/seedEvergreenForecasts": typeof domains_research_forecasting_seedEvergreenForecasts; - "domains/research/forecasting/signalMatcher": typeof domains_research_forecasting_signalMatcher; - "domains/research/forecasting/traceWrapper": typeof domains_research_forecasting_traceWrapper; - "domains/research/forecasting/validators": typeof domains_research_forecasting_validators; - "domains/research/githubExplorer": typeof domains_research_githubExplorer; - "domains/research/hydrateEntities": typeof domains_research_hydrateEntities; - "domains/research/index": typeof domains_research_index; - "domains/research/jobResearchAction": typeof domains_research_jobResearchAction; - "domains/research/lensRegistry": typeof domains_research_lensRegistry; - "domains/research/mcpServerCountSeed": typeof domains_research_mcpServerCountSeed; - "domains/research/modelComparison": typeof domains_research_modelComparison; - "domains/research/modelComparisonQueries": typeof domains_research_modelComparisonQueries; - "domains/research/narrative/actions/competingExplanations": typeof domains_research_narrative_actions_competingExplanations; - "domains/research/narrative/actions/hypothesisLifecycle": typeof domains_research_narrative_actions_hypothesisLifecycle; - "domains/research/narrative/adapters/briefAdapter": typeof domains_research_narrative_adapters_briefAdapter; - "domains/research/narrative/adapters/feedAdapter": typeof domains_research_narrative_adapters_feedAdapter; - "domains/research/narrative/adapters/index": typeof domains_research_narrative_adapters_index; - "domains/research/narrative/adapters/linkedinAdapter": typeof domains_research_narrative_adapters_linkedinAdapter; - "domains/research/narrative/adapters/pipelineQueries": typeof domains_research_narrative_adapters_pipelineQueries; - "domains/research/narrative/adapters/types": typeof domains_research_narrative_adapters_types; - "domains/research/narrative/contracts/eventClassificationContract": typeof domains_research_narrative_contracts_eventClassificationContract; - "domains/research/narrative/cronHandlers": typeof domains_research_narrative_cronHandlers; - "domains/research/narrative/crons": typeof domains_research_narrative_crons; - "domains/research/narrative/didYouKnow": typeof domains_research_narrative_didYouKnow; - "domains/research/narrative/didYouKnowSources": typeof domains_research_narrative_didYouKnowSources; - "domains/research/narrative/experiments/freshNewsDidYouKnowExperiment": typeof domains_research_narrative_experiments_freshNewsDidYouKnowExperiment; - "domains/research/narrative/guards/claimClassificationGate": typeof domains_research_narrative_guards_claimClassificationGate; - "domains/research/narrative/guards/claimClassificationGateQueries": typeof domains_research_narrative_guards_claimClassificationGateQueries; - "domains/research/narrative/guards/claimClassifier": typeof domains_research_narrative_guards_claimClassifier; - "domains/research/narrative/guards/contentRights": typeof domains_research_narrative_guards_contentRights; - "domains/research/narrative/guards/index": typeof domains_research_narrative_guards_index; - "domains/research/narrative/guards/injectionContainment": typeof domains_research_narrative_guards_injectionContainment; - "domains/research/narrative/guards/quarantine": typeof domains_research_narrative_guards_quarantine; - "domains/research/narrative/guards/selfCitationGuard": typeof domains_research_narrative_guards_selfCitationGuard; - "domains/research/narrative/guards/trustScoring": typeof domains_research_narrative_guards_trustScoring; - "domains/research/narrative/guards/truthMaintenance": typeof domains_research_narrative_guards_truthMaintenance; - "domains/research/narrative/index": typeof domains_research_narrative_index; - "domains/research/narrative/integrations/hooks": typeof domains_research_narrative_integrations_hooks; - "domains/research/narrative/mutations/correlations": typeof domains_research_narrative_mutations_correlations; - "domains/research/narrative/mutations/dedup": typeof domains_research_narrative_mutations_dedup; - "domains/research/narrative/mutations/disputes": typeof domains_research_narrative_mutations_disputes; - "domains/research/narrative/mutations/events": typeof domains_research_narrative_mutations_events; - "domains/research/narrative/mutations/evidence": typeof domains_research_narrative_mutations_evidence; - "domains/research/narrative/mutations/hypotheses": typeof domains_research_narrative_mutations_hypotheses; - "domains/research/narrative/mutations/policyEnforcedOps": typeof domains_research_narrative_mutations_policyEnforcedOps; - "domains/research/narrative/mutations/posts": typeof domains_research_narrative_mutations_posts; - "domains/research/narrative/mutations/replies": typeof domains_research_narrative_mutations_replies; - "domains/research/narrative/mutations/searchLog": typeof domains_research_narrative_mutations_searchLog; - "domains/research/narrative/mutations/signalMetrics": typeof domains_research_narrative_mutations_signalMetrics; - "domains/research/narrative/mutations/temporalFacts": typeof domains_research_narrative_mutations_temporalFacts; - "domains/research/narrative/mutations/threads": typeof domains_research_narrative_mutations_threads; - "domains/research/narrative/mutations/toolReplay": typeof domains_research_narrative_mutations_toolReplay; - "domains/research/narrative/mutations/workflowTrace": typeof domains_research_narrative_mutations_workflowTrace; - "domains/research/narrative/newsroom/agents/analystAgent": typeof domains_research_narrative_newsroom_agents_analystAgent; - "domains/research/narrative/newsroom/agents/commentHarvester": typeof domains_research_narrative_newsroom_agents_commentHarvester; - "domains/research/narrative/newsroom/agents/curatorAgent": typeof domains_research_narrative_newsroom_agents_curatorAgent; - "domains/research/narrative/newsroom/agents/historianAgent": typeof domains_research_narrative_newsroom_agents_historianAgent; - "domains/research/narrative/newsroom/agents/index": typeof domains_research_narrative_newsroom_agents_index; - "domains/research/narrative/newsroom/agents/publisherAgent": typeof domains_research_narrative_newsroom_agents_publisherAgent; - "domains/research/narrative/newsroom/agents/scoutAgent": typeof domains_research_narrative_newsroom_agents_scoutAgent; - "domains/research/narrative/newsroom/agents/signalCollectorAgent": typeof domains_research_narrative_newsroom_agents_signalCollectorAgent; - "domains/research/narrative/newsroom/recordReplayLane": typeof domains_research_narrative_newsroom_recordReplayLane; - "domains/research/narrative/newsroom/state": typeof domains_research_narrative_newsroom_state; - "domains/research/narrative/newsroom/workflow": typeof domains_research_narrative_newsroom_workflow; - "domains/research/narrative/policies/contentRights": typeof domains_research_narrative_policies_contentRights; - "domains/research/narrative/queries/correlations": typeof domains_research_narrative_queries_correlations; - "domains/research/narrative/queries/disputes": typeof domains_research_narrative_queries_disputes; - "domains/research/narrative/queries/events": typeof domains_research_narrative_queries_events; - "domains/research/narrative/queries/hypotheses": typeof domains_research_narrative_queries_hypotheses; - "domains/research/narrative/queries/posts": typeof domains_research_narrative_queries_posts; - "domains/research/narrative/queries/searchLog": typeof domains_research_narrative_queries_searchLog; - "domains/research/narrative/queries/signalMetrics": typeof domains_research_narrative_queries_signalMetrics; - "domains/research/narrative/queries/threads": typeof domains_research_narrative_queries_threads; - "domains/research/narrative/safety/abuseResistance": typeof domains_research_narrative_safety_abuseResistance; - "domains/research/narrative/tests/goldenSets/generatedCases": typeof domains_research_narrative_tests_goldenSets_generatedCases; - "domains/research/narrative/tests/goldenSets/types": typeof domains_research_narrative_tests_goldenSets_types; - "domains/research/narrative/tests/qaFramework": typeof domains_research_narrative_tests_qaFramework; - "domains/research/narrative/tests/validatePipeline": typeof domains_research_narrative_tests_validatePipeline; - "domains/research/narrative/truth/truthStateManager": typeof domains_research_narrative_truth_truthStateManager; - "domains/research/narrative/validators": typeof domains_research_narrative_validators; - "domains/research/paperDetails": typeof domains_research_paperDetails; - "domains/research/paperDetailsQueries": typeof domains_research_paperDetailsQueries; - "domains/research/publicDossier": typeof domains_research_publicDossier; - "domains/research/publicDossierQueries": typeof domains_research_publicDossierQueries; - "domains/research/readerContent": typeof domains_research_readerContent; - "domains/research/repoScout": typeof domains_research_repoScout; - "domains/research/repoScoutQueries": typeof domains_research_repoScoutQueries; - "domains/research/repoStats": typeof domains_research_repoStats; - "domains/research/repoStatsQueries": typeof domains_research_repoStatsQueries; - "domains/research/researchQueue": typeof domains_research_researchQueue; - "domains/research/researchRunAction": typeof domains_research_researchRunAction; - "domains/research/researchSessionBenchmark": typeof domains_research_researchSessionBenchmark; - "domains/research/researchSessionJit": typeof domains_research_researchSessionJit; - "domains/research/researchSessionLifecycle": typeof domains_research_researchSessionLifecycle; - "domains/research/researchSessionOrchestrator": typeof domains_research_researchSessionOrchestrator; - "domains/research/researchSessionSmoke": typeof domains_research_researchSessionSmoke; - "domains/research/seedEditorialHypotheses": typeof domains_research_seedEditorialHypotheses; - "domains/research/semanticDeduplicator": typeof domains_research_semanticDeduplicator; - "domains/research/semanticDeduplicatorQueries": typeof domains_research_semanticDeduplicatorQueries; - "domains/research/signalTimeseries": typeof domains_research_signalTimeseries; - "domains/research/stackImpact": typeof domains_research_stackImpact; - "domains/research/stackImpactQueries": typeof domains_research_stackImpactQueries; - "domains/research/strategyMetrics": typeof domains_research_strategyMetrics; - "domains/research/strategyMetricsQueries": typeof domains_research_strategyMetricsQueries; - "domains/search/analytics/analytics": typeof domains_search_analytics_analytics; - "domains/search/analytics/componentMetrics": typeof domains_search_analytics_componentMetrics; - "domains/search/analytics/intentSignals": typeof domains_search_analytics_intentSignals; - "domains/search/analytics/ossStats": typeof domains_search_analytics_ossStats; - "domains/search/deepDiligence": typeof domains_search_deepDiligence; - "domains/search/embedHashBackfill": typeof domains_search_embedHashBackfill; - "domains/search/embedRowOnUpdate": typeof domains_search_embedRowOnUpdate; - "domains/search/embedSearchableText": typeof domains_search_embedSearchableText; - "domains/search/federatedHelpers": typeof domains_search_federatedHelpers; - "domains/search/federatedSearch": typeof domains_search_federatedSearch; - "domains/search/federatedSearchCache": typeof domains_search_federatedSearchCache; - "domains/search/fusion/actions": typeof domains_search_fusion_actions; - "domains/search/fusion/adapters/arxivAdapter": typeof domains_search_fusion_adapters_arxivAdapter; - "domains/search/fusion/adapters/braveAdapter": typeof domains_search_fusion_adapters_braveAdapter; - "domains/search/fusion/adapters/documentAdapter": typeof domains_search_fusion_adapters_documentAdapter; - "domains/search/fusion/adapters/fdaAdapter": typeof domains_search_fusion_adapters_fdaAdapter; - "domains/search/fusion/adapters/finraAdapter": typeof domains_search_fusion_adapters_finraAdapter; - "domains/search/fusion/adapters/index": typeof domains_search_fusion_adapters_index; - "domains/search/fusion/adapters/linkupAdapter": typeof domains_search_fusion_adapters_linkupAdapter; - "domains/search/fusion/adapters/newsAdapter": typeof domains_search_fusion_adapters_newsAdapter; - "domains/search/fusion/adapters/ragAdapter": typeof domains_search_fusion_adapters_ragAdapter; - "domains/search/fusion/adapters/secAdapter": typeof domains_search_fusion_adapters_secAdapter; - "domains/search/fusion/adapters/serperAdapter": typeof domains_search_fusion_adapters_serperAdapter; - "domains/search/fusion/adapters/stateRegistryAdapter": typeof domains_search_fusion_adapters_stateRegistryAdapter; - "domains/search/fusion/adapters/tavilyAdapter": typeof domains_search_fusion_adapters_tavilyAdapter; - "domains/search/fusion/adapters/usptoAdapter": typeof domains_search_fusion_adapters_usptoAdapter; - "domains/search/fusion/adapters/youtubeAdapter": typeof domains_search_fusion_adapters_youtubeAdapter; - "domains/search/fusion/advanced": typeof domains_search_fusion_advanced; - "domains/search/fusion/benchmark": typeof domains_search_fusion_benchmark; - "domains/search/fusion/cache": typeof domains_search_fusion_cache; - "domains/search/fusion/crossProviderEval": typeof domains_search_fusion_crossProviderEval; - "domains/search/fusion/debugAdapters": typeof domains_search_fusion_debugAdapters; - "domains/search/fusion/debugOrchestrator": typeof domains_search_fusion_debugOrchestrator; - "domains/search/fusion/index": typeof domains_search_fusion_index; - "domains/search/fusion/observability": typeof domains_search_fusion_observability; - "domains/search/fusion/orchestrator": typeof domains_search_fusion_orchestrator; - "domains/search/fusion/rateLimiter": typeof domains_search_fusion_rateLimiter; - "domains/search/fusion/reranker": typeof domains_search_fusion_reranker; - "domains/search/fusion/types": typeof domains_search_fusion_types; - "domains/search/hashtagDossiers": typeof domains_search_hashtagDossiers; - "domains/search/index": typeof domains_search_index; - "domains/search/linkupClient": typeof domains_search_linkupClient; - "domains/search/quotaManager": typeof domains_search_quotaManager; - "domains/search/rag": typeof domains_search_rag; - "domains/search/ragEnhanced": typeof domains_search_ragEnhanced; - "domains/search/ragEnhancedBatchIndex": typeof domains_search_ragEnhancedBatchIndex; - "domains/search/ragQueries": typeof domains_search_ragQueries; - "domains/search/searchCache": typeof domains_search_searchCache; - "domains/search/searchForecastGate": typeof domains_search_searchForecastGate; - "domains/search/searchPipeline": typeof domains_search_searchPipeline; - "domains/search/searchPipelineNode": typeof domains_search_searchPipelineNode; - "domains/search/searchableTextBackfill": typeof domains_search_searchableTextBackfill; - "domains/search/searchableTextRecompute": typeof domains_search_searchableTextRecompute; - "domains/search/sharedCache": typeof domains_search_sharedCache; - "domains/search/signalTaxonomy": typeof domains_search_signalTaxonomy; - "domains/signals/index": typeof domains_signals_index; - "domains/signals/signalIngester": typeof domains_signals_signalIngester; - "domains/signals/signalProcessor": typeof domains_signals_signalProcessor; - "domains/social/instagramIngestion": typeof domains_social_instagramIngestion; - "domains/social/linkedinAccounts": typeof domains_social_linkedinAccounts; - "domains/social/linkedinArchiveAudit": typeof domains_social_linkedinArchiveAudit; - "domains/social/linkedinArchiveCleanup": typeof domains_social_linkedinArchiveCleanup; - "domains/social/linkedinArchiveCleanupMutations": typeof domains_social_linkedinArchiveCleanupMutations; - "domains/social/linkedinArchiveEdits": typeof domains_social_linkedinArchiveEdits; - "domains/social/linkedinArchiveEditsMutations": typeof domains_social_linkedinArchiveEditsMutations; - "domains/social/linkedinArchiveEntityLinks": typeof domains_social_linkedinArchiveEntityLinks; - "domains/social/linkedinArchiveMaintenance": typeof domains_social_linkedinArchiveMaintenance; - "domains/social/linkedinArchiveMaintenanceQueries": typeof domains_social_linkedinArchiveMaintenanceQueries; - "domains/social/linkedinArchivePurge": typeof domains_social_linkedinArchivePurge; - "domains/social/linkedinArchivePurgeMutations": typeof domains_social_linkedinArchivePurgeMutations; - "domains/social/linkedinArchiveQueries": typeof domains_social_linkedinArchiveQueries; - "domains/social/linkedinContentQueue": typeof domains_social_linkedinContentQueue; - "domains/social/linkedinFundingPosts": typeof domains_social_linkedinFundingPosts; - "domains/social/linkedinLegacyLookupQueries": typeof domains_social_linkedinLegacyLookupQueries; - "domains/social/linkedinOAuth": typeof domains_social_linkedinOAuth; - "domains/social/linkedinPosting": typeof domains_social_linkedinPosting; - "domains/social/linkedinPrePostVerification": typeof domains_social_linkedinPrePostVerification; - "domains/social/linkedinQualityJudge": typeof domains_social_linkedinQualityJudge; - "domains/social/linkedinScheduleGrid": typeof domains_social_linkedinScheduleGrid; - "domains/social/linkedinUnknownCompanyFixes": typeof domains_social_linkedinUnknownCompanyFixes; - "domains/social/postDedup": typeof domains_social_postDedup; - "domains/social/postDedupAction": typeof domains_social_postDedupAction; - "domains/social/publishing/deliveryQueue": typeof domains_social_publishing_deliveryQueue; - "domains/social/publishing/index": typeof domains_social_publishing_index; - "domains/social/publishing/publishingOrchestrator": typeof domains_social_publishing_publishingOrchestrator; - "domains/social/specializedPostQueries": typeof domains_social_specializedPostQueries; - "domains/successLoops/index": typeof domains_successLoops_index; - "domains/successLoops/lib": typeof domains_successLoops_lib; - "domains/successLoops/mutations": typeof domains_successLoops_mutations; - "domains/successLoops/projection": typeof domains_successLoops_projection; - "domains/successLoops/queries": typeof domains_successLoops_queries; - "domains/taskManager/cronWrapper": typeof domains_taskManager_cronWrapper; - "domains/taskManager/index": typeof domains_taskManager_index; - "domains/taskManager/mutations": typeof domains_taskManager_mutations; - "domains/taskManager/queries": typeof domains_taskManager_queries; - "domains/tasks/dailyNotes": typeof domains_tasks_dailyNotes; - "domains/tasks/eventTaskDocuments": typeof domains_tasks_eventTaskDocuments; - "domains/tasks/index": typeof domains_tasks_index; - "domains/tasks/userEvents": typeof domains_tasks_userEvents; - "domains/tasks/work": typeof domains_tasks_work; - "domains/tasks/workflows/bankingMemoWorkflow": typeof domains_tasks_workflows_bankingMemoWorkflow; - "domains/tasks/workflows/coordinatorWorkflow": typeof domains_tasks_workflows_coordinatorWorkflow; - "domains/tasks/workflows/index": typeof domains_tasks_workflows_index; - "domains/teachability/index": typeof domains_teachability_index; - "domains/telemetry/disclosureEvents": typeof domains_telemetry_disclosureEvents; - "domains/temporal/feynmanEditor": typeof domains_temporal_feynmanEditor; - "domains/temporal/forecastGatePolicy": typeof domains_temporal_forecastGatePolicy; - "domains/temporal/index": typeof domains_temporal_index; - "domains/temporal/ingestion": typeof domains_temporal_ingestion; - "domains/temporal/ingestionUtils": typeof domains_temporal_ingestionUtils; - "domains/temporal/langExtract": typeof domains_temporal_langExtract; - "domains/temporal/mutations": typeof domains_temporal_mutations; - "domains/temporal/queries": typeof domains_temporal_queries; - "domains/temporal/specDoc": typeof domains_temporal_specDoc; - "domains/testing/testingFramework": typeof domains_testing_testingFramework; - "domains/trajectory/index": typeof domains_trajectory_index; - "domains/trajectory/lib": typeof domains_trajectory_lib; - "domains/trajectory/mutations": typeof domains_trajectory_mutations; - "domains/trajectory/projection": typeof domains_trajectory_projection; - "domains/trajectory/queries": typeof domains_trajectory_queries; - "domains/utilities/migrations": typeof domains_utilities_migrations; - "domains/utilities/seedGoldenDataset": typeof domains_utilities_seedGoldenDataset; - "domains/utilities/snapshotMigrations": typeof domains_utilities_snapshotMigrations; - "domains/validation/contradictionDetector": typeof domains_validation_contradictionDetector; - "domains/validation/index": typeof domains_validation_index; - "domains/validation/personaValidators": typeof domains_validation_personaValidators; - "domains/validation/selfQuestionAgent": typeof domains_validation_selfQuestionAgent; - "domains/verification/calibration": typeof domains_verification_calibration; - "domains/verification/claimVerificationAction": typeof domains_verification_claimVerificationAction; - "domains/verification/claimVerificationQueries": typeof domains_verification_claimVerificationQueries; - "domains/verification/claimVerifications": typeof domains_verification_claimVerifications; - "domains/verification/contradictionDetector": typeof domains_verification_contradictionDetector; - "domains/verification/contradictionDetectorQueries": typeof domains_verification_contradictionDetectorQueries; - "domains/verification/entailmentChecker": typeof domains_verification_entailmentChecker; - "domains/verification/facts": typeof domains_verification_facts; - "domains/verification/fastVerification": typeof domains_verification_fastVerification; - "domains/verification/groundTruthRegistry": typeof domains_verification_groundTruthRegistry; - "domains/verification/index": typeof domains_verification_index; - "domains/verification/instagramClaimVerification": typeof domains_verification_instagramClaimVerification; - "domains/verification/instagramClaimVerificationMutations": typeof domains_verification_instagramClaimVerificationMutations; - "domains/verification/integrations/agentVerificationAdapter": typeof domains_verification_integrations_agentVerificationAdapter; - "domains/verification/integrations/artifactVerification": typeof domains_verification_integrations_artifactVerification; - "domains/verification/integrations/feedVerification": typeof domains_verification_integrations_feedVerification; - "domains/verification/integrations/index": typeof domains_verification_integrations_index; - "domains/verification/integrations/linkedinVerification": typeof domains_verification_integrations_linkedinVerification; - "domains/verification/integrations/narrativeVerification": typeof domains_verification_integrations_narrativeVerification; - "domains/verification/multiSourceValidation": typeof domains_verification_multiSourceValidation; - "domains/verification/publicSourceRegistry": typeof domains_verification_publicSourceRegistry; - "domains/verification/validation/contradictionDetector": typeof domains_verification_validation_contradictionDetector; - "domains/verification/validation/index": typeof domains_verification_validation_index; - "domains/verification/validation/personaValidators": typeof domains_verification_validation_personaValidators; - "domains/verification/validation/selfQuestionAgent": typeof domains_verification_validation_selfQuestionAgent; - "domains/verification/verificationAuditTrail": typeof domains_verification_verificationAuditTrail; - "domains/verification/verificationWorkflow": typeof domains_verification_verificationWorkflow; - "domains/world/operations": typeof domains_world_operations; - email: typeof email; - eventHandoff: typeof eventHandoff; - events: typeof events; - feed: typeof feed; - "globalResearch/artifacts": typeof globalResearch_artifacts; - "globalResearch/cacheSimple": typeof globalResearch_cacheSimple; - "globalResearch/compaction": typeof globalResearch_compaction; - "globalResearch/index": typeof globalResearch_index; - "globalResearch/locks": typeof globalResearch_locks; - "globalResearch/mentions": typeof globalResearch_mentions; - "globalResearch/queries": typeof globalResearch_queries; - "globalResearch/runs": typeof globalResearch_runs; - http: typeof http; - "http/mcpMemory": typeof http_mcpMemory; - "http/mcpPlans": typeof http_mcpPlans; - "lib/actionItemsGenerator": typeof lib_actionItemsGenerator; - "lib/agentCache": typeof lib_agentCache; - "lib/artifactModels": typeof lib_artifactModels; - "lib/artifactPersistence": typeof lib_artifactPersistence; - "lib/artifactQueries": typeof lib_artifactQueries; - "lib/artifactValidators": typeof lib_artifactValidators; - "lib/crypto": typeof lib_crypto; - "lib/dossierGenerator": typeof lib_dossierGenerator; - "lib/dossierHelpers": typeof lib_dossierHelpers; - "lib/entityResolution": typeof lib_entityResolution; - "lib/factValidation": typeof lib_factValidation; - "lib/featureFlags": typeof lib_featureFlags; - "lib/hash": typeof lib_hash; - "lib/index": typeof lib_index; - "lib/markdown": typeof lib_markdown; - "lib/markdownToTipTap": typeof lib_markdownToTipTap; - "lib/mcpTransport": typeof lib_mcpTransport; - "lib/memoryLimits": typeof lib_memoryLimits; - "lib/memoryQuality": typeof lib_memoryQuality; - "lib/parallelDelegation": typeof lib_parallelDelegation; - "lib/predictivePrefetch": typeof lib_predictivePrefetch; - "lib/streamingDelegation": typeof lib_streamingDelegation; - "lib/withArtifactPersistence": typeof lib_withArtifactPersistence; - "lib/withResourceLinkWrapping": typeof lib_withResourceLinkWrapping; - "lib/xaiClient": typeof lib_xaiClient; - notes: typeof notes; - presence: typeof presence; - prosemirror: typeof prosemirror; - router: typeof router; - "schema/apiUsage": typeof schema_apiUsage; - "schema/emailSchema": typeof schema_emailSchema; - "schema/eventsSchema": typeof schema_eventsSchema; - "schema/searchQuota": typeof schema_searchQuota; - "schema/toolSearchSchema": typeof schema_toolSearchSchema; - "schema/usersSchema": typeof schema_usersSchema; - scratchnodeHandoff: typeof scratchnodeHandoff; - scratchnodeLiveCues: typeof scratchnodeLiveCues; - scratchnodeRateLimit: typeof scratchnodeRateLimit; - "shared/actionSpan": typeof shared_actionSpan; - "shared/actionSpanReplay": typeof shared_actionSpanReplay; - "shared/actionSpanReplayQueries": typeof shared_actionSpanReplayQueries; - tags: typeof tags; - tags_actions: typeof tags_actions; - "tests/fastAgentPanelStreamingTests": typeof tests_fastAgentPanelStreamingTests; - "tests/fusionSearchContractTests": typeof tests_fusionSearchContractTests; - "tools/arbitrage/analyzeWithArbitrage": typeof tools_arbitrage_analyzeWithArbitrage; - "tools/arbitrage/index": typeof tools_arbitrage_index; - "tools/calendarIcs": typeof tools_calendarIcs; - "tools/calendarIcsMutations": typeof tools_calendarIcsMutations; - "tools/calendar/calendarCrudTools": typeof tools_calendar_calendarCrudTools; - "tools/calendar/confirmEventSelection": typeof tools_calendar_confirmEventSelection; - "tools/calendar/emailEventExtractor": typeof tools_calendar_emailEventExtractor; - "tools/calendar/recentEventSearch": typeof tools_calendar_recentEventSearch; - "tools/context/nodebenchContextTools": typeof tools_context_nodebenchContextTools; - "tools/context/resourceLinks": typeof tools_context_resourceLinks; - "tools/context/retrieveArtifact": typeof tools_context_retrieveArtifact; - "tools/document/contextTools": typeof tools_document_contextTools; - "tools/document/deepAgentEditTools": typeof tools_document_deepAgentEditTools; - "tools/document/documentEditingLiveTest": typeof tools_document_documentEditingLiveTest; - "tools/document/documentTools": typeof tools_document_documentTools; - "tools/document/geminiFileSearch": typeof tools_document_geminiFileSearch; - "tools/document/hashtagSearchTools": typeof tools_document_hashtagSearchTools; - "tools/dossier/dossierCrudTools": typeof tools_dossier_dossierCrudTools; - "tools/editDocument": typeof tools_editDocument; - "tools/editDocumentMutations": typeof tools_editDocumentMutations; - "tools/editSpreadsheet": typeof tools_editSpreadsheet; - "tools/editSpreadsheetMutations": typeof tools_editSpreadsheetMutations; - "tools/email/emailIntelligenceParser": typeof tools_email_emailIntelligenceParser; - "tools/evaluation/comprehensiveTest": typeof tools_evaluation_comprehensiveTest; - "tools/evaluation/evaluator": typeof tools_evaluation_evaluator; - "tools/evaluation/groundTruthLookup": typeof tools_evaluation_groundTruthLookup; - "tools/evaluation/groundTruthLookupTool": typeof tools_evaluation_groundTruthLookupTool; - "tools/evaluation/helpers": typeof tools_evaluation_helpers; - "tools/evaluation/multiSdkLiveValidation": typeof tools_evaluation_multiSdkLiveValidation; - "tools/evaluation/openDatasetEval": typeof tools_evaluation_openDatasetEval; - "tools/evaluation/quickTest": typeof tools_evaluation_quickTest; - "tools/evaluation/testCases": typeof tools_evaluation_testCases; - "tools/evaluation/testOptimizations": typeof tools_evaluation_testOptimizations; - "tools/evaluation/testPersonas": typeof tools_evaluation_testPersonas; - "tools/financial/enhancedFundingTools": typeof tools_financial_enhancedFundingTools; - "tools/financial/fundingDetectionTools": typeof tools_financial_fundingDetectionTools; - "tools/financial/fundingResearchTools": typeof tools_financial_fundingResearchTools; - "tools/integration/channelContextTools": typeof tools_integration_channelContextTools; - "tools/integration/confirmCompanySelection": typeof tools_integration_confirmCompanySelection; - "tools/integration/confirmNewsSelection": typeof tools_integration_confirmNewsSelection; - "tools/integration/confirmPersonSelection": typeof tools_integration_confirmPersonSelection; - "tools/integration/dataAccessTools": typeof tools_integration_dataAccessTools; - "tools/integration/digestTools": typeof tools_integration_digestTools; - "tools/integration/humanInputTools": typeof tools_integration_humanInputTools; - "tools/integration/newsletterTools": typeof tools_integration_newsletterTools; - "tools/integration/notificationTools": typeof tools_integration_notificationTools; - "tools/integration/orchestrationTools": typeof tools_integration_orchestrationTools; - "tools/integration/peopleProfileSearch": typeof tools_integration_peopleProfileSearch; - "tools/knowledge/clusteringTools": typeof tools_knowledge_clusteringTools; - "tools/knowledge/distiller": typeof tools_knowledge_distiller; - "tools/knowledge/distillerPrompts": typeof tools_knowledge_distillerPrompts; - "tools/knowledge/entityInsightTools": typeof tools_knowledge_entityInsightTools; - "tools/knowledge/evidenceTools": typeof tools_knowledge_evidenceTools; - "tools/knowledge/knowledgeGraphTools": typeof tools_knowledge_knowledgeGraphTools; - "tools/knowledge/unifiedMemoryTools": typeof tools_knowledge_unifiedMemoryTools; - "tools/media/adversarialValidation": typeof tools_media_adversarialValidation; - "tools/media/diagnosticTest": typeof tools_media_diagnosticTest; - "tools/media/entityExtractionTools": typeof tools_media_entityExtractionTools; - "tools/media/linkupFetch": typeof tools_media_linkupFetch; - "tools/media/linkupSearch": typeof tools_media_linkupSearch; - "tools/media/linkupStructuredSearch": typeof tools_media_linkupStructuredSearch; - "tools/media/llmEntityLinker": typeof tools_media_llmEntityLinker; - "tools/media/mediaTools": typeof tools_media_mediaTools; - "tools/media/recentNewsSearch": typeof tools_media_recentNewsSearch; - "tools/media/testImageTools": typeof tools_media_testImageTools; - "tools/media/validationTest": typeof tools_media_validationTest; - "tools/media/youtubeSearch": typeof tools_media_youtubeSearch; - "tools/meta/actionDraftMutations": typeof tools_meta_actionDraftMutations; - "tools/meta/contextEnhancement": typeof tools_meta_contextEnhancement; - "tools/meta/contextEnhancementActions": typeof tools_meta_contextEnhancementActions; - "tools/meta/dynamicPromptEnhancer": typeof tools_meta_dynamicPromptEnhancer; - "tools/meta/hybridSearch": typeof tools_meta_hybridSearch; - "tools/meta/hybridSearchQueries": typeof tools_meta_hybridSearchQueries; - "tools/meta/hybridSearchTest": typeof tools_meta_hybridSearchTest; - "tools/meta/index": typeof tools_meta_index; - "tools/meta/promptEnhancementFeedback": typeof tools_meta_promptEnhancementFeedback; - "tools/meta/seedSkillRegistry": typeof tools_meta_seedSkillRegistry; - "tools/meta/seedSkillRegistryQueries": typeof tools_meta_seedSkillRegistryQueries; - "tools/meta/seedToolRegistry": typeof tools_meta_seedToolRegistry; - "tools/meta/seedToolRegistryQueries": typeof tools_meta_seedToolRegistryQueries; - "tools/meta/skillDiscovery": typeof tools_meta_skillDiscovery; - "tools/meta/skillDiscoveryQueries": typeof tools_meta_skillDiscoveryQueries; - "tools/meta/toolDiscovery": typeof tools_meta_toolDiscovery; - "tools/meta/toolDiscoveryV2": typeof tools_meta_toolDiscoveryV2; - "tools/meta/toolGateway": typeof tools_meta_toolGateway; - "tools/meta/toolRegistry": typeof tools_meta_toolRegistry; - "tools/reports/pdfGenerationTools": typeof tools_reports_pdfGenerationTools; - "tools/research/researchTools": typeof tools_research_researchTools; - "tools/search/fusionSearchTool": typeof tools_search_fusionSearchTool; - "tools/search/index": typeof tools_search_index; - "tools/sec/secCompanySearch": typeof tools_sec_secCompanySearch; - "tools/sec/secFilingTools": typeof tools_sec_secFilingTools; - "tools/security/promptInjectionProtection": typeof tools_security_promptInjectionProtection; - "tools/sendEmail": typeof tools_sendEmail; - "tools/sendEmailMutations": typeof tools_sendEmailMutations; - "tools/sendNotification": typeof tools_sendNotification; - "tools/sendSms": typeof tools_sendSms; - "tools/shared/structuredOutput": typeof tools_shared_structuredOutput; - "tools/social/instagramTools": typeof tools_social_instagramTools; - "tools/social/linkedinTools": typeof tools_social_linkedinTools; - "tools/spreadsheetOperationTypes": typeof tools_spreadsheetOperationTypes; - "tools/spreadsheet/spreadsheetCrudTools": typeof tools_spreadsheet_spreadsheetCrudTools; - "tools/teachability/index": typeof tools_teachability_index; - "tools/teachability/learnUserSkill": typeof tools_teachability_learnUserSkill; - "tools/teachability/teachingAnalyzer": typeof tools_teachability_teachingAnalyzer; - "tools/teachability/userMemoryQueries": typeof tools_teachability_userMemoryQueries; - "tools/teachability/userMemoryTools": typeof tools_teachability_userMemoryTools; - "tools/wrappers/coreAgentTools": typeof tools_wrappers_coreAgentTools; - "tools/wrappers/evidenceTools": typeof tools_wrappers_evidenceTools; - "tools/wrappers/resourceLinkTools": typeof tools_wrappers_resourceLinkTools; - users: typeof users; - wall: typeof wall; - "workflows/agentProjectIdeaPost": typeof workflows_agentProjectIdeaPost; - "workflows/ainewsBriefFormat": typeof workflows_ainewsBriefFormat; - "workflows/dailyLinkedInPost": typeof workflows_dailyLinkedInPost; - "workflows/dailyLinkedInPostMutations": typeof workflows_dailyLinkedInPostMutations; - "workflows/dailyMorningBrief": typeof workflows_dailyMorningBrief; - "workflows/deepTrace": typeof workflows_deepTrace; - "workflows/emailResearchOrchestrator": typeof workflows_emailResearchOrchestrator; - "workflows/endToEndQa": typeof workflows_endToEndQa; - "workflows/enhancedMorningBrief": typeof workflows_enhancedMorningBrief; - "workflows/enhancedWeeklySummary": typeof workflows_enhancedWeeklySummary; - "workflows/founderPostGenerator": typeof workflows_founderPostGenerator; - "workflows/index": typeof workflows_index; - "workflows/linkedinTrigger": typeof workflows_linkedinTrigger; - "workflows/prdComposerWorkflow": typeof workflows_prdComposerWorkflow; - "workflows/scheduledPDFReports": typeof workflows_scheduledPDFReports; - "workflows/scheduledPDFReportsMutations": typeof workflows_scheduledPDFReportsMutations; - "workflows/sendMockBankerDigest": typeof workflows_sendMockBankerDigest; - "workflows/specializedLinkedInPosts": typeof workflows_specializedLinkedInPosts; - "workflows/testDailyBrief": typeof workflows_testDailyBrief; - "workflows/weeklySourceSummary": typeof workflows_weeklySourceSummary; -}>; +type ModuleApi = + FilterApi, FunctionReference> extends { + _: infer References; + } + ? References + : {}; /** * A utility for referencing Convex functions in your app's public API. @@ -3104,24 +1575,10657 @@ declare const fullApi: ApiFromModules<{ * const myFunctionReference = api.myModule.myFunction; * ``` */ -export declare const api: FilterApi< - typeof fullApi, - FunctionReference ->; - -/** - * A utility for referencing Convex functions in your app's internal API. - * - * Usage: - * ```js - * const myFunctionReference = internal.myModule.myFunction; - * ``` - */ -export declare const internal: FilterApi< - typeof fullApi, - FunctionReference ->; - +export declare const api: { + actions: { + coordinatorWorkflowActions: ModuleApi< + typeof actions_coordinatorWorkflowActions, + "public" + >; + externalOrchestrator: ModuleApi< + typeof actions_externalOrchestrator, + "public" + >; + openbbActions: ModuleApi; + parallelDelegation: ModuleApi; + researchMcpActions: ModuleApi; + spreadsheetActions: ModuleApi; + }; + agentOS: ModuleApi; + agentsPrefs: ModuleApi; + auth: ModuleApi; + config: { + autonomousConfig: ModuleApi; + }; + crons: ModuleApi & { + dailyDossierCron: ModuleApi; + emailIntelligenceCron: ModuleApi< + typeof crons_emailIntelligenceCron, + "public" + >; + proactiveCalendarIngestion: ModuleApi< + typeof crons_proactiveCalendarIngestion, + "public" + >; + proactiveDelivery: ModuleApi; + proactiveDetectorRuns: ModuleApi< + typeof crons_proactiveDetectorRuns, + "public" + >; + proactiveEmailIngestion: ModuleApi< + typeof crons_proactiveEmailIngestion, + "public" + >; + sloCalculation: ModuleApi; + }; + dataAudit: ModuleApi; + debugEnv: ModuleApi; + domains: { + agents: { + adapters: { + anthropic: { + anthropicReasoningAdapter: ModuleApi< + typeof domains_agents_adapters_anthropic_anthropicReasoningAdapter, + "public" + >; + promptCacheHelpers: ModuleApi< + typeof domains_agents_adapters_anthropic_promptCacheHelpers, + "public" + >; + }; + convex: { + convexAgentAdapter: ModuleApi< + typeof domains_agents_adapters_convex_convexAgentAdapter, + "public" + >; + }; + google: { + googleInteractionsAdapter: ModuleApi< + typeof domains_agents_adapters_google_googleInteractionsAdapter, + "public" + >; + }; + handoffBridge: ModuleApi< + typeof domains_agents_adapters_handoffBridge, + "public" + >; + index: ModuleApi; + langgraph: { + langgraphAdapter: ModuleApi< + typeof domains_agents_adapters_langgraph_langgraphAdapter, + "public" + >; + }; + multiSdkDelegation: ModuleApi< + typeof domains_agents_adapters_multiSdkDelegation, + "public" + >; + openai: { + openaiAgentsAdapter: ModuleApi< + typeof domains_agents_adapters_openai_openaiAgentsAdapter, + "public" + >; + }; + registerDefaultAdapters: ModuleApi< + typeof domains_agents_adapters_registerDefaultAdapters, + "public" + >; + registry: ModuleApi; + routing: { + personaRouter: ModuleApi< + typeof domains_agents_adapters_routing_personaRouter, + "public" + >; + }; + types: ModuleApi; + vercel: { + vercelAiSdkAdapter: ModuleApi< + typeof domains_agents_adapters_vercel_vercelAiSdkAdapter, + "public" + >; + }; + }; + agentActions: ModuleApi; + agentChat: ModuleApi; + agentChatActions: ModuleApi< + typeof domains_agents_agentChatActions, + "public" + >; + agentDelegations: ModuleApi< + typeof domains_agents_agentDelegations, + "public" + >; + agentFeedRanking: ModuleApi< + typeof domains_agents_agentFeedRanking, + "public" + >; + agentFeedTraversal: ModuleApi< + typeof domains_agents_agentFeedTraversal, + "public" + >; + agentHubQueries: ModuleApi< + typeof domains_agents_agentHubQueries, + "public" + >; + agentInitializer: ModuleApi< + typeof domains_agents_agentInitializer, + "public" + >; + agentLoop: ModuleApi; + agentLoopQueries: ModuleApi< + typeof domains_agents_agentLoopQueries, + "public" + >; + agentMarketplace: ModuleApi< + typeof domains_agents_agentMarketplace, + "public" + >; + agentMemory: ModuleApi; + agentMemorySummary: ModuleApi< + typeof domains_agents_agentMemorySummary, + "public" + >; + agentNavigation: ModuleApi< + typeof domains_agents_agentNavigation, + "public" + >; + agentPlanSummary: ModuleApi< + typeof domains_agents_agentPlanSummary, + "public" + >; + agentPlanning: ModuleApi; + agentPostingPipeline: ModuleApi< + typeof domains_agents_agentPostingPipeline, + "public" + >; + agentRouter: ModuleApi; + agentRunPresentation: ModuleApi< + typeof domains_agents_agentRunPresentation, + "public" + >; + agentScratchpads: ModuleApi< + typeof domains_agents_agentScratchpads, + "public" + >; + agentTimelines: ModuleApi; + agentViewManifest: ModuleApi< + typeof domains_agents_agentViewManifest, + "public" + >; + arbitrage: { + agent: ModuleApi; + config: ModuleApi; + index: ModuleApi; + tools: { + contradictionDetection: ModuleApi< + typeof domains_agents_arbitrage_tools_contradictionDetection, + "public" + >; + deltaDetection: ModuleApi< + typeof domains_agents_arbitrage_tools_deltaDetection, + "public" + >; + index: ModuleApi< + typeof domains_agents_arbitrage_tools_index, + "public" + >; + sourceHealthCheck: ModuleApi< + typeof domains_agents_arbitrage_tools_sourceHealthCheck, + "public" + >; + sourceQualityRanking: ModuleApi< + typeof domains_agents_arbitrage_tools_sourceQualityRanking, + "public" + >; + }; + }; + autonomousCrons: ModuleApi< + typeof domains_agents_autonomousCrons, + "public" + >; + autonomousCronsQueries: ModuleApi< + typeof domains_agents_autonomousCronsQueries, + "public" + >; + autonomy: { + commits: ModuleApi; + evidence: ModuleApi; + grants: ModuleApi; + hash: ModuleApi; + policy: ModuleApi; + proposals: ModuleApi< + typeof domains_agents_autonomy_proposals, + "public" + >; + remainders: ModuleApi< + typeof domains_agents_autonomy_remainders, + "public" + >; + }; + batchAPI: ModuleApi; + budget: { + budgetGate: ModuleApi< + typeof domains_agents_budget_budgetGate, + "public" + >; + }; + canonicalPlanner: ModuleApi< + typeof domains_agents_canonicalPlanner, + "public" + >; + canonicalRuntimeMutations: ModuleApi< + typeof domains_agents_canonicalRuntimeMutations, + "public" + >; + canonicalRuntimeQueries: ModuleApi< + typeof domains_agents_canonicalRuntimeQueries, + "public" + >; + chatPanelBackend: ModuleApi< + typeof domains_agents_chatPanelBackend, + "public" + >; + chatThreads: ModuleApi; + checkpointing: ModuleApi; + consistencyIndex: ModuleApi< + typeof domains_agents_consistencyIndex, + "public" + >; + consistencyIndexQueries: ModuleApi< + typeof domains_agents_consistencyIndexQueries, + "public" + >; + coordinator: { + agent: ModuleApi; + config: ModuleApi; + contextPack: ModuleApi< + typeof domains_agents_coordinator_contextPack, + "public" + >; + contextPackMutations: ModuleApi< + typeof domains_agents_coordinator_contextPackMutations, + "public" + >; + contextPackQueries: ModuleApi< + typeof domains_agents_coordinator_contextPackQueries, + "public" + >; + index: ModuleApi; + tools: { + delegationTools: ModuleApi< + typeof domains_agents_coordinator_tools_delegationTools, + "public" + >; + index: ModuleApi< + typeof domains_agents_coordinator_tools_index, + "public" + >; + }; + }; + core: { + coordinatorAgent: ModuleApi< + typeof domains_agents_core_coordinatorAgent, + "public" + >; + delegation: { + delegationHelpers: ModuleApi< + typeof domains_agents_core_delegation_delegationHelpers, + "public" + >; + delegationTools: ModuleApi< + typeof domains_agents_core_delegation_delegationTools, + "public" + >; + temporalContext: ModuleApi< + typeof domains_agents_core_delegation_temporalContext, + "public" + >; + }; + multiAgentWorkflow: ModuleApi< + typeof domains_agents_core_multiAgentWorkflow, + "public" + >; + prompts: ModuleApi; + subagents: { + comment_harvester: { + index: ModuleApi< + typeof domains_agents_core_subagents_comment_harvester_index, + "public" + >; + mutations: ModuleApi< + typeof domains_agents_core_subagents_comment_harvester_mutations, + "public" + >; + }; + document_subagent: { + documentAgent: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_documentAgent, + "public" + >; + documentAgentWithMetaTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_documentAgentWithMetaTools, + "public" + >; + tools: { + deepAgentEditTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_deepAgentEditTools, + "public" + >; + documentTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_documentTools, + "public" + >; + geminiFileSearch: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_geminiFileSearch, + "public" + >; + hashtagSearchTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_hashtagSearchTools, + "public" + >; + index: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_index, + "public" + >; + }; + }; + dossier_subagent: { + dossierAgent: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_dossierAgent, + "public" + >; + tools: { + enrichDataPoint: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_enrichDataPoint, + "public" + >; + generateAnnotation: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_generateAnnotation, + "public" + >; + getChartContext: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_getChartContext, + "public" + >; + index: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_index, + "public" + >; + updateFocusState: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_updateFocusState, + "public" + >; + updateNarrativeSection: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_updateNarrativeSection, + "public" + >; + }; + }; + entity_subagent: { + entityResearchAgent: ModuleApi< + typeof domains_agents_core_subagents_entity_subagent_entityResearchAgent, + "public" + >; + }; + media_subagent: { + mediaAgent: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_mediaAgent, + "public" + >; + tools: { + index: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_index, + "public" + >; + linkupSearch: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_linkupSearch, + "public" + >; + mediaTools: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_mediaTools, + "public" + >; + youtubeSearch: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_youtubeSearch, + "public" + >; + }; + }; + openbb_subagent: { + openbbAgent: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_openbbAgent, + "public" + >; + tools: { + adminTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_adminTools, + "public" + >; + cryptoTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_cryptoTools, + "public" + >; + economyTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_economyTools, + "public" + >; + equityTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_equityTools, + "public" + >; + index: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_index, + "public" + >; + newsTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_newsTools, + "public" + >; + }; + }; + research_subagent: { + multiSourceResearchAgent: ModuleApi< + typeof domains_agents_core_subagents_research_subagent_multiSourceResearchAgent, + "public" + >; + }; + sec_subagent: { + secAgent: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_secAgent, + "public" + >; + tools: { + index: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_tools_index, + "public" + >; + secCompanySearch: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_tools_secCompanySearch, + "public" + >; + secFilingTools: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_tools_secFilingTools, + "public" + >; + }; + }; + thread_curator: { + index: ModuleApi< + typeof domains_agents_core_subagents_thread_curator_index, + "public" + >; + queries: ModuleApi< + typeof domains_agents_core_subagents_thread_curator_queries, + "public" + >; + }; + }; + tools: { + externalOrchestratorTools: ModuleApi< + typeof domains_agents_core_tools_externalOrchestratorTools, + "public" + >; + }; + }; + dataAccess: { + agent: ModuleApi; + config: ModuleApi; + index: ModuleApi; + tools: { + calendarTools: ModuleApi< + typeof domains_agents_dataAccess_tools_calendarTools, + "public" + >; + index: ModuleApi< + typeof domains_agents_dataAccess_tools_index, + "public" + >; + taskTools: ModuleApi< + typeof domains_agents_dataAccess_tools_taskTools, + "public" + >; + }; + }; + decisionMemory: ModuleApi; + decisionMemoryQueries: ModuleApi< + typeof domains_agents_decisionMemoryQueries, + "public" + >; + decorationPreferences: ModuleApi< + typeof domains_agents_decorationPreferences, + "public" + >; + deliberationToEvolution: ModuleApi< + typeof domains_agents_deliberationToEvolution, + "public" + >; + digestAgent: ModuleApi; + dueDiligence: { + branches: { + companyProfile: ModuleApi< + typeof domains_agents_dueDiligence_branches_companyProfile, + "public" + >; + conditionalBranches: ModuleApi< + typeof domains_agents_dueDiligence_branches_conditionalBranches, + "public" + >; + marketCompetitive: ModuleApi< + typeof domains_agents_dueDiligence_branches_marketCompetitive, + "public" + >; + teamDeepResearch: ModuleApi< + typeof domains_agents_dueDiligence_branches_teamDeepResearch, + "public" + >; + }; + crossChecker: ModuleApi< + typeof domains_agents_dueDiligence_crossChecker, + "public" + >; + ddBranchHandoff: ModuleApi< + typeof domains_agents_dueDiligence_ddBranchHandoff, + "public" + >; + ddContextEngine: ModuleApi< + typeof domains_agents_dueDiligence_ddContextEngine, + "public" + >; + ddEnhancedOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_ddEnhancedOrchestrator, + "public" + >; + ddMutations: ModuleApi< + typeof domains_agents_dueDiligence_ddMutations, + "public" + >; + ddOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_ddOrchestrator, + "public" + >; + ddTriggerQueries: ModuleApi< + typeof domains_agents_dueDiligence_ddTriggerQueries, + "public" + >; + ddTriggers: ModuleApi< + typeof domains_agents_dueDiligence_ddTriggers, + "public" + >; + deepResearch: { + agents: { + newsVerificationAgent: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_agents_newsVerificationAgent, + "public" + >; + personResearchAgent: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_agents_personResearchAgent, + "public" + >; + }; + claimClassifier: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_claimClassifier, + "public" + >; + deepResearchOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_deepResearchOrchestrator, + "public" + >; + hypothesisEngine: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_hypothesisEngine, + "public" + >; + index: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_index, + "public" + >; + queryDecomposer: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_queryDecomposer, + "public" + >; + types: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_types, + "public" + >; + }; + index: ModuleApi; + investorPlaybook: { + agenticPlaybook: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_agenticPlaybook, + "public" + >; + branches: { + claimVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_claimVerificationBranch, + "public" + >; + enhancedClaimVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_enhancedClaimVerification, + "public" + >; + enhancedNewsVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_enhancedNewsVerification, + "public" + >; + entityVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_entityVerificationBranch, + "public" + >; + fdaVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_fdaVerificationBranch, + "public" + >; + financial: { + dealMemoSynthesis: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_financial_dealMemoSynthesis, + "public" + >; + fundPerformanceVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_financial_fundPerformanceVerification, + "public" + >; + }; + finraValidationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_finraValidationBranch, + "public" + >; + index: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_index, + "public" + >; + industry: { + clinicalTrialVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_industry_clinicalTrialVerification, + "public" + >; + literatureTriangulation: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_industry_literatureTriangulation, + "public" + >; + }; + moneyFlowBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_moneyFlowBranch, + "public" + >; + newsVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_newsVerificationBranch, + "public" + >; + personVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_personVerificationBranch, + "public" + >; + scientificClaimVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_scientificClaimVerificationBranch, + "public" + >; + secEdgarBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_secEdgarBranch, + "public" + >; + strategic: { + economicIndicatorVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_strategic_economicIndicatorVerification, + "public" + >; + maActivityVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_strategic_maActivityVerification, + "public" + >; + }; + usptoBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_usptoBranch, + "public" + >; + }; + evalPlaybook: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_evalPlaybook, + "public" + >; + index: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_index, + "public" + >; + playbookActions: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_playbookActions, + "public" + >; + playbookMutations: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_playbookMutations, + "public" + >; + playbookOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_playbookOrchestrator, + "public" + >; + types: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_types, + "public" + >; + }; + investorProtection: { + index: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_index, + "public" + >; + investorProtectionMutations: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_investorProtectionMutations, + "public" + >; + investorProtectionOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_investorProtectionOrchestrator, + "public" + >; + investorProtectionOwnership: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_investorProtectionOwnership, + "public" + >; + phases: { + claimsExtraction: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_phases_claimsExtraction, + "public" + >; + }; + types: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_types, + "public" + >; + }; + memoSynthesizer: ModuleApi< + typeof domains_agents_dueDiligence_memoSynthesizer, + "public" + >; + microBranches: ModuleApi< + typeof domains_agents_dueDiligence_microBranches, + "public" + >; + riskScoring: ModuleApi< + typeof domains_agents_dueDiligence_riskScoring, + "public" + >; + types: ModuleApi; + }; + emailAgent: ModuleApi; + evolutionVerification: ModuleApi< + typeof domains_agents_evolutionVerification, + "public" + >; + fastAgentChat: ModuleApi; + fastAgentChatHelpers: ModuleApi< + typeof domains_agents_fastAgentChatHelpers, + "public" + >; + fastAgentDocumentCreation: ModuleApi< + typeof domains_agents_fastAgentDocumentCreation, + "public" + >; + fastAgentDocumentCreationOwnership: ModuleApi< + typeof domains_agents_fastAgentDocumentCreationOwnership, + "public" + >; + fastAgentPanelStreaming: ModuleApi< + typeof domains_agents_fastAgentPanelStreaming, + "public" + >; + glmFlashWithReasoning: ModuleApi< + typeof domains_agents_glmFlashWithReasoning, + "public" + >; + glmHybridApproach: ModuleApi< + typeof domains_agents_glmHybridApproach, + "public" + >; + hitl: { + config: ModuleApi; + index: ModuleApi; + interruptManager: ModuleApi< + typeof domains_agents_hitl_interruptManager, + "public" + >; + tools: { + askHuman: ModuleApi< + typeof domains_agents_hitl_tools_askHuman, + "public" + >; + index: ModuleApi; + }; + }; + humanInTheLoop: ModuleApi; + index: ModuleApi; + lessons: { + captureLesson: ModuleApi< + typeof domains_agents_lessons_captureLesson, + "public" + >; + getRelevantLessons: ModuleApi< + typeof domains_agents_lessons_getRelevantLessons, + "public" + >; + infraPreferIds: ModuleApi< + typeof domains_agents_lessons_infraPreferIds, + "public" + >; + lessonInjection: ModuleApi< + typeof domains_agents_lessons_lessonInjection, + "public" + >; + lessonsPublic: ModuleApi< + typeof domains_agents_lessons_lessonsPublic, + "public" + >; + systemPromptBuilder: ModuleApi< + typeof domains_agents_lessons_systemPromptBuilder, + "public" + >; + }; + mcp_tools: { + context: { + contextInitializerTool: ModuleApi< + typeof domains_agents_mcp_tools_context_contextInitializerTool, + "public" + >; + index: ModuleApi< + typeof domains_agents_mcp_tools_context_index, + "public" + >; + }; + index: ModuleApi; + models: { + healthcheck: ModuleApi< + typeof domains_agents_mcp_tools_models_healthcheck, + "public" + >; + index: ModuleApi< + typeof domains_agents_mcp_tools_models_index, + "public" + >; + migration: ModuleApi< + typeof domains_agents_mcp_tools_models_migration, + "public" + >; + modelResolver: ModuleApi< + typeof domains_agents_mcp_tools_models_modelResolver, + "public" + >; + promptCaching: ModuleApi< + typeof domains_agents_mcp_tools_models_promptCaching, + "public" + >; + }; + reasoningTool: ModuleApi< + typeof domains_agents_mcp_tools_reasoningTool, + "public" + >; + testReasoningPersonas: ModuleApi< + typeof domains_agents_mcp_tools_testReasoningPersonas, + "public" + >; + tracking: { + index: ModuleApi< + typeof domains_agents_mcp_tools_tracking_index, + "public" + >; + taskTrackerTool: ModuleApi< + typeof domains_agents_mcp_tools_tracking_taskTrackerTool, + "public" + >; + }; + }; + orchestrator: { + geminiVideoWrapper: ModuleApi< + typeof domains_agents_orchestrator_geminiVideoWrapper, + "public" + >; + passportEnforcement: ModuleApi< + typeof domains_agents_orchestrator_passportEnforcement, + "public" + >; + passportEnforcementQueries: ModuleApi< + typeof domains_agents_orchestrator_passportEnforcementQueries, + "public" + >; + queueProtocol: ModuleApi< + typeof domains_agents_orchestrator_queueProtocol, + "public" + >; + secEdgarWrapper: ModuleApi< + typeof domains_agents_orchestrator_secEdgarWrapper, + "public" + >; + toolHealth: ModuleApi< + typeof domains_agents_orchestrator_toolHealth, + "public" + >; + toolRouter: ModuleApi< + typeof domains_agents_orchestrator_toolRouter, + "public" + >; + worker: ModuleApi; + }; + parallelTaskTree: ModuleApi< + typeof domains_agents_parallelTaskTree, + "public" + >; + promptEnhancer: ModuleApi; + publicWrappers: ModuleApi; + receipts: { + actionReceipts: ModuleApi< + typeof domains_agents_receipts_actionReceipts, + "public" + >; + emitWithReceipt: ModuleApi< + typeof domains_agents_receipts_emitWithReceipt, + "public" + >; + }; + researchJobs: ModuleApi; + responseFlywheel: ModuleApi< + typeof domains_agents_responseFlywheel, + "public" + >; + runtimeRouting: ModuleApi; + runtimeTierFallback: ModuleApi< + typeof domains_agents_runtimeTierFallback, + "public" + >; + safety: { + artifactDecisionGate: ModuleApi< + typeof domains_agents_safety_artifactDecisionGate, + "public" + >; + lowConfidenceGuard: ModuleApi< + typeof domains_agents_safety_lowConfidenceGuard, + "public" + >; + rateLimitGuard: ModuleApi< + typeof domains_agents_safety_rateLimitGuard, + "public" + >; + singleflightMap: ModuleApi< + typeof domains_agents_safety_singleflightMap, + "public" + >; + }; + selfEvolution: ModuleApi; + selfEvolutionQueries: ModuleApi< + typeof domains_agents_selfEvolutionQueries, + "public" + >; + snapshots: { + rollbackToCheckpoint: ModuleApi< + typeof domains_agents_snapshots_rollbackToCheckpoint, + "public" + >; + snapshotCheckpoint: ModuleApi< + typeof domains_agents_snapshots_snapshotCheckpoint, + "public" + >; + }; + spiral: { + spiralDetector: ModuleApi< + typeof domains_agents_spiral_spiralDetector, + "public" + >; + }; + swarmDeliberation: ModuleApi< + typeof domains_agents_swarmDeliberation, + "public" + >; + swarmDeliberationQueries: ModuleApi< + typeof domains_agents_swarmDeliberationQueries, + "public" + >; + swarmMutations: ModuleApi; + swarmOrchestrator: ModuleApi< + typeof domains_agents_swarmOrchestrator, + "public" + >; + swarmOrchestratorEnhanced: ModuleApi< + typeof domains_agents_swarmOrchestratorEnhanced, + "public" + >; + swarmQueries: ModuleApi; + testGlmFlash: ModuleApi; + testGlmFlashFix: ModuleApi< + typeof domains_agents_testGlmFlashFix, + "public" + >; + testOrchestratorReasoningIntegration: ModuleApi< + typeof domains_agents_testOrchestratorReasoningIntegration, + "public" + >; + testParallelOrchestrator: ModuleApi< + typeof domains_agents_testParallelOrchestrator, + "public" + >; + tools: { + createDCFSpreadsheet: ModuleApi< + typeof domains_agents_tools_createDCFSpreadsheet, + "public" + >; + editDCFSpreadsheet: ModuleApi< + typeof domains_agents_tools_editDCFSpreadsheet, + "public" + >; + }; + traceAuditLog: ModuleApi; + traceOrchestrator: ModuleApi< + typeof domains_agents_traceOrchestrator, + "public" + >; + traceTypes: ModuleApi; + types: ModuleApi; + unified: ModuleApi; + }; + ai: { + ai: ModuleApi; + genai: ModuleApi; + metadataAnalyzer: ModuleApi; + models: { + autonomousModelResolver: ModuleApi< + typeof domains_ai_models_autonomousModelResolver, + "public" + >; + capabilityRegistry: ModuleApi< + typeof domains_ai_models_capabilityRegistry, + "public" + >; + chainResolver: ModuleApi< + typeof domains_ai_models_chainResolver, + "public" + >; + freeModelDiscovery: ModuleApi< + typeof domains_ai_models_freeModelDiscovery, + "public" + >; + index: ModuleApi; + livePerformanceEval: ModuleApi< + typeof domains_ai_models_livePerformanceEval, + "public" + >; + modelRouter: ModuleApi; + modelRouterQueries: ModuleApi< + typeof domains_ai_models_modelRouterQueries, + "public" + >; + }; + morningDigest: ModuleApi; + morningDigestQueries: ModuleApi< + typeof domains_ai_morningDigestQueries, + "public" + >; + realtimeTranscription: ModuleApi< + typeof domains_ai_realtimeTranscription, + "public" + >; + whisperTranscribe: ModuleApi< + typeof domains_ai_whisperTranscribe, + "public" + >; + }; + analytics: { + analytics: ModuleApi; + componentMetrics: ModuleApi< + typeof domains_analytics_componentMetrics, + "public" + >; + intentSignals: ModuleApi< + typeof domains_analytics_intentSignals, + "public" + >; + ossStats: ModuleApi; + }; + artifacts: { + evidenceIndex: ModuleApi< + typeof domains_artifacts_evidenceIndex, + "public" + >; + evidenceIndexActions: ModuleApi< + typeof domains_artifacts_evidenceIndexActions, + "public" + >; + evidencePacks: ModuleApi< + typeof domains_artifacts_evidencePacks, + "public" + >; + evidenceSearch: ModuleApi< + typeof domains_artifacts_evidenceSearch, + "public" + >; + sourceArtifacts: ModuleApi< + typeof domains_artifacts_sourceArtifacts, + "public" + >; + }; + auth: { + account: ModuleApi; + apiKeys: ModuleApi; + apiKeysActions: ModuleApi; + auth: ModuleApi; + index: ModuleApi; + onboarding: ModuleApi; + personas: { + index: ModuleApi; + multiPersonaSynthesizer: ModuleApi< + typeof domains_auth_personas_multiPersonaSynthesizer, + "public" + >; + personaAutonomousAgent: ModuleApi< + typeof domains_auth_personas_personaAutonomousAgent, + "public" + >; + }; + presence: ModuleApi; + usage: ModuleApi; + userPreferences: ModuleApi; + userStats: ModuleApi; + users: ModuleApi; + }; + batchAutopilot: { + deltaCollector: ModuleApi< + typeof domains_batchAutopilot_deltaCollector, + "public" + >; + mutations: ModuleApi; + promptBuilder: ModuleApi< + typeof domains_batchAutopilot_promptBuilder, + "public" + >; + queries: ModuleApi; + runner: ModuleApi; + scheduler: ModuleApi; + }; + billing: { + apiUsageTracking: ModuleApi< + typeof domains_billing_apiUsageTracking, + "public" + >; + billing: ModuleApi; + index: ModuleApi; + rateLimiting: ModuleApi; + }; + blips: { + blipClaimExtraction: ModuleApi< + typeof domains_blips_blipClaimExtraction, + "public" + >; + blipGeneration: ModuleApi; + blipIngestion: ModuleApi; + blipMutations: ModuleApi; + blipPersonaLens: ModuleApi< + typeof domains_blips_blipPersonaLens, + "public" + >; + blipPipeline: ModuleApi; + blipQueries: ModuleApi; + blipVerification: ModuleApi< + typeof domains_blips_blipVerification, + "public" + >; + index: ModuleApi; + types: ModuleApi; + }; + calendar: { + calendar: ModuleApi; + events: ModuleApi; + holidays: ModuleApi; + holidaysActions: ModuleApi< + typeof domains_calendar_holidaysActions, + "public" + >; + index: ModuleApi; + }; + canonicalization: { + duplicateDetection: ModuleApi< + typeof domains_canonicalization_duplicateDetection, + "public" + >; + }; + channels: { + channelIntelligence: ModuleApi< + typeof domains_channels_channelIntelligence, + "public" + >; + engagementOptimizer: ModuleApi< + typeof domains_channels_engagementOptimizer, + "public" + >; + index: ModuleApi; + }; + deepTrace: { + causalChainEngine: ModuleApi< + typeof domains_deepTrace_causalChainEngine, + "public" + >; + dimensionEngine: ModuleApi< + typeof domains_deepTrace_dimensionEngine, + "public" + >; + dimensionModel: ModuleApi< + typeof domains_deepTrace_dimensionModel, + "public" + >; + dimensions: ModuleApi; + heuristics: ModuleApi; + integrations: ModuleApi; + researchCell: ModuleApi; + }; + documents: { + artifacts: { + evidenceIndex: ModuleApi< + typeof domains_documents_artifacts_evidenceIndex, + "public" + >; + evidenceIndexActions: ModuleApi< + typeof domains_documents_artifacts_evidenceIndexActions, + "public" + >; + evidencePacks: ModuleApi< + typeof domains_documents_artifacts_evidencePacks, + "public" + >; + evidenceSearch: ModuleApi< + typeof domains_documents_artifacts_evidenceSearch, + "public" + >; + ingestionPipeline: ModuleApi< + typeof domains_documents_artifacts_ingestionPipeline, + "public" + >; + sourceArtifacts: ModuleApi< + typeof domains_documents_artifacts_sourceArtifacts, + "public" + >; + }; + batchOperations: ModuleApi< + typeof domains_documents_batchOperations, + "public" + >; + calendar: { + calendar: ModuleApi< + typeof domains_documents_calendar_calendar, + "public" + >; + events: ModuleApi; + holidays: ModuleApi< + typeof domains_documents_calendar_holidays, + "public" + >; + holidaysActions: ModuleApi< + typeof domains_documents_calendar_holidaysActions, + "public" + >; + index: ModuleApi; + }; + chunks: ModuleApi; + citationValidator: ModuleApi< + typeof domains_documents_citationValidator, + "public" + >; + citations: ModuleApi; + documentEvents: ModuleApi< + typeof domains_documents_documentEvents, + "public" + >; + documentMetadataParser: ModuleApi< + typeof domains_documents_documentMetadataParser, + "public" + >; + documentTasks: ModuleApi< + typeof domains_documents_documentTasks, + "public" + >; + documentVersions: ModuleApi< + typeof domains_documents_documentVersions, + "public" + >; + documents: ModuleApi; + dossier: { + annotations: ModuleApi< + typeof domains_documents_dossier_annotations, + "public" + >; + enrichment: ModuleApi< + typeof domains_documents_dossier_enrichment, + "public" + >; + focusState: ModuleApi< + typeof domains_documents_dossier_focusState, + "public" + >; + index: ModuleApi; + }; + exportDocument: ModuleApi< + typeof domains_documents_exportDocument, + "public" + >; + fileAnalysis: ModuleApi; + fileDocuments: ModuleApi< + typeof domains_documents_fileDocuments, + "public" + >; + fileQueries: ModuleApi; + fileSearch: ModuleApi; + fileSearchData: ModuleApi< + typeof domains_documents_fileSearchData, + "public" + >; + files: ModuleApi; + folders: ModuleApi; + gridProjects: ModuleApi; + index: ModuleApi; + mcpDocumentEndpoints: ModuleApi< + typeof domains_documents_mcpDocumentEndpoints, + "public" + >; + pdfAnalysis: ModuleApi; + pdfInsights: ModuleApi; + pendingEdits: ModuleApi; + prosemirror: ModuleApi; + quickCapture: { + index: ModuleApi; + quickCapture: ModuleApi< + typeof domains_documents_quickCapture_quickCapture, + "public" + >; + voiceMemos: ModuleApi< + typeof domains_documents_quickCapture_voiceMemos, + "public" + >; + }; + reportDocuments: ModuleApi< + typeof domains_documents_reportDocuments, + "public" + >; + search: ModuleApi; + smartDateExtraction: ModuleApi< + typeof domains_documents_smartDateExtraction, + "public" + >; + sync: ModuleApi; + syncMutations: ModuleApi< + typeof domains_documents_syncMutations, + "public" + >; + }; + dogfood: { + screenshotQa: ModuleApi; + videoQa: ModuleApi; + videoQaMutations: ModuleApi< + typeof domains_dogfood_videoQaMutations, + "public" + >; + videoQaQueries: ModuleApi< + typeof domains_dogfood_videoQaQueries, + "public" + >; + }; + dossier: { + annotations: ModuleApi; + enrichment: ModuleApi; + focusState: ModuleApi; + index: ModuleApi; + }; + encounters: { + encounterCapture: ModuleApi< + typeof domains_encounters_encounterCapture, + "public" + >; + encounterFastPass: ModuleApi< + typeof domains_encounters_encounterFastPass, + "public" + >; + encounterMutations: ModuleApi< + typeof domains_encounters_encounterMutations, + "public" + >; + encounterQueries: ModuleApi< + typeof domains_encounters_encounterQueries, + "public" + >; + index: ModuleApi; + types: ModuleApi; + }; + enrichment: { + backfillMetadata: ModuleApi< + typeof domains_enrichment_backfillMetadata, + "public" + >; + betterSectorClassifier: ModuleApi< + typeof domains_enrichment_betterSectorClassifier, + "public" + >; + canonicalization: { + duplicateDetection: ModuleApi< + typeof domains_enrichment_canonicalization_duplicateDetection, + "public" + >; + }; + dataCleanup: ModuleApi; + deleteDuplicates: ModuleApi< + typeof domains_enrichment_deleteDuplicates, + "public" + >; + documentStore: ModuleApi< + typeof domains_enrichment_documentStore, + "public" + >; + enrichmentQueue: ModuleApi< + typeof domains_enrichment_enrichmentQueue, + "public" + >; + enrichmentWorker: ModuleApi< + typeof domains_enrichment_enrichmentWorker, + "public" + >; + entityBackfill: ModuleApi< + typeof domains_enrichment_entityBackfill, + "public" + >; + entityLinkingJudge: ModuleApi< + typeof domains_enrichment_entityLinkingJudge, + "public" + >; + entityLinkingMutations: ModuleApi< + typeof domains_enrichment_entityLinkingMutations, + "public" + >; + entityLinkingQueries: ModuleApi< + typeof domains_enrichment_entityLinkingQueries, + "public" + >; + entityLinkingService: ModuleApi< + typeof domains_enrichment_entityLinkingService, + "public" + >; + entityPromotion: ModuleApi< + typeof domains_enrichment_entityPromotion, + "public" + >; + fundingDetection: ModuleApi< + typeof domains_enrichment_fundingDetection, + "public" + >; + fundingMutations: ModuleApi< + typeof domains_enrichment_fundingMutations, + "public" + >; + fundingQueries: ModuleApi< + typeof domains_enrichment_fundingQueries, + "public" + >; + fundingVerification: ModuleApi< + typeof domains_enrichment_fundingVerification, + "public" + >; + llmCompanyExtraction: ModuleApi< + typeof domains_enrichment_llmCompanyExtraction, + "public" + >; + llmEnrichment: ModuleApi< + typeof domains_enrichment_llmEnrichment, + "public" + >; + quickVerificationUpgrade: ModuleApi< + typeof domains_enrichment_quickVerificationUpgrade, + "public" + >; + signals: { + index: ModuleApi; + signalIngester: ModuleApi< + typeof domains_enrichment_signals_signalIngester, + "public" + >; + signalProcessor: ModuleApi< + typeof domains_enrichment_signals_signalProcessor, + "public" + >; + }; + testQueries: ModuleApi; + useOfProceedsExtractor: ModuleApi< + typeof domains_enrichment_useOfProceedsExtractor, + "public" + >; + workpools: ModuleApi; + }; + entities: { + decayManager: ModuleApi; + entityLifecycle: ModuleApi< + typeof domains_entities_entityLifecycle, + "public" + >; + index: ModuleApi; + }; + eval: { + evalHelpers: ModuleApi; + evalMutations: ModuleApi; + evalStorage: ModuleApi; + productionTestCases: ModuleApi< + typeof domains_eval_productionTestCases, + "public" + >; + runBatch: ModuleApi; + runBatchNative: ModuleApi; + }; + evaluation: { + agentRunJudge: ModuleApi< + typeof domains_evaluation_agentRunJudge, + "public" + >; + benchmarkHarness: ModuleApi< + typeof domains_evaluation_benchmarkHarness, + "public" + >; + booleanEvaluator: ModuleApi< + typeof domains_evaluation_booleanEvaluator, + "public" + >; + comprehensiveEval: ModuleApi< + typeof domains_evaluation_comprehensiveEval, + "public" + >; + cronHandlers: ModuleApi; + ddEvaluation: ModuleApi; + dogfood: { + screenshotQa: ModuleApi< + typeof domains_evaluation_dogfood_screenshotQa, + "public" + >; + videoQa: ModuleApi; + videoQaMutations: ModuleApi< + typeof domains_evaluation_dogfood_videoQaMutations, + "public" + >; + videoQaQueries: ModuleApi< + typeof domains_evaluation_dogfood_videoQaQueries, + "public" + >; + }; + e2eValidation: ModuleApi< + typeof domains_evaluation_e2eValidation, + "public" + >; + eval: { + evalHelpers: ModuleApi< + typeof domains_evaluation_eval_evalHelpers, + "public" + >; + evalMutations: ModuleApi< + typeof domains_evaluation_eval_evalMutations, + "public" + >; + evalStorage: ModuleApi< + typeof domains_evaluation_eval_evalStorage, + "public" + >; + productionTestCases: ModuleApi< + typeof domains_evaluation_eval_productionTestCases, + "public" + >; + runBatch: ModuleApi; + runBatchNative: ModuleApi< + typeof domains_evaluation_eval_runBatchNative, + "public" + >; + }; + evalHarness: ModuleApi; + evalRunTracking: ModuleApi< + typeof domains_evaluation_evalRunTracking, + "public" + >; + evaluationPrompts: ModuleApi< + typeof domains_evaluation_evaluationPrompts, + "public" + >; + evaluationSafeResponse: ModuleApi< + typeof domains_evaluation_evaluationSafeResponse, + "public" + >; + evidencePlanner: ModuleApi< + typeof domains_evaluation_evidencePlanner, + "public" + >; + financial: { + corrections: ModuleApi< + typeof domains_evaluation_financial_corrections, + "public" + >; + dcfComparison: ModuleApi< + typeof domains_evaluation_financial_dcfComparison, + "public" + >; + dcfEngine: ModuleApi< + typeof domains_evaluation_financial_dcfEngine, + "public" + >; + evaluationOrchestrator: ModuleApi< + typeof domains_evaluation_financial_evaluationOrchestrator, + "public" + >; + index: ModuleApi; + reproPack: ModuleApi< + typeof domains_evaluation_financial_reproPack, + "public" + >; + seedData: ModuleApi< + typeof domains_evaluation_financial_seedData, + "public" + >; + sourceQuality: ModuleApi< + typeof domains_evaluation_financial_sourceQuality, + "public" + >; + types: ModuleApi; + }; + fixtures: { + shipDemoDayFixtures: ModuleApi< + typeof domains_evaluation_fixtures_shipDemoDayFixtures, + "public" + >; + }; + groundTruth: ModuleApi< + typeof domains_evaluation_groundTruth, + "public" + > & { + auditLog: ModuleApi< + typeof domains_evaluation_groundTruth_auditLog, + "public" + >; + versions: ModuleApi< + typeof domains_evaluation_groundTruth_versions, + "public" + >; + }; + index: ModuleApi; + inference: { + becPlaybook: ModuleApi< + typeof domains_evaluation_inference_becPlaybook, + "public" + >; + index: ModuleApi; + llmJudge: ModuleApi< + typeof domains_evaluation_inference_llmJudge, + "public" + >; + personaInferenceEval: ModuleApi< + typeof domains_evaluation_inference_personaInferenceEval, + "public" + >; + }; + judgeMetrics: ModuleApi; + liveApiSmoke: ModuleApi; + liveEval: ModuleApi; + llmJudge: ModuleApi; + mediaContextScenarios: ModuleApi< + typeof domains_evaluation_mediaContextScenarios, + "public" + >; + memoryFirstScenarios: ModuleApi< + typeof domains_evaluation_memoryFirstScenarios, + "public" + >; + migrateEvaluationScenarios: ModuleApi< + typeof domains_evaluation_migrateEvaluationScenarios, + "public" + >; + multiTurnScenarios: ModuleApi< + typeof domains_evaluation_multiTurnScenarios, + "public" + >; + operations: ModuleApi; + personaEpisodeEval: ModuleApi< + typeof domains_evaluation_personaEpisodeEval, + "public" + >; + personaInferenceScenarios: ModuleApi< + typeof domains_evaluation_personaInferenceScenarios, + "public" + >; + personaLiveEval: ModuleApi< + typeof domains_evaluation_personaLiveEval, + "public" + >; + personas: { + financial: { + financialGroundTruth: ModuleApi< + typeof domains_evaluation_personas_financial_financialGroundTruth, + "public" + >; + jpmBankerEval: ModuleApi< + typeof domains_evaluation_personas_financial_jpmBankerEval, + "public" + >; + lpAllocatorEval: ModuleApi< + typeof domains_evaluation_personas_financial_lpAllocatorEval, + "public" + >; + quantPMEval: ModuleApi< + typeof domains_evaluation_personas_financial_quantPMEval, + "public" + >; + quantPMGroundTruth: ModuleApi< + typeof domains_evaluation_personas_financial_quantPMGroundTruth, + "public" + >; + }; + identityAssurance: ModuleApi< + typeof domains_evaluation_personas_identityAssurance, + "public" + >; + index: ModuleApi; + industry: { + academicRDEval: ModuleApi< + typeof domains_evaluation_personas_industry_academicRDEval, + "public" + >; + industryGroundTruth: ModuleApi< + typeof domains_evaluation_personas_industry_industryGroundTruth, + "public" + >; + pharmaBDEval: ModuleApi< + typeof domains_evaluation_personas_industry_pharmaBDEval, + "public" + >; + }; + media: { + journalistEval: ModuleApi< + typeof domains_evaluation_personas_media_journalistEval, + "public" + >; + mediaGroundTruth: ModuleApi< + typeof domains_evaluation_personas_media_mediaGroundTruth, + "public" + >; + }; + strategic: { + corpDevEval: ModuleApi< + typeof domains_evaluation_personas_strategic_corpDevEval, + "public" + >; + founderStrategyEval: ModuleApi< + typeof domains_evaluation_personas_strategic_founderStrategyEval, + "public" + >; + founderStrategyGroundTruth: ModuleApi< + typeof domains_evaluation_personas_strategic_founderStrategyGroundTruth, + "public" + >; + macroStratEval: ModuleApi< + typeof domains_evaluation_personas_strategic_macroStratEval, + "public" + >; + strategicGroundTruth: ModuleApi< + typeof domains_evaluation_personas_strategic_strategicGroundTruth, + "public" + >; + }; + technical: { + ctoTechLeadEval: ModuleApi< + typeof domains_evaluation_personas_technical_ctoTechLeadEval, + "public" + >; + technicalGroundTruth: ModuleApi< + typeof domains_evaluation_personas_technical_technicalGroundTruth, + "public" + >; + }; + types: ModuleApi; + unifiedPersonaHarness: ModuleApi< + typeof domains_evaluation_personas_unifiedPersonaHarness, + "public" + >; + }; + promptEnhancerScenarios: ModuleApi< + typeof domains_evaluation_promptEnhancerScenarios, + "public" + >; + runBenchmark: ModuleApi; + scenarioQueries: ModuleApi< + typeof domains_evaluation_scenarioQueries, + "public" + >; + scenarios: { + researchToolEval: ModuleApi< + typeof domains_evaluation_scenarios_researchToolEval, + "public" + >; + researchUltraLongChatEval: ModuleApi< + typeof domains_evaluation_scenarios_researchUltraLongChatEval, + "public" + >; + ultraLongChatRealPathEval: ModuleApi< + typeof domains_evaluation_scenarios_ultraLongChatRealPathEval, + "public" + >; + }; + scoring: { + benchmarkSuite: ModuleApi< + typeof domains_evaluation_scoring_benchmarkSuite, + "public" + >; + claimLifecycle: ModuleApi< + typeof domains_evaluation_scoring_claimLifecycle, + "public" + >; + personaWeights: ModuleApi< + typeof domains_evaluation_scoring_personaWeights, + "public" + >; + riskCalibration: ModuleApi< + typeof domains_evaluation_scoring_riskCalibration, + "public" + >; + scoringFramework: ModuleApi< + typeof domains_evaluation_scoring_scoringFramework, + "public" + >; + sourceCitations: ModuleApi< + typeof domains_evaluation_scoring_sourceCitations, + "public" + >; + }; + sourceQuality: ModuleApi< + typeof domains_evaluation_sourceQuality, + "public" + >; + systemE2E: ModuleApi; + tasteBench: ModuleApi; + tasteBenchPolicy: ModuleApi< + typeof domains_evaluation_tasteBenchPolicy, + "public" + >; + tasteBenchSchema: ModuleApi< + typeof domains_evaluation_tasteBenchSchema, + "public" + >; + testAgentDirect: ModuleApi< + typeof domains_evaluation_testAgentDirect, + "public" + >; + testAgentQueries: ModuleApi< + typeof domains_evaluation_testAgentQueries, + "public" + >; + testAnthropicApi: ModuleApi< + typeof domains_evaluation_testAnthropicApi, + "public" + >; + testDirectApi: ModuleApi< + typeof domains_evaluation_testDirectApi, + "public" + >; + testLlmJudge: ModuleApi; + testing: { + testingFramework: ModuleApi< + typeof domains_evaluation_testing_testingFramework, + "public" + >; + }; + ultraLongChat: { + batchRunner: ModuleApi< + typeof domains_evaluation_ultraLongChat_batchRunner, + "public" + >; + judge: ModuleApi< + typeof domains_evaluation_ultraLongChat_judge, + "public" + >; + regressionGate: ModuleApi< + typeof domains_evaluation_ultraLongChat_regressionGate, + "public" + >; + scenarios: ModuleApi< + typeof domains_evaluation_ultraLongChat_scenarios, + "public" + >; + storage: ModuleApi< + typeof domains_evaluation_ultraLongChat_storage, + "public" + >; + }; + validators: ModuleApi; + workbenchQueries: ModuleApi< + typeof domains_evaluation_workbenchQueries, + "public" + >; + }; + financial: { + balanceSheetFetcher: ModuleApi< + typeof domains_financial_balanceSheetFetcher, + "public" + >; + corporateActions: ModuleApi< + typeof domains_financial_corporateActions, + "public" + >; + corrections: ModuleApi; + dcfBuilder: ModuleApi; + dcfEvaluator: ModuleApi; + dcfOrchestrator: ModuleApi< + typeof domains_financial_dcfOrchestrator, + "public" + >; + dcfProgress: ModuleApi; + dcfSpreadsheetAdapter: ModuleApi< + typeof domains_financial_dcfSpreadsheetAdapter, + "public" + >; + dcfSpreadsheetMapping: ModuleApi< + typeof domains_financial_dcfSpreadsheetMapping, + "public" + >; + dcfTools: ModuleApi; + financialAnalystAgent: ModuleApi< + typeof domains_financial_financialAnalystAgent, + "public" + >; + fundamentals: ModuleApi; + groundTruthFetcher: ModuleApi< + typeof domains_financial_groundTruthFetcher, + "public" + >; + groundTruthManager: ModuleApi< + typeof domains_financial_groundTruthManager, + "public" + >; + inconclusiveOnFailure: ModuleApi< + typeof domains_financial_inconclusiveOnFailure, + "public" + >; + index: ModuleApi; + interactiveDCFSession: ModuleApi< + typeof domains_financial_interactiveDCFSession, + "public" + >; + modelRiskGovernance: ModuleApi< + typeof domains_financial_modelRiskGovernance, + "public" + >; + reportGenerator: ModuleApi< + typeof domains_financial_reportGenerator, + "public" + >; + restatementPolicy: ModuleApi< + typeof domains_financial_restatementPolicy, + "public" + >; + secEdgarClient: ModuleApi< + typeof domains_financial_secEdgarClient, + "public" + >; + sensitivityAnalysis: ModuleApi< + typeof domains_financial_sensitivityAnalysis, + "public" + >; + taxonomyManagement: ModuleApi< + typeof domains_financial_taxonomyManagement, + "public" + >; + validation: ModuleApi; + xbrlParser: ModuleApi; + }; + financialOperator: { + attFixture: ModuleApi< + typeof domains_financialOperator_attFixture, + "public" + >; + extractors: ModuleApi< + typeof domains_financialOperator_extractors, + "public" + >; + fixtures: { + covenantFixture: ModuleApi< + typeof domains_financialOperator_fixtures_covenantFixture, + "public" + >; + crmFixture: ModuleApi< + typeof domains_financialOperator_fixtures_crmFixture, + "public" + >; + varianceFixture: ModuleApi< + typeof domains_financialOperator_fixtures_varianceFixture, + "public" + >; + }; + index: ModuleApi; + orchestrator: ModuleApi< + typeof domains_financialOperator_orchestrator, + "public" + >; + orchestratorExamples: ModuleApi< + typeof domains_financialOperator_orchestratorExamples, + "public" + >; + realExtractors: ModuleApi< + typeof domains_financialOperator_realExtractors, + "public" + >; + runOps: ModuleApi; + sandbox: ModuleApi; + types: ModuleApi; + validators: ModuleApi< + typeof domains_financialOperator_validators, + "public" + >; + }; + forecasting: { + actions: { + computeCalibration: ModuleApi< + typeof domains_forecasting_actions_computeCalibration, + "public" + >; + createForecast: ModuleApi< + typeof domains_forecasting_actions_createForecast, + "public" + >; + refreshForecast: ModuleApi< + typeof domains_forecasting_actions_refreshForecast, + "public" + >; + resolveForecast: ModuleApi< + typeof domains_forecasting_actions_resolveForecast, + "public" + >; + }; + cronHandlers: { + dailyForecastRefresh: ModuleApi< + typeof domains_forecasting_cronHandlers_dailyForecastRefresh, + "public" + >; + resolutionCheck: ModuleApi< + typeof domains_forecasting_cronHandlers_resolutionCheck, + "public" + >; + weeklyCalibration: ModuleApi< + typeof domains_forecasting_cronHandlers_weeklyCalibration, + "public" + >; + }; + forecastManager: ModuleApi< + typeof domains_forecasting_forecastManager, + "public" + >; + scoringEngine: ModuleApi< + typeof domains_forecasting_scoringEngine, + "public" + >; + signalMatcher: ModuleApi< + typeof domains_forecasting_signalMatcher, + "public" + >; + traceWrapper: ModuleApi< + typeof domains_forecasting_traceWrapper, + "public" + >; + validators: ModuleApi; + }; + founder: { + ambientIntelligenceJobs: ModuleApi< + typeof domains_founder_ambientIntelligenceJobs, + "public" + >; + ambientIntelligenceOps: ModuleApi< + typeof domains_founder_ambientIntelligenceOps, + "public" + >; + backgroundJobs: ModuleApi< + typeof domains_founder_backgroundJobs, + "public" + >; + causalMemoryJobs: ModuleApi< + typeof domains_founder_causalMemoryJobs, + "public" + >; + causalMemoryOps: ModuleApi< + typeof domains_founder_causalMemoryOps, + "public" + >; + founderHarnessOps: ModuleApi< + typeof domains_founder_founderHarnessOps, + "public" + >; + index: ModuleApi; + operations: ModuleApi; + seed: ModuleApi; + seedTrigger: ModuleApi; + sharedContextOps: ModuleApi< + typeof domains_founder_sharedContextOps, + "public" + >; + }; + governance: { + provenanceExplainer: ModuleApi< + typeof domains_governance_provenanceExplainer, + "public" + >; + quarantine: ModuleApi; + trustPolicy: ModuleApi; + }; + graph: { + applyGraphPatch: ModuleApi< + typeof domains_graph_applyGraphPatch, + "public" + >; + autoExtractMentions: ModuleApi< + typeof domains_graph_autoExtractMentions, + "public" + >; + backlinkQueries: ModuleApi< + typeof domains_graph_backlinkQueries, + "public" + >; + expandEntity: ModuleApi; + expansionQueries: ModuleApi< + typeof domains_graph_expansionQueries, + "public" + >; + index: ModuleApi; + }; + groundTruth: { + auditLog: ModuleApi; + versions: ModuleApi; + }; + hitl: { + adjudicationWorkflow: ModuleApi< + typeof domains_hitl_adjudicationWorkflow, + "public" + >; + decisions: ModuleApi; + distributionDriftDetection: ModuleApi< + typeof domains_hitl_distributionDriftDetection, + "public" + >; + labelerCalibration: ModuleApi< + typeof domains_hitl_labelerCalibration, + "public" + >; + labelingQueue: ModuleApi; + validationWorkspaceEnforcement: ModuleApi< + typeof domains_hitl_validationWorkspaceEnforcement, + "public" + >; + }; + hyperloop: { + operations: ModuleApi; + policy: ModuleApi; + }; + integrations: { + billing: { + apiUsageTracking: ModuleApi< + typeof domains_integrations_billing_apiUsageTracking, + "public" + >; + billing: ModuleApi< + typeof domains_integrations_billing_billing, + "public" + >; + index: ModuleApi; + rateLimiting: ModuleApi< + typeof domains_integrations_billing_rateLimiting, + "public" + >; + }; + discord: ModuleApi; + discordAgent: ModuleApi< + typeof domains_integrations_discordAgent, + "public" + >; + email: ModuleApi & { + dailyEmailReport: ModuleApi< + typeof domains_integrations_email_dailyEmailReport, + "public" + >; + dossierEmailExample: ModuleApi< + typeof domains_integrations_email_dossierEmailExample, + "public" + >; + dossierEmailTemplate: ModuleApi< + typeof domains_integrations_email_dossierEmailTemplate, + "public" + >; + emailAdmin: ModuleApi< + typeof domains_integrations_email_emailAdmin, + "public" + >; + emailAdminActions: ModuleApi< + typeof domains_integrations_email_emailAdminActions, + "public" + >; + emailEncounterIngest: ModuleApi< + typeof domains_integrations_email_emailEncounterIngest, + "public" + >; + emailQueries: ModuleApi< + typeof domains_integrations_email_emailQueries, + "public" + >; + emailService: ModuleApi< + typeof domains_integrations_email_emailService, + "public" + >; + emailWebhook: ModuleApi< + typeof domains_integrations_email_emailWebhook, + "public" + >; + morningDigestEmailTemplate: ModuleApi< + typeof domains_integrations_email_morningDigestEmailTemplate, + "public" + >; + }; + gcal: ModuleApi; + gmail: ModuleApi & { + types: ModuleApi; + }; + index: ModuleApi; + integrations: ModuleApi< + typeof domains_integrations_integrations, + "public" + >; + landing: { + landingPageLog: ModuleApi< + typeof domains_integrations_landing_landingPageLog, + "public" + >; + }; + macro: { + fredSeed: ModuleApi< + typeof domains_integrations_macro_fredSeed, + "public" + >; + }; + ntfy: ModuleApi; + polar: ModuleApi; + resend: ModuleApi; + slack: { + encounterMutations: ModuleApi< + typeof domains_integrations_slack_encounterMutations, + "public" + >; + encounterParser: ModuleApi< + typeof domains_integrations_slack_encounterParser, + "public" + >; + encounterResearch: ModuleApi< + typeof domains_integrations_slack_encounterResearch, + "public" + >; + encounterResearchQueries: ModuleApi< + typeof domains_integrations_slack_encounterResearchQueries, + "public" + >; + encounterResolver: ModuleApi< + typeof domains_integrations_slack_encounterResolver, + "public" + >; + index: ModuleApi; + slackAgent: ModuleApi< + typeof domains_integrations_slack_slackAgent, + "public" + >; + slackBlocks: ModuleApi< + typeof domains_integrations_slack_slackBlocks, + "public" + >; + slackWebhook: ModuleApi< + typeof domains_integrations_slack_slackWebhook, + "public" + >; + }; + sms: ModuleApi; + spreadsheets: ModuleApi< + typeof domains_integrations_spreadsheets, + "public" + >; + telegram: ModuleApi; + telegramAgent: ModuleApi< + typeof domains_integrations_telegramAgent, + "public" + >; + video: { + oembedFetcher: ModuleApi< + typeof domains_integrations_video_oembedFetcher, + "public" + >; + oembedFetcherQueries: ModuleApi< + typeof domains_integrations_video_oembedFetcherQueries, + "public" + >; + }; + voice: { + costLedger: ModuleApi< + typeof domains_integrations_voice_costLedger, + "public" + >; + editionTts: ModuleApi< + typeof domains_integrations_voice_editionTts, + "public" + >; + realtimeAudit: ModuleApi< + typeof domains_integrations_voice_realtimeAudit, + "public" + >; + realtimeGateway: ModuleApi< + typeof domains_integrations_voice_realtimeGateway, + "public" + >; + voiceActions: ModuleApi< + typeof domains_integrations_voice_voiceActions, + "public" + >; + voiceAgent: ModuleApi< + typeof domains_integrations_voice_voiceAgent, + "public" + >; + voiceMutations: ModuleApi< + typeof domains_integrations_voice_voiceMutations, + "public" + >; + }; + }; + intelligence: { + operations: ModuleApi; + }; + knowledge: { + adaptiveEntityEnrichment: ModuleApi< + typeof domains_knowledge_adaptiveEntityEnrichment, + "public" + >; + adaptiveEntityQueries: ModuleApi< + typeof domains_knowledge_adaptiveEntityQueries, + "public" + >; + entityContexts: ModuleApi< + typeof domains_knowledge_entityContexts, + "public" + >; + entityInsights: ModuleApi< + typeof domains_knowledge_entityInsights, + "public" + >; + index: ModuleApi; + knowledgeGraph: ModuleApi< + typeof domains_knowledge_knowledgeGraph, + "public" + >; + learning: { + adaptiveLearning: ModuleApi< + typeof domains_knowledge_learning_adaptiveLearning, + "public" + >; + }; + nodes: ModuleApi; + relationTypes: ModuleApi< + typeof domains_knowledge_relationTypes, + "public" + >; + relations: ModuleApi; + relationshipGraph: ModuleApi< + typeof domains_knowledge_relationshipGraph, + "public" + >; + sourceDiffs: ModuleApi; + sourceRegistry: ModuleApi< + typeof domains_knowledge_sourceRegistry, + "public" + >; + tags: ModuleApi; + teachability: { + index: ModuleApi; + }; + }; + landing: { + landingPageLog: ModuleApi< + typeof domains_landing_landingPageLog, + "public" + >; + }; + learning: { + adaptiveLearning: ModuleApi< + typeof domains_learning_adaptiveLearning, + "public" + >; + }; + mcp: { + apiKeys: ModuleApi; + apiKeysSchema: ModuleApi; + mcp: ModuleApi; + mcpAuth: ModuleApi; + mcpBridgeHttp: ModuleApi; + mcpBridgeQueries: ModuleApi< + typeof domains_mcp_mcpBridgeQueries, + "public" + >; + mcpClient: ModuleApi; + mcpExecutionTraceEndpoints: ModuleApi< + typeof domains_mcp_mcpExecutionTraceEndpoints, + "public" + >; + mcpGatewayDispatcher: ModuleApi< + typeof domains_mcp_mcpGatewayDispatcher, + "public" + >; + mcpHttpAuth: ModuleApi; + mcpHybridSearch: ModuleApi; + mcpLearning: ModuleApi; + mcpMemory: ModuleApi; + mcpMemoryHttp: ModuleApi; + mcpNarrativeEndpoints: ModuleApi< + typeof domains_mcp_mcpNarrativeEndpoints, + "public" + >; + mcpPlans: ModuleApi; + mcpPlansHttp: ModuleApi; + mcpResearchEndpoints: ModuleApi< + typeof domains_mcp_mcpResearchEndpoints, + "public" + >; + mcpSourcingContract: ModuleApi< + typeof domains_mcp_mcpSourcingContract, + "public" + >; + mcpSourcingDraft: ModuleApi< + typeof domains_mcp_mcpSourcingDraft, + "public" + >; + mcpToolLedger: ModuleApi; + mcpToolRegistry: ModuleApi; + mcpVerificationEndpoints: ModuleApi< + typeof domains_mcp_mcpVerificationEndpoints, + "public" + >; + webmcpOriginManager: ModuleApi< + typeof domains_mcp_webmcpOriginManager, + "public" + >; + }; + messaging: { + channelPreferencesManager: ModuleApi< + typeof domains_messaging_channelPreferencesManager, + "public" + >; + channelProvider: ModuleApi< + typeof domains_messaging_channelProvider, + "public" + >; + channels: { + channelIntelligence: ModuleApi< + typeof domains_messaging_channels_channelIntelligence, + "public" + >; + engagementOptimizer: ModuleApi< + typeof domains_messaging_channels_engagementOptimizer, + "public" + >; + index: ModuleApi; + }; + inboundPipeline: ModuleApi< + typeof domains_messaging_inboundPipeline, + "public" + >; + messagingObservability: ModuleApi< + typeof domains_messaging_messagingObservability, + "public" + >; + messagingSecurity: ModuleApi< + typeof domains_messaging_messagingSecurity, + "public" + >; + outboundPipeline: ModuleApi< + typeof domains_messaging_outboundPipeline, + "public" + >; + providerRegistry: ModuleApi< + typeof domains_messaging_providerRegistry, + "public" + >; + providers: { + discordProvider: ModuleApi< + typeof domains_messaging_providers_discordProvider, + "public" + >; + emailProvider: ModuleApi< + typeof domains_messaging_providers_emailProvider, + "public" + >; + ntfyProvider: ModuleApi< + typeof domains_messaging_providers_ntfyProvider, + "public" + >; + openclawGatewayClient: ModuleApi< + typeof domains_messaging_providers_openclawGatewayClient, + "public" + >; + openclawProvider: ModuleApi< + typeof domains_messaging_providers_openclawProvider, + "public" + >; + slackProvider: ModuleApi< + typeof domains_messaging_providers_slackProvider, + "public" + >; + smsProvider: ModuleApi< + typeof domains_messaging_providers_smsProvider, + "public" + >; + telegramProvider: ModuleApi< + typeof domains_messaging_providers_telegramProvider, + "public" + >; + uiProvider: ModuleApi< + typeof domains_messaging_providers_uiProvider, + "public" + >; + }; + }; + missions: { + costQueries: ModuleApi; + index: ModuleApi; + missionOrchestrator: ModuleApi< + typeof domains_missions_missionOrchestrator, + "public" + >; + preExecutionGate: ModuleApi< + typeof domains_missions_preExecutionGate, + "public" + >; + preExecutionGateQueries: ModuleApi< + typeof domains_missions_preExecutionGateQueries, + "public" + >; + }; + models: { + autonomousModelResolver: ModuleApi< + typeof domains_models_autonomousModelResolver, + "public" + >; + freeModelDiscovery: ModuleApi< + typeof domains_models_freeModelDiscovery, + "public" + >; + index: ModuleApi; + livePerformanceEval: ModuleApi< + typeof domains_models_livePerformanceEval, + "public" + >; + modelRouter: ModuleApi; + modelRouterQueries: ModuleApi< + typeof domains_models_modelRouterQueries, + "public" + >; + }; + monitoring: { + gdeltSeed: ModuleApi; + industryUpdates: ModuleApi< + typeof domains_monitoring_industryUpdates, + "public" + >; + industryUpdatesEnhanced: ModuleApi< + typeof domains_monitoring_industryUpdatesEnhanced, + "public" + >; + integrationHelpers: ModuleApi< + typeof domains_monitoring_integrationHelpers, + "public" + >; + publicTrendingSeed: ModuleApi< + typeof domains_monitoring_publicTrendingSeed, + "public" + >; + worldMonitor: ModuleApi; + }; + narrative: { + actions: { + competingExplanations: ModuleApi< + typeof domains_narrative_actions_competingExplanations, + "public" + >; + hypothesisLifecycle: ModuleApi< + typeof domains_narrative_actions_hypothesisLifecycle, + "public" + >; + }; + adapters: { + briefAdapter: ModuleApi< + typeof domains_narrative_adapters_briefAdapter, + "public" + >; + feedAdapter: ModuleApi< + typeof domains_narrative_adapters_feedAdapter, + "public" + >; + index: ModuleApi; + linkedinAdapter: ModuleApi< + typeof domains_narrative_adapters_linkedinAdapter, + "public" + >; + pipelineQueries: ModuleApi< + typeof domains_narrative_adapters_pipelineQueries, + "public" + >; + types: ModuleApi; + }; + contracts: { + eventClassificationContract: ModuleApi< + typeof domains_narrative_contracts_eventClassificationContract, + "public" + >; + }; + cronHandlers: ModuleApi; + crons: ModuleApi; + didYouKnow: ModuleApi; + didYouKnowSources: ModuleApi< + typeof domains_narrative_didYouKnowSources, + "public" + >; + experiments: { + freshNewsDidYouKnowExperiment: ModuleApi< + typeof domains_narrative_experiments_freshNewsDidYouKnowExperiment, + "public" + >; + }; + guards: { + claimClassificationGate: ModuleApi< + typeof domains_narrative_guards_claimClassificationGate, + "public" + >; + claimClassificationGateQueries: ModuleApi< + typeof domains_narrative_guards_claimClassificationGateQueries, + "public" + >; + claimClassifier: ModuleApi< + typeof domains_narrative_guards_claimClassifier, + "public" + >; + contentRights: ModuleApi< + typeof domains_narrative_guards_contentRights, + "public" + >; + index: ModuleApi; + injectionContainment: ModuleApi< + typeof domains_narrative_guards_injectionContainment, + "public" + >; + quarantine: ModuleApi< + typeof domains_narrative_guards_quarantine, + "public" + >; + selfCitationGuard: ModuleApi< + typeof domains_narrative_guards_selfCitationGuard, + "public" + >; + trustScoring: ModuleApi< + typeof domains_narrative_guards_trustScoring, + "public" + >; + truthMaintenance: ModuleApi< + typeof domains_narrative_guards_truthMaintenance, + "public" + >; + }; + index: ModuleApi; + integrations: { + hooks: ModuleApi; + }; + mutations: { + correlations: ModuleApi< + typeof domains_narrative_mutations_correlations, + "public" + >; + dedup: ModuleApi; + disputes: ModuleApi< + typeof domains_narrative_mutations_disputes, + "public" + >; + events: ModuleApi; + evidence: ModuleApi< + typeof domains_narrative_mutations_evidence, + "public" + >; + hypotheses: ModuleApi< + typeof domains_narrative_mutations_hypotheses, + "public" + >; + policyEnforcedOps: ModuleApi< + typeof domains_narrative_mutations_policyEnforcedOps, + "public" + >; + posts: ModuleApi; + replies: ModuleApi< + typeof domains_narrative_mutations_replies, + "public" + >; + searchLog: ModuleApi< + typeof domains_narrative_mutations_searchLog, + "public" + >; + signalMetrics: ModuleApi< + typeof domains_narrative_mutations_signalMetrics, + "public" + >; + temporalFacts: ModuleApi< + typeof domains_narrative_mutations_temporalFacts, + "public" + >; + threads: ModuleApi< + typeof domains_narrative_mutations_threads, + "public" + >; + toolReplay: ModuleApi< + typeof domains_narrative_mutations_toolReplay, + "public" + >; + workflowTrace: ModuleApi< + typeof domains_narrative_mutations_workflowTrace, + "public" + >; + }; + newsroom: { + agents: { + analystAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_analystAgent, + "public" + >; + commentHarvester: ModuleApi< + typeof domains_narrative_newsroom_agents_commentHarvester, + "public" + >; + curatorAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_curatorAgent, + "public" + >; + historianAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_historianAgent, + "public" + >; + index: ModuleApi< + typeof domains_narrative_newsroom_agents_index, + "public" + >; + publisherAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_publisherAgent, + "public" + >; + scoutAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_scoutAgent, + "public" + >; + signalCollectorAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_signalCollectorAgent, + "public" + >; + }; + recordReplayLane: ModuleApi< + typeof domains_narrative_newsroom_recordReplayLane, + "public" + >; + state: ModuleApi; + workflow: ModuleApi< + typeof domains_narrative_newsroom_workflow, + "public" + >; + }; + policies: { + contentRights: ModuleApi< + typeof domains_narrative_policies_contentRights, + "public" + >; + }; + queries: { + correlations: ModuleApi< + typeof domains_narrative_queries_correlations, + "public" + >; + disputes: ModuleApi< + typeof domains_narrative_queries_disputes, + "public" + >; + events: ModuleApi; + hypotheses: ModuleApi< + typeof domains_narrative_queries_hypotheses, + "public" + >; + posts: ModuleApi; + searchLog: ModuleApi< + typeof domains_narrative_queries_searchLog, + "public" + >; + signalMetrics: ModuleApi< + typeof domains_narrative_queries_signalMetrics, + "public" + >; + threads: ModuleApi; + }; + safety: { + abuseResistance: ModuleApi< + typeof domains_narrative_safety_abuseResistance, + "public" + >; + }; + tests: { + goldenSets: { + generatedCases: ModuleApi< + typeof domains_narrative_tests_goldenSets_generatedCases, + "public" + >; + types: ModuleApi< + typeof domains_narrative_tests_goldenSets_types, + "public" + >; + }; + qaFramework: ModuleApi< + typeof domains_narrative_tests_qaFramework, + "public" + >; + validatePipeline: ModuleApi< + typeof domains_narrative_tests_validatePipeline, + "public" + >; + }; + truth: { + truthStateManager: ModuleApi< + typeof domains_narrative_truth_truthStateManager, + "public" + >; + }; + validators: ModuleApi; + }; + observability: { + dashboardData: ModuleApi< + typeof domains_observability_dashboardData, + "public" + >; + goldenMetrics: ModuleApi< + typeof domains_observability_goldenMetrics, + "public" + >; + healthMonitor: ModuleApi< + typeof domains_observability_healthMonitor, + "public" + >; + index: ModuleApi; + selfHealer: ModuleApi; + telemetry: ModuleApi; + traces: ModuleApi; + }; + openclaw: { + executionEngine: ModuleApi< + typeof domains_openclaw_executionEngine, + "public" + >; + forecastHandoffPolicy: ModuleApi< + typeof domains_openclaw_forecastHandoffPolicy, + "public" + >; + monitoring: ModuleApi; + sessionManager: ModuleApi< + typeof domains_openclaw_sessionManager, + "public" + >; + tools: { + openclawAgentTools: ModuleApi< + typeof domains_openclaw_tools_openclawAgentTools, + "public" + >; + }; + workflowManager: ModuleApi< + typeof domains_openclaw_workflowManager, + "public" + >; + }; + operations: { + adminAuditLog: ModuleApi< + typeof domains_operations_adminAuditLog, + "public" + >; + autonomousControlTower: ModuleApi< + typeof domains_operations_autonomousControlTower, + "public" + >; + batchAutopilot: { + deltaCollector: ModuleApi< + typeof domains_operations_batchAutopilot_deltaCollector, + "public" + >; + mutations: ModuleApi< + typeof domains_operations_batchAutopilot_mutations, + "public" + >; + promptBuilder: ModuleApi< + typeof domains_operations_batchAutopilot_promptBuilder, + "public" + >; + queries: ModuleApi< + typeof domains_operations_batchAutopilot_queries, + "public" + >; + runner: ModuleApi< + typeof domains_operations_batchAutopilot_runner, + "public" + >; + scheduler: ModuleApi< + typeof domains_operations_batchAutopilot_scheduler, + "public" + >; + }; + bugLoop: ModuleApi; + encounters: { + encounterCapture: ModuleApi< + typeof domains_operations_encounters_encounterCapture, + "public" + >; + encounterFastPass: ModuleApi< + typeof domains_operations_encounters_encounterFastPass, + "public" + >; + encounterMutations: ModuleApi< + typeof domains_operations_encounters_encounterMutations, + "public" + >; + encounterQueries: ModuleApi< + typeof domains_operations_encounters_encounterQueries, + "public" + >; + index: ModuleApi; + types: ModuleApi; + }; + gameDayTracking: ModuleApi< + typeof domains_operations_gameDayTracking, + "public" + >; + governance: { + provenanceExplainer: ModuleApi< + typeof domains_operations_governance_provenanceExplainer, + "public" + >; + quarantine: ModuleApi< + typeof domains_operations_governance_quarantine, + "public" + >; + trustPolicy: ModuleApi< + typeof domains_operations_governance_trustPolicy, + "public" + >; + }; + hitl: { + adjudicationWorkflow: ModuleApi< + typeof domains_operations_hitl_adjudicationWorkflow, + "public" + >; + decisions: ModuleApi< + typeof domains_operations_hitl_decisions, + "public" + >; + distributionDriftDetection: ModuleApi< + typeof domains_operations_hitl_distributionDriftDetection, + "public" + >; + labelerCalibration: ModuleApi< + typeof domains_operations_hitl_labelerCalibration, + "public" + >; + labelingQueue: ModuleApi< + typeof domains_operations_hitl_labelingQueue, + "public" + >; + validationWorkspaceEnforcement: ModuleApi< + typeof domains_operations_hitl_validationWorkspaceEnforcement, + "public" + >; + }; + mcpRateLimiting: ModuleApi< + typeof domains_operations_mcpRateLimiting, + "public" + >; + mcpSecurity: ModuleApi; + monitoring: { + industryUpdates: ModuleApi< + typeof domains_operations_monitoring_industryUpdates, + "public" + >; + industryUpdatesEnhanced: ModuleApi< + typeof domains_operations_monitoring_industryUpdatesEnhanced, + "public" + >; + integrationHelpers: ModuleApi< + typeof domains_operations_monitoring_integrationHelpers, + "public" + >; + }; + observability: { + dashboardData: ModuleApi< + typeof domains_operations_observability_dashboardData, + "public" + >; + goldenMetrics: ModuleApi< + typeof domains_operations_observability_goldenMetrics, + "public" + >; + healthMonitor: ModuleApi< + typeof domains_operations_observability_healthMonitor, + "public" + >; + index: ModuleApi< + typeof domains_operations_observability_index, + "public" + >; + selfHealer: ModuleApi< + typeof domains_operations_observability_selfHealer, + "public" + >; + telemetry: ModuleApi< + typeof domains_operations_observability_telemetry, + "public" + >; + traces: ModuleApi< + typeof domains_operations_observability_traces, + "public" + >; + }; + personaChangeTracking: ModuleApi< + typeof domains_operations_personaChangeTracking, + "public" + >; + postExecutionHygiene: ModuleApi< + typeof domains_operations_postExecutionHygiene, + "public" + >; + privacyEnforcement: ModuleApi< + typeof domains_operations_privacyEnforcement, + "public" + >; + selfMaintenance: ModuleApi< + typeof domains_operations_selfMaintenance, + "public" + >; + selfMaintenanceChecks: ModuleApi< + typeof domains_operations_selfMaintenanceChecks, + "public" + >; + sloCalculation: ModuleApi< + typeof domains_operations_sloCalculation, + "public" + >; + sloCollector: ModuleApi; + sloDashboardQueries: ModuleApi< + typeof domains_operations_sloDashboardQueries, + "public" + >; + sloFramework: ModuleApi; + taskManager: { + cronWrapper: ModuleApi< + typeof domains_operations_taskManager_cronWrapper, + "public" + >; + index: ModuleApi; + mutations: ModuleApi< + typeof domains_operations_taskManager_mutations, + "public" + >; + nodeKitNativeIdentityMigration: ModuleApi< + typeof domains_operations_taskManager_nodeKitNativeIdentityMigration, + "public" + >; + nodeKitRunEvents: ModuleApi< + typeof domains_operations_taskManager_nodeKitRunEvents, + "public" + >; + nodeKitRunExport: ModuleApi< + typeof domains_operations_taskManager_nodeKitRunExport, + "public" + >; + nodeKitRunRetention: ModuleApi< + typeof domains_operations_taskManager_nodeKitRunRetention, + "public" + >; + nodeKitRuntimeIdentity: ModuleApi< + typeof domains_operations_taskManager_nodeKitRuntimeIdentity, + "public" + >; + proofPack: ModuleApi< + typeof domains_operations_taskManager_proofPack, + "public" + >; + queries: ModuleApi< + typeof domains_operations_taskManager_queries, + "public" + >; + }; + tasks: { + dailyNotes: ModuleApi< + typeof domains_operations_tasks_dailyNotes, + "public" + >; + eventTaskDocuments: ModuleApi< + typeof domains_operations_tasks_eventTaskDocuments, + "public" + >; + index: ModuleApi; + userEvents: ModuleApi< + typeof domains_operations_tasks_userEvents, + "public" + >; + work: ModuleApi; + workflows: { + bankingMemoWorkflow: ModuleApi< + typeof domains_operations_tasks_workflows_bankingMemoWorkflow, + "public" + >; + coordinatorWorkflow: ModuleApi< + typeof domains_operations_tasks_workflows_coordinatorWorkflow, + "public" + >; + index: ModuleApi< + typeof domains_operations_tasks_workflows_index, + "public" + >; + }; + }; + telemetry: { + disclosureEvents: ModuleApi< + typeof domains_operations_telemetry_disclosureEvents, + "public" + >; + }; + utilities: { + migrations: ModuleApi< + typeof domains_operations_utilities_migrations, + "public" + >; + seedGoldenDataset: ModuleApi< + typeof domains_operations_utilities_seedGoldenDataset, + "public" + >; + snapshotMigrations: ModuleApi< + typeof domains_operations_utilities_snapshotMigrations, + "public" + >; + }; + validationWorkflow: ModuleApi< + typeof domains_operations_validationWorkflow, + "public" + >; + }; + operatorProfile: { + filesystemSync: ModuleApi< + typeof domains_operatorProfile_filesystemSync, + "public" + >; + manifest: ModuleApi; + mutations: ModuleApi; + parser: ModuleApi; + queries: ModuleApi; + template: ModuleApi; + }; + oracle: { + index: ModuleApi; + mutations: ModuleApi; + queries: ModuleApi; + }; + personas: { + index: ModuleApi; + multiPersonaSynthesizer: ModuleApi< + typeof domains_personas_multiPersonaSynthesizer, + "public" + >; + personaAutonomousAgent: ModuleApi< + typeof domains_personas_personaAutonomousAgent, + "public" + >; + }; + pipelines: { + codeGenPipeline: ModuleApi< + typeof domains_pipelines_codeGenPipeline, + "public" + >; + composedPipeline: ModuleApi< + typeof domains_pipelines_composedPipeline, + "public" + >; + designGenPipeline: ModuleApi< + typeof domains_pipelines_designGenPipeline, + "public" + >; + linkupAdapter: ModuleApi< + typeof domains_pipelines_linkupAdapter, + "public" + >; + piRuntime: ModuleApi; + pipelineAdmission: ModuleApi< + typeof domains_pipelines_pipelineAdmission, + "public" + >; + pipelineAttempt: ModuleApi< + typeof domains_pipelines_pipelineAttempt, + "public" + >; + pipelineDocumentHandoff: ModuleApi< + typeof domains_pipelines_pipelineDocumentHandoff, + "public" + >; + pipelineEvalQueries: ModuleApi< + typeof domains_pipelines_pipelineEvalQueries, + "public" + >; + pipelineMcpHttp: ModuleApi< + typeof domains_pipelines_pipelineMcpHttp, + "public" + >; + pipelineOwnership: ModuleApi< + typeof domains_pipelines_pipelineOwnership, + "public" + >; + pipelineRunsMutations: ModuleApi< + typeof domains_pipelines_pipelineRunsMutations, + "public" + >; + pipelineRunsQueries: ModuleApi< + typeof domains_pipelines_pipelineRunsQueries, + "public" + >; + pipelineSchedule: ModuleApi< + typeof domains_pipelines_pipelineSchedule, + "public" + >; + pipelineStreamMutations: ModuleApi< + typeof domains_pipelines_pipelineStreamMutations, + "public" + >; + pipelineTrace: ModuleApi< + typeof domains_pipelines_pipelineTrace, + "public" + >; + pipelineWorkflow: ModuleApi< + typeof domains_pipelines_pipelineWorkflow, + "public" + >; + researchPipeline: ModuleApi< + typeof domains_pipelines_researchPipeline, + "public" + >; + researchProvenance: ModuleApi< + typeof domains_pipelines_researchProvenance, + "public" + >; + }; + proactive: { + actions: { + emailDraftGenerator: ModuleApi< + typeof domains_proactive_actions_emailDraftGenerator, + "public" + >; + gmailDraftActions: ModuleApi< + typeof domains_proactive_actions_gmailDraftActions, + "public" + >; + testDraftGenerator: ModuleApi< + typeof domains_proactive_actions_testDraftGenerator, + "public" + >; + testOpenRouterProvider: ModuleApi< + typeof domains_proactive_actions_testOpenRouterProvider, + "public" + >; + testSimpleDraft: ModuleApi< + typeof domains_proactive_actions_testSimpleDraft, + "public" + >; + }; + adapters: { + calendarEventAdapter: ModuleApi< + typeof domains_proactive_adapters_calendarEventAdapter, + "public" + >; + emailEventAdapter: ModuleApi< + typeof domains_proactive_adapters_emailEventAdapter, + "public" + >; + }; + adminQueries: ModuleApi; + agentDispatch: ModuleApi< + typeof domains_proactive_agentDispatch, + "public" + >; + consentMutations: ModuleApi< + typeof domains_proactive_consentMutations, + "public" + >; + delivery: { + slackDelivery: ModuleApi< + typeof domains_proactive_delivery_slackDelivery, + "public" + >; + }; + deliveryOrchestrator: ModuleApi< + typeof domains_proactive_deliveryOrchestrator, + "public" + >; + detectors: { + BaseDetector: ModuleApi< + typeof domains_proactive_detectors_BaseDetector, + "public" + >; + dailyBriefDetector: ModuleApi< + typeof domains_proactive_detectors_dailyBriefDetector, + "public" + >; + executor: ModuleApi< + typeof domains_proactive_detectors_executor, + "public" + >; + followUpDetector: ModuleApi< + typeof domains_proactive_detectors_followUpDetector, + "public" + >; + meetingPrepDetector: ModuleApi< + typeof domains_proactive_detectors_meetingPrepDetector, + "public" + >; + registry: ModuleApi< + typeof domains_proactive_detectors_registry, + "public" + >; + types: ModuleApi; + }; + mutations: ModuleApi; + policyGateway: ModuleApi< + typeof domains_proactive_policyGateway, + "public" + >; + queries: ModuleApi; + recomm: { + feedback: ModuleApi; + }; + recommendations: { + behaviorTracking: ModuleApi< + typeof domains_proactive_recommendations_behaviorTracking, + "public" + >; + index: ModuleApi< + typeof domains_proactive_recommendations_index, + "public" + >; + recommendationEngine: ModuleApi< + typeof domains_proactive_recommendations_recommendationEngine, + "public" + >; + }; + seedAdmins: ModuleApi; + }; + product: { + activity: ModuleApi; + blockOrdering: ModuleApi; + blockProsemirror: ModuleApi< + typeof domains_product_blockProsemirror, + "public" + >; + blocks: ModuleApi; + bootstrap: ModuleApi; + chat: ModuleApi; + delivery: ModuleApi; + diligenceCheckpointStructuring: ModuleApi< + typeof domains_product_diligenceCheckpointStructuring, + "public" + >; + diligenceJudge: ModuleApi< + typeof domains_product_diligenceJudge, + "public" + >; + diligenceLlmJudgeRuns: ModuleApi< + typeof domains_product_diligenceLlmJudgeRuns, + "public" + >; + diligenceProjectionRuntime: ModuleApi< + typeof domains_product_diligenceProjectionRuntime, + "public" + >; + diligenceProjections: ModuleApi< + typeof domains_product_diligenceProjections, + "public" + >; + diligenceRunTelemetry: ModuleApi< + typeof domains_product_diligenceRunTelemetry, + "public" + >; + diligenceScratchpads: ModuleApi< + typeof domains_product_diligenceScratchpads, + "public" + >; + documents: ModuleApi; + entities: ModuleApi; + entityMemory: ModuleApi; + eventWorkspace: ModuleApi< + typeof domains_product_eventWorkspace, + "public" + >; + extendedThinking: ModuleApi< + typeof domains_product_extendedThinking, + "public" + >; + helpers: ModuleApi; + home: ModuleApi; + me: ModuleApi; + notebookPresence: ModuleApi< + typeof domains_product_notebookPresence, + "public" + >; + notebookTracking: ModuleApi< + typeof domains_product_notebookTracking, + "public" + >; + nudgeHelpers: ModuleApi; + nudges: ModuleApi; + pipelineReliability: ModuleApi< + typeof domains_product_pipelineReliability, + "public" + >; + pipelineRetryDispatcher: ModuleApi< + typeof domains_product_pipelineRetryDispatcher, + "public" + >; + publicShares: ModuleApi; + pulseReports: ModuleApi; + reports: ModuleApi; + scratchnodeImport: ModuleApi< + typeof domains_product_scratchnodeImport, + "public" + >; + sessionArtifacts: ModuleApi< + typeof domains_product_sessionArtifacts, + "public" + >; + shares: ModuleApi; + shell: ModuleApi; + systemIntelligence: ModuleApi< + typeof domains_product_systemIntelligence, + "public" + >; + userWikiMaintainer: ModuleApi< + typeof domains_product_userWikiMaintainer, + "public" + >; + userWikiSchema: ModuleApi< + typeof domains_product_userWikiSchema, + "public" + >; + visibilityBackfill: ModuleApi< + typeof domains_product_visibilityBackfill, + "public" + >; + wikiDreamingEvalProduction: ModuleApi< + typeof domains_product_wikiDreamingEvalProduction, + "public" + >; + wikiDreamingEvaluation: ModuleApi< + typeof domains_product_wikiDreamingEvaluation, + "public" + >; + wikiDreamingEvaluationNatural: ModuleApi< + typeof domains_product_wikiDreamingEvaluationNatural, + "public" + >; + wikiDreamingGraph: ModuleApi< + typeof domains_product_wikiDreamingGraph, + "public" + >; + wikiDreamingQueries: ModuleApi< + typeof domains_product_wikiDreamingQueries, + "public" + >; + wikiStagingMutations: ModuleApi< + typeof domains_product_wikiStagingMutations, + "public" + >; + }; + profiler: { + mutations: ModuleApi; + queries: ModuleApi; + }; + publicResearch: { + actions: ModuleApi; + core: ModuleApi; + }; + publishing: { + deliveryQueue: ModuleApi< + typeof domains_publishing_deliveryQueue, + "public" + >; + index: ModuleApi; + publishingOrchestrator: ModuleApi< + typeof domains_publishing_publishingOrchestrator, + "public" + >; + }; + quickCapture: { + index: ModuleApi; + quickCapture: ModuleApi< + typeof domains_quickCapture_quickCapture, + "public" + >; + voiceMemos: ModuleApi; + }; + recomm: { + feedback: ModuleApi; + }; + recommendations: { + behaviorTracking: ModuleApi< + typeof domains_recommendations_behaviorTracking, + "public" + >; + index: ModuleApi; + recommendationEngine: ModuleApi< + typeof domains_recommendations_recommendationEngine, + "public" + >; + }; + redesign: { + agentRunFeedback: ModuleApi< + typeof domains_redesign_agentRunFeedback, + "public" + >; + chatRuns: ModuleApi; + documentPatches: ModuleApi< + typeof domains_redesign_documentPatches, + "public" + >; + inboxSnoozes: ModuleApi; + reportGraphNeighborhood: ModuleApi< + typeof domains_redesign_reportGraphNeighborhood, + "public" + >; + reportTopology: ModuleApi< + typeof domains_redesign_reportTopology, + "public" + >; + reportTopologyRuntime: ModuleApi< + typeof domains_redesign_reportTopologyRuntime, + "public" + >; + styleProfile: ModuleApi; + universes: ModuleApi; + }; + research: { + angleRegistry: ModuleApi; + autonomousResearcher: ModuleApi< + typeof domains_research_autonomousResearcher, + "public" + >; + briefGenerator: ModuleApi< + typeof domains_research_briefGenerator, + "public" + >; + dailyBriefInitializer: ModuleApi< + typeof domains_research_dailyBriefInitializer, + "public" + >; + dailyBriefMemoryMutations: ModuleApi< + typeof domains_research_dailyBriefMemoryMutations, + "public" + >; + dailyBriefMemoryQueries: ModuleApi< + typeof domains_research_dailyBriefMemoryQueries, + "public" + >; + dailyBriefPersonalOverlay: ModuleApi< + typeof domains_research_dailyBriefPersonalOverlay, + "public" + >; + dailyBriefPersonalOverlayMutations: ModuleApi< + typeof domains_research_dailyBriefPersonalOverlayMutations, + "public" + >; + dailyBriefPersonalOverlayQueries: ModuleApi< + typeof domains_research_dailyBriefPersonalOverlayQueries, + "public" + >; + dailyBriefSourceVerification: ModuleApi< + typeof domains_research_dailyBriefSourceVerification, + "public" + >; + dailyBriefWorker: ModuleApi< + typeof domains_research_dailyBriefWorker, + "public" + >; + dashboardMetrics: ModuleApi< + typeof domains_research_dashboardMetrics, + "public" + >; + dashboardMutations: ModuleApi< + typeof domains_research_dashboardMutations, + "public" + >; + dashboardQueries: ModuleApi< + typeof domains_research_dashboardQueries, + "public" + >; + dealFlow: ModuleApi; + dealFlowQueries: ModuleApi< + typeof domains_research_dealFlowQueries, + "public" + >; + documentDiscovery: ModuleApi< + typeof domains_research_documentDiscovery, + "public" + >; + editionQueries: ModuleApi< + typeof domains_research_editionQueries, + "public" + >; + editionScoreboardSeed: ModuleApi< + typeof domains_research_editionScoreboardSeed, + "public" + >; + entities: { + decayManager: ModuleApi< + typeof domains_research_entities_decayManager, + "public" + >; + entityLifecycle: ModuleApi< + typeof domains_research_entities_entityLifecycle, + "public" + >; + index: ModuleApi; + }; + executiveBrief: ModuleApi< + typeof domains_research_executiveBrief, + "public" + >; + expandResource: ModuleApi< + typeof domains_research_expandResource, + "public" + >; + financial: { + balanceSheetFetcher: ModuleApi< + typeof domains_research_financial_balanceSheetFetcher, + "public" + >; + corporateActions: ModuleApi< + typeof domains_research_financial_corporateActions, + "public" + >; + corrections: ModuleApi< + typeof domains_research_financial_corrections, + "public" + >; + dcfBuilder: ModuleApi< + typeof domains_research_financial_dcfBuilder, + "public" + >; + dcfEvaluator: ModuleApi< + typeof domains_research_financial_dcfEvaluator, + "public" + >; + dcfOrchestrator: ModuleApi< + typeof domains_research_financial_dcfOrchestrator, + "public" + >; + dcfProgress: ModuleApi< + typeof domains_research_financial_dcfProgress, + "public" + >; + dcfSpreadsheetAdapter: ModuleApi< + typeof domains_research_financial_dcfSpreadsheetAdapter, + "public" + >; + dcfSpreadsheetMapping: ModuleApi< + typeof domains_research_financial_dcfSpreadsheetMapping, + "public" + >; + dcfTools: ModuleApi< + typeof domains_research_financial_dcfTools, + "public" + >; + financialAnalystAgent: ModuleApi< + typeof domains_research_financial_financialAnalystAgent, + "public" + >; + fundamentals: ModuleApi< + typeof domains_research_financial_fundamentals, + "public" + >; + groundTruthFetcher: ModuleApi< + typeof domains_research_financial_groundTruthFetcher, + "public" + >; + groundTruthManager: ModuleApi< + typeof domains_research_financial_groundTruthManager, + "public" + >; + inconclusiveOnFailure: ModuleApi< + typeof domains_research_financial_inconclusiveOnFailure, + "public" + >; + index: ModuleApi; + interactiveDCFSession: ModuleApi< + typeof domains_research_financial_interactiveDCFSession, + "public" + >; + modelRiskGovernance: ModuleApi< + typeof domains_research_financial_modelRiskGovernance, + "public" + >; + reportGenerator: ModuleApi< + typeof domains_research_financial_reportGenerator, + "public" + >; + restatementPolicy: ModuleApi< + typeof domains_research_financial_restatementPolicy, + "public" + >; + secEdgarClient: ModuleApi< + typeof domains_research_financial_secEdgarClient, + "public" + >; + sensitivityAnalysis: ModuleApi< + typeof domains_research_financial_sensitivityAnalysis, + "public" + >; + taxonomyManagement: ModuleApi< + typeof domains_research_financial_taxonomyManagement, + "public" + >; + validation: ModuleApi< + typeof domains_research_financial_validation, + "public" + >; + xbrlParser: ModuleApi< + typeof domains_research_financial_xbrlParser, + "public" + >; + }; + forYouFeed: ModuleApi; + forecasting: { + actions: { + computeCalibration: ModuleApi< + typeof domains_research_forecasting_actions_computeCalibration, + "public" + >; + createForecast: ModuleApi< + typeof domains_research_forecasting_actions_createForecast, + "public" + >; + refreshForecast: ModuleApi< + typeof domains_research_forecasting_actions_refreshForecast, + "public" + >; + resolveForecast: ModuleApi< + typeof domains_research_forecasting_actions_resolveForecast, + "public" + >; + }; + cronHandlers: { + dailyForecastRefresh: ModuleApi< + typeof domains_research_forecasting_cronHandlers_dailyForecastRefresh, + "public" + >; + resolutionCheck: ModuleApi< + typeof domains_research_forecasting_cronHandlers_resolutionCheck, + "public" + >; + weeklyCalibration: ModuleApi< + typeof domains_research_forecasting_cronHandlers_weeklyCalibration, + "public" + >; + }; + forecastManager: ModuleApi< + typeof domains_research_forecasting_forecastManager, + "public" + >; + scoringEngine: ModuleApi< + typeof domains_research_forecasting_scoringEngine, + "public" + >; + seedEvergreenForecasts: ModuleApi< + typeof domains_research_forecasting_seedEvergreenForecasts, + "public" + >; + signalMatcher: ModuleApi< + typeof domains_research_forecasting_signalMatcher, + "public" + >; + traceWrapper: ModuleApi< + typeof domains_research_forecasting_traceWrapper, + "public" + >; + validators: ModuleApi< + typeof domains_research_forecasting_validators, + "public" + >; + }; + githubExplorer: ModuleApi< + typeof domains_research_githubExplorer, + "public" + >; + hydrateEntities: ModuleApi< + typeof domains_research_hydrateEntities, + "public" + >; + index: ModuleApi; + jobResearchAction: ModuleApi< + typeof domains_research_jobResearchAction, + "public" + >; + lensRegistry: ModuleApi; + mcpServerCountSeed: ModuleApi< + typeof domains_research_mcpServerCountSeed, + "public" + >; + modelComparison: ModuleApi< + typeof domains_research_modelComparison, + "public" + >; + modelComparisonQueries: ModuleApi< + typeof domains_research_modelComparisonQueries, + "public" + >; + narrative: { + actions: { + competingExplanations: ModuleApi< + typeof domains_research_narrative_actions_competingExplanations, + "public" + >; + hypothesisLifecycle: ModuleApi< + typeof domains_research_narrative_actions_hypothesisLifecycle, + "public" + >; + }; + adapters: { + briefAdapter: ModuleApi< + typeof domains_research_narrative_adapters_briefAdapter, + "public" + >; + feedAdapter: ModuleApi< + typeof domains_research_narrative_adapters_feedAdapter, + "public" + >; + index: ModuleApi< + typeof domains_research_narrative_adapters_index, + "public" + >; + linkedinAdapter: ModuleApi< + typeof domains_research_narrative_adapters_linkedinAdapter, + "public" + >; + pipelineQueries: ModuleApi< + typeof domains_research_narrative_adapters_pipelineQueries, + "public" + >; + types: ModuleApi< + typeof domains_research_narrative_adapters_types, + "public" + >; + }; + contracts: { + eventClassificationContract: ModuleApi< + typeof domains_research_narrative_contracts_eventClassificationContract, + "public" + >; + }; + cronHandlers: ModuleApi< + typeof domains_research_narrative_cronHandlers, + "public" + >; + crons: ModuleApi; + didYouKnow: ModuleApi< + typeof domains_research_narrative_didYouKnow, + "public" + >; + didYouKnowSources: ModuleApi< + typeof domains_research_narrative_didYouKnowSources, + "public" + >; + experiments: { + freshNewsDidYouKnowExperiment: ModuleApi< + typeof domains_research_narrative_experiments_freshNewsDidYouKnowExperiment, + "public" + >; + }; + guards: { + claimClassificationGate: ModuleApi< + typeof domains_research_narrative_guards_claimClassificationGate, + "public" + >; + claimClassificationGateQueries: ModuleApi< + typeof domains_research_narrative_guards_claimClassificationGateQueries, + "public" + >; + claimClassifier: ModuleApi< + typeof domains_research_narrative_guards_claimClassifier, + "public" + >; + contentRights: ModuleApi< + typeof domains_research_narrative_guards_contentRights, + "public" + >; + index: ModuleApi< + typeof domains_research_narrative_guards_index, + "public" + >; + injectionContainment: ModuleApi< + typeof domains_research_narrative_guards_injectionContainment, + "public" + >; + quarantine: ModuleApi< + typeof domains_research_narrative_guards_quarantine, + "public" + >; + selfCitationGuard: ModuleApi< + typeof domains_research_narrative_guards_selfCitationGuard, + "public" + >; + trustScoring: ModuleApi< + typeof domains_research_narrative_guards_trustScoring, + "public" + >; + truthMaintenance: ModuleApi< + typeof domains_research_narrative_guards_truthMaintenance, + "public" + >; + }; + index: ModuleApi; + integrations: { + hooks: ModuleApi< + typeof domains_research_narrative_integrations_hooks, + "public" + >; + }; + mutations: { + correlations: ModuleApi< + typeof domains_research_narrative_mutations_correlations, + "public" + >; + dedup: ModuleApi< + typeof domains_research_narrative_mutations_dedup, + "public" + >; + disputes: ModuleApi< + typeof domains_research_narrative_mutations_disputes, + "public" + >; + events: ModuleApi< + typeof domains_research_narrative_mutations_events, + "public" + >; + evidence: ModuleApi< + typeof domains_research_narrative_mutations_evidence, + "public" + >; + hypotheses: ModuleApi< + typeof domains_research_narrative_mutations_hypotheses, + "public" + >; + policyEnforcedOps: ModuleApi< + typeof domains_research_narrative_mutations_policyEnforcedOps, + "public" + >; + posts: ModuleApi< + typeof domains_research_narrative_mutations_posts, + "public" + >; + replies: ModuleApi< + typeof domains_research_narrative_mutations_replies, + "public" + >; + searchLog: ModuleApi< + typeof domains_research_narrative_mutations_searchLog, + "public" + >; + signalMetrics: ModuleApi< + typeof domains_research_narrative_mutations_signalMetrics, + "public" + >; + temporalFacts: ModuleApi< + typeof domains_research_narrative_mutations_temporalFacts, + "public" + >; + threads: ModuleApi< + typeof domains_research_narrative_mutations_threads, + "public" + >; + toolReplay: ModuleApi< + typeof domains_research_narrative_mutations_toolReplay, + "public" + >; + workflowTrace: ModuleApi< + typeof domains_research_narrative_mutations_workflowTrace, + "public" + >; + }; + newsroom: { + agents: { + analystAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_analystAgent, + "public" + >; + commentHarvester: ModuleApi< + typeof domains_research_narrative_newsroom_agents_commentHarvester, + "public" + >; + curatorAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_curatorAgent, + "public" + >; + historianAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_historianAgent, + "public" + >; + index: ModuleApi< + typeof domains_research_narrative_newsroom_agents_index, + "public" + >; + publisherAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_publisherAgent, + "public" + >; + scoutAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_scoutAgent, + "public" + >; + signalCollectorAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_signalCollectorAgent, + "public" + >; + }; + recordReplayLane: ModuleApi< + typeof domains_research_narrative_newsroom_recordReplayLane, + "public" + >; + state: ModuleApi< + typeof domains_research_narrative_newsroom_state, + "public" + >; + workflow: ModuleApi< + typeof domains_research_narrative_newsroom_workflow, + "public" + >; + }; + policies: { + contentRights: ModuleApi< + typeof domains_research_narrative_policies_contentRights, + "public" + >; + }; + queries: { + correlations: ModuleApi< + typeof domains_research_narrative_queries_correlations, + "public" + >; + disputes: ModuleApi< + typeof domains_research_narrative_queries_disputes, + "public" + >; + events: ModuleApi< + typeof domains_research_narrative_queries_events, + "public" + >; + hypotheses: ModuleApi< + typeof domains_research_narrative_queries_hypotheses, + "public" + >; + posts: ModuleApi< + typeof domains_research_narrative_queries_posts, + "public" + >; + searchLog: ModuleApi< + typeof domains_research_narrative_queries_searchLog, + "public" + >; + signalMetrics: ModuleApi< + typeof domains_research_narrative_queries_signalMetrics, + "public" + >; + threads: ModuleApi< + typeof domains_research_narrative_queries_threads, + "public" + >; + }; + safety: { + abuseResistance: ModuleApi< + typeof domains_research_narrative_safety_abuseResistance, + "public" + >; + }; + tests: { + goldenSets: { + generatedCases: ModuleApi< + typeof domains_research_narrative_tests_goldenSets_generatedCases, + "public" + >; + types: ModuleApi< + typeof domains_research_narrative_tests_goldenSets_types, + "public" + >; + }; + qaFramework: ModuleApi< + typeof domains_research_narrative_tests_qaFramework, + "public" + >; + validatePipeline: ModuleApi< + typeof domains_research_narrative_tests_validatePipeline, + "public" + >; + }; + truth: { + truthStateManager: ModuleApi< + typeof domains_research_narrative_truth_truthStateManager, + "public" + >; + }; + validators: ModuleApi< + typeof domains_research_narrative_validators, + "public" + >; + }; + paperDetails: ModuleApi; + paperDetailsQueries: ModuleApi< + typeof domains_research_paperDetailsQueries, + "public" + >; + publicDossier: ModuleApi; + publicDossierQueries: ModuleApi< + typeof domains_research_publicDossierQueries, + "public" + >; + readerContent: ModuleApi; + repoScout: ModuleApi; + repoScoutQueries: ModuleApi< + typeof domains_research_repoScoutQueries, + "public" + >; + repoStats: ModuleApi; + repoStatsQueries: ModuleApi< + typeof domains_research_repoStatsQueries, + "public" + >; + researchQueue: ModuleApi; + researchRunAction: ModuleApi< + typeof domains_research_researchRunAction, + "public" + >; + researchSessionBenchmark: ModuleApi< + typeof domains_research_researchSessionBenchmark, + "public" + >; + researchSessionJit: ModuleApi< + typeof domains_research_researchSessionJit, + "public" + >; + researchSessionLifecycle: ModuleApi< + typeof domains_research_researchSessionLifecycle, + "public" + >; + researchSessionOrchestrator: ModuleApi< + typeof domains_research_researchSessionOrchestrator, + "public" + >; + researchSessionSmoke: ModuleApi< + typeof domains_research_researchSessionSmoke, + "public" + >; + seedEditorialHypotheses: ModuleApi< + typeof domains_research_seedEditorialHypotheses, + "public" + >; + semanticDeduplicator: ModuleApi< + typeof domains_research_semanticDeduplicator, + "public" + >; + semanticDeduplicatorQueries: ModuleApi< + typeof domains_research_semanticDeduplicatorQueries, + "public" + >; + signalTimeseries: ModuleApi< + typeof domains_research_signalTimeseries, + "public" + >; + stackImpact: ModuleApi; + stackImpactQueries: ModuleApi< + typeof domains_research_stackImpactQueries, + "public" + >; + strategyMetrics: ModuleApi< + typeof domains_research_strategyMetrics, + "public" + >; + strategyMetricsQueries: ModuleApi< + typeof domains_research_strategyMetricsQueries, + "public" + >; + }; + search: { + analytics: { + analytics: ModuleApi< + typeof domains_search_analytics_analytics, + "public" + >; + componentMetrics: ModuleApi< + typeof domains_search_analytics_componentMetrics, + "public" + >; + intentSignals: ModuleApi< + typeof domains_search_analytics_intentSignals, + "public" + >; + ossStats: ModuleApi; + }; + deepDiligence: ModuleApi; + embedHashBackfill: ModuleApi< + typeof domains_search_embedHashBackfill, + "public" + >; + embedRowOnUpdate: ModuleApi< + typeof domains_search_embedRowOnUpdate, + "public" + >; + embedSearchableText: ModuleApi< + typeof domains_search_embedSearchableText, + "public" + >; + federatedHelpers: ModuleApi< + typeof domains_search_federatedHelpers, + "public" + >; + federatedSearch: ModuleApi< + typeof domains_search_federatedSearch, + "public" + >; + federatedSearchCache: ModuleApi< + typeof domains_search_federatedSearchCache, + "public" + >; + fusion: { + actions: ModuleApi; + adapters: { + arxivAdapter: ModuleApi< + typeof domains_search_fusion_adapters_arxivAdapter, + "public" + >; + braveAdapter: ModuleApi< + typeof domains_search_fusion_adapters_braveAdapter, + "public" + >; + documentAdapter: ModuleApi< + typeof domains_search_fusion_adapters_documentAdapter, + "public" + >; + fdaAdapter: ModuleApi< + typeof domains_search_fusion_adapters_fdaAdapter, + "public" + >; + finraAdapter: ModuleApi< + typeof domains_search_fusion_adapters_finraAdapter, + "public" + >; + index: ModuleApi< + typeof domains_search_fusion_adapters_index, + "public" + >; + linkupAdapter: ModuleApi< + typeof domains_search_fusion_adapters_linkupAdapter, + "public" + >; + newsAdapter: ModuleApi< + typeof domains_search_fusion_adapters_newsAdapter, + "public" + >; + ragAdapter: ModuleApi< + typeof domains_search_fusion_adapters_ragAdapter, + "public" + >; + secAdapter: ModuleApi< + typeof domains_search_fusion_adapters_secAdapter, + "public" + >; + serperAdapter: ModuleApi< + typeof domains_search_fusion_adapters_serperAdapter, + "public" + >; + stateRegistryAdapter: ModuleApi< + typeof domains_search_fusion_adapters_stateRegistryAdapter, + "public" + >; + tavilyAdapter: ModuleApi< + typeof domains_search_fusion_adapters_tavilyAdapter, + "public" + >; + usptoAdapter: ModuleApi< + typeof domains_search_fusion_adapters_usptoAdapter, + "public" + >; + youtubeAdapter: ModuleApi< + typeof domains_search_fusion_adapters_youtubeAdapter, + "public" + >; + }; + advanced: ModuleApi; + benchmark: ModuleApi; + cache: ModuleApi; + crossProviderEval: ModuleApi< + typeof domains_search_fusion_crossProviderEval, + "public" + >; + debugAdapters: ModuleApi< + typeof domains_search_fusion_debugAdapters, + "public" + >; + debugOrchestrator: ModuleApi< + typeof domains_search_fusion_debugOrchestrator, + "public" + >; + index: ModuleApi; + observability: ModuleApi< + typeof domains_search_fusion_observability, + "public" + >; + orchestrator: ModuleApi< + typeof domains_search_fusion_orchestrator, + "public" + >; + rateLimiter: ModuleApi< + typeof domains_search_fusion_rateLimiter, + "public" + >; + reranker: ModuleApi; + types: ModuleApi; + }; + hashtagDossiers: ModuleApi< + typeof domains_search_hashtagDossiers, + "public" + >; + index: ModuleApi; + linkupClient: ModuleApi; + quotaManager: ModuleApi; + rag: ModuleApi; + ragEnhanced: ModuleApi; + ragEnhancedBatchIndex: ModuleApi< + typeof domains_search_ragEnhancedBatchIndex, + "public" + >; + ragQueries: ModuleApi; + searchCache: ModuleApi; + searchForecastGate: ModuleApi< + typeof domains_search_searchForecastGate, + "public" + >; + searchPipeline: ModuleApi; + searchPipelineNode: ModuleApi< + typeof domains_search_searchPipelineNode, + "public" + >; + searchableTextBackfill: ModuleApi< + typeof domains_search_searchableTextBackfill, + "public" + >; + searchableTextRecompute: ModuleApi< + typeof domains_search_searchableTextRecompute, + "public" + >; + sharedCache: ModuleApi; + signalTaxonomy: ModuleApi; + }; + signals: { + index: ModuleApi; + signalIngester: ModuleApi< + typeof domains_signals_signalIngester, + "public" + >; + signalProcessor: ModuleApi< + typeof domains_signals_signalProcessor, + "public" + >; + }; + social: { + instagramIngestion: ModuleApi< + typeof domains_social_instagramIngestion, + "public" + >; + linkedinAccounts: ModuleApi< + typeof domains_social_linkedinAccounts, + "public" + >; + linkedinArchiveAudit: ModuleApi< + typeof domains_social_linkedinArchiveAudit, + "public" + >; + linkedinArchiveCleanup: ModuleApi< + typeof domains_social_linkedinArchiveCleanup, + "public" + >; + linkedinArchiveCleanupMutations: ModuleApi< + typeof domains_social_linkedinArchiveCleanupMutations, + "public" + >; + linkedinArchiveEdits: ModuleApi< + typeof domains_social_linkedinArchiveEdits, + "public" + >; + linkedinArchiveEditsMutations: ModuleApi< + typeof domains_social_linkedinArchiveEditsMutations, + "public" + >; + linkedinArchiveEntityLinks: ModuleApi< + typeof domains_social_linkedinArchiveEntityLinks, + "public" + >; + linkedinArchiveMaintenance: ModuleApi< + typeof domains_social_linkedinArchiveMaintenance, + "public" + >; + linkedinArchiveMaintenanceQueries: ModuleApi< + typeof domains_social_linkedinArchiveMaintenanceQueries, + "public" + >; + linkedinArchivePurge: ModuleApi< + typeof domains_social_linkedinArchivePurge, + "public" + >; + linkedinArchivePurgeMutations: ModuleApi< + typeof domains_social_linkedinArchivePurgeMutations, + "public" + >; + linkedinArchiveQueries: ModuleApi< + typeof domains_social_linkedinArchiveQueries, + "public" + >; + linkedinContentQueue: ModuleApi< + typeof domains_social_linkedinContentQueue, + "public" + >; + linkedinFundingPosts: ModuleApi< + typeof domains_social_linkedinFundingPosts, + "public" + >; + linkedinLegacyLookupQueries: ModuleApi< + typeof domains_social_linkedinLegacyLookupQueries, + "public" + >; + linkedinOAuth: ModuleApi; + linkedinPosting: ModuleApi< + typeof domains_social_linkedinPosting, + "public" + >; + linkedinPrePostVerification: ModuleApi< + typeof domains_social_linkedinPrePostVerification, + "public" + >; + linkedinQualityJudge: ModuleApi< + typeof domains_social_linkedinQualityJudge, + "public" + >; + linkedinQualityJudgePolicy: ModuleApi< + typeof domains_social_linkedinQualityJudgePolicy, + "public" + >; + linkedinScheduleGrid: ModuleApi< + typeof domains_social_linkedinScheduleGrid, + "public" + >; + linkedinUnknownCompanyFixes: ModuleApi< + typeof domains_social_linkedinUnknownCompanyFixes, + "public" + >; + postDedup: ModuleApi; + postDedupAction: ModuleApi< + typeof domains_social_postDedupAction, + "public" + >; + publishing: { + deliveryQueue: ModuleApi< + typeof domains_social_publishing_deliveryQueue, + "public" + >; + index: ModuleApi; + publishingOrchestrator: ModuleApi< + typeof domains_social_publishing_publishingOrchestrator, + "public" + >; + }; + specializedPostQueries: ModuleApi< + typeof domains_social_specializedPostQueries, + "public" + >; + }; + successLoops: { + index: ModuleApi; + lib: ModuleApi; + mutations: ModuleApi; + projection: ModuleApi; + queries: ModuleApi; + }; + taskManager: { + cronWrapper: ModuleApi; + index: ModuleApi; + mutations: ModuleApi; + queries: ModuleApi; + }; + tasks: { + dailyNotes: ModuleApi; + eventTaskDocuments: ModuleApi< + typeof domains_tasks_eventTaskDocuments, + "public" + >; + index: ModuleApi; + userEvents: ModuleApi; + work: ModuleApi; + workflows: { + bankingMemoWorkflow: ModuleApi< + typeof domains_tasks_workflows_bankingMemoWorkflow, + "public" + >; + coordinatorWorkflow: ModuleApi< + typeof domains_tasks_workflows_coordinatorWorkflow, + "public" + >; + index: ModuleApi; + }; + }; + teachability: { + index: ModuleApi; + }; + telemetry: { + disclosureEvents: ModuleApi< + typeof domains_telemetry_disclosureEvents, + "public" + >; + }; + temporal: { + feynmanEditor: ModuleApi; + forecastGatePolicy: ModuleApi< + typeof domains_temporal_forecastGatePolicy, + "public" + >; + index: ModuleApi; + ingestion: ModuleApi; + ingestionUtils: ModuleApi< + typeof domains_temporal_ingestionUtils, + "public" + >; + langExtract: ModuleApi; + mutations: ModuleApi; + queries: ModuleApi; + specDoc: ModuleApi; + }; + testing: { + testingFramework: ModuleApi< + typeof domains_testing_testingFramework, + "public" + >; + }; + trajectory: { + index: ModuleApi; + lib: ModuleApi; + mutations: ModuleApi; + projection: ModuleApi; + queries: ModuleApi; + }; + utilities: { + migrations: ModuleApi; + seedGoldenDataset: ModuleApi< + typeof domains_utilities_seedGoldenDataset, + "public" + >; + snapshotMigrations: ModuleApi< + typeof domains_utilities_snapshotMigrations, + "public" + >; + }; + validation: { + contradictionDetector: ModuleApi< + typeof domains_validation_contradictionDetector, + "public" + >; + index: ModuleApi; + personaValidators: ModuleApi< + typeof domains_validation_personaValidators, + "public" + >; + selfQuestionAgent: ModuleApi< + typeof domains_validation_selfQuestionAgent, + "public" + >; + }; + verification: { + calibration: ModuleApi; + claimVerificationAction: ModuleApi< + typeof domains_verification_claimVerificationAction, + "public" + >; + claimVerificationQueries: ModuleApi< + typeof domains_verification_claimVerificationQueries, + "public" + >; + claimVerifications: ModuleApi< + typeof domains_verification_claimVerifications, + "public" + >; + contradictionDetector: ModuleApi< + typeof domains_verification_contradictionDetector, + "public" + >; + contradictionDetectorQueries: ModuleApi< + typeof domains_verification_contradictionDetectorQueries, + "public" + >; + entailmentChecker: ModuleApi< + typeof domains_verification_entailmentChecker, + "public" + >; + facts: ModuleApi; + fastVerification: ModuleApi< + typeof domains_verification_fastVerification, + "public" + >; + groundTruthRegistry: ModuleApi< + typeof domains_verification_groundTruthRegistry, + "public" + >; + index: ModuleApi; + instagramClaimVerification: ModuleApi< + typeof domains_verification_instagramClaimVerification, + "public" + >; + instagramClaimVerificationMutations: ModuleApi< + typeof domains_verification_instagramClaimVerificationMutations, + "public" + >; + integrations: { + agentVerificationAdapter: ModuleApi< + typeof domains_verification_integrations_agentVerificationAdapter, + "public" + >; + artifactVerification: ModuleApi< + typeof domains_verification_integrations_artifactVerification, + "public" + >; + feedVerification: ModuleApi< + typeof domains_verification_integrations_feedVerification, + "public" + >; + index: ModuleApi< + typeof domains_verification_integrations_index, + "public" + >; + linkedinVerification: ModuleApi< + typeof domains_verification_integrations_linkedinVerification, + "public" + >; + narrativeVerification: ModuleApi< + typeof domains_verification_integrations_narrativeVerification, + "public" + >; + }; + multiSourceValidation: ModuleApi< + typeof domains_verification_multiSourceValidation, + "public" + >; + publicSourceRegistry: ModuleApi< + typeof domains_verification_publicSourceRegistry, + "public" + >; + validation: { + contradictionDetector: ModuleApi< + typeof domains_verification_validation_contradictionDetector, + "public" + >; + index: ModuleApi< + typeof domains_verification_validation_index, + "public" + >; + personaValidators: ModuleApi< + typeof domains_verification_validation_personaValidators, + "public" + >; + selfQuestionAgent: ModuleApi< + typeof domains_verification_validation_selfQuestionAgent, + "public" + >; + }; + verificationAuditTrail: ModuleApi< + typeof domains_verification_verificationAuditTrail, + "public" + >; + verificationWorkflow: ModuleApi< + typeof domains_verification_verificationWorkflow, + "public" + >; + }; + world: { + operations: ModuleApi; + }; + }; + email: ModuleApi; + eventHandoff: ModuleApi; + events: ModuleApi; + feed: ModuleApi; + globalResearch: { + artifacts: ModuleApi; + cacheSimple: ModuleApi; + compaction: ModuleApi; + index: ModuleApi; + locks: ModuleApi; + mentions: ModuleApi; + queries: ModuleApi; + runs: ModuleApi; + }; + http: ModuleApi & { + mcpMemory: ModuleApi; + mcpPlans: ModuleApi; + }; + lib: { + actionItemsGenerator: ModuleApi; + agentCache: ModuleApi; + artifactModels: ModuleApi; + artifactPersistence: ModuleApi; + artifactQueries: ModuleApi; + artifactValidators: ModuleApi; + crypto: ModuleApi; + dossierGenerator: ModuleApi; + dossierHelpers: ModuleApi; + entityResolution: ModuleApi; + factValidation: ModuleApi; + featureFlags: ModuleApi; + hash: ModuleApi; + index: ModuleApi; + markdown: ModuleApi; + markdownToTipTap: ModuleApi; + mcpTransport: ModuleApi; + memoryLimits: ModuleApi; + memoryQuality: ModuleApi; + parallelDelegation: ModuleApi; + predictivePrefetch: ModuleApi; + streamingDelegation: ModuleApi; + withArtifactPersistence: ModuleApi< + typeof lib_withArtifactPersistence, + "public" + >; + withResourceLinkWrapping: ModuleApi< + typeof lib_withResourceLinkWrapping, + "public" + >; + xaiClient: ModuleApi; + }; + notes: ModuleApi; + presence: ModuleApi; + prosemirror: ModuleApi; + router: ModuleApi; + schema: { + apiUsage: ModuleApi; + emailSchema: ModuleApi; + eventsSchema: ModuleApi; + searchQuota: ModuleApi; + toolSearchSchema: ModuleApi; + usersSchema: ModuleApi; + }; + scratchnodeHandoff: ModuleApi; + scratchnodeLiveCues: ModuleApi; + scratchnodeRateLimit: ModuleApi; + shared: { + actionSpan: ModuleApi; + actionSpanReplay: ModuleApi; + actionSpanReplayQueries: ModuleApi< + typeof shared_actionSpanReplayQueries, + "public" + >; + }; + tags: ModuleApi; + tags_actions: ModuleApi; + tests: { + fastAgentPanelStreamingTests: ModuleApi< + typeof tests_fastAgentPanelStreamingTests, + "public" + >; + fusionSearchContractTests: ModuleApi< + typeof tests_fusionSearchContractTests, + "public" + >; + }; + tools: { + arbitrage: { + analyzeWithArbitrage: ModuleApi< + typeof tools_arbitrage_analyzeWithArbitrage, + "public" + >; + index: ModuleApi; + }; + calendar: { + calendarCrudTools: ModuleApi< + typeof tools_calendar_calendarCrudTools, + "public" + >; + confirmEventSelection: ModuleApi< + typeof tools_calendar_confirmEventSelection, + "public" + >; + emailEventExtractor: ModuleApi< + typeof tools_calendar_emailEventExtractor, + "public" + >; + recentEventSearch: ModuleApi< + typeof tools_calendar_recentEventSearch, + "public" + >; + }; + calendarIcs: ModuleApi; + calendarIcsMutations: ModuleApi< + typeof tools_calendarIcsMutations, + "public" + >; + context: { + nodebenchContextTools: ModuleApi< + typeof tools_context_nodebenchContextTools, + "public" + >; + resourceLinks: ModuleApi; + retrieveArtifact: ModuleApi< + typeof tools_context_retrieveArtifact, + "public" + >; + }; + document: { + contextTools: ModuleApi; + deepAgentEditTools: ModuleApi< + typeof tools_document_deepAgentEditTools, + "public" + >; + documentEditingLiveTest: ModuleApi< + typeof tools_document_documentEditingLiveTest, + "public" + >; + documentTools: ModuleApi; + geminiFileSearch: ModuleApi< + typeof tools_document_geminiFileSearch, + "public" + >; + hashtagSearchTools: ModuleApi< + typeof tools_document_hashtagSearchTools, + "public" + >; + }; + dossier: { + dossierCrudTools: ModuleApi< + typeof tools_dossier_dossierCrudTools, + "public" + >; + }; + editDocument: ModuleApi; + editDocumentMutations: ModuleApi< + typeof tools_editDocumentMutations, + "public" + >; + editSpreadsheet: ModuleApi; + editSpreadsheetMutations: ModuleApi< + typeof tools_editSpreadsheetMutations, + "public" + >; + email: { + emailIntelligenceParser: ModuleApi< + typeof tools_email_emailIntelligenceParser, + "public" + >; + }; + evaluation: { + comprehensiveTest: ModuleApi< + typeof tools_evaluation_comprehensiveTest, + "public" + >; + evaluator: ModuleApi; + groundTruthLookup: ModuleApi< + typeof tools_evaluation_groundTruthLookup, + "public" + >; + groundTruthLookupTool: ModuleApi< + typeof tools_evaluation_groundTruthLookupTool, + "public" + >; + helpers: ModuleApi; + multiSdkLiveValidation: ModuleApi< + typeof tools_evaluation_multiSdkLiveValidation, + "public" + >; + openDatasetEval: ModuleApi< + typeof tools_evaluation_openDatasetEval, + "public" + >; + quickTest: ModuleApi; + testCases: ModuleApi; + testOptimizations: ModuleApi< + typeof tools_evaluation_testOptimizations, + "public" + >; + testPersonas: ModuleApi; + }; + financial: { + enhancedFundingTools: ModuleApi< + typeof tools_financial_enhancedFundingTools, + "public" + >; + fundingDetectionTools: ModuleApi< + typeof tools_financial_fundingDetectionTools, + "public" + >; + fundingResearchTools: ModuleApi< + typeof tools_financial_fundingResearchTools, + "public" + >; + }; + integration: { + channelContextTools: ModuleApi< + typeof tools_integration_channelContextTools, + "public" + >; + confirmCompanySelection: ModuleApi< + typeof tools_integration_confirmCompanySelection, + "public" + >; + confirmNewsSelection: ModuleApi< + typeof tools_integration_confirmNewsSelection, + "public" + >; + confirmPersonSelection: ModuleApi< + typeof tools_integration_confirmPersonSelection, + "public" + >; + dataAccessTools: ModuleApi< + typeof tools_integration_dataAccessTools, + "public" + >; + digestTools: ModuleApi; + humanInputTools: ModuleApi< + typeof tools_integration_humanInputTools, + "public" + >; + newsletterTools: ModuleApi< + typeof tools_integration_newsletterTools, + "public" + >; + notificationTools: ModuleApi< + typeof tools_integration_notificationTools, + "public" + >; + orchestrationTools: ModuleApi< + typeof tools_integration_orchestrationTools, + "public" + >; + peopleProfileSearch: ModuleApi< + typeof tools_integration_peopleProfileSearch, + "public" + >; + }; + knowledge: { + clusteringTools: ModuleApi< + typeof tools_knowledge_clusteringTools, + "public" + >; + distiller: ModuleApi; + distillerPrompts: ModuleApi< + typeof tools_knowledge_distillerPrompts, + "public" + >; + entityInsightTools: ModuleApi< + typeof tools_knowledge_entityInsightTools, + "public" + >; + evidenceTools: ModuleApi; + knowledgeGraphTools: ModuleApi< + typeof tools_knowledge_knowledgeGraphTools, + "public" + >; + unifiedMemoryTools: ModuleApi< + typeof tools_knowledge_unifiedMemoryTools, + "public" + >; + }; + media: { + adversarialValidation: ModuleApi< + typeof tools_media_adversarialValidation, + "public" + >; + diagnosticTest: ModuleApi; + entityExtractionTools: ModuleApi< + typeof tools_media_entityExtractionTools, + "public" + >; + linkupFetch: ModuleApi; + linkupSearch: ModuleApi; + linkupStructuredSearch: ModuleApi< + typeof tools_media_linkupStructuredSearch, + "public" + >; + llmEntityLinker: ModuleApi; + mediaTools: ModuleApi; + recentNewsSearch: ModuleApi< + typeof tools_media_recentNewsSearch, + "public" + >; + testImageTools: ModuleApi; + validationTest: ModuleApi; + youtubeSearch: ModuleApi; + }; + meta: { + actionDraftMutations: ModuleApi< + typeof tools_meta_actionDraftMutations, + "public" + >; + contextEnhancement: ModuleApi< + typeof tools_meta_contextEnhancement, + "public" + >; + contextEnhancementActions: ModuleApi< + typeof tools_meta_contextEnhancementActions, + "public" + >; + dynamicPromptEnhancer: ModuleApi< + typeof tools_meta_dynamicPromptEnhancer, + "public" + >; + hybridSearch: ModuleApi; + hybridSearchQueries: ModuleApi< + typeof tools_meta_hybridSearchQueries, + "public" + >; + hybridSearchTest: ModuleApi; + index: ModuleApi; + promptEnhancementFeedback: ModuleApi< + typeof tools_meta_promptEnhancementFeedback, + "public" + >; + seedSkillRegistry: ModuleApi< + typeof tools_meta_seedSkillRegistry, + "public" + >; + seedSkillRegistryQueries: ModuleApi< + typeof tools_meta_seedSkillRegistryQueries, + "public" + >; + seedToolRegistry: ModuleApi; + seedToolRegistryQueries: ModuleApi< + typeof tools_meta_seedToolRegistryQueries, + "public" + >; + skillDiscovery: ModuleApi; + skillDiscoveryQueries: ModuleApi< + typeof tools_meta_skillDiscoveryQueries, + "public" + >; + toolDiscovery: ModuleApi; + toolDiscoveryV2: ModuleApi; + toolGateway: ModuleApi; + toolRegistry: ModuleApi; + }; + reports: { + pdfGenerationTools: ModuleApi< + typeof tools_reports_pdfGenerationTools, + "public" + >; + }; + research: { + researchTools: ModuleApi; + }; + search: { + fusionSearchTool: ModuleApi< + typeof tools_search_fusionSearchTool, + "public" + >; + index: ModuleApi; + }; + sec: { + secCompanySearch: ModuleApi; + secFilingTools: ModuleApi; + }; + security: { + promptInjectionProtection: ModuleApi< + typeof tools_security_promptInjectionProtection, + "public" + >; + }; + sendEmail: ModuleApi; + sendEmailMutations: ModuleApi; + sendNotification: ModuleApi; + sendSms: ModuleApi; + shared: { + structuredOutput: ModuleApi< + typeof tools_shared_structuredOutput, + "public" + >; + }; + social: { + instagramTools: ModuleApi; + linkedinTools: ModuleApi; + }; + spreadsheet: { + spreadsheetCrudTools: ModuleApi< + typeof tools_spreadsheet_spreadsheetCrudTools, + "public" + >; + }; + spreadsheetOperationTypes: ModuleApi< + typeof tools_spreadsheetOperationTypes, + "public" + >; + teachability: { + index: ModuleApi; + learnUserSkill: ModuleApi< + typeof tools_teachability_learnUserSkill, + "public" + >; + teachingAnalyzer: ModuleApi< + typeof tools_teachability_teachingAnalyzer, + "public" + >; + userMemoryQueries: ModuleApi< + typeof tools_teachability_userMemoryQueries, + "public" + >; + userMemoryTools: ModuleApi< + typeof tools_teachability_userMemoryTools, + "public" + >; + }; + wrappers: { + coreAgentTools: ModuleApi; + evidenceTools: ModuleApi; + resourceLinkTools: ModuleApi< + typeof tools_wrappers_resourceLinkTools, + "public" + >; + }; + }; + users: ModuleApi; + wall: ModuleApi; + workflows: { + agentProjectIdeaPost: ModuleApi< + typeof workflows_agentProjectIdeaPost, + "public" + >; + ainewsBriefFormat: ModuleApi; + dailyLinkedInPost: ModuleApi; + dailyLinkedInPostMutations: ModuleApi< + typeof workflows_dailyLinkedInPostMutations, + "public" + >; + dailyMorningBrief: ModuleApi; + deepTrace: ModuleApi; + emailResearchOrchestrator: ModuleApi< + typeof workflows_emailResearchOrchestrator, + "public" + >; + endToEndQa: ModuleApi; + enhancedMorningBrief: ModuleApi< + typeof workflows_enhancedMorningBrief, + "public" + >; + enhancedWeeklySummary: ModuleApi< + typeof workflows_enhancedWeeklySummary, + "public" + >; + founderPostGenerator: ModuleApi< + typeof workflows_founderPostGenerator, + "public" + >; + index: ModuleApi; + linkedinTrigger: ModuleApi; + prdComposerWorkflow: ModuleApi< + typeof workflows_prdComposerWorkflow, + "public" + >; + scheduledPDFReports: ModuleApi< + typeof workflows_scheduledPDFReports, + "public" + >; + scheduledPDFReportsMutations: ModuleApi< + typeof workflows_scheduledPDFReportsMutations, + "public" + >; + sendMockBankerDigest: ModuleApi< + typeof workflows_sendMockBankerDigest, + "public" + >; + specializedLinkedInPosts: ModuleApi< + typeof workflows_specializedLinkedInPosts, + "public" + >; + testDailyBrief: ModuleApi; + weeklySourceSummary: ModuleApi< + typeof workflows_weeklySourceSummary, + "public" + >; + }; +}; + +/** + * A utility for referencing Convex functions in your app's internal API. + * + * Usage: + * ```js + * const myFunctionReference = internal.myModule.myFunction; + * ``` + */ +export declare const internal: { + actions: { + coordinatorWorkflowActions: ModuleApi< + typeof actions_coordinatorWorkflowActions, + "internal" + >; + externalOrchestrator: ModuleApi< + typeof actions_externalOrchestrator, + "internal" + >; + openbbActions: ModuleApi; + parallelDelegation: ModuleApi< + typeof actions_parallelDelegation, + "internal" + >; + researchMcpActions: ModuleApi< + typeof actions_researchMcpActions, + "internal" + >; + spreadsheetActions: ModuleApi< + typeof actions_spreadsheetActions, + "internal" + >; + }; + agentOS: ModuleApi; + agentsPrefs: ModuleApi; + auth: ModuleApi; + config: { + autonomousConfig: ModuleApi; + }; + crons: ModuleApi & { + dailyDossierCron: ModuleApi; + emailIntelligenceCron: ModuleApi< + typeof crons_emailIntelligenceCron, + "internal" + >; + proactiveCalendarIngestion: ModuleApi< + typeof crons_proactiveCalendarIngestion, + "internal" + >; + proactiveDelivery: ModuleApi; + proactiveDetectorRuns: ModuleApi< + typeof crons_proactiveDetectorRuns, + "internal" + >; + proactiveEmailIngestion: ModuleApi< + typeof crons_proactiveEmailIngestion, + "internal" + >; + sloCalculation: ModuleApi; + }; + dataAudit: ModuleApi; + debugEnv: ModuleApi; + domains: { + agents: { + adapters: { + anthropic: { + anthropicReasoningAdapter: ModuleApi< + typeof domains_agents_adapters_anthropic_anthropicReasoningAdapter, + "internal" + >; + promptCacheHelpers: ModuleApi< + typeof domains_agents_adapters_anthropic_promptCacheHelpers, + "internal" + >; + }; + convex: { + convexAgentAdapter: ModuleApi< + typeof domains_agents_adapters_convex_convexAgentAdapter, + "internal" + >; + }; + google: { + googleInteractionsAdapter: ModuleApi< + typeof domains_agents_adapters_google_googleInteractionsAdapter, + "internal" + >; + }; + handoffBridge: ModuleApi< + typeof domains_agents_adapters_handoffBridge, + "internal" + >; + index: ModuleApi; + langgraph: { + langgraphAdapter: ModuleApi< + typeof domains_agents_adapters_langgraph_langgraphAdapter, + "internal" + >; + }; + multiSdkDelegation: ModuleApi< + typeof domains_agents_adapters_multiSdkDelegation, + "internal" + >; + openai: { + openaiAgentsAdapter: ModuleApi< + typeof domains_agents_adapters_openai_openaiAgentsAdapter, + "internal" + >; + }; + registerDefaultAdapters: ModuleApi< + typeof domains_agents_adapters_registerDefaultAdapters, + "internal" + >; + registry: ModuleApi< + typeof domains_agents_adapters_registry, + "internal" + >; + routing: { + personaRouter: ModuleApi< + typeof domains_agents_adapters_routing_personaRouter, + "internal" + >; + }; + types: ModuleApi; + vercel: { + vercelAiSdkAdapter: ModuleApi< + typeof domains_agents_adapters_vercel_vercelAiSdkAdapter, + "internal" + >; + }; + }; + agentActions: ModuleApi; + agentChat: ModuleApi; + agentChatActions: ModuleApi< + typeof domains_agents_agentChatActions, + "internal" + >; + agentDelegations: ModuleApi< + typeof domains_agents_agentDelegations, + "internal" + >; + agentFeedRanking: ModuleApi< + typeof domains_agents_agentFeedRanking, + "internal" + >; + agentFeedTraversal: ModuleApi< + typeof domains_agents_agentFeedTraversal, + "internal" + >; + agentHubQueries: ModuleApi< + typeof domains_agents_agentHubQueries, + "internal" + >; + agentInitializer: ModuleApi< + typeof domains_agents_agentInitializer, + "internal" + >; + agentLoop: ModuleApi; + agentLoopQueries: ModuleApi< + typeof domains_agents_agentLoopQueries, + "internal" + >; + agentMarketplace: ModuleApi< + typeof domains_agents_agentMarketplace, + "internal" + >; + agentMemory: ModuleApi; + agentMemorySummary: ModuleApi< + typeof domains_agents_agentMemorySummary, + "internal" + >; + agentNavigation: ModuleApi< + typeof domains_agents_agentNavigation, + "internal" + >; + agentPlanSummary: ModuleApi< + typeof domains_agents_agentPlanSummary, + "internal" + >; + agentPlanning: ModuleApi; + agentPostingPipeline: ModuleApi< + typeof domains_agents_agentPostingPipeline, + "internal" + >; + agentRouter: ModuleApi; + agentRunPresentation: ModuleApi< + typeof domains_agents_agentRunPresentation, + "internal" + >; + agentScratchpads: ModuleApi< + typeof domains_agents_agentScratchpads, + "internal" + >; + agentTimelines: ModuleApi< + typeof domains_agents_agentTimelines, + "internal" + >; + agentViewManifest: ModuleApi< + typeof domains_agents_agentViewManifest, + "internal" + >; + arbitrage: { + agent: ModuleApi; + config: ModuleApi; + index: ModuleApi; + tools: { + contradictionDetection: ModuleApi< + typeof domains_agents_arbitrage_tools_contradictionDetection, + "internal" + >; + deltaDetection: ModuleApi< + typeof domains_agents_arbitrage_tools_deltaDetection, + "internal" + >; + index: ModuleApi< + typeof domains_agents_arbitrage_tools_index, + "internal" + >; + sourceHealthCheck: ModuleApi< + typeof domains_agents_arbitrage_tools_sourceHealthCheck, + "internal" + >; + sourceQualityRanking: ModuleApi< + typeof domains_agents_arbitrage_tools_sourceQualityRanking, + "internal" + >; + }; + }; + autonomousCrons: ModuleApi< + typeof domains_agents_autonomousCrons, + "internal" + >; + autonomousCronsQueries: ModuleApi< + typeof domains_agents_autonomousCronsQueries, + "internal" + >; + autonomy: { + commits: ModuleApi; + evidence: ModuleApi< + typeof domains_agents_autonomy_evidence, + "internal" + >; + grants: ModuleApi; + hash: ModuleApi; + policy: ModuleApi; + proposals: ModuleApi< + typeof domains_agents_autonomy_proposals, + "internal" + >; + remainders: ModuleApi< + typeof domains_agents_autonomy_remainders, + "internal" + >; + }; + batchAPI: ModuleApi; + budget: { + budgetGate: ModuleApi< + typeof domains_agents_budget_budgetGate, + "internal" + >; + }; + canonicalPlanner: ModuleApi< + typeof domains_agents_canonicalPlanner, + "internal" + >; + canonicalRuntimeMutations: ModuleApi< + typeof domains_agents_canonicalRuntimeMutations, + "internal" + >; + canonicalRuntimeQueries: ModuleApi< + typeof domains_agents_canonicalRuntimeQueries, + "internal" + >; + chatPanelBackend: ModuleApi< + typeof domains_agents_chatPanelBackend, + "internal" + >; + chatThreads: ModuleApi; + checkpointing: ModuleApi; + consistencyIndex: ModuleApi< + typeof domains_agents_consistencyIndex, + "internal" + >; + consistencyIndexQueries: ModuleApi< + typeof domains_agents_consistencyIndexQueries, + "internal" + >; + coordinator: { + agent: ModuleApi; + config: ModuleApi; + contextPack: ModuleApi< + typeof domains_agents_coordinator_contextPack, + "internal" + >; + contextPackMutations: ModuleApi< + typeof domains_agents_coordinator_contextPackMutations, + "internal" + >; + contextPackQueries: ModuleApi< + typeof domains_agents_coordinator_contextPackQueries, + "internal" + >; + index: ModuleApi; + tools: { + delegationTools: ModuleApi< + typeof domains_agents_coordinator_tools_delegationTools, + "internal" + >; + index: ModuleApi< + typeof domains_agents_coordinator_tools_index, + "internal" + >; + }; + }; + core: { + coordinatorAgent: ModuleApi< + typeof domains_agents_core_coordinatorAgent, + "internal" + >; + delegation: { + delegationHelpers: ModuleApi< + typeof domains_agents_core_delegation_delegationHelpers, + "internal" + >; + delegationTools: ModuleApi< + typeof domains_agents_core_delegation_delegationTools, + "internal" + >; + temporalContext: ModuleApi< + typeof domains_agents_core_delegation_temporalContext, + "internal" + >; + }; + multiAgentWorkflow: ModuleApi< + typeof domains_agents_core_multiAgentWorkflow, + "internal" + >; + prompts: ModuleApi; + subagents: { + comment_harvester: { + index: ModuleApi< + typeof domains_agents_core_subagents_comment_harvester_index, + "internal" + >; + mutations: ModuleApi< + typeof domains_agents_core_subagents_comment_harvester_mutations, + "internal" + >; + }; + document_subagent: { + documentAgent: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_documentAgent, + "internal" + >; + documentAgentWithMetaTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_documentAgentWithMetaTools, + "internal" + >; + tools: { + deepAgentEditTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_deepAgentEditTools, + "internal" + >; + documentTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_documentTools, + "internal" + >; + geminiFileSearch: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_geminiFileSearch, + "internal" + >; + hashtagSearchTools: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_hashtagSearchTools, + "internal" + >; + index: ModuleApi< + typeof domains_agents_core_subagents_document_subagent_tools_index, + "internal" + >; + }; + }; + dossier_subagent: { + dossierAgent: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_dossierAgent, + "internal" + >; + tools: { + enrichDataPoint: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_enrichDataPoint, + "internal" + >; + generateAnnotation: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_generateAnnotation, + "internal" + >; + getChartContext: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_getChartContext, + "internal" + >; + index: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_index, + "internal" + >; + updateFocusState: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_updateFocusState, + "internal" + >; + updateNarrativeSection: ModuleApi< + typeof domains_agents_core_subagents_dossier_subagent_tools_updateNarrativeSection, + "internal" + >; + }; + }; + entity_subagent: { + entityResearchAgent: ModuleApi< + typeof domains_agents_core_subagents_entity_subagent_entityResearchAgent, + "internal" + >; + }; + media_subagent: { + mediaAgent: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_mediaAgent, + "internal" + >; + tools: { + index: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_index, + "internal" + >; + linkupSearch: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_linkupSearch, + "internal" + >; + mediaTools: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_mediaTools, + "internal" + >; + youtubeSearch: ModuleApi< + typeof domains_agents_core_subagents_media_subagent_tools_youtubeSearch, + "internal" + >; + }; + }; + openbb_subagent: { + openbbAgent: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_openbbAgent, + "internal" + >; + tools: { + adminTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_adminTools, + "internal" + >; + cryptoTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_cryptoTools, + "internal" + >; + economyTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_economyTools, + "internal" + >; + equityTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_equityTools, + "internal" + >; + index: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_index, + "internal" + >; + newsTools: ModuleApi< + typeof domains_agents_core_subagents_openbb_subagent_tools_newsTools, + "internal" + >; + }; + }; + research_subagent: { + multiSourceResearchAgent: ModuleApi< + typeof domains_agents_core_subagents_research_subagent_multiSourceResearchAgent, + "internal" + >; + }; + sec_subagent: { + secAgent: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_secAgent, + "internal" + >; + tools: { + index: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_tools_index, + "internal" + >; + secCompanySearch: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_tools_secCompanySearch, + "internal" + >; + secFilingTools: ModuleApi< + typeof domains_agents_core_subagents_sec_subagent_tools_secFilingTools, + "internal" + >; + }; + }; + thread_curator: { + index: ModuleApi< + typeof domains_agents_core_subagents_thread_curator_index, + "internal" + >; + queries: ModuleApi< + typeof domains_agents_core_subagents_thread_curator_queries, + "internal" + >; + }; + }; + tools: { + externalOrchestratorTools: ModuleApi< + typeof domains_agents_core_tools_externalOrchestratorTools, + "internal" + >; + }; + }; + dataAccess: { + agent: ModuleApi; + config: ModuleApi; + index: ModuleApi; + tools: { + calendarTools: ModuleApi< + typeof domains_agents_dataAccess_tools_calendarTools, + "internal" + >; + index: ModuleApi< + typeof domains_agents_dataAccess_tools_index, + "internal" + >; + taskTools: ModuleApi< + typeof domains_agents_dataAccess_tools_taskTools, + "internal" + >; + }; + }; + decisionMemory: ModuleApi< + typeof domains_agents_decisionMemory, + "internal" + >; + decisionMemoryQueries: ModuleApi< + typeof domains_agents_decisionMemoryQueries, + "internal" + >; + decorationPreferences: ModuleApi< + typeof domains_agents_decorationPreferences, + "internal" + >; + deliberationToEvolution: ModuleApi< + typeof domains_agents_deliberationToEvolution, + "internal" + >; + digestAgent: ModuleApi; + dueDiligence: { + branches: { + companyProfile: ModuleApi< + typeof domains_agents_dueDiligence_branches_companyProfile, + "internal" + >; + conditionalBranches: ModuleApi< + typeof domains_agents_dueDiligence_branches_conditionalBranches, + "internal" + >; + marketCompetitive: ModuleApi< + typeof domains_agents_dueDiligence_branches_marketCompetitive, + "internal" + >; + teamDeepResearch: ModuleApi< + typeof domains_agents_dueDiligence_branches_teamDeepResearch, + "internal" + >; + }; + crossChecker: ModuleApi< + typeof domains_agents_dueDiligence_crossChecker, + "internal" + >; + ddBranchHandoff: ModuleApi< + typeof domains_agents_dueDiligence_ddBranchHandoff, + "internal" + >; + ddContextEngine: ModuleApi< + typeof domains_agents_dueDiligence_ddContextEngine, + "internal" + >; + ddEnhancedOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_ddEnhancedOrchestrator, + "internal" + >; + ddMutations: ModuleApi< + typeof domains_agents_dueDiligence_ddMutations, + "internal" + >; + ddOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_ddOrchestrator, + "internal" + >; + ddTriggerQueries: ModuleApi< + typeof domains_agents_dueDiligence_ddTriggerQueries, + "internal" + >; + ddTriggers: ModuleApi< + typeof domains_agents_dueDiligence_ddTriggers, + "internal" + >; + deepResearch: { + agents: { + newsVerificationAgent: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_agents_newsVerificationAgent, + "internal" + >; + personResearchAgent: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_agents_personResearchAgent, + "internal" + >; + }; + claimClassifier: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_claimClassifier, + "internal" + >; + deepResearchOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_deepResearchOrchestrator, + "internal" + >; + hypothesisEngine: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_hypothesisEngine, + "internal" + >; + index: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_index, + "internal" + >; + queryDecomposer: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_queryDecomposer, + "internal" + >; + types: ModuleApi< + typeof domains_agents_dueDiligence_deepResearch_types, + "internal" + >; + }; + index: ModuleApi; + investorPlaybook: { + agenticPlaybook: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_agenticPlaybook, + "internal" + >; + branches: { + claimVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_claimVerificationBranch, + "internal" + >; + enhancedClaimVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_enhancedClaimVerification, + "internal" + >; + enhancedNewsVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_enhancedNewsVerification, + "internal" + >; + entityVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_entityVerificationBranch, + "internal" + >; + fdaVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_fdaVerificationBranch, + "internal" + >; + financial: { + dealMemoSynthesis: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_financial_dealMemoSynthesis, + "internal" + >; + fundPerformanceVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_financial_fundPerformanceVerification, + "internal" + >; + }; + finraValidationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_finraValidationBranch, + "internal" + >; + index: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_index, + "internal" + >; + industry: { + clinicalTrialVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_industry_clinicalTrialVerification, + "internal" + >; + literatureTriangulation: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_industry_literatureTriangulation, + "internal" + >; + }; + moneyFlowBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_moneyFlowBranch, + "internal" + >; + newsVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_newsVerificationBranch, + "internal" + >; + personVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_personVerificationBranch, + "internal" + >; + scientificClaimVerificationBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_scientificClaimVerificationBranch, + "internal" + >; + secEdgarBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_secEdgarBranch, + "internal" + >; + strategic: { + economicIndicatorVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_strategic_economicIndicatorVerification, + "internal" + >; + maActivityVerification: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_strategic_maActivityVerification, + "internal" + >; + }; + usptoBranch: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_branches_usptoBranch, + "internal" + >; + }; + evalPlaybook: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_evalPlaybook, + "internal" + >; + index: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_index, + "internal" + >; + playbookActions: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_playbookActions, + "internal" + >; + playbookMutations: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_playbookMutations, + "internal" + >; + playbookOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_playbookOrchestrator, + "internal" + >; + types: ModuleApi< + typeof domains_agents_dueDiligence_investorPlaybook_types, + "internal" + >; + }; + investorProtection: { + index: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_index, + "internal" + >; + investorProtectionMutations: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_investorProtectionMutations, + "internal" + >; + investorProtectionOrchestrator: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_investorProtectionOrchestrator, + "internal" + >; + investorProtectionOwnership: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_investorProtectionOwnership, + "internal" + >; + phases: { + claimsExtraction: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_phases_claimsExtraction, + "internal" + >; + }; + types: ModuleApi< + typeof domains_agents_dueDiligence_investorProtection_types, + "internal" + >; + }; + memoSynthesizer: ModuleApi< + typeof domains_agents_dueDiligence_memoSynthesizer, + "internal" + >; + microBranches: ModuleApi< + typeof domains_agents_dueDiligence_microBranches, + "internal" + >; + riskScoring: ModuleApi< + typeof domains_agents_dueDiligence_riskScoring, + "internal" + >; + types: ModuleApi; + }; + emailAgent: ModuleApi; + evolutionVerification: ModuleApi< + typeof domains_agents_evolutionVerification, + "internal" + >; + fastAgentChat: ModuleApi; + fastAgentChatHelpers: ModuleApi< + typeof domains_agents_fastAgentChatHelpers, + "internal" + >; + fastAgentDocumentCreation: ModuleApi< + typeof domains_agents_fastAgentDocumentCreation, + "internal" + >; + fastAgentDocumentCreationOwnership: ModuleApi< + typeof domains_agents_fastAgentDocumentCreationOwnership, + "internal" + >; + fastAgentPanelStreaming: ModuleApi< + typeof domains_agents_fastAgentPanelStreaming, + "internal" + >; + glmFlashWithReasoning: ModuleApi< + typeof domains_agents_glmFlashWithReasoning, + "internal" + >; + glmHybridApproach: ModuleApi< + typeof domains_agents_glmHybridApproach, + "internal" + >; + hitl: { + config: ModuleApi; + index: ModuleApi; + interruptManager: ModuleApi< + typeof domains_agents_hitl_interruptManager, + "internal" + >; + tools: { + askHuman: ModuleApi< + typeof domains_agents_hitl_tools_askHuman, + "internal" + >; + index: ModuleApi; + }; + }; + humanInTheLoop: ModuleApi< + typeof domains_agents_humanInTheLoop, + "internal" + >; + index: ModuleApi; + lessons: { + captureLesson: ModuleApi< + typeof domains_agents_lessons_captureLesson, + "internal" + >; + getRelevantLessons: ModuleApi< + typeof domains_agents_lessons_getRelevantLessons, + "internal" + >; + infraPreferIds: ModuleApi< + typeof domains_agents_lessons_infraPreferIds, + "internal" + >; + lessonInjection: ModuleApi< + typeof domains_agents_lessons_lessonInjection, + "internal" + >; + lessonsPublic: ModuleApi< + typeof domains_agents_lessons_lessonsPublic, + "internal" + >; + systemPromptBuilder: ModuleApi< + typeof domains_agents_lessons_systemPromptBuilder, + "internal" + >; + }; + mcp_tools: { + context: { + contextInitializerTool: ModuleApi< + typeof domains_agents_mcp_tools_context_contextInitializerTool, + "internal" + >; + index: ModuleApi< + typeof domains_agents_mcp_tools_context_index, + "internal" + >; + }; + index: ModuleApi; + models: { + healthcheck: ModuleApi< + typeof domains_agents_mcp_tools_models_healthcheck, + "internal" + >; + index: ModuleApi< + typeof domains_agents_mcp_tools_models_index, + "internal" + >; + migration: ModuleApi< + typeof domains_agents_mcp_tools_models_migration, + "internal" + >; + modelResolver: ModuleApi< + typeof domains_agents_mcp_tools_models_modelResolver, + "internal" + >; + promptCaching: ModuleApi< + typeof domains_agents_mcp_tools_models_promptCaching, + "internal" + >; + }; + reasoningTool: ModuleApi< + typeof domains_agents_mcp_tools_reasoningTool, + "internal" + >; + testReasoningPersonas: ModuleApi< + typeof domains_agents_mcp_tools_testReasoningPersonas, + "internal" + >; + tracking: { + index: ModuleApi< + typeof domains_agents_mcp_tools_tracking_index, + "internal" + >; + taskTrackerTool: ModuleApi< + typeof domains_agents_mcp_tools_tracking_taskTrackerTool, + "internal" + >; + }; + }; + orchestrator: { + geminiVideoWrapper: ModuleApi< + typeof domains_agents_orchestrator_geminiVideoWrapper, + "internal" + >; + passportEnforcement: ModuleApi< + typeof domains_agents_orchestrator_passportEnforcement, + "internal" + >; + passportEnforcementQueries: ModuleApi< + typeof domains_agents_orchestrator_passportEnforcementQueries, + "internal" + >; + queueProtocol: ModuleApi< + typeof domains_agents_orchestrator_queueProtocol, + "internal" + >; + secEdgarWrapper: ModuleApi< + typeof domains_agents_orchestrator_secEdgarWrapper, + "internal" + >; + toolHealth: ModuleApi< + typeof domains_agents_orchestrator_toolHealth, + "internal" + >; + toolRouter: ModuleApi< + typeof domains_agents_orchestrator_toolRouter, + "internal" + >; + worker: ModuleApi< + typeof domains_agents_orchestrator_worker, + "internal" + >; + }; + parallelTaskTree: ModuleApi< + typeof domains_agents_parallelTaskTree, + "internal" + >; + promptEnhancer: ModuleApi< + typeof domains_agents_promptEnhancer, + "internal" + >; + publicWrappers: ModuleApi< + typeof domains_agents_publicWrappers, + "internal" + >; + receipts: { + actionReceipts: ModuleApi< + typeof domains_agents_receipts_actionReceipts, + "internal" + >; + emitWithReceipt: ModuleApi< + typeof domains_agents_receipts_emitWithReceipt, + "internal" + >; + }; + researchJobs: ModuleApi; + responseFlywheel: ModuleApi< + typeof domains_agents_responseFlywheel, + "internal" + >; + runtimeRouting: ModuleApi< + typeof domains_agents_runtimeRouting, + "internal" + >; + runtimeTierFallback: ModuleApi< + typeof domains_agents_runtimeTierFallback, + "internal" + >; + safety: { + artifactDecisionGate: ModuleApi< + typeof domains_agents_safety_artifactDecisionGate, + "internal" + >; + lowConfidenceGuard: ModuleApi< + typeof domains_agents_safety_lowConfidenceGuard, + "internal" + >; + rateLimitGuard: ModuleApi< + typeof domains_agents_safety_rateLimitGuard, + "internal" + >; + singleflightMap: ModuleApi< + typeof domains_agents_safety_singleflightMap, + "internal" + >; + }; + selfEvolution: ModuleApi; + selfEvolutionQueries: ModuleApi< + typeof domains_agents_selfEvolutionQueries, + "internal" + >; + snapshots: { + rollbackToCheckpoint: ModuleApi< + typeof domains_agents_snapshots_rollbackToCheckpoint, + "internal" + >; + snapshotCheckpoint: ModuleApi< + typeof domains_agents_snapshots_snapshotCheckpoint, + "internal" + >; + }; + spiral: { + spiralDetector: ModuleApi< + typeof domains_agents_spiral_spiralDetector, + "internal" + >; + }; + swarmDeliberation: ModuleApi< + typeof domains_agents_swarmDeliberation, + "internal" + >; + swarmDeliberationQueries: ModuleApi< + typeof domains_agents_swarmDeliberationQueries, + "internal" + >; + swarmMutations: ModuleApi< + typeof domains_agents_swarmMutations, + "internal" + >; + swarmOrchestrator: ModuleApi< + typeof domains_agents_swarmOrchestrator, + "internal" + >; + swarmOrchestratorEnhanced: ModuleApi< + typeof domains_agents_swarmOrchestratorEnhanced, + "internal" + >; + swarmQueries: ModuleApi; + testGlmFlash: ModuleApi; + testGlmFlashFix: ModuleApi< + typeof domains_agents_testGlmFlashFix, + "internal" + >; + testOrchestratorReasoningIntegration: ModuleApi< + typeof domains_agents_testOrchestratorReasoningIntegration, + "internal" + >; + testParallelOrchestrator: ModuleApi< + typeof domains_agents_testParallelOrchestrator, + "internal" + >; + tools: { + createDCFSpreadsheet: ModuleApi< + typeof domains_agents_tools_createDCFSpreadsheet, + "internal" + >; + editDCFSpreadsheet: ModuleApi< + typeof domains_agents_tools_editDCFSpreadsheet, + "internal" + >; + }; + traceAuditLog: ModuleApi; + traceOrchestrator: ModuleApi< + typeof domains_agents_traceOrchestrator, + "internal" + >; + traceTypes: ModuleApi; + types: ModuleApi; + unified: ModuleApi; + }; + ai: { + ai: ModuleApi; + genai: ModuleApi; + metadataAnalyzer: ModuleApi< + typeof domains_ai_metadataAnalyzer, + "internal" + >; + models: { + autonomousModelResolver: ModuleApi< + typeof domains_ai_models_autonomousModelResolver, + "internal" + >; + capabilityRegistry: ModuleApi< + typeof domains_ai_models_capabilityRegistry, + "internal" + >; + chainResolver: ModuleApi< + typeof domains_ai_models_chainResolver, + "internal" + >; + freeModelDiscovery: ModuleApi< + typeof domains_ai_models_freeModelDiscovery, + "internal" + >; + index: ModuleApi; + livePerformanceEval: ModuleApi< + typeof domains_ai_models_livePerformanceEval, + "internal" + >; + modelRouter: ModuleApi< + typeof domains_ai_models_modelRouter, + "internal" + >; + modelRouterQueries: ModuleApi< + typeof domains_ai_models_modelRouterQueries, + "internal" + >; + }; + morningDigest: ModuleApi; + morningDigestQueries: ModuleApi< + typeof domains_ai_morningDigestQueries, + "internal" + >; + realtimeTranscription: ModuleApi< + typeof domains_ai_realtimeTranscription, + "internal" + >; + whisperTranscribe: ModuleApi< + typeof domains_ai_whisperTranscribe, + "internal" + >; + }; + analytics: { + analytics: ModuleApi; + componentMetrics: ModuleApi< + typeof domains_analytics_componentMetrics, + "internal" + >; + intentSignals: ModuleApi< + typeof domains_analytics_intentSignals, + "internal" + >; + ossStats: ModuleApi; + }; + artifacts: { + evidenceIndex: ModuleApi< + typeof domains_artifacts_evidenceIndex, + "internal" + >; + evidenceIndexActions: ModuleApi< + typeof domains_artifacts_evidenceIndexActions, + "internal" + >; + evidencePacks: ModuleApi< + typeof domains_artifacts_evidencePacks, + "internal" + >; + evidenceSearch: ModuleApi< + typeof domains_artifacts_evidenceSearch, + "internal" + >; + sourceArtifacts: ModuleApi< + typeof domains_artifacts_sourceArtifacts, + "internal" + >; + }; + auth: { + account: ModuleApi; + apiKeys: ModuleApi; + apiKeysActions: ModuleApi; + auth: ModuleApi; + index: ModuleApi; + onboarding: ModuleApi; + personas: { + index: ModuleApi; + multiPersonaSynthesizer: ModuleApi< + typeof domains_auth_personas_multiPersonaSynthesizer, + "internal" + >; + personaAutonomousAgent: ModuleApi< + typeof domains_auth_personas_personaAutonomousAgent, + "internal" + >; + }; + presence: ModuleApi; + usage: ModuleApi; + userPreferences: ModuleApi< + typeof domains_auth_userPreferences, + "internal" + >; + userStats: ModuleApi; + users: ModuleApi; + }; + batchAutopilot: { + deltaCollector: ModuleApi< + typeof domains_batchAutopilot_deltaCollector, + "internal" + >; + mutations: ModuleApi; + promptBuilder: ModuleApi< + typeof domains_batchAutopilot_promptBuilder, + "internal" + >; + queries: ModuleApi; + runner: ModuleApi; + scheduler: ModuleApi; + }; + billing: { + apiUsageTracking: ModuleApi< + typeof domains_billing_apiUsageTracking, + "internal" + >; + billing: ModuleApi; + index: ModuleApi; + rateLimiting: ModuleApi; + }; + blips: { + blipClaimExtraction: ModuleApi< + typeof domains_blips_blipClaimExtraction, + "internal" + >; + blipGeneration: ModuleApi< + typeof domains_blips_blipGeneration, + "internal" + >; + blipIngestion: ModuleApi; + blipMutations: ModuleApi; + blipPersonaLens: ModuleApi< + typeof domains_blips_blipPersonaLens, + "internal" + >; + blipPipeline: ModuleApi; + blipQueries: ModuleApi; + blipVerification: ModuleApi< + typeof domains_blips_blipVerification, + "internal" + >; + index: ModuleApi; + types: ModuleApi; + }; + calendar: { + calendar: ModuleApi; + events: ModuleApi; + holidays: ModuleApi; + holidaysActions: ModuleApi< + typeof domains_calendar_holidaysActions, + "internal" + >; + index: ModuleApi; + }; + canonicalization: { + duplicateDetection: ModuleApi< + typeof domains_canonicalization_duplicateDetection, + "internal" + >; + }; + channels: { + channelIntelligence: ModuleApi< + typeof domains_channels_channelIntelligence, + "internal" + >; + engagementOptimizer: ModuleApi< + typeof domains_channels_engagementOptimizer, + "internal" + >; + index: ModuleApi; + }; + deepTrace: { + causalChainEngine: ModuleApi< + typeof domains_deepTrace_causalChainEngine, + "internal" + >; + dimensionEngine: ModuleApi< + typeof domains_deepTrace_dimensionEngine, + "internal" + >; + dimensionModel: ModuleApi< + typeof domains_deepTrace_dimensionModel, + "internal" + >; + dimensions: ModuleApi; + heuristics: ModuleApi; + integrations: ModuleApi< + typeof domains_deepTrace_integrations, + "internal" + >; + researchCell: ModuleApi< + typeof domains_deepTrace_researchCell, + "internal" + >; + }; + documents: { + artifacts: { + evidenceIndex: ModuleApi< + typeof domains_documents_artifacts_evidenceIndex, + "internal" + >; + evidenceIndexActions: ModuleApi< + typeof domains_documents_artifacts_evidenceIndexActions, + "internal" + >; + evidencePacks: ModuleApi< + typeof domains_documents_artifacts_evidencePacks, + "internal" + >; + evidenceSearch: ModuleApi< + typeof domains_documents_artifacts_evidenceSearch, + "internal" + >; + ingestionPipeline: ModuleApi< + typeof domains_documents_artifacts_ingestionPipeline, + "internal" + >; + sourceArtifacts: ModuleApi< + typeof domains_documents_artifacts_sourceArtifacts, + "internal" + >; + }; + batchOperations: ModuleApi< + typeof domains_documents_batchOperations, + "internal" + >; + calendar: { + calendar: ModuleApi< + typeof domains_documents_calendar_calendar, + "internal" + >; + events: ModuleApi; + holidays: ModuleApi< + typeof domains_documents_calendar_holidays, + "internal" + >; + holidaysActions: ModuleApi< + typeof domains_documents_calendar_holidaysActions, + "internal" + >; + index: ModuleApi; + }; + chunks: ModuleApi; + citationValidator: ModuleApi< + typeof domains_documents_citationValidator, + "internal" + >; + citations: ModuleApi; + documentEvents: ModuleApi< + typeof domains_documents_documentEvents, + "internal" + >; + documentMetadataParser: ModuleApi< + typeof domains_documents_documentMetadataParser, + "internal" + >; + documentTasks: ModuleApi< + typeof domains_documents_documentTasks, + "internal" + >; + documentVersions: ModuleApi< + typeof domains_documents_documentVersions, + "internal" + >; + documents: ModuleApi; + dossier: { + annotations: ModuleApi< + typeof domains_documents_dossier_annotations, + "internal" + >; + enrichment: ModuleApi< + typeof domains_documents_dossier_enrichment, + "internal" + >; + focusState: ModuleApi< + typeof domains_documents_dossier_focusState, + "internal" + >; + index: ModuleApi; + }; + exportDocument: ModuleApi< + typeof domains_documents_exportDocument, + "internal" + >; + fileAnalysis: ModuleApi< + typeof domains_documents_fileAnalysis, + "internal" + >; + fileDocuments: ModuleApi< + typeof domains_documents_fileDocuments, + "internal" + >; + fileQueries: ModuleApi; + fileSearch: ModuleApi; + fileSearchData: ModuleApi< + typeof domains_documents_fileSearchData, + "internal" + >; + files: ModuleApi; + folders: ModuleApi; + gridProjects: ModuleApi< + typeof domains_documents_gridProjects, + "internal" + >; + index: ModuleApi; + mcpDocumentEndpoints: ModuleApi< + typeof domains_documents_mcpDocumentEndpoints, + "internal" + >; + pdfAnalysis: ModuleApi; + pdfInsights: ModuleApi; + pendingEdits: ModuleApi< + typeof domains_documents_pendingEdits, + "internal" + >; + prosemirror: ModuleApi; + quickCapture: { + index: ModuleApi< + typeof domains_documents_quickCapture_index, + "internal" + >; + quickCapture: ModuleApi< + typeof domains_documents_quickCapture_quickCapture, + "internal" + >; + voiceMemos: ModuleApi< + typeof domains_documents_quickCapture_voiceMemos, + "internal" + >; + }; + reportDocuments: ModuleApi< + typeof domains_documents_reportDocuments, + "internal" + >; + search: ModuleApi; + smartDateExtraction: ModuleApi< + typeof domains_documents_smartDateExtraction, + "internal" + >; + sync: ModuleApi; + syncMutations: ModuleApi< + typeof domains_documents_syncMutations, + "internal" + >; + }; + dogfood: { + screenshotQa: ModuleApi; + videoQa: ModuleApi; + videoQaMutations: ModuleApi< + typeof domains_dogfood_videoQaMutations, + "internal" + >; + videoQaQueries: ModuleApi< + typeof domains_dogfood_videoQaQueries, + "internal" + >; + }; + dossier: { + annotations: ModuleApi; + enrichment: ModuleApi; + focusState: ModuleApi; + index: ModuleApi; + }; + encounters: { + encounterCapture: ModuleApi< + typeof domains_encounters_encounterCapture, + "internal" + >; + encounterFastPass: ModuleApi< + typeof domains_encounters_encounterFastPass, + "internal" + >; + encounterMutations: ModuleApi< + typeof domains_encounters_encounterMutations, + "internal" + >; + encounterQueries: ModuleApi< + typeof domains_encounters_encounterQueries, + "internal" + >; + index: ModuleApi; + types: ModuleApi; + }; + enrichment: { + backfillMetadata: ModuleApi< + typeof domains_enrichment_backfillMetadata, + "internal" + >; + betterSectorClassifier: ModuleApi< + typeof domains_enrichment_betterSectorClassifier, + "internal" + >; + canonicalization: { + duplicateDetection: ModuleApi< + typeof domains_enrichment_canonicalization_duplicateDetection, + "internal" + >; + }; + dataCleanup: ModuleApi; + deleteDuplicates: ModuleApi< + typeof domains_enrichment_deleteDuplicates, + "internal" + >; + documentStore: ModuleApi< + typeof domains_enrichment_documentStore, + "internal" + >; + enrichmentQueue: ModuleApi< + typeof domains_enrichment_enrichmentQueue, + "internal" + >; + enrichmentWorker: ModuleApi< + typeof domains_enrichment_enrichmentWorker, + "internal" + >; + entityBackfill: ModuleApi< + typeof domains_enrichment_entityBackfill, + "internal" + >; + entityLinkingJudge: ModuleApi< + typeof domains_enrichment_entityLinkingJudge, + "internal" + >; + entityLinkingMutations: ModuleApi< + typeof domains_enrichment_entityLinkingMutations, + "internal" + >; + entityLinkingQueries: ModuleApi< + typeof domains_enrichment_entityLinkingQueries, + "internal" + >; + entityLinkingService: ModuleApi< + typeof domains_enrichment_entityLinkingService, + "internal" + >; + entityPromotion: ModuleApi< + typeof domains_enrichment_entityPromotion, + "internal" + >; + fundingDetection: ModuleApi< + typeof domains_enrichment_fundingDetection, + "internal" + >; + fundingMutations: ModuleApi< + typeof domains_enrichment_fundingMutations, + "internal" + >; + fundingQueries: ModuleApi< + typeof domains_enrichment_fundingQueries, + "internal" + >; + fundingVerification: ModuleApi< + typeof domains_enrichment_fundingVerification, + "internal" + >; + llmCompanyExtraction: ModuleApi< + typeof domains_enrichment_llmCompanyExtraction, + "internal" + >; + llmEnrichment: ModuleApi< + typeof domains_enrichment_llmEnrichment, + "internal" + >; + quickVerificationUpgrade: ModuleApi< + typeof domains_enrichment_quickVerificationUpgrade, + "internal" + >; + signals: { + index: ModuleApi; + signalIngester: ModuleApi< + typeof domains_enrichment_signals_signalIngester, + "internal" + >; + signalProcessor: ModuleApi< + typeof domains_enrichment_signals_signalProcessor, + "internal" + >; + }; + testQueries: ModuleApi; + useOfProceedsExtractor: ModuleApi< + typeof domains_enrichment_useOfProceedsExtractor, + "internal" + >; + workpools: ModuleApi; + }; + entities: { + decayManager: ModuleApi; + entityLifecycle: ModuleApi< + typeof domains_entities_entityLifecycle, + "internal" + >; + index: ModuleApi; + }; + eval: { + evalHelpers: ModuleApi; + evalMutations: ModuleApi; + evalStorage: ModuleApi; + productionTestCases: ModuleApi< + typeof domains_eval_productionTestCases, + "internal" + >; + runBatch: ModuleApi; + runBatchNative: ModuleApi; + }; + evaluation: { + agentRunJudge: ModuleApi< + typeof domains_evaluation_agentRunJudge, + "internal" + >; + benchmarkHarness: ModuleApi< + typeof domains_evaluation_benchmarkHarness, + "internal" + >; + booleanEvaluator: ModuleApi< + typeof domains_evaluation_booleanEvaluator, + "internal" + >; + comprehensiveEval: ModuleApi< + typeof domains_evaluation_comprehensiveEval, + "internal" + >; + cronHandlers: ModuleApi< + typeof domains_evaluation_cronHandlers, + "internal" + >; + ddEvaluation: ModuleApi< + typeof domains_evaluation_ddEvaluation, + "internal" + >; + dogfood: { + screenshotQa: ModuleApi< + typeof domains_evaluation_dogfood_screenshotQa, + "internal" + >; + videoQa: ModuleApi< + typeof domains_evaluation_dogfood_videoQa, + "internal" + >; + videoQaMutations: ModuleApi< + typeof domains_evaluation_dogfood_videoQaMutations, + "internal" + >; + videoQaQueries: ModuleApi< + typeof domains_evaluation_dogfood_videoQaQueries, + "internal" + >; + }; + e2eValidation: ModuleApi< + typeof domains_evaluation_e2eValidation, + "internal" + >; + eval: { + evalHelpers: ModuleApi< + typeof domains_evaluation_eval_evalHelpers, + "internal" + >; + evalMutations: ModuleApi< + typeof domains_evaluation_eval_evalMutations, + "internal" + >; + evalStorage: ModuleApi< + typeof domains_evaluation_eval_evalStorage, + "internal" + >; + productionTestCases: ModuleApi< + typeof domains_evaluation_eval_productionTestCases, + "internal" + >; + runBatch: ModuleApi< + typeof domains_evaluation_eval_runBatch, + "internal" + >; + runBatchNative: ModuleApi< + typeof domains_evaluation_eval_runBatchNative, + "internal" + >; + }; + evalHarness: ModuleApi; + evalRunTracking: ModuleApi< + typeof domains_evaluation_evalRunTracking, + "internal" + >; + evaluationPrompts: ModuleApi< + typeof domains_evaluation_evaluationPrompts, + "internal" + >; + evaluationSafeResponse: ModuleApi< + typeof domains_evaluation_evaluationSafeResponse, + "internal" + >; + evidencePlanner: ModuleApi< + typeof domains_evaluation_evidencePlanner, + "internal" + >; + financial: { + corrections: ModuleApi< + typeof domains_evaluation_financial_corrections, + "internal" + >; + dcfComparison: ModuleApi< + typeof domains_evaluation_financial_dcfComparison, + "internal" + >; + dcfEngine: ModuleApi< + typeof domains_evaluation_financial_dcfEngine, + "internal" + >; + evaluationOrchestrator: ModuleApi< + typeof domains_evaluation_financial_evaluationOrchestrator, + "internal" + >; + index: ModuleApi; + reproPack: ModuleApi< + typeof domains_evaluation_financial_reproPack, + "internal" + >; + seedData: ModuleApi< + typeof domains_evaluation_financial_seedData, + "internal" + >; + sourceQuality: ModuleApi< + typeof domains_evaluation_financial_sourceQuality, + "internal" + >; + types: ModuleApi; + }; + fixtures: { + shipDemoDayFixtures: ModuleApi< + typeof domains_evaluation_fixtures_shipDemoDayFixtures, + "internal" + >; + }; + groundTruth: ModuleApi< + typeof domains_evaluation_groundTruth, + "internal" + > & { + auditLog: ModuleApi< + typeof domains_evaluation_groundTruth_auditLog, + "internal" + >; + versions: ModuleApi< + typeof domains_evaluation_groundTruth_versions, + "internal" + >; + }; + index: ModuleApi; + inference: { + becPlaybook: ModuleApi< + typeof domains_evaluation_inference_becPlaybook, + "internal" + >; + index: ModuleApi; + llmJudge: ModuleApi< + typeof domains_evaluation_inference_llmJudge, + "internal" + >; + personaInferenceEval: ModuleApi< + typeof domains_evaluation_inference_personaInferenceEval, + "internal" + >; + }; + judgeMetrics: ModuleApi< + typeof domains_evaluation_judgeMetrics, + "internal" + >; + liveApiSmoke: ModuleApi< + typeof domains_evaluation_liveApiSmoke, + "internal" + >; + liveEval: ModuleApi; + llmJudge: ModuleApi; + mediaContextScenarios: ModuleApi< + typeof domains_evaluation_mediaContextScenarios, + "internal" + >; + memoryFirstScenarios: ModuleApi< + typeof domains_evaluation_memoryFirstScenarios, + "internal" + >; + migrateEvaluationScenarios: ModuleApi< + typeof domains_evaluation_migrateEvaluationScenarios, + "internal" + >; + multiTurnScenarios: ModuleApi< + typeof domains_evaluation_multiTurnScenarios, + "internal" + >; + operations: ModuleApi; + personaEpisodeEval: ModuleApi< + typeof domains_evaluation_personaEpisodeEval, + "internal" + >; + personaInferenceScenarios: ModuleApi< + typeof domains_evaluation_personaInferenceScenarios, + "internal" + >; + personaLiveEval: ModuleApi< + typeof domains_evaluation_personaLiveEval, + "internal" + >; + personas: { + financial: { + financialGroundTruth: ModuleApi< + typeof domains_evaluation_personas_financial_financialGroundTruth, + "internal" + >; + jpmBankerEval: ModuleApi< + typeof domains_evaluation_personas_financial_jpmBankerEval, + "internal" + >; + lpAllocatorEval: ModuleApi< + typeof domains_evaluation_personas_financial_lpAllocatorEval, + "internal" + >; + quantPMEval: ModuleApi< + typeof domains_evaluation_personas_financial_quantPMEval, + "internal" + >; + quantPMGroundTruth: ModuleApi< + typeof domains_evaluation_personas_financial_quantPMGroundTruth, + "internal" + >; + }; + identityAssurance: ModuleApi< + typeof domains_evaluation_personas_identityAssurance, + "internal" + >; + index: ModuleApi; + industry: { + academicRDEval: ModuleApi< + typeof domains_evaluation_personas_industry_academicRDEval, + "internal" + >; + industryGroundTruth: ModuleApi< + typeof domains_evaluation_personas_industry_industryGroundTruth, + "internal" + >; + pharmaBDEval: ModuleApi< + typeof domains_evaluation_personas_industry_pharmaBDEval, + "internal" + >; + }; + media: { + journalistEval: ModuleApi< + typeof domains_evaluation_personas_media_journalistEval, + "internal" + >; + mediaGroundTruth: ModuleApi< + typeof domains_evaluation_personas_media_mediaGroundTruth, + "internal" + >; + }; + strategic: { + corpDevEval: ModuleApi< + typeof domains_evaluation_personas_strategic_corpDevEval, + "internal" + >; + founderStrategyEval: ModuleApi< + typeof domains_evaluation_personas_strategic_founderStrategyEval, + "internal" + >; + founderStrategyGroundTruth: ModuleApi< + typeof domains_evaluation_personas_strategic_founderStrategyGroundTruth, + "internal" + >; + macroStratEval: ModuleApi< + typeof domains_evaluation_personas_strategic_macroStratEval, + "internal" + >; + strategicGroundTruth: ModuleApi< + typeof domains_evaluation_personas_strategic_strategicGroundTruth, + "internal" + >; + }; + technical: { + ctoTechLeadEval: ModuleApi< + typeof domains_evaluation_personas_technical_ctoTechLeadEval, + "internal" + >; + technicalGroundTruth: ModuleApi< + typeof domains_evaluation_personas_technical_technicalGroundTruth, + "internal" + >; + }; + types: ModuleApi; + unifiedPersonaHarness: ModuleApi< + typeof domains_evaluation_personas_unifiedPersonaHarness, + "internal" + >; + }; + promptEnhancerScenarios: ModuleApi< + typeof domains_evaluation_promptEnhancerScenarios, + "internal" + >; + runBenchmark: ModuleApi< + typeof domains_evaluation_runBenchmark, + "internal" + >; + scenarioQueries: ModuleApi< + typeof domains_evaluation_scenarioQueries, + "internal" + >; + scenarios: { + researchToolEval: ModuleApi< + typeof domains_evaluation_scenarios_researchToolEval, + "internal" + >; + researchUltraLongChatEval: ModuleApi< + typeof domains_evaluation_scenarios_researchUltraLongChatEval, + "internal" + >; + ultraLongChatRealPathEval: ModuleApi< + typeof domains_evaluation_scenarios_ultraLongChatRealPathEval, + "internal" + >; + }; + scoring: { + benchmarkSuite: ModuleApi< + typeof domains_evaluation_scoring_benchmarkSuite, + "internal" + >; + claimLifecycle: ModuleApi< + typeof domains_evaluation_scoring_claimLifecycle, + "internal" + >; + personaWeights: ModuleApi< + typeof domains_evaluation_scoring_personaWeights, + "internal" + >; + riskCalibration: ModuleApi< + typeof domains_evaluation_scoring_riskCalibration, + "internal" + >; + scoringFramework: ModuleApi< + typeof domains_evaluation_scoring_scoringFramework, + "internal" + >; + sourceCitations: ModuleApi< + typeof domains_evaluation_scoring_sourceCitations, + "internal" + >; + }; + sourceQuality: ModuleApi< + typeof domains_evaluation_sourceQuality, + "internal" + >; + systemE2E: ModuleApi; + tasteBench: ModuleApi; + tasteBenchPolicy: ModuleApi< + typeof domains_evaluation_tasteBenchPolicy, + "internal" + >; + tasteBenchSchema: ModuleApi< + typeof domains_evaluation_tasteBenchSchema, + "internal" + >; + testAgentDirect: ModuleApi< + typeof domains_evaluation_testAgentDirect, + "internal" + >; + testAgentQueries: ModuleApi< + typeof domains_evaluation_testAgentQueries, + "internal" + >; + testAnthropicApi: ModuleApi< + typeof domains_evaluation_testAnthropicApi, + "internal" + >; + testDirectApi: ModuleApi< + typeof domains_evaluation_testDirectApi, + "internal" + >; + testLlmJudge: ModuleApi< + typeof domains_evaluation_testLlmJudge, + "internal" + >; + testing: { + testingFramework: ModuleApi< + typeof domains_evaluation_testing_testingFramework, + "internal" + >; + }; + ultraLongChat: { + batchRunner: ModuleApi< + typeof domains_evaluation_ultraLongChat_batchRunner, + "internal" + >; + judge: ModuleApi< + typeof domains_evaluation_ultraLongChat_judge, + "internal" + >; + regressionGate: ModuleApi< + typeof domains_evaluation_ultraLongChat_regressionGate, + "internal" + >; + scenarios: ModuleApi< + typeof domains_evaluation_ultraLongChat_scenarios, + "internal" + >; + storage: ModuleApi< + typeof domains_evaluation_ultraLongChat_storage, + "internal" + >; + }; + validators: ModuleApi; + workbenchQueries: ModuleApi< + typeof domains_evaluation_workbenchQueries, + "internal" + >; + }; + financial: { + balanceSheetFetcher: ModuleApi< + typeof domains_financial_balanceSheetFetcher, + "internal" + >; + corporateActions: ModuleApi< + typeof domains_financial_corporateActions, + "internal" + >; + corrections: ModuleApi; + dcfBuilder: ModuleApi; + dcfEvaluator: ModuleApi< + typeof domains_financial_dcfEvaluator, + "internal" + >; + dcfOrchestrator: ModuleApi< + typeof domains_financial_dcfOrchestrator, + "internal" + >; + dcfProgress: ModuleApi; + dcfSpreadsheetAdapter: ModuleApi< + typeof domains_financial_dcfSpreadsheetAdapter, + "internal" + >; + dcfSpreadsheetMapping: ModuleApi< + typeof domains_financial_dcfSpreadsheetMapping, + "internal" + >; + dcfTools: ModuleApi; + financialAnalystAgent: ModuleApi< + typeof domains_financial_financialAnalystAgent, + "internal" + >; + fundamentals: ModuleApi< + typeof domains_financial_fundamentals, + "internal" + >; + groundTruthFetcher: ModuleApi< + typeof domains_financial_groundTruthFetcher, + "internal" + >; + groundTruthManager: ModuleApi< + typeof domains_financial_groundTruthManager, + "internal" + >; + inconclusiveOnFailure: ModuleApi< + typeof domains_financial_inconclusiveOnFailure, + "internal" + >; + index: ModuleApi; + interactiveDCFSession: ModuleApi< + typeof domains_financial_interactiveDCFSession, + "internal" + >; + modelRiskGovernance: ModuleApi< + typeof domains_financial_modelRiskGovernance, + "internal" + >; + reportGenerator: ModuleApi< + typeof domains_financial_reportGenerator, + "internal" + >; + restatementPolicy: ModuleApi< + typeof domains_financial_restatementPolicy, + "internal" + >; + secEdgarClient: ModuleApi< + typeof domains_financial_secEdgarClient, + "internal" + >; + sensitivityAnalysis: ModuleApi< + typeof domains_financial_sensitivityAnalysis, + "internal" + >; + taxonomyManagement: ModuleApi< + typeof domains_financial_taxonomyManagement, + "internal" + >; + validation: ModuleApi; + xbrlParser: ModuleApi; + }; + financialOperator: { + attFixture: ModuleApi< + typeof domains_financialOperator_attFixture, + "internal" + >; + extractors: ModuleApi< + typeof domains_financialOperator_extractors, + "internal" + >; + fixtures: { + covenantFixture: ModuleApi< + typeof domains_financialOperator_fixtures_covenantFixture, + "internal" + >; + crmFixture: ModuleApi< + typeof domains_financialOperator_fixtures_crmFixture, + "internal" + >; + varianceFixture: ModuleApi< + typeof domains_financialOperator_fixtures_varianceFixture, + "internal" + >; + }; + index: ModuleApi; + orchestrator: ModuleApi< + typeof domains_financialOperator_orchestrator, + "internal" + >; + orchestratorExamples: ModuleApi< + typeof domains_financialOperator_orchestratorExamples, + "internal" + >; + realExtractors: ModuleApi< + typeof domains_financialOperator_realExtractors, + "internal" + >; + runOps: ModuleApi; + sandbox: ModuleApi; + types: ModuleApi; + validators: ModuleApi< + typeof domains_financialOperator_validators, + "internal" + >; + }; + forecasting: { + actions: { + computeCalibration: ModuleApi< + typeof domains_forecasting_actions_computeCalibration, + "internal" + >; + createForecast: ModuleApi< + typeof domains_forecasting_actions_createForecast, + "internal" + >; + refreshForecast: ModuleApi< + typeof domains_forecasting_actions_refreshForecast, + "internal" + >; + resolveForecast: ModuleApi< + typeof domains_forecasting_actions_resolveForecast, + "internal" + >; + }; + cronHandlers: { + dailyForecastRefresh: ModuleApi< + typeof domains_forecasting_cronHandlers_dailyForecastRefresh, + "internal" + >; + resolutionCheck: ModuleApi< + typeof domains_forecasting_cronHandlers_resolutionCheck, + "internal" + >; + weeklyCalibration: ModuleApi< + typeof domains_forecasting_cronHandlers_weeklyCalibration, + "internal" + >; + }; + forecastManager: ModuleApi< + typeof domains_forecasting_forecastManager, + "internal" + >; + scoringEngine: ModuleApi< + typeof domains_forecasting_scoringEngine, + "internal" + >; + signalMatcher: ModuleApi< + typeof domains_forecasting_signalMatcher, + "internal" + >; + traceWrapper: ModuleApi< + typeof domains_forecasting_traceWrapper, + "internal" + >; + validators: ModuleApi; + }; + founder: { + ambientIntelligenceJobs: ModuleApi< + typeof domains_founder_ambientIntelligenceJobs, + "internal" + >; + ambientIntelligenceOps: ModuleApi< + typeof domains_founder_ambientIntelligenceOps, + "internal" + >; + backgroundJobs: ModuleApi< + typeof domains_founder_backgroundJobs, + "internal" + >; + causalMemoryJobs: ModuleApi< + typeof domains_founder_causalMemoryJobs, + "internal" + >; + causalMemoryOps: ModuleApi< + typeof domains_founder_causalMemoryOps, + "internal" + >; + founderHarnessOps: ModuleApi< + typeof domains_founder_founderHarnessOps, + "internal" + >; + index: ModuleApi; + operations: ModuleApi; + seed: ModuleApi; + seedTrigger: ModuleApi; + sharedContextOps: ModuleApi< + typeof domains_founder_sharedContextOps, + "internal" + >; + }; + governance: { + provenanceExplainer: ModuleApi< + typeof domains_governance_provenanceExplainer, + "internal" + >; + quarantine: ModuleApi; + trustPolicy: ModuleApi; + }; + graph: { + applyGraphPatch: ModuleApi< + typeof domains_graph_applyGraphPatch, + "internal" + >; + autoExtractMentions: ModuleApi< + typeof domains_graph_autoExtractMentions, + "internal" + >; + backlinkQueries: ModuleApi< + typeof domains_graph_backlinkQueries, + "internal" + >; + expandEntity: ModuleApi; + expansionQueries: ModuleApi< + typeof domains_graph_expansionQueries, + "internal" + >; + index: ModuleApi; + }; + groundTruth: { + auditLog: ModuleApi; + versions: ModuleApi; + }; + hitl: { + adjudicationWorkflow: ModuleApi< + typeof domains_hitl_adjudicationWorkflow, + "internal" + >; + decisions: ModuleApi; + distributionDriftDetection: ModuleApi< + typeof domains_hitl_distributionDriftDetection, + "internal" + >; + labelerCalibration: ModuleApi< + typeof domains_hitl_labelerCalibration, + "internal" + >; + labelingQueue: ModuleApi; + validationWorkspaceEnforcement: ModuleApi< + typeof domains_hitl_validationWorkspaceEnforcement, + "internal" + >; + }; + hyperloop: { + operations: ModuleApi; + policy: ModuleApi; + }; + integrations: { + billing: { + apiUsageTracking: ModuleApi< + typeof domains_integrations_billing_apiUsageTracking, + "internal" + >; + billing: ModuleApi< + typeof domains_integrations_billing_billing, + "internal" + >; + index: ModuleApi; + rateLimiting: ModuleApi< + typeof domains_integrations_billing_rateLimiting, + "internal" + >; + }; + discord: ModuleApi; + discordAgent: ModuleApi< + typeof domains_integrations_discordAgent, + "internal" + >; + email: ModuleApi & { + dailyEmailReport: ModuleApi< + typeof domains_integrations_email_dailyEmailReport, + "internal" + >; + dossierEmailExample: ModuleApi< + typeof domains_integrations_email_dossierEmailExample, + "internal" + >; + dossierEmailTemplate: ModuleApi< + typeof domains_integrations_email_dossierEmailTemplate, + "internal" + >; + emailAdmin: ModuleApi< + typeof domains_integrations_email_emailAdmin, + "internal" + >; + emailAdminActions: ModuleApi< + typeof domains_integrations_email_emailAdminActions, + "internal" + >; + emailEncounterIngest: ModuleApi< + typeof domains_integrations_email_emailEncounterIngest, + "internal" + >; + emailQueries: ModuleApi< + typeof domains_integrations_email_emailQueries, + "internal" + >; + emailService: ModuleApi< + typeof domains_integrations_email_emailService, + "internal" + >; + emailWebhook: ModuleApi< + typeof domains_integrations_email_emailWebhook, + "internal" + >; + morningDigestEmailTemplate: ModuleApi< + typeof domains_integrations_email_morningDigestEmailTemplate, + "internal" + >; + }; + gcal: ModuleApi; + gmail: ModuleApi & { + types: ModuleApi; + }; + index: ModuleApi; + integrations: ModuleApi< + typeof domains_integrations_integrations, + "internal" + >; + landing: { + landingPageLog: ModuleApi< + typeof domains_integrations_landing_landingPageLog, + "internal" + >; + }; + macro: { + fredSeed: ModuleApi< + typeof domains_integrations_macro_fredSeed, + "internal" + >; + }; + ntfy: ModuleApi; + polar: ModuleApi; + resend: ModuleApi; + slack: { + encounterMutations: ModuleApi< + typeof domains_integrations_slack_encounterMutations, + "internal" + >; + encounterParser: ModuleApi< + typeof domains_integrations_slack_encounterParser, + "internal" + >; + encounterResearch: ModuleApi< + typeof domains_integrations_slack_encounterResearch, + "internal" + >; + encounterResearchQueries: ModuleApi< + typeof domains_integrations_slack_encounterResearchQueries, + "internal" + >; + encounterResolver: ModuleApi< + typeof domains_integrations_slack_encounterResolver, + "internal" + >; + index: ModuleApi; + slackAgent: ModuleApi< + typeof domains_integrations_slack_slackAgent, + "internal" + >; + slackBlocks: ModuleApi< + typeof domains_integrations_slack_slackBlocks, + "internal" + >; + slackWebhook: ModuleApi< + typeof domains_integrations_slack_slackWebhook, + "internal" + >; + }; + sms: ModuleApi; + spreadsheets: ModuleApi< + typeof domains_integrations_spreadsheets, + "internal" + >; + telegram: ModuleApi; + telegramAgent: ModuleApi< + typeof domains_integrations_telegramAgent, + "internal" + >; + video: { + oembedFetcher: ModuleApi< + typeof domains_integrations_video_oembedFetcher, + "internal" + >; + oembedFetcherQueries: ModuleApi< + typeof domains_integrations_video_oembedFetcherQueries, + "internal" + >; + }; + voice: { + costLedger: ModuleApi< + typeof domains_integrations_voice_costLedger, + "internal" + >; + editionTts: ModuleApi< + typeof domains_integrations_voice_editionTts, + "internal" + >; + realtimeAudit: ModuleApi< + typeof domains_integrations_voice_realtimeAudit, + "internal" + >; + realtimeGateway: ModuleApi< + typeof domains_integrations_voice_realtimeGateway, + "internal" + >; + voiceActions: ModuleApi< + typeof domains_integrations_voice_voiceActions, + "internal" + >; + voiceAgent: ModuleApi< + typeof domains_integrations_voice_voiceAgent, + "internal" + >; + voiceMutations: ModuleApi< + typeof domains_integrations_voice_voiceMutations, + "internal" + >; + }; + }; + intelligence: { + operations: ModuleApi; + }; + knowledge: { + adaptiveEntityEnrichment: ModuleApi< + typeof domains_knowledge_adaptiveEntityEnrichment, + "internal" + >; + adaptiveEntityQueries: ModuleApi< + typeof domains_knowledge_adaptiveEntityQueries, + "internal" + >; + entityContexts: ModuleApi< + typeof domains_knowledge_entityContexts, + "internal" + >; + entityInsights: ModuleApi< + typeof domains_knowledge_entityInsights, + "internal" + >; + index: ModuleApi; + knowledgeGraph: ModuleApi< + typeof domains_knowledge_knowledgeGraph, + "internal" + >; + learning: { + adaptiveLearning: ModuleApi< + typeof domains_knowledge_learning_adaptiveLearning, + "internal" + >; + }; + nodes: ModuleApi; + relationTypes: ModuleApi< + typeof domains_knowledge_relationTypes, + "internal" + >; + relations: ModuleApi; + relationshipGraph: ModuleApi< + typeof domains_knowledge_relationshipGraph, + "internal" + >; + sourceDiffs: ModuleApi; + sourceRegistry: ModuleApi< + typeof domains_knowledge_sourceRegistry, + "internal" + >; + tags: ModuleApi; + teachability: { + index: ModuleApi< + typeof domains_knowledge_teachability_index, + "internal" + >; + }; + }; + landing: { + landingPageLog: ModuleApi< + typeof domains_landing_landingPageLog, + "internal" + >; + }; + learning: { + adaptiveLearning: ModuleApi< + typeof domains_learning_adaptiveLearning, + "internal" + >; + }; + mcp: { + apiKeys: ModuleApi; + apiKeysSchema: ModuleApi; + mcp: ModuleApi; + mcpAuth: ModuleApi; + mcpBridgeHttp: ModuleApi; + mcpBridgeQueries: ModuleApi< + typeof domains_mcp_mcpBridgeQueries, + "internal" + >; + mcpClient: ModuleApi; + mcpExecutionTraceEndpoints: ModuleApi< + typeof domains_mcp_mcpExecutionTraceEndpoints, + "internal" + >; + mcpGatewayDispatcher: ModuleApi< + typeof domains_mcp_mcpGatewayDispatcher, + "internal" + >; + mcpHttpAuth: ModuleApi; + mcpHybridSearch: ModuleApi< + typeof domains_mcp_mcpHybridSearch, + "internal" + >; + mcpLearning: ModuleApi; + mcpMemory: ModuleApi; + mcpMemoryHttp: ModuleApi; + mcpNarrativeEndpoints: ModuleApi< + typeof domains_mcp_mcpNarrativeEndpoints, + "internal" + >; + mcpPlans: ModuleApi; + mcpPlansHttp: ModuleApi; + mcpResearchEndpoints: ModuleApi< + typeof domains_mcp_mcpResearchEndpoints, + "internal" + >; + mcpSourcingContract: ModuleApi< + typeof domains_mcp_mcpSourcingContract, + "internal" + >; + mcpSourcingDraft: ModuleApi< + typeof domains_mcp_mcpSourcingDraft, + "internal" + >; + mcpToolLedger: ModuleApi; + mcpToolRegistry: ModuleApi< + typeof domains_mcp_mcpToolRegistry, + "internal" + >; + mcpVerificationEndpoints: ModuleApi< + typeof domains_mcp_mcpVerificationEndpoints, + "internal" + >; + webmcpOriginManager: ModuleApi< + typeof domains_mcp_webmcpOriginManager, + "internal" + >; + }; + messaging: { + channelPreferencesManager: ModuleApi< + typeof domains_messaging_channelPreferencesManager, + "internal" + >; + channelProvider: ModuleApi< + typeof domains_messaging_channelProvider, + "internal" + >; + channels: { + channelIntelligence: ModuleApi< + typeof domains_messaging_channels_channelIntelligence, + "internal" + >; + engagementOptimizer: ModuleApi< + typeof domains_messaging_channels_engagementOptimizer, + "internal" + >; + index: ModuleApi; + }; + inboundPipeline: ModuleApi< + typeof domains_messaging_inboundPipeline, + "internal" + >; + messagingObservability: ModuleApi< + typeof domains_messaging_messagingObservability, + "internal" + >; + messagingSecurity: ModuleApi< + typeof domains_messaging_messagingSecurity, + "internal" + >; + outboundPipeline: ModuleApi< + typeof domains_messaging_outboundPipeline, + "internal" + >; + providerRegistry: ModuleApi< + typeof domains_messaging_providerRegistry, + "internal" + >; + providers: { + discordProvider: ModuleApi< + typeof domains_messaging_providers_discordProvider, + "internal" + >; + emailProvider: ModuleApi< + typeof domains_messaging_providers_emailProvider, + "internal" + >; + ntfyProvider: ModuleApi< + typeof domains_messaging_providers_ntfyProvider, + "internal" + >; + openclawGatewayClient: ModuleApi< + typeof domains_messaging_providers_openclawGatewayClient, + "internal" + >; + openclawProvider: ModuleApi< + typeof domains_messaging_providers_openclawProvider, + "internal" + >; + slackProvider: ModuleApi< + typeof domains_messaging_providers_slackProvider, + "internal" + >; + smsProvider: ModuleApi< + typeof domains_messaging_providers_smsProvider, + "internal" + >; + telegramProvider: ModuleApi< + typeof domains_messaging_providers_telegramProvider, + "internal" + >; + uiProvider: ModuleApi< + typeof domains_messaging_providers_uiProvider, + "internal" + >; + }; + }; + missions: { + costQueries: ModuleApi; + index: ModuleApi; + missionOrchestrator: ModuleApi< + typeof domains_missions_missionOrchestrator, + "internal" + >; + preExecutionGate: ModuleApi< + typeof domains_missions_preExecutionGate, + "internal" + >; + preExecutionGateQueries: ModuleApi< + typeof domains_missions_preExecutionGateQueries, + "internal" + >; + }; + models: { + autonomousModelResolver: ModuleApi< + typeof domains_models_autonomousModelResolver, + "internal" + >; + freeModelDiscovery: ModuleApi< + typeof domains_models_freeModelDiscovery, + "internal" + >; + index: ModuleApi; + livePerformanceEval: ModuleApi< + typeof domains_models_livePerformanceEval, + "internal" + >; + modelRouter: ModuleApi; + modelRouterQueries: ModuleApi< + typeof domains_models_modelRouterQueries, + "internal" + >; + }; + monitoring: { + gdeltSeed: ModuleApi; + industryUpdates: ModuleApi< + typeof domains_monitoring_industryUpdates, + "internal" + >; + industryUpdatesEnhanced: ModuleApi< + typeof domains_monitoring_industryUpdatesEnhanced, + "internal" + >; + integrationHelpers: ModuleApi< + typeof domains_monitoring_integrationHelpers, + "internal" + >; + publicTrendingSeed: ModuleApi< + typeof domains_monitoring_publicTrendingSeed, + "internal" + >; + worldMonitor: ModuleApi< + typeof domains_monitoring_worldMonitor, + "internal" + >; + }; + narrative: { + actions: { + competingExplanations: ModuleApi< + typeof domains_narrative_actions_competingExplanations, + "internal" + >; + hypothesisLifecycle: ModuleApi< + typeof domains_narrative_actions_hypothesisLifecycle, + "internal" + >; + }; + adapters: { + briefAdapter: ModuleApi< + typeof domains_narrative_adapters_briefAdapter, + "internal" + >; + feedAdapter: ModuleApi< + typeof domains_narrative_adapters_feedAdapter, + "internal" + >; + index: ModuleApi; + linkedinAdapter: ModuleApi< + typeof domains_narrative_adapters_linkedinAdapter, + "internal" + >; + pipelineQueries: ModuleApi< + typeof domains_narrative_adapters_pipelineQueries, + "internal" + >; + types: ModuleApi; + }; + contracts: { + eventClassificationContract: ModuleApi< + typeof domains_narrative_contracts_eventClassificationContract, + "internal" + >; + }; + cronHandlers: ModuleApi< + typeof domains_narrative_cronHandlers, + "internal" + >; + crons: ModuleApi; + didYouKnow: ModuleApi; + didYouKnowSources: ModuleApi< + typeof domains_narrative_didYouKnowSources, + "internal" + >; + experiments: { + freshNewsDidYouKnowExperiment: ModuleApi< + typeof domains_narrative_experiments_freshNewsDidYouKnowExperiment, + "internal" + >; + }; + guards: { + claimClassificationGate: ModuleApi< + typeof domains_narrative_guards_claimClassificationGate, + "internal" + >; + claimClassificationGateQueries: ModuleApi< + typeof domains_narrative_guards_claimClassificationGateQueries, + "internal" + >; + claimClassifier: ModuleApi< + typeof domains_narrative_guards_claimClassifier, + "internal" + >; + contentRights: ModuleApi< + typeof domains_narrative_guards_contentRights, + "internal" + >; + index: ModuleApi; + injectionContainment: ModuleApi< + typeof domains_narrative_guards_injectionContainment, + "internal" + >; + quarantine: ModuleApi< + typeof domains_narrative_guards_quarantine, + "internal" + >; + selfCitationGuard: ModuleApi< + typeof domains_narrative_guards_selfCitationGuard, + "internal" + >; + trustScoring: ModuleApi< + typeof domains_narrative_guards_trustScoring, + "internal" + >; + truthMaintenance: ModuleApi< + typeof domains_narrative_guards_truthMaintenance, + "internal" + >; + }; + index: ModuleApi; + integrations: { + hooks: ModuleApi< + typeof domains_narrative_integrations_hooks, + "internal" + >; + }; + mutations: { + correlations: ModuleApi< + typeof domains_narrative_mutations_correlations, + "internal" + >; + dedup: ModuleApi; + disputes: ModuleApi< + typeof domains_narrative_mutations_disputes, + "internal" + >; + events: ModuleApi< + typeof domains_narrative_mutations_events, + "internal" + >; + evidence: ModuleApi< + typeof domains_narrative_mutations_evidence, + "internal" + >; + hypotheses: ModuleApi< + typeof domains_narrative_mutations_hypotheses, + "internal" + >; + policyEnforcedOps: ModuleApi< + typeof domains_narrative_mutations_policyEnforcedOps, + "internal" + >; + posts: ModuleApi; + replies: ModuleApi< + typeof domains_narrative_mutations_replies, + "internal" + >; + searchLog: ModuleApi< + typeof domains_narrative_mutations_searchLog, + "internal" + >; + signalMetrics: ModuleApi< + typeof domains_narrative_mutations_signalMetrics, + "internal" + >; + temporalFacts: ModuleApi< + typeof domains_narrative_mutations_temporalFacts, + "internal" + >; + threads: ModuleApi< + typeof domains_narrative_mutations_threads, + "internal" + >; + toolReplay: ModuleApi< + typeof domains_narrative_mutations_toolReplay, + "internal" + >; + workflowTrace: ModuleApi< + typeof domains_narrative_mutations_workflowTrace, + "internal" + >; + }; + newsroom: { + agents: { + analystAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_analystAgent, + "internal" + >; + commentHarvester: ModuleApi< + typeof domains_narrative_newsroom_agents_commentHarvester, + "internal" + >; + curatorAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_curatorAgent, + "internal" + >; + historianAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_historianAgent, + "internal" + >; + index: ModuleApi< + typeof domains_narrative_newsroom_agents_index, + "internal" + >; + publisherAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_publisherAgent, + "internal" + >; + scoutAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_scoutAgent, + "internal" + >; + signalCollectorAgent: ModuleApi< + typeof domains_narrative_newsroom_agents_signalCollectorAgent, + "internal" + >; + }; + recordReplayLane: ModuleApi< + typeof domains_narrative_newsroom_recordReplayLane, + "internal" + >; + state: ModuleApi; + workflow: ModuleApi< + typeof domains_narrative_newsroom_workflow, + "internal" + >; + }; + policies: { + contentRights: ModuleApi< + typeof domains_narrative_policies_contentRights, + "internal" + >; + }; + queries: { + correlations: ModuleApi< + typeof domains_narrative_queries_correlations, + "internal" + >; + disputes: ModuleApi< + typeof domains_narrative_queries_disputes, + "internal" + >; + events: ModuleApi; + hypotheses: ModuleApi< + typeof domains_narrative_queries_hypotheses, + "internal" + >; + posts: ModuleApi; + searchLog: ModuleApi< + typeof domains_narrative_queries_searchLog, + "internal" + >; + signalMetrics: ModuleApi< + typeof domains_narrative_queries_signalMetrics, + "internal" + >; + threads: ModuleApi< + typeof domains_narrative_queries_threads, + "internal" + >; + }; + safety: { + abuseResistance: ModuleApi< + typeof domains_narrative_safety_abuseResistance, + "internal" + >; + }; + tests: { + goldenSets: { + generatedCases: ModuleApi< + typeof domains_narrative_tests_goldenSets_generatedCases, + "internal" + >; + types: ModuleApi< + typeof domains_narrative_tests_goldenSets_types, + "internal" + >; + }; + qaFramework: ModuleApi< + typeof domains_narrative_tests_qaFramework, + "internal" + >; + validatePipeline: ModuleApi< + typeof domains_narrative_tests_validatePipeline, + "internal" + >; + }; + truth: { + truthStateManager: ModuleApi< + typeof domains_narrative_truth_truthStateManager, + "internal" + >; + }; + validators: ModuleApi; + }; + observability: { + dashboardData: ModuleApi< + typeof domains_observability_dashboardData, + "internal" + >; + goldenMetrics: ModuleApi< + typeof domains_observability_goldenMetrics, + "internal" + >; + healthMonitor: ModuleApi< + typeof domains_observability_healthMonitor, + "internal" + >; + index: ModuleApi; + selfHealer: ModuleApi< + typeof domains_observability_selfHealer, + "internal" + >; + telemetry: ModuleApi; + traces: ModuleApi; + }; + openclaw: { + executionEngine: ModuleApi< + typeof domains_openclaw_executionEngine, + "internal" + >; + forecastHandoffPolicy: ModuleApi< + typeof domains_openclaw_forecastHandoffPolicy, + "internal" + >; + monitoring: ModuleApi; + sessionManager: ModuleApi< + typeof domains_openclaw_sessionManager, + "internal" + >; + tools: { + openclawAgentTools: ModuleApi< + typeof domains_openclaw_tools_openclawAgentTools, + "internal" + >; + }; + workflowManager: ModuleApi< + typeof domains_openclaw_workflowManager, + "internal" + >; + }; + operations: { + adminAuditLog: ModuleApi< + typeof domains_operations_adminAuditLog, + "internal" + >; + autonomousControlTower: ModuleApi< + typeof domains_operations_autonomousControlTower, + "internal" + >; + batchAutopilot: { + deltaCollector: ModuleApi< + typeof domains_operations_batchAutopilot_deltaCollector, + "internal" + >; + mutations: ModuleApi< + typeof domains_operations_batchAutopilot_mutations, + "internal" + >; + promptBuilder: ModuleApi< + typeof domains_operations_batchAutopilot_promptBuilder, + "internal" + >; + queries: ModuleApi< + typeof domains_operations_batchAutopilot_queries, + "internal" + >; + runner: ModuleApi< + typeof domains_operations_batchAutopilot_runner, + "internal" + >; + scheduler: ModuleApi< + typeof domains_operations_batchAutopilot_scheduler, + "internal" + >; + }; + bugLoop: ModuleApi; + encounters: { + encounterCapture: ModuleApi< + typeof domains_operations_encounters_encounterCapture, + "internal" + >; + encounterFastPass: ModuleApi< + typeof domains_operations_encounters_encounterFastPass, + "internal" + >; + encounterMutations: ModuleApi< + typeof domains_operations_encounters_encounterMutations, + "internal" + >; + encounterQueries: ModuleApi< + typeof domains_operations_encounters_encounterQueries, + "internal" + >; + index: ModuleApi< + typeof domains_operations_encounters_index, + "internal" + >; + types: ModuleApi< + typeof domains_operations_encounters_types, + "internal" + >; + }; + gameDayTracking: ModuleApi< + typeof domains_operations_gameDayTracking, + "internal" + >; + governance: { + provenanceExplainer: ModuleApi< + typeof domains_operations_governance_provenanceExplainer, + "internal" + >; + quarantine: ModuleApi< + typeof domains_operations_governance_quarantine, + "internal" + >; + trustPolicy: ModuleApi< + typeof domains_operations_governance_trustPolicy, + "internal" + >; + }; + hitl: { + adjudicationWorkflow: ModuleApi< + typeof domains_operations_hitl_adjudicationWorkflow, + "internal" + >; + decisions: ModuleApi< + typeof domains_operations_hitl_decisions, + "internal" + >; + distributionDriftDetection: ModuleApi< + typeof domains_operations_hitl_distributionDriftDetection, + "internal" + >; + labelerCalibration: ModuleApi< + typeof domains_operations_hitl_labelerCalibration, + "internal" + >; + labelingQueue: ModuleApi< + typeof domains_operations_hitl_labelingQueue, + "internal" + >; + validationWorkspaceEnforcement: ModuleApi< + typeof domains_operations_hitl_validationWorkspaceEnforcement, + "internal" + >; + }; + mcpRateLimiting: ModuleApi< + typeof domains_operations_mcpRateLimiting, + "internal" + >; + mcpSecurity: ModuleApi; + monitoring: { + industryUpdates: ModuleApi< + typeof domains_operations_monitoring_industryUpdates, + "internal" + >; + industryUpdatesEnhanced: ModuleApi< + typeof domains_operations_monitoring_industryUpdatesEnhanced, + "internal" + >; + integrationHelpers: ModuleApi< + typeof domains_operations_monitoring_integrationHelpers, + "internal" + >; + }; + observability: { + dashboardData: ModuleApi< + typeof domains_operations_observability_dashboardData, + "internal" + >; + goldenMetrics: ModuleApi< + typeof domains_operations_observability_goldenMetrics, + "internal" + >; + healthMonitor: ModuleApi< + typeof domains_operations_observability_healthMonitor, + "internal" + >; + index: ModuleApi< + typeof domains_operations_observability_index, + "internal" + >; + selfHealer: ModuleApi< + typeof domains_operations_observability_selfHealer, + "internal" + >; + telemetry: ModuleApi< + typeof domains_operations_observability_telemetry, + "internal" + >; + traces: ModuleApi< + typeof domains_operations_observability_traces, + "internal" + >; + }; + personaChangeTracking: ModuleApi< + typeof domains_operations_personaChangeTracking, + "internal" + >; + postExecutionHygiene: ModuleApi< + typeof domains_operations_postExecutionHygiene, + "internal" + >; + privacyEnforcement: ModuleApi< + typeof domains_operations_privacyEnforcement, + "internal" + >; + selfMaintenance: ModuleApi< + typeof domains_operations_selfMaintenance, + "internal" + >; + selfMaintenanceChecks: ModuleApi< + typeof domains_operations_selfMaintenanceChecks, + "internal" + >; + sloCalculation: ModuleApi< + typeof domains_operations_sloCalculation, + "internal" + >; + sloCollector: ModuleApi< + typeof domains_operations_sloCollector, + "internal" + >; + sloDashboardQueries: ModuleApi< + typeof domains_operations_sloDashboardQueries, + "internal" + >; + sloFramework: ModuleApi< + typeof domains_operations_sloFramework, + "internal" + >; + taskManager: { + cronWrapper: ModuleApi< + typeof domains_operations_taskManager_cronWrapper, + "internal" + >; + index: ModuleApi< + typeof domains_operations_taskManager_index, + "internal" + >; + mutations: ModuleApi< + typeof domains_operations_taskManager_mutations, + "internal" + >; + nodeKitNativeIdentityMigration: ModuleApi< + typeof domains_operations_taskManager_nodeKitNativeIdentityMigration, + "internal" + >; + nodeKitRunEvents: ModuleApi< + typeof domains_operations_taskManager_nodeKitRunEvents, + "internal" + >; + nodeKitRunExport: ModuleApi< + typeof domains_operations_taskManager_nodeKitRunExport, + "internal" + >; + nodeKitRunRetention: ModuleApi< + typeof domains_operations_taskManager_nodeKitRunRetention, + "internal" + >; + nodeKitRuntimeIdentity: ModuleApi< + typeof domains_operations_taskManager_nodeKitRuntimeIdentity, + "internal" + >; + proofPack: ModuleApi< + typeof domains_operations_taskManager_proofPack, + "internal" + >; + queries: ModuleApi< + typeof domains_operations_taskManager_queries, + "internal" + >; + }; + tasks: { + dailyNotes: ModuleApi< + typeof domains_operations_tasks_dailyNotes, + "internal" + >; + eventTaskDocuments: ModuleApi< + typeof domains_operations_tasks_eventTaskDocuments, + "internal" + >; + index: ModuleApi; + userEvents: ModuleApi< + typeof domains_operations_tasks_userEvents, + "internal" + >; + work: ModuleApi; + workflows: { + bankingMemoWorkflow: ModuleApi< + typeof domains_operations_tasks_workflows_bankingMemoWorkflow, + "internal" + >; + coordinatorWorkflow: ModuleApi< + typeof domains_operations_tasks_workflows_coordinatorWorkflow, + "internal" + >; + index: ModuleApi< + typeof domains_operations_tasks_workflows_index, + "internal" + >; + }; + }; + telemetry: { + disclosureEvents: ModuleApi< + typeof domains_operations_telemetry_disclosureEvents, + "internal" + >; + }; + utilities: { + migrations: ModuleApi< + typeof domains_operations_utilities_migrations, + "internal" + >; + seedGoldenDataset: ModuleApi< + typeof domains_operations_utilities_seedGoldenDataset, + "internal" + >; + snapshotMigrations: ModuleApi< + typeof domains_operations_utilities_snapshotMigrations, + "internal" + >; + }; + validationWorkflow: ModuleApi< + typeof domains_operations_validationWorkflow, + "internal" + >; + }; + operatorProfile: { + filesystemSync: ModuleApi< + typeof domains_operatorProfile_filesystemSync, + "internal" + >; + manifest: ModuleApi; + mutations: ModuleApi< + typeof domains_operatorProfile_mutations, + "internal" + >; + parser: ModuleApi; + queries: ModuleApi; + template: ModuleApi; + }; + oracle: { + index: ModuleApi; + mutations: ModuleApi; + queries: ModuleApi; + }; + personas: { + index: ModuleApi; + multiPersonaSynthesizer: ModuleApi< + typeof domains_personas_multiPersonaSynthesizer, + "internal" + >; + personaAutonomousAgent: ModuleApi< + typeof domains_personas_personaAutonomousAgent, + "internal" + >; + }; + pipelines: { + codeGenPipeline: ModuleApi< + typeof domains_pipelines_codeGenPipeline, + "internal" + >; + composedPipeline: ModuleApi< + typeof domains_pipelines_composedPipeline, + "internal" + >; + designGenPipeline: ModuleApi< + typeof domains_pipelines_designGenPipeline, + "internal" + >; + linkupAdapter: ModuleApi< + typeof domains_pipelines_linkupAdapter, + "internal" + >; + piRuntime: ModuleApi; + pipelineAdmission: ModuleApi< + typeof domains_pipelines_pipelineAdmission, + "internal" + >; + pipelineAttempt: ModuleApi< + typeof domains_pipelines_pipelineAttempt, + "internal" + >; + pipelineDocumentHandoff: ModuleApi< + typeof domains_pipelines_pipelineDocumentHandoff, + "internal" + >; + pipelineEvalQueries: ModuleApi< + typeof domains_pipelines_pipelineEvalQueries, + "internal" + >; + pipelineMcpHttp: ModuleApi< + typeof domains_pipelines_pipelineMcpHttp, + "internal" + >; + pipelineOwnership: ModuleApi< + typeof domains_pipelines_pipelineOwnership, + "internal" + >; + pipelineRunsMutations: ModuleApi< + typeof domains_pipelines_pipelineRunsMutations, + "internal" + >; + pipelineRunsQueries: ModuleApi< + typeof domains_pipelines_pipelineRunsQueries, + "internal" + >; + pipelineSchedule: ModuleApi< + typeof domains_pipelines_pipelineSchedule, + "internal" + >; + pipelineStreamMutations: ModuleApi< + typeof domains_pipelines_pipelineStreamMutations, + "internal" + >; + pipelineTrace: ModuleApi< + typeof domains_pipelines_pipelineTrace, + "internal" + >; + pipelineWorkflow: ModuleApi< + typeof domains_pipelines_pipelineWorkflow, + "internal" + >; + researchPipeline: ModuleApi< + typeof domains_pipelines_researchPipeline, + "internal" + >; + researchProvenance: ModuleApi< + typeof domains_pipelines_researchProvenance, + "internal" + >; + }; + proactive: { + actions: { + emailDraftGenerator: ModuleApi< + typeof domains_proactive_actions_emailDraftGenerator, + "internal" + >; + gmailDraftActions: ModuleApi< + typeof domains_proactive_actions_gmailDraftActions, + "internal" + >; + testDraftGenerator: ModuleApi< + typeof domains_proactive_actions_testDraftGenerator, + "internal" + >; + testOpenRouterProvider: ModuleApi< + typeof domains_proactive_actions_testOpenRouterProvider, + "internal" + >; + testSimpleDraft: ModuleApi< + typeof domains_proactive_actions_testSimpleDraft, + "internal" + >; + }; + adapters: { + calendarEventAdapter: ModuleApi< + typeof domains_proactive_adapters_calendarEventAdapter, + "internal" + >; + emailEventAdapter: ModuleApi< + typeof domains_proactive_adapters_emailEventAdapter, + "internal" + >; + }; + adminQueries: ModuleApi< + typeof domains_proactive_adminQueries, + "internal" + >; + agentDispatch: ModuleApi< + typeof domains_proactive_agentDispatch, + "internal" + >; + consentMutations: ModuleApi< + typeof domains_proactive_consentMutations, + "internal" + >; + delivery: { + slackDelivery: ModuleApi< + typeof domains_proactive_delivery_slackDelivery, + "internal" + >; + }; + deliveryOrchestrator: ModuleApi< + typeof domains_proactive_deliveryOrchestrator, + "internal" + >; + detectors: { + BaseDetector: ModuleApi< + typeof domains_proactive_detectors_BaseDetector, + "internal" + >; + dailyBriefDetector: ModuleApi< + typeof domains_proactive_detectors_dailyBriefDetector, + "internal" + >; + executor: ModuleApi< + typeof domains_proactive_detectors_executor, + "internal" + >; + followUpDetector: ModuleApi< + typeof domains_proactive_detectors_followUpDetector, + "internal" + >; + meetingPrepDetector: ModuleApi< + typeof domains_proactive_detectors_meetingPrepDetector, + "internal" + >; + registry: ModuleApi< + typeof domains_proactive_detectors_registry, + "internal" + >; + types: ModuleApi; + }; + mutations: ModuleApi; + policyGateway: ModuleApi< + typeof domains_proactive_policyGateway, + "internal" + >; + queries: ModuleApi; + recomm: { + feedback: ModuleApi< + typeof domains_proactive_recomm_feedback, + "internal" + >; + }; + recommendations: { + behaviorTracking: ModuleApi< + typeof domains_proactive_recommendations_behaviorTracking, + "internal" + >; + index: ModuleApi< + typeof domains_proactive_recommendations_index, + "internal" + >; + recommendationEngine: ModuleApi< + typeof domains_proactive_recommendations_recommendationEngine, + "internal" + >; + }; + seedAdmins: ModuleApi; + }; + product: { + activity: ModuleApi; + blockOrdering: ModuleApi< + typeof domains_product_blockOrdering, + "internal" + >; + blockProsemirror: ModuleApi< + typeof domains_product_blockProsemirror, + "internal" + >; + blocks: ModuleApi; + bootstrap: ModuleApi; + chat: ModuleApi; + delivery: ModuleApi; + diligenceCheckpointStructuring: ModuleApi< + typeof domains_product_diligenceCheckpointStructuring, + "internal" + >; + diligenceJudge: ModuleApi< + typeof domains_product_diligenceJudge, + "internal" + >; + diligenceLlmJudgeRuns: ModuleApi< + typeof domains_product_diligenceLlmJudgeRuns, + "internal" + >; + diligenceProjectionRuntime: ModuleApi< + typeof domains_product_diligenceProjectionRuntime, + "internal" + >; + diligenceProjections: ModuleApi< + typeof domains_product_diligenceProjections, + "internal" + >; + diligenceRunTelemetry: ModuleApi< + typeof domains_product_diligenceRunTelemetry, + "internal" + >; + diligenceScratchpads: ModuleApi< + typeof domains_product_diligenceScratchpads, + "internal" + >; + documents: ModuleApi; + entities: ModuleApi; + entityMemory: ModuleApi; + eventWorkspace: ModuleApi< + typeof domains_product_eventWorkspace, + "internal" + >; + extendedThinking: ModuleApi< + typeof domains_product_extendedThinking, + "internal" + >; + helpers: ModuleApi; + home: ModuleApi; + me: ModuleApi; + notebookPresence: ModuleApi< + typeof domains_product_notebookPresence, + "internal" + >; + notebookTracking: ModuleApi< + typeof domains_product_notebookTracking, + "internal" + >; + nudgeHelpers: ModuleApi; + nudges: ModuleApi; + pipelineReliability: ModuleApi< + typeof domains_product_pipelineReliability, + "internal" + >; + pipelineRetryDispatcher: ModuleApi< + typeof domains_product_pipelineRetryDispatcher, + "internal" + >; + publicShares: ModuleApi; + pulseReports: ModuleApi; + reports: ModuleApi; + scratchnodeImport: ModuleApi< + typeof domains_product_scratchnodeImport, + "internal" + >; + sessionArtifacts: ModuleApi< + typeof domains_product_sessionArtifacts, + "internal" + >; + shares: ModuleApi; + shell: ModuleApi; + systemIntelligence: ModuleApi< + typeof domains_product_systemIntelligence, + "internal" + >; + userWikiMaintainer: ModuleApi< + typeof domains_product_userWikiMaintainer, + "internal" + >; + userWikiSchema: ModuleApi< + typeof domains_product_userWikiSchema, + "internal" + >; + visibilityBackfill: ModuleApi< + typeof domains_product_visibilityBackfill, + "internal" + >; + wikiDreamingEvalProduction: ModuleApi< + typeof domains_product_wikiDreamingEvalProduction, + "internal" + >; + wikiDreamingEvaluation: ModuleApi< + typeof domains_product_wikiDreamingEvaluation, + "internal" + >; + wikiDreamingEvaluationNatural: ModuleApi< + typeof domains_product_wikiDreamingEvaluationNatural, + "internal" + >; + wikiDreamingGraph: ModuleApi< + typeof domains_product_wikiDreamingGraph, + "internal" + >; + wikiDreamingQueries: ModuleApi< + typeof domains_product_wikiDreamingQueries, + "internal" + >; + wikiStagingMutations: ModuleApi< + typeof domains_product_wikiStagingMutations, + "internal" + >; + }; + profiler: { + mutations: ModuleApi; + queries: ModuleApi; + }; + publicResearch: { + actions: ModuleApi; + core: ModuleApi; + }; + publishing: { + deliveryQueue: ModuleApi< + typeof domains_publishing_deliveryQueue, + "internal" + >; + index: ModuleApi; + publishingOrchestrator: ModuleApi< + typeof domains_publishing_publishingOrchestrator, + "internal" + >; + }; + quickCapture: { + index: ModuleApi; + quickCapture: ModuleApi< + typeof domains_quickCapture_quickCapture, + "internal" + >; + voiceMemos: ModuleApi; + }; + recomm: { + feedback: ModuleApi; + }; + recommendations: { + behaviorTracking: ModuleApi< + typeof domains_recommendations_behaviorTracking, + "internal" + >; + index: ModuleApi; + recommendationEngine: ModuleApi< + typeof domains_recommendations_recommendationEngine, + "internal" + >; + }; + redesign: { + agentRunFeedback: ModuleApi< + typeof domains_redesign_agentRunFeedback, + "internal" + >; + chatRuns: ModuleApi; + documentPatches: ModuleApi< + typeof domains_redesign_documentPatches, + "internal" + >; + inboxSnoozes: ModuleApi; + reportGraphNeighborhood: ModuleApi< + typeof domains_redesign_reportGraphNeighborhood, + "internal" + >; + reportTopology: ModuleApi< + typeof domains_redesign_reportTopology, + "internal" + >; + reportTopologyRuntime: ModuleApi< + typeof domains_redesign_reportTopologyRuntime, + "internal" + >; + styleProfile: ModuleApi; + universes: ModuleApi; + }; + research: { + angleRegistry: ModuleApi< + typeof domains_research_angleRegistry, + "internal" + >; + autonomousResearcher: ModuleApi< + typeof domains_research_autonomousResearcher, + "internal" + >; + briefGenerator: ModuleApi< + typeof domains_research_briefGenerator, + "internal" + >; + dailyBriefInitializer: ModuleApi< + typeof domains_research_dailyBriefInitializer, + "internal" + >; + dailyBriefMemoryMutations: ModuleApi< + typeof domains_research_dailyBriefMemoryMutations, + "internal" + >; + dailyBriefMemoryQueries: ModuleApi< + typeof domains_research_dailyBriefMemoryQueries, + "internal" + >; + dailyBriefPersonalOverlay: ModuleApi< + typeof domains_research_dailyBriefPersonalOverlay, + "internal" + >; + dailyBriefPersonalOverlayMutations: ModuleApi< + typeof domains_research_dailyBriefPersonalOverlayMutations, + "internal" + >; + dailyBriefPersonalOverlayQueries: ModuleApi< + typeof domains_research_dailyBriefPersonalOverlayQueries, + "internal" + >; + dailyBriefSourceVerification: ModuleApi< + typeof domains_research_dailyBriefSourceVerification, + "internal" + >; + dailyBriefWorker: ModuleApi< + typeof domains_research_dailyBriefWorker, + "internal" + >; + dashboardMetrics: ModuleApi< + typeof domains_research_dashboardMetrics, + "internal" + >; + dashboardMutations: ModuleApi< + typeof domains_research_dashboardMutations, + "internal" + >; + dashboardQueries: ModuleApi< + typeof domains_research_dashboardQueries, + "internal" + >; + dealFlow: ModuleApi; + dealFlowQueries: ModuleApi< + typeof domains_research_dealFlowQueries, + "internal" + >; + documentDiscovery: ModuleApi< + typeof domains_research_documentDiscovery, + "internal" + >; + editionQueries: ModuleApi< + typeof domains_research_editionQueries, + "internal" + >; + editionScoreboardSeed: ModuleApi< + typeof domains_research_editionScoreboardSeed, + "internal" + >; + entities: { + decayManager: ModuleApi< + typeof domains_research_entities_decayManager, + "internal" + >; + entityLifecycle: ModuleApi< + typeof domains_research_entities_entityLifecycle, + "internal" + >; + index: ModuleApi; + }; + executiveBrief: ModuleApi< + typeof domains_research_executiveBrief, + "internal" + >; + expandResource: ModuleApi< + typeof domains_research_expandResource, + "internal" + >; + financial: { + balanceSheetFetcher: ModuleApi< + typeof domains_research_financial_balanceSheetFetcher, + "internal" + >; + corporateActions: ModuleApi< + typeof domains_research_financial_corporateActions, + "internal" + >; + corrections: ModuleApi< + typeof domains_research_financial_corrections, + "internal" + >; + dcfBuilder: ModuleApi< + typeof domains_research_financial_dcfBuilder, + "internal" + >; + dcfEvaluator: ModuleApi< + typeof domains_research_financial_dcfEvaluator, + "internal" + >; + dcfOrchestrator: ModuleApi< + typeof domains_research_financial_dcfOrchestrator, + "internal" + >; + dcfProgress: ModuleApi< + typeof domains_research_financial_dcfProgress, + "internal" + >; + dcfSpreadsheetAdapter: ModuleApi< + typeof domains_research_financial_dcfSpreadsheetAdapter, + "internal" + >; + dcfSpreadsheetMapping: ModuleApi< + typeof domains_research_financial_dcfSpreadsheetMapping, + "internal" + >; + dcfTools: ModuleApi< + typeof domains_research_financial_dcfTools, + "internal" + >; + financialAnalystAgent: ModuleApi< + typeof domains_research_financial_financialAnalystAgent, + "internal" + >; + fundamentals: ModuleApi< + typeof domains_research_financial_fundamentals, + "internal" + >; + groundTruthFetcher: ModuleApi< + typeof domains_research_financial_groundTruthFetcher, + "internal" + >; + groundTruthManager: ModuleApi< + typeof domains_research_financial_groundTruthManager, + "internal" + >; + inconclusiveOnFailure: ModuleApi< + typeof domains_research_financial_inconclusiveOnFailure, + "internal" + >; + index: ModuleApi; + interactiveDCFSession: ModuleApi< + typeof domains_research_financial_interactiveDCFSession, + "internal" + >; + modelRiskGovernance: ModuleApi< + typeof domains_research_financial_modelRiskGovernance, + "internal" + >; + reportGenerator: ModuleApi< + typeof domains_research_financial_reportGenerator, + "internal" + >; + restatementPolicy: ModuleApi< + typeof domains_research_financial_restatementPolicy, + "internal" + >; + secEdgarClient: ModuleApi< + typeof domains_research_financial_secEdgarClient, + "internal" + >; + sensitivityAnalysis: ModuleApi< + typeof domains_research_financial_sensitivityAnalysis, + "internal" + >; + taxonomyManagement: ModuleApi< + typeof domains_research_financial_taxonomyManagement, + "internal" + >; + validation: ModuleApi< + typeof domains_research_financial_validation, + "internal" + >; + xbrlParser: ModuleApi< + typeof domains_research_financial_xbrlParser, + "internal" + >; + }; + forYouFeed: ModuleApi; + forecasting: { + actions: { + computeCalibration: ModuleApi< + typeof domains_research_forecasting_actions_computeCalibration, + "internal" + >; + createForecast: ModuleApi< + typeof domains_research_forecasting_actions_createForecast, + "internal" + >; + refreshForecast: ModuleApi< + typeof domains_research_forecasting_actions_refreshForecast, + "internal" + >; + resolveForecast: ModuleApi< + typeof domains_research_forecasting_actions_resolveForecast, + "internal" + >; + }; + cronHandlers: { + dailyForecastRefresh: ModuleApi< + typeof domains_research_forecasting_cronHandlers_dailyForecastRefresh, + "internal" + >; + resolutionCheck: ModuleApi< + typeof domains_research_forecasting_cronHandlers_resolutionCheck, + "internal" + >; + weeklyCalibration: ModuleApi< + typeof domains_research_forecasting_cronHandlers_weeklyCalibration, + "internal" + >; + }; + forecastManager: ModuleApi< + typeof domains_research_forecasting_forecastManager, + "internal" + >; + scoringEngine: ModuleApi< + typeof domains_research_forecasting_scoringEngine, + "internal" + >; + seedEvergreenForecasts: ModuleApi< + typeof domains_research_forecasting_seedEvergreenForecasts, + "internal" + >; + signalMatcher: ModuleApi< + typeof domains_research_forecasting_signalMatcher, + "internal" + >; + traceWrapper: ModuleApi< + typeof domains_research_forecasting_traceWrapper, + "internal" + >; + validators: ModuleApi< + typeof domains_research_forecasting_validators, + "internal" + >; + }; + githubExplorer: ModuleApi< + typeof domains_research_githubExplorer, + "internal" + >; + hydrateEntities: ModuleApi< + typeof domains_research_hydrateEntities, + "internal" + >; + index: ModuleApi; + jobResearchAction: ModuleApi< + typeof domains_research_jobResearchAction, + "internal" + >; + lensRegistry: ModuleApi; + mcpServerCountSeed: ModuleApi< + typeof domains_research_mcpServerCountSeed, + "internal" + >; + modelComparison: ModuleApi< + typeof domains_research_modelComparison, + "internal" + >; + modelComparisonQueries: ModuleApi< + typeof domains_research_modelComparisonQueries, + "internal" + >; + narrative: { + actions: { + competingExplanations: ModuleApi< + typeof domains_research_narrative_actions_competingExplanations, + "internal" + >; + hypothesisLifecycle: ModuleApi< + typeof domains_research_narrative_actions_hypothesisLifecycle, + "internal" + >; + }; + adapters: { + briefAdapter: ModuleApi< + typeof domains_research_narrative_adapters_briefAdapter, + "internal" + >; + feedAdapter: ModuleApi< + typeof domains_research_narrative_adapters_feedAdapter, + "internal" + >; + index: ModuleApi< + typeof domains_research_narrative_adapters_index, + "internal" + >; + linkedinAdapter: ModuleApi< + typeof domains_research_narrative_adapters_linkedinAdapter, + "internal" + >; + pipelineQueries: ModuleApi< + typeof domains_research_narrative_adapters_pipelineQueries, + "internal" + >; + types: ModuleApi< + typeof domains_research_narrative_adapters_types, + "internal" + >; + }; + contracts: { + eventClassificationContract: ModuleApi< + typeof domains_research_narrative_contracts_eventClassificationContract, + "internal" + >; + }; + cronHandlers: ModuleApi< + typeof domains_research_narrative_cronHandlers, + "internal" + >; + crons: ModuleApi; + didYouKnow: ModuleApi< + typeof domains_research_narrative_didYouKnow, + "internal" + >; + didYouKnowSources: ModuleApi< + typeof domains_research_narrative_didYouKnowSources, + "internal" + >; + experiments: { + freshNewsDidYouKnowExperiment: ModuleApi< + typeof domains_research_narrative_experiments_freshNewsDidYouKnowExperiment, + "internal" + >; + }; + guards: { + claimClassificationGate: ModuleApi< + typeof domains_research_narrative_guards_claimClassificationGate, + "internal" + >; + claimClassificationGateQueries: ModuleApi< + typeof domains_research_narrative_guards_claimClassificationGateQueries, + "internal" + >; + claimClassifier: ModuleApi< + typeof domains_research_narrative_guards_claimClassifier, + "internal" + >; + contentRights: ModuleApi< + typeof domains_research_narrative_guards_contentRights, + "internal" + >; + index: ModuleApi< + typeof domains_research_narrative_guards_index, + "internal" + >; + injectionContainment: ModuleApi< + typeof domains_research_narrative_guards_injectionContainment, + "internal" + >; + quarantine: ModuleApi< + typeof domains_research_narrative_guards_quarantine, + "internal" + >; + selfCitationGuard: ModuleApi< + typeof domains_research_narrative_guards_selfCitationGuard, + "internal" + >; + trustScoring: ModuleApi< + typeof domains_research_narrative_guards_trustScoring, + "internal" + >; + truthMaintenance: ModuleApi< + typeof domains_research_narrative_guards_truthMaintenance, + "internal" + >; + }; + index: ModuleApi; + integrations: { + hooks: ModuleApi< + typeof domains_research_narrative_integrations_hooks, + "internal" + >; + }; + mutations: { + correlations: ModuleApi< + typeof domains_research_narrative_mutations_correlations, + "internal" + >; + dedup: ModuleApi< + typeof domains_research_narrative_mutations_dedup, + "internal" + >; + disputes: ModuleApi< + typeof domains_research_narrative_mutations_disputes, + "internal" + >; + events: ModuleApi< + typeof domains_research_narrative_mutations_events, + "internal" + >; + evidence: ModuleApi< + typeof domains_research_narrative_mutations_evidence, + "internal" + >; + hypotheses: ModuleApi< + typeof domains_research_narrative_mutations_hypotheses, + "internal" + >; + policyEnforcedOps: ModuleApi< + typeof domains_research_narrative_mutations_policyEnforcedOps, + "internal" + >; + posts: ModuleApi< + typeof domains_research_narrative_mutations_posts, + "internal" + >; + replies: ModuleApi< + typeof domains_research_narrative_mutations_replies, + "internal" + >; + searchLog: ModuleApi< + typeof domains_research_narrative_mutations_searchLog, + "internal" + >; + signalMetrics: ModuleApi< + typeof domains_research_narrative_mutations_signalMetrics, + "internal" + >; + temporalFacts: ModuleApi< + typeof domains_research_narrative_mutations_temporalFacts, + "internal" + >; + threads: ModuleApi< + typeof domains_research_narrative_mutations_threads, + "internal" + >; + toolReplay: ModuleApi< + typeof domains_research_narrative_mutations_toolReplay, + "internal" + >; + workflowTrace: ModuleApi< + typeof domains_research_narrative_mutations_workflowTrace, + "internal" + >; + }; + newsroom: { + agents: { + analystAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_analystAgent, + "internal" + >; + commentHarvester: ModuleApi< + typeof domains_research_narrative_newsroom_agents_commentHarvester, + "internal" + >; + curatorAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_curatorAgent, + "internal" + >; + historianAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_historianAgent, + "internal" + >; + index: ModuleApi< + typeof domains_research_narrative_newsroom_agents_index, + "internal" + >; + publisherAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_publisherAgent, + "internal" + >; + scoutAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_scoutAgent, + "internal" + >; + signalCollectorAgent: ModuleApi< + typeof domains_research_narrative_newsroom_agents_signalCollectorAgent, + "internal" + >; + }; + recordReplayLane: ModuleApi< + typeof domains_research_narrative_newsroom_recordReplayLane, + "internal" + >; + state: ModuleApi< + typeof domains_research_narrative_newsroom_state, + "internal" + >; + workflow: ModuleApi< + typeof domains_research_narrative_newsroom_workflow, + "internal" + >; + }; + policies: { + contentRights: ModuleApi< + typeof domains_research_narrative_policies_contentRights, + "internal" + >; + }; + queries: { + correlations: ModuleApi< + typeof domains_research_narrative_queries_correlations, + "internal" + >; + disputes: ModuleApi< + typeof domains_research_narrative_queries_disputes, + "internal" + >; + events: ModuleApi< + typeof domains_research_narrative_queries_events, + "internal" + >; + hypotheses: ModuleApi< + typeof domains_research_narrative_queries_hypotheses, + "internal" + >; + posts: ModuleApi< + typeof domains_research_narrative_queries_posts, + "internal" + >; + searchLog: ModuleApi< + typeof domains_research_narrative_queries_searchLog, + "internal" + >; + signalMetrics: ModuleApi< + typeof domains_research_narrative_queries_signalMetrics, + "internal" + >; + threads: ModuleApi< + typeof domains_research_narrative_queries_threads, + "internal" + >; + }; + safety: { + abuseResistance: ModuleApi< + typeof domains_research_narrative_safety_abuseResistance, + "internal" + >; + }; + tests: { + goldenSets: { + generatedCases: ModuleApi< + typeof domains_research_narrative_tests_goldenSets_generatedCases, + "internal" + >; + types: ModuleApi< + typeof domains_research_narrative_tests_goldenSets_types, + "internal" + >; + }; + qaFramework: ModuleApi< + typeof domains_research_narrative_tests_qaFramework, + "internal" + >; + validatePipeline: ModuleApi< + typeof domains_research_narrative_tests_validatePipeline, + "internal" + >; + }; + truth: { + truthStateManager: ModuleApi< + typeof domains_research_narrative_truth_truthStateManager, + "internal" + >; + }; + validators: ModuleApi< + typeof domains_research_narrative_validators, + "internal" + >; + }; + paperDetails: ModuleApi; + paperDetailsQueries: ModuleApi< + typeof domains_research_paperDetailsQueries, + "internal" + >; + publicDossier: ModuleApi< + typeof domains_research_publicDossier, + "internal" + >; + publicDossierQueries: ModuleApi< + typeof domains_research_publicDossierQueries, + "internal" + >; + readerContent: ModuleApi< + typeof domains_research_readerContent, + "internal" + >; + repoScout: ModuleApi; + repoScoutQueries: ModuleApi< + typeof domains_research_repoScoutQueries, + "internal" + >; + repoStats: ModuleApi; + repoStatsQueries: ModuleApi< + typeof domains_research_repoStatsQueries, + "internal" + >; + researchQueue: ModuleApi< + typeof domains_research_researchQueue, + "internal" + >; + researchRunAction: ModuleApi< + typeof domains_research_researchRunAction, + "internal" + >; + researchSessionBenchmark: ModuleApi< + typeof domains_research_researchSessionBenchmark, + "internal" + >; + researchSessionJit: ModuleApi< + typeof domains_research_researchSessionJit, + "internal" + >; + researchSessionLifecycle: ModuleApi< + typeof domains_research_researchSessionLifecycle, + "internal" + >; + researchSessionOrchestrator: ModuleApi< + typeof domains_research_researchSessionOrchestrator, + "internal" + >; + researchSessionSmoke: ModuleApi< + typeof domains_research_researchSessionSmoke, + "internal" + >; + seedEditorialHypotheses: ModuleApi< + typeof domains_research_seedEditorialHypotheses, + "internal" + >; + semanticDeduplicator: ModuleApi< + typeof domains_research_semanticDeduplicator, + "internal" + >; + semanticDeduplicatorQueries: ModuleApi< + typeof domains_research_semanticDeduplicatorQueries, + "internal" + >; + signalTimeseries: ModuleApi< + typeof domains_research_signalTimeseries, + "internal" + >; + stackImpact: ModuleApi; + stackImpactQueries: ModuleApi< + typeof domains_research_stackImpactQueries, + "internal" + >; + strategyMetrics: ModuleApi< + typeof domains_research_strategyMetrics, + "internal" + >; + strategyMetricsQueries: ModuleApi< + typeof domains_research_strategyMetricsQueries, + "internal" + >; + }; + search: { + analytics: { + analytics: ModuleApi< + typeof domains_search_analytics_analytics, + "internal" + >; + componentMetrics: ModuleApi< + typeof domains_search_analytics_componentMetrics, + "internal" + >; + intentSignals: ModuleApi< + typeof domains_search_analytics_intentSignals, + "internal" + >; + ossStats: ModuleApi< + typeof domains_search_analytics_ossStats, + "internal" + >; + }; + deepDiligence: ModuleApi; + embedHashBackfill: ModuleApi< + typeof domains_search_embedHashBackfill, + "internal" + >; + embedRowOnUpdate: ModuleApi< + typeof domains_search_embedRowOnUpdate, + "internal" + >; + embedSearchableText: ModuleApi< + typeof domains_search_embedSearchableText, + "internal" + >; + federatedHelpers: ModuleApi< + typeof domains_search_federatedHelpers, + "internal" + >; + federatedSearch: ModuleApi< + typeof domains_search_federatedSearch, + "internal" + >; + federatedSearchCache: ModuleApi< + typeof domains_search_federatedSearchCache, + "internal" + >; + fusion: { + actions: ModuleApi; + adapters: { + arxivAdapter: ModuleApi< + typeof domains_search_fusion_adapters_arxivAdapter, + "internal" + >; + braveAdapter: ModuleApi< + typeof domains_search_fusion_adapters_braveAdapter, + "internal" + >; + documentAdapter: ModuleApi< + typeof domains_search_fusion_adapters_documentAdapter, + "internal" + >; + fdaAdapter: ModuleApi< + typeof domains_search_fusion_adapters_fdaAdapter, + "internal" + >; + finraAdapter: ModuleApi< + typeof domains_search_fusion_adapters_finraAdapter, + "internal" + >; + index: ModuleApi< + typeof domains_search_fusion_adapters_index, + "internal" + >; + linkupAdapter: ModuleApi< + typeof domains_search_fusion_adapters_linkupAdapter, + "internal" + >; + newsAdapter: ModuleApi< + typeof domains_search_fusion_adapters_newsAdapter, + "internal" + >; + ragAdapter: ModuleApi< + typeof domains_search_fusion_adapters_ragAdapter, + "internal" + >; + secAdapter: ModuleApi< + typeof domains_search_fusion_adapters_secAdapter, + "internal" + >; + serperAdapter: ModuleApi< + typeof domains_search_fusion_adapters_serperAdapter, + "internal" + >; + stateRegistryAdapter: ModuleApi< + typeof domains_search_fusion_adapters_stateRegistryAdapter, + "internal" + >; + tavilyAdapter: ModuleApi< + typeof domains_search_fusion_adapters_tavilyAdapter, + "internal" + >; + usptoAdapter: ModuleApi< + typeof domains_search_fusion_adapters_usptoAdapter, + "internal" + >; + youtubeAdapter: ModuleApi< + typeof domains_search_fusion_adapters_youtubeAdapter, + "internal" + >; + }; + advanced: ModuleApi; + benchmark: ModuleApi< + typeof domains_search_fusion_benchmark, + "internal" + >; + cache: ModuleApi; + crossProviderEval: ModuleApi< + typeof domains_search_fusion_crossProviderEval, + "internal" + >; + debugAdapters: ModuleApi< + typeof domains_search_fusion_debugAdapters, + "internal" + >; + debugOrchestrator: ModuleApi< + typeof domains_search_fusion_debugOrchestrator, + "internal" + >; + index: ModuleApi; + observability: ModuleApi< + typeof domains_search_fusion_observability, + "internal" + >; + orchestrator: ModuleApi< + typeof domains_search_fusion_orchestrator, + "internal" + >; + rateLimiter: ModuleApi< + typeof domains_search_fusion_rateLimiter, + "internal" + >; + reranker: ModuleApi; + types: ModuleApi; + }; + hashtagDossiers: ModuleApi< + typeof domains_search_hashtagDossiers, + "internal" + >; + index: ModuleApi; + linkupClient: ModuleApi; + quotaManager: ModuleApi; + rag: ModuleApi; + ragEnhanced: ModuleApi; + ragEnhancedBatchIndex: ModuleApi< + typeof domains_search_ragEnhancedBatchIndex, + "internal" + >; + ragQueries: ModuleApi; + searchCache: ModuleApi; + searchForecastGate: ModuleApi< + typeof domains_search_searchForecastGate, + "internal" + >; + searchPipeline: ModuleApi< + typeof domains_search_searchPipeline, + "internal" + >; + searchPipelineNode: ModuleApi< + typeof domains_search_searchPipelineNode, + "internal" + >; + searchableTextBackfill: ModuleApi< + typeof domains_search_searchableTextBackfill, + "internal" + >; + searchableTextRecompute: ModuleApi< + typeof domains_search_searchableTextRecompute, + "internal" + >; + sharedCache: ModuleApi; + signalTaxonomy: ModuleApi< + typeof domains_search_signalTaxonomy, + "internal" + >; + }; + signals: { + index: ModuleApi; + signalIngester: ModuleApi< + typeof domains_signals_signalIngester, + "internal" + >; + signalProcessor: ModuleApi< + typeof domains_signals_signalProcessor, + "internal" + >; + }; + social: { + instagramIngestion: ModuleApi< + typeof domains_social_instagramIngestion, + "internal" + >; + linkedinAccounts: ModuleApi< + typeof domains_social_linkedinAccounts, + "internal" + >; + linkedinArchiveAudit: ModuleApi< + typeof domains_social_linkedinArchiveAudit, + "internal" + >; + linkedinArchiveCleanup: ModuleApi< + typeof domains_social_linkedinArchiveCleanup, + "internal" + >; + linkedinArchiveCleanupMutations: ModuleApi< + typeof domains_social_linkedinArchiveCleanupMutations, + "internal" + >; + linkedinArchiveEdits: ModuleApi< + typeof domains_social_linkedinArchiveEdits, + "internal" + >; + linkedinArchiveEditsMutations: ModuleApi< + typeof domains_social_linkedinArchiveEditsMutations, + "internal" + >; + linkedinArchiveEntityLinks: ModuleApi< + typeof domains_social_linkedinArchiveEntityLinks, + "internal" + >; + linkedinArchiveMaintenance: ModuleApi< + typeof domains_social_linkedinArchiveMaintenance, + "internal" + >; + linkedinArchiveMaintenanceQueries: ModuleApi< + typeof domains_social_linkedinArchiveMaintenanceQueries, + "internal" + >; + linkedinArchivePurge: ModuleApi< + typeof domains_social_linkedinArchivePurge, + "internal" + >; + linkedinArchivePurgeMutations: ModuleApi< + typeof domains_social_linkedinArchivePurgeMutations, + "internal" + >; + linkedinArchiveQueries: ModuleApi< + typeof domains_social_linkedinArchiveQueries, + "internal" + >; + linkedinContentQueue: ModuleApi< + typeof domains_social_linkedinContentQueue, + "internal" + >; + linkedinFundingPosts: ModuleApi< + typeof domains_social_linkedinFundingPosts, + "internal" + >; + linkedinLegacyLookupQueries: ModuleApi< + typeof domains_social_linkedinLegacyLookupQueries, + "internal" + >; + linkedinOAuth: ModuleApi; + linkedinPosting: ModuleApi< + typeof domains_social_linkedinPosting, + "internal" + >; + linkedinPrePostVerification: ModuleApi< + typeof domains_social_linkedinPrePostVerification, + "internal" + >; + linkedinQualityJudge: ModuleApi< + typeof domains_social_linkedinQualityJudge, + "internal" + >; + linkedinQualityJudgePolicy: ModuleApi< + typeof domains_social_linkedinQualityJudgePolicy, + "internal" + >; + linkedinScheduleGrid: ModuleApi< + typeof domains_social_linkedinScheduleGrid, + "internal" + >; + linkedinUnknownCompanyFixes: ModuleApi< + typeof domains_social_linkedinUnknownCompanyFixes, + "internal" + >; + postDedup: ModuleApi; + postDedupAction: ModuleApi< + typeof domains_social_postDedupAction, + "internal" + >; + publishing: { + deliveryQueue: ModuleApi< + typeof domains_social_publishing_deliveryQueue, + "internal" + >; + index: ModuleApi; + publishingOrchestrator: ModuleApi< + typeof domains_social_publishing_publishingOrchestrator, + "internal" + >; + }; + specializedPostQueries: ModuleApi< + typeof domains_social_specializedPostQueries, + "internal" + >; + }; + successLoops: { + index: ModuleApi; + lib: ModuleApi; + mutations: ModuleApi; + projection: ModuleApi; + queries: ModuleApi; + }; + taskManager: { + cronWrapper: ModuleApi< + typeof domains_taskManager_cronWrapper, + "internal" + >; + index: ModuleApi; + mutations: ModuleApi; + queries: ModuleApi; + }; + tasks: { + dailyNotes: ModuleApi; + eventTaskDocuments: ModuleApi< + typeof domains_tasks_eventTaskDocuments, + "internal" + >; + index: ModuleApi; + userEvents: ModuleApi; + work: ModuleApi; + workflows: { + bankingMemoWorkflow: ModuleApi< + typeof domains_tasks_workflows_bankingMemoWorkflow, + "internal" + >; + coordinatorWorkflow: ModuleApi< + typeof domains_tasks_workflows_coordinatorWorkflow, + "internal" + >; + index: ModuleApi; + }; + }; + teachability: { + index: ModuleApi; + }; + telemetry: { + disclosureEvents: ModuleApi< + typeof domains_telemetry_disclosureEvents, + "internal" + >; + }; + temporal: { + feynmanEditor: ModuleApi< + typeof domains_temporal_feynmanEditor, + "internal" + >; + forecastGatePolicy: ModuleApi< + typeof domains_temporal_forecastGatePolicy, + "internal" + >; + index: ModuleApi; + ingestion: ModuleApi; + ingestionUtils: ModuleApi< + typeof domains_temporal_ingestionUtils, + "internal" + >; + langExtract: ModuleApi; + mutations: ModuleApi; + queries: ModuleApi; + specDoc: ModuleApi; + }; + testing: { + testingFramework: ModuleApi< + typeof domains_testing_testingFramework, + "internal" + >; + }; + trajectory: { + index: ModuleApi; + lib: ModuleApi; + mutations: ModuleApi; + projection: ModuleApi; + queries: ModuleApi; + }; + utilities: { + migrations: ModuleApi; + seedGoldenDataset: ModuleApi< + typeof domains_utilities_seedGoldenDataset, + "internal" + >; + snapshotMigrations: ModuleApi< + typeof domains_utilities_snapshotMigrations, + "internal" + >; + }; + validation: { + contradictionDetector: ModuleApi< + typeof domains_validation_contradictionDetector, + "internal" + >; + index: ModuleApi; + personaValidators: ModuleApi< + typeof domains_validation_personaValidators, + "internal" + >; + selfQuestionAgent: ModuleApi< + typeof domains_validation_selfQuestionAgent, + "internal" + >; + }; + verification: { + calibration: ModuleApi< + typeof domains_verification_calibration, + "internal" + >; + claimVerificationAction: ModuleApi< + typeof domains_verification_claimVerificationAction, + "internal" + >; + claimVerificationQueries: ModuleApi< + typeof domains_verification_claimVerificationQueries, + "internal" + >; + claimVerifications: ModuleApi< + typeof domains_verification_claimVerifications, + "internal" + >; + contradictionDetector: ModuleApi< + typeof domains_verification_contradictionDetector, + "internal" + >; + contradictionDetectorQueries: ModuleApi< + typeof domains_verification_contradictionDetectorQueries, + "internal" + >; + entailmentChecker: ModuleApi< + typeof domains_verification_entailmentChecker, + "internal" + >; + facts: ModuleApi; + fastVerification: ModuleApi< + typeof domains_verification_fastVerification, + "internal" + >; + groundTruthRegistry: ModuleApi< + typeof domains_verification_groundTruthRegistry, + "internal" + >; + index: ModuleApi; + instagramClaimVerification: ModuleApi< + typeof domains_verification_instagramClaimVerification, + "internal" + >; + instagramClaimVerificationMutations: ModuleApi< + typeof domains_verification_instagramClaimVerificationMutations, + "internal" + >; + integrations: { + agentVerificationAdapter: ModuleApi< + typeof domains_verification_integrations_agentVerificationAdapter, + "internal" + >; + artifactVerification: ModuleApi< + typeof domains_verification_integrations_artifactVerification, + "internal" + >; + feedVerification: ModuleApi< + typeof domains_verification_integrations_feedVerification, + "internal" + >; + index: ModuleApi< + typeof domains_verification_integrations_index, + "internal" + >; + linkedinVerification: ModuleApi< + typeof domains_verification_integrations_linkedinVerification, + "internal" + >; + narrativeVerification: ModuleApi< + typeof domains_verification_integrations_narrativeVerification, + "internal" + >; + }; + multiSourceValidation: ModuleApi< + typeof domains_verification_multiSourceValidation, + "internal" + >; + publicSourceRegistry: ModuleApi< + typeof domains_verification_publicSourceRegistry, + "internal" + >; + validation: { + contradictionDetector: ModuleApi< + typeof domains_verification_validation_contradictionDetector, + "internal" + >; + index: ModuleApi< + typeof domains_verification_validation_index, + "internal" + >; + personaValidators: ModuleApi< + typeof domains_verification_validation_personaValidators, + "internal" + >; + selfQuestionAgent: ModuleApi< + typeof domains_verification_validation_selfQuestionAgent, + "internal" + >; + }; + verificationAuditTrail: ModuleApi< + typeof domains_verification_verificationAuditTrail, + "internal" + >; + verificationWorkflow: ModuleApi< + typeof domains_verification_verificationWorkflow, + "internal" + >; + }; + world: { + operations: ModuleApi; + }; + }; + email: ModuleApi; + eventHandoff: ModuleApi; + events: ModuleApi; + feed: ModuleApi; + globalResearch: { + artifacts: ModuleApi; + cacheSimple: ModuleApi; + compaction: ModuleApi; + index: ModuleApi; + locks: ModuleApi; + mentions: ModuleApi; + queries: ModuleApi; + runs: ModuleApi; + }; + http: ModuleApi & { + mcpMemory: ModuleApi; + mcpPlans: ModuleApi; + }; + lib: { + actionItemsGenerator: ModuleApi< + typeof lib_actionItemsGenerator, + "internal" + >; + agentCache: ModuleApi; + artifactModels: ModuleApi; + artifactPersistence: ModuleApi; + artifactQueries: ModuleApi; + artifactValidators: ModuleApi; + crypto: ModuleApi; + dossierGenerator: ModuleApi; + dossierHelpers: ModuleApi; + entityResolution: ModuleApi; + factValidation: ModuleApi; + featureFlags: ModuleApi; + hash: ModuleApi; + index: ModuleApi; + markdown: ModuleApi; + markdownToTipTap: ModuleApi; + mcpTransport: ModuleApi; + memoryLimits: ModuleApi; + memoryQuality: ModuleApi; + parallelDelegation: ModuleApi; + predictivePrefetch: ModuleApi; + streamingDelegation: ModuleApi; + withArtifactPersistence: ModuleApi< + typeof lib_withArtifactPersistence, + "internal" + >; + withResourceLinkWrapping: ModuleApi< + typeof lib_withResourceLinkWrapping, + "internal" + >; + xaiClient: ModuleApi; + }; + notes: ModuleApi; + presence: ModuleApi; + prosemirror: ModuleApi; + router: ModuleApi; + schema: { + apiUsage: ModuleApi; + emailSchema: ModuleApi; + eventsSchema: ModuleApi; + searchQuota: ModuleApi; + toolSearchSchema: ModuleApi; + usersSchema: ModuleApi; + }; + scratchnodeHandoff: ModuleApi; + scratchnodeLiveCues: ModuleApi; + scratchnodeRateLimit: ModuleApi; + shared: { + actionSpan: ModuleApi; + actionSpanReplay: ModuleApi; + actionSpanReplayQueries: ModuleApi< + typeof shared_actionSpanReplayQueries, + "internal" + >; + }; + tags: ModuleApi; + tags_actions: ModuleApi; + tests: { + fastAgentPanelStreamingTests: ModuleApi< + typeof tests_fastAgentPanelStreamingTests, + "internal" + >; + fusionSearchContractTests: ModuleApi< + typeof tests_fusionSearchContractTests, + "internal" + >; + }; + tools: { + arbitrage: { + analyzeWithArbitrage: ModuleApi< + typeof tools_arbitrage_analyzeWithArbitrage, + "internal" + >; + index: ModuleApi; + }; + calendar: { + calendarCrudTools: ModuleApi< + typeof tools_calendar_calendarCrudTools, + "internal" + >; + confirmEventSelection: ModuleApi< + typeof tools_calendar_confirmEventSelection, + "internal" + >; + emailEventExtractor: ModuleApi< + typeof tools_calendar_emailEventExtractor, + "internal" + >; + recentEventSearch: ModuleApi< + typeof tools_calendar_recentEventSearch, + "internal" + >; + }; + calendarIcs: ModuleApi; + calendarIcsMutations: ModuleApi< + typeof tools_calendarIcsMutations, + "internal" + >; + context: { + nodebenchContextTools: ModuleApi< + typeof tools_context_nodebenchContextTools, + "internal" + >; + resourceLinks: ModuleApi; + retrieveArtifact: ModuleApi< + typeof tools_context_retrieveArtifact, + "internal" + >; + }; + document: { + contextTools: ModuleApi; + deepAgentEditTools: ModuleApi< + typeof tools_document_deepAgentEditTools, + "internal" + >; + documentEditingLiveTest: ModuleApi< + typeof tools_document_documentEditingLiveTest, + "internal" + >; + documentTools: ModuleApi; + geminiFileSearch: ModuleApi< + typeof tools_document_geminiFileSearch, + "internal" + >; + hashtagSearchTools: ModuleApi< + typeof tools_document_hashtagSearchTools, + "internal" + >; + }; + dossier: { + dossierCrudTools: ModuleApi< + typeof tools_dossier_dossierCrudTools, + "internal" + >; + }; + editDocument: ModuleApi; + editDocumentMutations: ModuleApi< + typeof tools_editDocumentMutations, + "internal" + >; + editSpreadsheet: ModuleApi; + editSpreadsheetMutations: ModuleApi< + typeof tools_editSpreadsheetMutations, + "internal" + >; + email: { + emailIntelligenceParser: ModuleApi< + typeof tools_email_emailIntelligenceParser, + "internal" + >; + }; + evaluation: { + comprehensiveTest: ModuleApi< + typeof tools_evaluation_comprehensiveTest, + "internal" + >; + evaluator: ModuleApi; + groundTruthLookup: ModuleApi< + typeof tools_evaluation_groundTruthLookup, + "internal" + >; + groundTruthLookupTool: ModuleApi< + typeof tools_evaluation_groundTruthLookupTool, + "internal" + >; + helpers: ModuleApi; + multiSdkLiveValidation: ModuleApi< + typeof tools_evaluation_multiSdkLiveValidation, + "internal" + >; + openDatasetEval: ModuleApi< + typeof tools_evaluation_openDatasetEval, + "internal" + >; + quickTest: ModuleApi; + testCases: ModuleApi; + testOptimizations: ModuleApi< + typeof tools_evaluation_testOptimizations, + "internal" + >; + testPersonas: ModuleApi; + }; + financial: { + enhancedFundingTools: ModuleApi< + typeof tools_financial_enhancedFundingTools, + "internal" + >; + fundingDetectionTools: ModuleApi< + typeof tools_financial_fundingDetectionTools, + "internal" + >; + fundingResearchTools: ModuleApi< + typeof tools_financial_fundingResearchTools, + "internal" + >; + }; + integration: { + channelContextTools: ModuleApi< + typeof tools_integration_channelContextTools, + "internal" + >; + confirmCompanySelection: ModuleApi< + typeof tools_integration_confirmCompanySelection, + "internal" + >; + confirmNewsSelection: ModuleApi< + typeof tools_integration_confirmNewsSelection, + "internal" + >; + confirmPersonSelection: ModuleApi< + typeof tools_integration_confirmPersonSelection, + "internal" + >; + dataAccessTools: ModuleApi< + typeof tools_integration_dataAccessTools, + "internal" + >; + digestTools: ModuleApi; + humanInputTools: ModuleApi< + typeof tools_integration_humanInputTools, + "internal" + >; + newsletterTools: ModuleApi< + typeof tools_integration_newsletterTools, + "internal" + >; + notificationTools: ModuleApi< + typeof tools_integration_notificationTools, + "internal" + >; + orchestrationTools: ModuleApi< + typeof tools_integration_orchestrationTools, + "internal" + >; + peopleProfileSearch: ModuleApi< + typeof tools_integration_peopleProfileSearch, + "internal" + >; + }; + knowledge: { + clusteringTools: ModuleApi< + typeof tools_knowledge_clusteringTools, + "internal" + >; + distiller: ModuleApi; + distillerPrompts: ModuleApi< + typeof tools_knowledge_distillerPrompts, + "internal" + >; + entityInsightTools: ModuleApi< + typeof tools_knowledge_entityInsightTools, + "internal" + >; + evidenceTools: ModuleApi< + typeof tools_knowledge_evidenceTools, + "internal" + >; + knowledgeGraphTools: ModuleApi< + typeof tools_knowledge_knowledgeGraphTools, + "internal" + >; + unifiedMemoryTools: ModuleApi< + typeof tools_knowledge_unifiedMemoryTools, + "internal" + >; + }; + media: { + adversarialValidation: ModuleApi< + typeof tools_media_adversarialValidation, + "internal" + >; + diagnosticTest: ModuleApi; + entityExtractionTools: ModuleApi< + typeof tools_media_entityExtractionTools, + "internal" + >; + linkupFetch: ModuleApi; + linkupSearch: ModuleApi; + linkupStructuredSearch: ModuleApi< + typeof tools_media_linkupStructuredSearch, + "internal" + >; + llmEntityLinker: ModuleApi< + typeof tools_media_llmEntityLinker, + "internal" + >; + mediaTools: ModuleApi; + recentNewsSearch: ModuleApi< + typeof tools_media_recentNewsSearch, + "internal" + >; + testImageTools: ModuleApi; + validationTest: ModuleApi; + youtubeSearch: ModuleApi; + }; + meta: { + actionDraftMutations: ModuleApi< + typeof tools_meta_actionDraftMutations, + "internal" + >; + contextEnhancement: ModuleApi< + typeof tools_meta_contextEnhancement, + "internal" + >; + contextEnhancementActions: ModuleApi< + typeof tools_meta_contextEnhancementActions, + "internal" + >; + dynamicPromptEnhancer: ModuleApi< + typeof tools_meta_dynamicPromptEnhancer, + "internal" + >; + hybridSearch: ModuleApi; + hybridSearchQueries: ModuleApi< + typeof tools_meta_hybridSearchQueries, + "internal" + >; + hybridSearchTest: ModuleApi< + typeof tools_meta_hybridSearchTest, + "internal" + >; + index: ModuleApi; + promptEnhancementFeedback: ModuleApi< + typeof tools_meta_promptEnhancementFeedback, + "internal" + >; + seedSkillRegistry: ModuleApi< + typeof tools_meta_seedSkillRegistry, + "internal" + >; + seedSkillRegistryQueries: ModuleApi< + typeof tools_meta_seedSkillRegistryQueries, + "internal" + >; + seedToolRegistry: ModuleApi< + typeof tools_meta_seedToolRegistry, + "internal" + >; + seedToolRegistryQueries: ModuleApi< + typeof tools_meta_seedToolRegistryQueries, + "internal" + >; + skillDiscovery: ModuleApi; + skillDiscoveryQueries: ModuleApi< + typeof tools_meta_skillDiscoveryQueries, + "internal" + >; + toolDiscovery: ModuleApi; + toolDiscoveryV2: ModuleApi; + toolGateway: ModuleApi; + toolRegistry: ModuleApi; + }; + reports: { + pdfGenerationTools: ModuleApi< + typeof tools_reports_pdfGenerationTools, + "internal" + >; + }; + research: { + researchTools: ModuleApi; + }; + search: { + fusionSearchTool: ModuleApi< + typeof tools_search_fusionSearchTool, + "internal" + >; + index: ModuleApi; + }; + sec: { + secCompanySearch: ModuleApi< + typeof tools_sec_secCompanySearch, + "internal" + >; + secFilingTools: ModuleApi; + }; + security: { + promptInjectionProtection: ModuleApi< + typeof tools_security_promptInjectionProtection, + "internal" + >; + }; + sendEmail: ModuleApi; + sendEmailMutations: ModuleApi; + sendNotification: ModuleApi; + sendSms: ModuleApi; + shared: { + structuredOutput: ModuleApi< + typeof tools_shared_structuredOutput, + "internal" + >; + }; + social: { + instagramTools: ModuleApi; + linkedinTools: ModuleApi; + }; + spreadsheet: { + spreadsheetCrudTools: ModuleApi< + typeof tools_spreadsheet_spreadsheetCrudTools, + "internal" + >; + }; + spreadsheetOperationTypes: ModuleApi< + typeof tools_spreadsheetOperationTypes, + "internal" + >; + teachability: { + index: ModuleApi; + learnUserSkill: ModuleApi< + typeof tools_teachability_learnUserSkill, + "internal" + >; + teachingAnalyzer: ModuleApi< + typeof tools_teachability_teachingAnalyzer, + "internal" + >; + userMemoryQueries: ModuleApi< + typeof tools_teachability_userMemoryQueries, + "internal" + >; + userMemoryTools: ModuleApi< + typeof tools_teachability_userMemoryTools, + "internal" + >; + }; + wrappers: { + coreAgentTools: ModuleApi< + typeof tools_wrappers_coreAgentTools, + "internal" + >; + evidenceTools: ModuleApi; + resourceLinkTools: ModuleApi< + typeof tools_wrappers_resourceLinkTools, + "internal" + >; + }; + }; + users: ModuleApi; + wall: ModuleApi; + workflows: { + agentProjectIdeaPost: ModuleApi< + typeof workflows_agentProjectIdeaPost, + "internal" + >; + ainewsBriefFormat: ModuleApi< + typeof workflows_ainewsBriefFormat, + "internal" + >; + dailyLinkedInPost: ModuleApi< + typeof workflows_dailyLinkedInPost, + "internal" + >; + dailyLinkedInPostMutations: ModuleApi< + typeof workflows_dailyLinkedInPostMutations, + "internal" + >; + dailyMorningBrief: ModuleApi< + typeof workflows_dailyMorningBrief, + "internal" + >; + deepTrace: ModuleApi; + emailResearchOrchestrator: ModuleApi< + typeof workflows_emailResearchOrchestrator, + "internal" + >; + endToEndQa: ModuleApi; + enhancedMorningBrief: ModuleApi< + typeof workflows_enhancedMorningBrief, + "internal" + >; + enhancedWeeklySummary: ModuleApi< + typeof workflows_enhancedWeeklySummary, + "internal" + >; + founderPostGenerator: ModuleApi< + typeof workflows_founderPostGenerator, + "internal" + >; + index: ModuleApi; + linkedinTrigger: ModuleApi; + prdComposerWorkflow: ModuleApi< + typeof workflows_prdComposerWorkflow, + "internal" + >; + scheduledPDFReports: ModuleApi< + typeof workflows_scheduledPDFReports, + "internal" + >; + scheduledPDFReportsMutations: ModuleApi< + typeof workflows_scheduledPDFReportsMutations, + "internal" + >; + sendMockBankerDigest: ModuleApi< + typeof workflows_sendMockBankerDigest, + "internal" + >; + specializedLinkedInPosts: ModuleApi< + typeof workflows_specializedLinkedInPosts, + "internal" + >; + testDailyBrief: ModuleApi; + weeklySourceSummary: ModuleApi< + typeof workflows_weeklySourceSummary, + "internal" + >; + }; +}; export declare const components: { prosemirrorSync: { lib: { @@ -3356,16 +12460,7 @@ export declare const components: { agentName?: string; embeddings?: { dimension: - | 128 - | 256 - | 512 - | 768 - | 1024 - | 1408 - | 1536 - | 2048 - | 3072 - | 4096; + 128 | 256 | 512 | 768 | 1024 | 1408 | 1536 | 2048 | 3072 | 4096; model: string; vectors: Array | null>; }; @@ -5972,16 +15067,7 @@ export declare const components: { model: string; threadId: string; vectorDimension: - | 128 - | 256 - | 512 - | 768 - | 1024 - | 1408 - | 1536 - | 2048 - | 3072 - | 4096; + 128 | 256 | 512 | 768 | 1024 | 1408 | 1536 | 2048 | 3072 | 4096; }, { continueCursor: string; isDone: boolean } >; @@ -5990,16 +15076,7 @@ export declare const components: { "internal", { vectorDimension: - | 128 - | 256 - | 512 - | 768 - | 1024 - | 1408 - | 1536 - | 2048 - | 3072 - | 4096; + 128 | 256 | 512 | 768 | 1024 | 1408 | 1536 | 2048 | 3072 | 4096; vectors: Array<{ messageId?: string; model: string; @@ -6031,16 +15108,7 @@ export declare const components: { table?: string; targetModel: string; vectorDimension: - | 128 - | 256 - | 512 - | 768 - | 1024 - | 1408 - | 1536 - | 2048 - | 3072 - | 4096; + 128 | 256 | 512 | 768 | 1024 | 1408 | 1536 | 2048 | 3072 | 4096; }, { continueCursor: string; diff --git a/backend/convex/_type_shims/convex-server.d.ts b/backend/convex/_type_shims/convex-server.d.ts deleted file mode 100644 index e171a7ccc..000000000 --- a/backend/convex/_type_shims/convex-server.d.ts +++ /dev/null @@ -1,143 +0,0 @@ -declare module "convex/server" { - export type FunctionVisibility = "public" | "internal"; - export type GenericDataModel = any; - - // --------------------------------------------------------------------------- - // API typing (keep permissive to avoid TS2589 in large schemas) - // --------------------------------------------------------------------------- - // Match the structural shape used by Convex so helper generics (e.g. ctx.runQuery) - // don't collapse to `never`. - export type FunctionReference< - Type extends any = any, - Visibility extends FunctionVisibility = "public", - Args extends any = any, - ReturnType = any, - ComponentPath = string | undefined, - > = { - _type: Type; - _visibility: Visibility; - _args: Args; - _returnType: ReturnType; - _componentPath: ComponentPath; - }; - - export type AnyFunctionReference = FunctionReference; - export type FilterApi<_API, _Predicate> = any; - export type ApiFromModules<_AllModules extends Record> = any; - - export const anyApi: any; - export const componentsGeneric: any; - - // --------------------------------------------------------------------------- - // Schema helpers - // --------------------------------------------------------------------------- - export const defineSchema: any; - export const defineTable: any; - export const defineApp: any; - export const cronJobs: any; - export const httpRouter: any; - export const paginationOptsValidator: any; - - // --------------------------------------------------------------------------- - // Database stubs (return `any` to avoid cascading `{}` / `unknown` errors) - // --------------------------------------------------------------------------- - export interface QueryStub { - [Symbol.asyncIterator](): AsyncIterator; - withIndex(_indexName: string, _cb?: (q: any) => any): QueryStub; - withSearchIndex(_indexName: string, _cb?: (q: any) => any): QueryStub; - filter(_cb: (q: any) => any): QueryStub; - order(_direction: any): QueryStub; - take(_n: number): Promise; - first(): Promise; - unique(): Promise; - collect(): Promise; - paginate(_paginationOpts: any): Promise; - } - - export interface GenericDatabaseReader<_DataModel = any> { - get(_id: any): Promise; - query(_tableName: string): QueryStub; - } - - export interface GenericDatabaseWriter<_DataModel = any> extends GenericDatabaseReader<_DataModel> { - insert(_tableName: string, _value: any): Promise; - patch(_id: any, _value: any): Promise; - delete(_id: any): Promise; - } - - export interface GenericQueryCtx<_DataModel = any> { - db: GenericDatabaseReader<_DataModel>; - runQuery: any; - runMutation: any; - runAction: any; - auth: any; - scheduler?: any; - storage: any; - vectorSearch?: any; - } - - export interface GenericMutationCtx<_DataModel = any> { - db: GenericDatabaseWriter<_DataModel>; - runQuery: any; - runMutation: any; - runAction: any; - auth: any; - scheduler?: any; - storage: any; - vectorSearch?: any; - } - - export interface GenericActionCtx<_DataModel = any> { - db: GenericDatabaseWriter<_DataModel>; - runQuery: any; - runMutation: any; - runAction: any; - auth: any; - scheduler?: any; - storage: any; - vectorSearch?: any; - } - - // --------------------------------------------------------------------------- - // Function wrappers (typed loosely) - // --------------------------------------------------------------------------- - export type QueryBuilder<_DataModel extends GenericDataModel = any, _Visibility extends FunctionVisibility = any> = ( - def: - | { - args?: any; - returns?: any; - handler: (ctx: GenericQueryCtx<_DataModel>, args: any) => any; - } - | ((ctx: GenericQueryCtx<_DataModel>, args: any) => any), - ) => any; - - export type MutationBuilder<_DataModel extends GenericDataModel = any, _Visibility extends FunctionVisibility = any> = - ( - def: - | { - args?: any; - returns?: any; - handler: (ctx: GenericMutationCtx<_DataModel>, args: any) => any; - } - | ((ctx: GenericMutationCtx<_DataModel>, args: any) => any), - ) => any; - - export type ActionBuilder<_DataModel extends GenericDataModel = any, _Visibility extends FunctionVisibility = any> = ( - def: - | { - args?: any; - returns?: any; - handler: (ctx: GenericActionCtx<_DataModel>, args: any) => any; - } - | ((ctx: GenericActionCtx<_DataModel>, args: any) => any), - ) => any; - - export type HttpActionBuilder = (handler: (ctx: GenericActionCtx, request: Request) => any) => any; - - // --------------------------------------------------------------------------- - // Registered function marker types (needed by generated API typing) - // --------------------------------------------------------------------------- - export type RegisteredQuery<_Visibility = any, _Args = any, _Return = any> = { isConvexFunction: true } & any; - export type RegisteredMutation<_Visibility = any, _Args = any, _Return = any> = { isConvexFunction: true } & any; - export type RegisteredAction<_Visibility = any, _Args = any, _Return = any> = { isConvexFunction: true } & any; -} diff --git a/backend/convex/_type_shims/convex-values.d.ts b/backend/convex/_type_shims/convex-values.d.ts deleted file mode 100644 index 660a2079a..000000000 --- a/backend/convex/_type_shims/convex-values.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module "convex/values" { - export const v: any; - - export type Validator<_T = any, _IsOptional = any, _FieldPaths = any> = any; - - export type GenericId<_TableName extends string = string> = string; - export type Id<_TableName extends string = string> = string; -} - diff --git a/backend/convex/domains/agents/__tests__/delegationRegistration.test.ts b/backend/convex/domains/agents/__tests__/delegationRegistration.test.ts new file mode 100644 index 000000000..e51b72d37 --- /dev/null +++ b/backend/convex/domains/agents/__tests__/delegationRegistration.test.ts @@ -0,0 +1,210 @@ +/// +// @vitest-environment node +import { convexTest } from "convex-test"; +import type { FunctionArgs, FunctionReference } from "convex/server"; +import { describe, expect, expectTypeOf, it } from "vitest"; +import { api, internal } from "../../../_generated/api"; +import type { Doc, Id } from "../../../_generated/dataModel"; +import schema from "../../../schema"; +import * as handlers from "../agentDelegations"; + +const modules = Object.fromEntries( + Object.entries(import.meta.glob("../../../**/*.{ts,js}")).map(([key, loader]) => { + const parts = key.replace(/^\.\//, "").split("/"); + const base = ["domains", "agents", "__tests__"]; + while (parts[0] === "..") { parts.shift(); base.pop(); } + return [[...base, ...parts].join("/"), loader]; + }), +); +const fixture = () => convexTest({ schema, modules, transactionLimits: true }); +const readers = api.domains.agents.agentDelegations; +const writers = internal.domains.agents.agentDelegations; +type IsAny = 0 extends (1 & T) ? true : false; + +// Checked by the real backend TypeScript program; never invoked at runtime. +// Vitest runtime success by itself does not establish these compiler contracts. +function compilerContracts(userId: Id<"users">, documentId: Id<"documents">) { + expectTypeOf(readers.listByRun).toMatchTypeOf>(); + expectTypeOf(readers.getWriteEvents).toMatchTypeOf>(); + expectTypeOf(readers.getByDelegationId).toMatchTypeOf>(); + expectTypeOf(writers.listByRunInternal).toMatchTypeOf>(); + expectTypeOf(writers.getWriteEventsInternal).toMatchTypeOf>(); + expectTypeOf(writers.createDelegation).toMatchTypeOf>(); + expectTypeOf(writers.updateStatus).toMatchTypeOf>(); + expectTypeOf(writers.emitWriteEvent).toMatchTypeOf>(); + expectTypeOf(writers.updateMergeStatus).toMatchTypeOf>(); + expectTypeOf(writers.cancelDelegation).toMatchTypeOf>(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>>().toEqualTypeOf(); + expectTypeOf>>().toEqualTypeOf(); + expectTypeOf>>().toEqualTypeOf(); + + // @ts-expect-error The public projection must not expose this internal query. + readers.listByRunInternal; + // @ts-expect-error Internal event reads are not a public history API. + readers.getWriteEventsInternal; + // @ts-expect-error External callers cannot create delegation rows. + readers.createDelegation; + // @ts-expect-error External callers cannot set another delegation's status. + readers.updateStatus; + // @ts-expect-error External callers cannot forge streaming events. + readers.emitWriteEvent; + // @ts-expect-error Merge writes retain internal visibility. + readers.updateMergeStatus; + // @ts-expect-error Cancellation is not a public unowned-ID operation. + readers.cancelDelegation; + // @ts-expect-error This query is registered public and performs its own auth check. + writers.listByRun; + // @ts-expect-error The owner-facing event projection is public. + writers.getWriteEvents; + // @ts-expect-error The owner-facing lookup is public. + writers.getByDelegationId; + + const create = (args: FunctionArgs) => args; + const status = (args: FunctionArgs) => args; + const event = (args: FunctionArgs) => args; + const valid = { runId: "run", delegationId: "delegation", userId, agentName: "DocumentAgent", query: "Read the supplied report" } as const; + create(valid); + status({ delegationId: "delegation", status: "running" }); + event({ delegationId: "delegation", seq: 0, kind: "note", textChunk: "Started" }); + // @ts-expect-error The executor has no DossierAgent registration. + create({ ...valid, agentName: "DossierAgent" }); + // @ts-expect-error A document ID cannot select the user identity. + create({ ...valid, userId: documentId }); + // @ts-expect-error Delegation status is the existing validated literal union. + status({ delegationId: "delegation", status: "invented" }); + // @ts-expect-error Event kind is the existing validated literal union. + event({ delegationId: "delegation", seq: 0, kind: "invented" }); + // @ts-expect-error The sequence is numeric, not a text cursor. + event({ delegationId: "delegation", seq: "next", kind: "note" }); +} +void compilerContracts; + +async function seedOwners(t: ReturnType) { + return t.run(async ctx => ({ + ownerA: await ctx.db.insert("users", { name: "Delegation owner A" }), + ownerB: await ctx.db.insert("users", { name: "Delegation owner B" }), + })); +} + +describe("a person follows delegated research without exposing another person's work", () => { + it("keeps the three owner-facing readers public and all seven trusted helpers internal", () => { + const publicQueries = [handlers.listByRun, handlers.getWriteEvents, handlers.getByDelegationId]; + const internalQueries = [handlers.listByRunInternal, handlers.getWriteEventsInternal]; + const internalMutations = [handlers.createDelegation, handlers.updateStatus, handlers.emitWriteEvent, handlers.updateMergeStatus, handlers.cancelDelegation]; + for (const handler of publicQueries) { + expect(handler).toHaveProperty("isQuery", true); + expect(handler).toHaveProperty("isPublic", true); + expect(handler).not.toHaveProperty("isInternal", true); + } + for (const handler of [...internalQueries, ...internalMutations]) { + expect(handler).toHaveProperty("isInternal", true); + expect(handler).not.toHaveProperty("isPublic", true); + } + for (const handler of internalQueries) expect(handler).toHaveProperty("isQuery", true); + for (const handler of internalMutations) expect(handler).toHaveProperty("isMutation", true); + }); + + it("stores progress through real internal mutations while guests and foreign owners see no private rows", async () => { + const t = fixture(); + const { ownerA, ownerB } = await seedOwners(t); + const a = t.withIdentity({ subject: String(ownerA) }); + const b = t.withIdentity({ subject: String(ownerB) }); + for (const [userId, delegationId] of [[ownerA, "a"], [ownerB, "b"]] as const) { + expect(await t.mutation(writers.createDelegation, { + userId, delegationId, runId: "shared-run-label", agentName: "DocumentAgent", query: `${delegationId} private report`, + })).toEqual({ delegationId }); + await t.mutation(writers.updateStatus, { delegationId, status: "running", subagentThreadId: `${delegationId}-thread` }); + await t.mutation(writers.emitWriteEvent, { delegationId, seq: 0, kind: "tool_end", toolName: `${delegationId}-tool` }); + await t.mutation(writers.emitWriteEvent, { delegationId, seq: 1, kind: "final", textChunk: `${delegationId} private result` }); + await t.mutation(writers.updateStatus, { delegationId, status: "completed" }); + await t.mutation(writers.updateMergeStatus, { delegationId, mergeStatus: "merged" }); + } + const rowsA: Doc<"agentDelegations">[] = await a.query(readers.listByRun, { runId: "shared-run-label" }); + const rowsB: Doc<"agentDelegations">[] = await b.query(readers.listByRun, { runId: "shared-run-label" }); + expect(rowsA.map(row => row.delegationId)).toEqual(["a"]); + expect(rowsB.map(row => row.delegationId)).toEqual(["b"]); + expect(rowsA[0]).toMatchObject({ userId: ownerA, status: "completed", mergeStatus: "merged", subagentThreadId: "a-thread" }); + expect(rowsA[0].finishedAt).toBeGreaterThanOrEqual(rowsA[0].startedAt ?? Infinity); + expect(await t.query(readers.listByRun, { runId: "shared-run-label" })).toEqual([]); + for (const viewer of [t, b]) { + expect(await viewer.query(readers.getByDelegationId, { delegationId: "a" })).toBeNull(); + expect(await viewer.query(readers.getWriteEvents, { delegationId: "a" })).toEqual([]); + } + expect(await a.query(readers.getWriteEvents, { delegationId: "a", afterSeq: 0 })).toMatchObject([{ kind: "final", textChunk: "a private result", seq: 1 }]); + expect(await a.query(readers.getByDelegationId, { delegationId: "missing" })).toBeNull(); + expect(await a.query(readers.getWriteEvents, { delegationId: "missing" })).toEqual([]); + const trustedRows: Doc<"agentDelegations">[] = await t.query(writers.listByRunInternal, { runId: "shared-run-label", userId: ownerA }); + expect(trustedRows.map(row => row.delegationId)).toEqual(["a"]); + expect(await t.query(writers.getWriteEventsInternal, { delegationId: "a", afterSeq: 0 })).toMatchObject([{ seq: 1 }]); + }); + + it("keeps distinct concurrent delegations isolated across twelve accumulated request rounds", async () => { + const t = fixture(); + const { ownerA, ownerB } = await seedOwners(t); + const a = t.withIdentity({ subject: String(ownerA) }); + const b = t.withIdentity({ subject: String(ownerB) }); + for (let round = 0; round < 12; round++) { + await Promise.all(Array.from({ length: 5 }, async (_, lane) => { + const delegationId = `round-${round}-lane-${lane}`; + const userId = lane % 2 === 0 ? ownerA : ownerB; + await t.mutation(writers.createDelegation, { delegationId, runId: "accumulated-run", userId, agentName: "MediaAgent", query: `source-${delegationId}` }); + await t.mutation(writers.updateStatus, { delegationId, status: "running" }); + for (let seq = 0; seq < 4; seq++) { + await t.mutation(writers.emitWriteEvent, { delegationId, seq, kind: seq === 3 ? "final" : "delta", textChunk: `${delegationId}:${seq}` }); + } + await t.mutation(writers.updateStatus, { delegationId, status: "completed" }); + const viewer = userId === ownerA ? a : b; + const foreign = userId === ownerA ? b : a; + const events: Doc<"agentWriteEvents">[] = await viewer.query(readers.getWriteEvents, { delegationId, afterSeq: 1 }); + expect(events.map(event => [event.seq, event.textChunk])).toEqual([[2, `${delegationId}:2`], [3, `${delegationId}:3`]]); + expect(await foreign.query(readers.getWriteEvents, { delegationId })).toEqual([]); + })); + const ownA: Doc<"agentDelegations">[] = await a.query(readers.listByRun, { runId: "accumulated-run" }); + const ownB: Doc<"agentDelegations">[] = await b.query(readers.listByRun, { runId: "accumulated-run" }); + expect(ownA).toHaveLength((round + 1) * 3); + expect(ownB).toHaveLength((round + 1) * 2); + expect(ownA.every(row => row.userId === ownerA)).toBe(true); + expect(ownB.every(row => row.userId === ownerB)).toBe(true); + } + expect(await t.run(async ctx => ({ + rows: (await ctx.db.query("agentDelegations").collect()).length, + events: (await ctx.db.query("agentWriteEvents").collect()).length, + }))).toEqual({ rows: 60, events: 240 }); + }); + + it("retains the existing event read cap and incremental final event access", async () => { + const t = fixture(); + const { ownerA, ownerB } = await seedOwners(t); + await t.mutation(writers.createDelegation, { delegationId: "long-run", runId: "run", userId: ownerA, agentName: "SECAgent", query: "Read supplied filing" }); + for (let start = 0; start < 501; start += 25) { + await Promise.all(Array.from({ length: Math.min(25, 501 - start) }, (_, offset) => { + const seq = start + offset; + return t.mutation(writers.emitWriteEvent, { delegationId: "long-run", seq, kind: seq === 500 ? "final" : "delta", textChunk: `part-${seq}` }); + })); + } + const a = t.withIdentity({ subject: String(ownerA) }); + const b = t.withIdentity({ subject: String(ownerB) }); + expect(await a.query(readers.getWriteEvents, { delegationId: "long-run", limit: 1000 })).toHaveLength(500); + expect(await t.query(writers.getWriteEventsInternal, { delegationId: "long-run", limit: 1000 })).toHaveLength(500); + expect(await a.query(readers.getWriteEvents, { delegationId: "long-run", afterSeq: 499 })).toMatchObject([{ seq: 500, kind: "final" }]); + expect(await b.query(readers.getWriteEvents, { delegationId: "long-run", limit: 1000 })).toEqual([]); + }); + + it("preserves failure and cancellation records without claiming that cancellation stops the worker", async () => { + const t = fixture(); + const { ownerA } = await seedOwners(t); + const a = t.withIdentity({ subject: String(ownerA) }); + for (const delegationId of ["failed", "cancelled"]) { + await t.mutation(writers.createDelegation, { delegationId, runId: "run", userId: ownerA, agentName: "OpenBBAgent", query: "Inspect fixture" }); + await t.mutation(writers.updateStatus, { delegationId, status: "running" }); + } + await t.mutation(writers.updateStatus, { delegationId: "failed", status: "failed", errorMessage: "Fixture provider unavailable" }); + await t.mutation(writers.cancelDelegation, { delegationId: "cancelled" }); + expect(await a.query(readers.getByDelegationId, { delegationId: "failed" })).toMatchObject({ status: "failed", errorMessage: "Fixture provider unavailable" }); + expect(await a.query(readers.getByDelegationId, { delegationId: "cancelled" })).toMatchObject({ status: "cancelled" }); + // No executor/provider runs here: later worker writes can still overwrite cancellation. + expect(await t.run(async ctx => (await ctx.db.query("agentWriteEvents").collect()).length)).toBe(0); + }); +}); diff --git a/backend/convex/domains/agents/agentDelegations.ts b/backend/convex/domains/agents/agentDelegations.ts index 650e33657..985ed073b 100644 --- a/backend/convex/domains/agents/agentDelegations.ts +++ b/backend/convex/domains/agents/agentDelegations.ts @@ -10,7 +10,7 @@ import { getAuthUserId } from "@convex-dev/auth/server"; // VALIDATORS (reusable) // ═══════════════════════════════════════════════════════════════════════════ -export const agentNameValidator: any = v.union( +export const agentNameValidator = v.union( v.literal("DocumentAgent"), v.literal("MediaAgent"), v.literal("SECAgent"), @@ -18,7 +18,7 @@ export const agentNameValidator: any = v.union( v.literal("EntityResearchAgent"), ); -export const delegationStatusValidator: any = v.union( +export const delegationStatusValidator = v.union( v.literal("scheduled"), v.literal("running"), v.literal("completed"), @@ -26,7 +26,7 @@ export const delegationStatusValidator: any = v.union( v.literal("cancelled"), ); -export const writeEventKindValidator: any = v.union( +export const writeEventKindValidator = v.union( v.literal("delta"), v.literal("tool_start"), v.literal("tool_end"), @@ -42,9 +42,9 @@ export const writeEventKindValidator: any = v.union( * List active delegations for a run (UI subscription) * Auth-guarded: only returns delegations owned by current user */ -export const listByRun = (query as any)({ +export const listByRun = query({ args: { runId: v.string() }, - handler: async (ctx: any, { runId }: any): Promise => { + handler: async (ctx: any, { runId }): Promise => { const userId = await getAuthUserId(ctx); if (!userId) return []; @@ -59,12 +59,12 @@ export const listByRun = (query as any)({ /** * Internal version of listByRun (no auth check, for evaluation) */ -export const listByRunInternal = (internalQuery as any)({ +export const listByRunInternal = internalQuery({ args: { runId: v.string(), userId: v.id("users"), }, - handler: async (ctx: any, { runId, userId }: any): Promise => { + handler: async (ctx: any, { runId, userId }): Promise => { return await ctx.db .query("agentDelegations") .withIndex("by_user_run", (q: any) => q.eq("userId", userId).eq("runId", runId)) @@ -78,13 +78,13 @@ export const listByRunInternal = (internalQuery as any)({ * * Fix B applied: proper index usage, no JS filter, bounded results */ -export const getWriteEvents = (query as any)({ +export const getWriteEvents = query({ args: { delegationId: v.string(), afterSeq: v.optional(v.number()), limit: v.optional(v.number()), }, - handler: async (ctx: any, { delegationId, afterSeq, limit }: any): Promise => { + handler: async (ctx: any, { delegationId, afterSeq, limit }): Promise => { // First verify user owns this delegation (auth guard) const userId = await getAuthUserId(ctx); if (!userId) return []; @@ -118,13 +118,13 @@ export const getWriteEvents = (query as any)({ /** * Internal version of getWriteEvents (no auth check, for evaluation) */ -export const getWriteEventsInternal = (internalQuery as any)({ +export const getWriteEventsInternal = internalQuery({ args: { delegationId: v.string(), afterSeq: v.optional(v.number()), limit: v.optional(v.number()), }, - handler: async (ctx: any, { delegationId, afterSeq, limit }: any): Promise => { + handler: async (ctx: any, { delegationId, afterSeq, limit }): Promise => { let q = ctx.db .query("agentWriteEvents") .withIndex("by_delegation", (q: any) => q.eq("delegationId", delegationId)); @@ -141,9 +141,9 @@ export const getWriteEventsInternal = (internalQuery as any)({ /** * Get a single delegation by ID */ -export const getByDelegationId = (query as any)({ +export const getByDelegationId = query({ args: { delegationId: v.string() }, - handler: async (ctx: any, { delegationId }: any): Promise => { + handler: async (ctx: any, { delegationId }): Promise => { const userId = await getAuthUserId(ctx); if (!userId) return null; @@ -169,7 +169,7 @@ export const getByDelegationId = (query as any)({ * Create a new delegation record * Called before scheduling the execution action */ -export const createDelegation = (internalMutation as any)({ +export const createDelegation = internalMutation({ args: { runId: v.string(), delegationId: v.string(), @@ -177,7 +177,7 @@ export const createDelegation = (internalMutation as any)({ agentName: agentNameValidator, query: v.string(), }, - handler: async (ctx: any, args: any): Promise => { + handler: async (ctx: any, args): Promise => { await ctx.db.insert("agentDelegations", { runId: args.runId, delegationId: args.delegationId, @@ -195,7 +195,7 @@ export const createDelegation = (internalMutation as any)({ * Update delegation status * Only patches specific fields to minimize write size */ -export const updateStatus = (internalMutation as any)({ +export const updateStatus = internalMutation({ args: { delegationId: v.string(), status: delegationStatusValidator, @@ -203,7 +203,7 @@ export const updateStatus = (internalMutation as any)({ errorMessage: v.optional(v.string()), finalPatchRef: v.optional(v.string()), }, - handler: async (ctx: any, args: any): Promise => { + handler: async (ctx: any, args): Promise => { const delegation = await ctx.db .query("agentDelegations") .withIndex("by_delegation", (q: any) => q.eq("delegationId", args.delegationId)) @@ -239,7 +239,7 @@ export const updateStatus = (internalMutation as any)({ * Fix A applied: seq is passed in by action (action-owned), NOT mutated here * This makes streaming essentially conflict-free */ -export const emitWriteEvent = (internalMutation as any)({ +export const emitWriteEvent = internalMutation({ args: { delegationId: v.string(), seq: v.number(), // Action-owned, passed in @@ -248,7 +248,7 @@ export const emitWriteEvent = (internalMutation as any)({ toolName: v.optional(v.string()), metadata: v.optional(v.any()), }, - handler: async (ctx: any, args: any): Promise => { + handler: async (ctx: any, args): Promise => { // Pure insert - no reads or patches, no OCC contention await ctx.db.insert("agentWriteEvents", { delegationId: args.delegationId, @@ -265,12 +265,12 @@ export const emitWriteEvent = (internalMutation as any)({ /** * Update merge status (called after coordinator merges) */ -export const updateMergeStatus = (internalMutation as any)({ +export const updateMergeStatus = internalMutation({ args: { delegationId: v.string(), mergeStatus: v.string(), }, - handler: async (ctx: any, args: any): Promise => { + handler: async (ctx: any, args): Promise => { const delegation = await ctx.db .query("agentDelegations") .withIndex("by_delegation", (q: any) => q.eq("delegationId", args.delegationId)) @@ -285,9 +285,9 @@ export const updateMergeStatus = (internalMutation as any)({ /** * Cancel a delegation (user-initiated) */ -export const cancelDelegation = (internalMutation as any)({ +export const cancelDelegation = internalMutation({ args: { delegationId: v.string() }, - handler: async (ctx: any, args: any): Promise => { + handler: async (ctx: any, args): Promise => { const delegation = await ctx.db .query("agentDelegations") .withIndex("by_delegation", (q: any) => q.eq("delegationId", args.delegationId)) diff --git a/backend/convex/domains/agents/agentLoop.ts b/backend/convex/domains/agents/agentLoop.ts index a0d38b17f..352ba35d5 100644 --- a/backend/convex/domains/agents/agentLoop.ts +++ b/backend/convex/domains/agents/agentLoop.ts @@ -18,7 +18,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; // Note: getDispatchedEventsForAgent lives in agentLoopQueries.ts (non-node file) import { generateText } from "ai"; import { getLanguageModelSafe } from "./mcp_tools/models/modelResolver"; @@ -62,7 +62,7 @@ export const tickAgentLoop = internalAction({ // 1. Get all active agents with their posting capability const agents = await ctx.runQuery( - internal.agentOS.listAgents, + api.agentOS.listAgents, { status: "active" } ); @@ -266,7 +266,7 @@ export const executeAgentWorkCycle = internalAction({ // All agents try to post to LinkedIn if authorized const agent = await ctx.runQuery( - internal.agentOS.getAgent, + api.agentOS.getAgent, { agentId } ); @@ -300,7 +300,7 @@ export const tickSingleAgent = internalAction({ args: { agentId: v.string() }, handler: async (ctx, args) => { const agent = await ctx.runQuery( - internal.agentOS.getAgent, + api.agentOS.getAgent, { agentId: args.agentId } ); if (!agent || agent.status !== "active") { @@ -329,7 +329,7 @@ export const tickSingleAgent = internalAction({ } try { - const result = await ctx.runAction( + const result: { postsCreated: number; tokensBurned: number; costUsd: number; contentLength: number } = await ctx.runAction( internal.domains.agents.agentLoop.executeAgentWorkCycle, { agentId: args.agentId, diff --git a/backend/convex/domains/agents/agentPostingPipeline.ts b/backend/convex/domains/agents/agentPostingPipeline.ts index 7d4d772e6..71d348acc 100644 --- a/backend/convex/domains/agents/agentPostingPipeline.ts +++ b/backend/convex/domains/agents/agentPostingPipeline.ts @@ -11,7 +11,7 @@ import { v } from "convex/values"; import { internalAction, internalMutation, internalQuery } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; /** * Create a narrative post as an agent, routed through all governance guards. @@ -47,7 +47,7 @@ export const createAgentNarrativePost = internalAction({ handler: async (ctx, args) => { // 1. Verify agent identity exists and is active const agent = await ctx.runQuery( - internal.agentOS.getAgent, + api.agentOS.getAgent, { agentId: args.agentId } ); if (!agent || agent.status !== "active") { @@ -130,7 +130,7 @@ export const createAgentLinkedInPost = internalAction({ handler: async (ctx, args) => { // 1. Verify agent identity and channel access const agent = await ctx.runQuery( - internal.agentOS.getAgent, + api.agentOS.getAgent, { agentId: args.agentId } ); if (!agent || agent.status !== "active") { diff --git a/backend/convex/domains/agents/canonicalPlanner.ts b/backend/convex/domains/agents/canonicalPlanner.ts index cc0e4cef9..4be74ff46 100644 --- a/backend/convex/domains/agents/canonicalPlanner.ts +++ b/backend/convex/domains/agents/canonicalPlanner.ts @@ -14,7 +14,7 @@ import { v } from "convex/values"; import { getAuthUserId } from "@convex-dev/auth/server"; import { action, internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { injectLessonsForThread } from "./lessons/lessonInjection"; import { toAnonymousProductOwnerKey } from "../product/helpers"; @@ -189,7 +189,7 @@ export const planAndRunFast = internalAction({ // Log the fast interaction as a message (fire-and-forget) await ctx .runMutation( - internal.domains.agents.canonicalRuntimeMutations.insertAgentMessage, + api.domains.agents.canonicalRuntimeMutations.insertAgentMessage, { ownerKey: args.ownerKey, threadId, @@ -215,7 +215,7 @@ export const planAndRunFast = internalAction({ // 4. SLOW LANE — create run, return immediately so client can subscribe const runId = await ctx.runMutation( - internal.domains.agents.canonicalRuntimeMutations.createRunRecord, + api.domains.agents.canonicalRuntimeMutations.createRunRecord, { ownerKey: args.ownerKey, entitySlug: args.entitySlug, @@ -234,7 +234,7 @@ export const planAndRunFast = internalAction({ // Insert placeholder message in thread await ctx .runMutation( - internal.domains.agents.canonicalRuntimeMutations.insertAgentMessage, + api.domains.agents.canonicalRuntimeMutations.insertAgentMessage, { ownerKey: args.ownerKey, threadId, @@ -281,7 +281,7 @@ export const runSlowOrchestrator = internalAction({ // Update run status → running await ctx.runMutation( - internal.domains.agents.canonicalRuntimeMutations.updateRunStatus, + api.domains.agents.canonicalRuntimeMutations.updateRunStatus, { runId: args.runId, status: "running", @@ -306,7 +306,7 @@ export const runSlowOrchestrator = internalAction({ // Insert first checkpoint await ctx.runMutation( - internal.domains.agents.canonicalRuntimeMutations.insertCheckpoint, + api.domains.agents.canonicalRuntimeMutations.insertCheckpoint, { runId: args.runId, index: 0, @@ -394,7 +394,7 @@ Mark confidence: verified | corroborated | single-source | unverified.`, // Final checkpoint await ctx.runMutation( - internal.domains.agents.canonicalRuntimeMutations.insertCheckpoint, + api.domains.agents.canonicalRuntimeMutations.insertCheckpoint, { runId: args.runId, index: 1, @@ -411,7 +411,7 @@ Mark confidence: verified | corroborated | single-source | unverified.`, // Mark run ready await ctx.runMutation( - internal.domains.agents.canonicalRuntimeMutations.updateRunStatus, + api.domains.agents.canonicalRuntimeMutations.updateRunStatus, { runId: args.runId, status: "completed", @@ -424,7 +424,7 @@ Mark confidence: verified | corroborated | single-source | unverified.`, // Update thread message await ctx .runMutation( - internal.domains.agents.canonicalRuntimeMutations.insertAgentMessage, + api.domains.agents.canonicalRuntimeMutations.insertAgentMessage, { ownerKey: args.ownerKey, threadId: args.threadId, @@ -482,7 +482,7 @@ export const triggerPulseForEntity = internalAction({ // Create run const runId = await ctx.runMutation( - internal.domains.agents.canonicalRuntimeMutations.createRunRecord, + api.domains.agents.canonicalRuntimeMutations.createRunRecord, { ownerKey: args.ownerKey, entitySlug: args.entitySlug, @@ -545,7 +545,7 @@ export const runFastLane = action({ latencyMs: v.number(), fromCache: v.boolean(), }), - handler: async (ctx, args) => { + handler: async (ctx, args): Promise => { const rawUserId = await getAuthUserId(ctx); const ownerKey = rawUserId ? `user:${String(rawUserId)}` diff --git a/backend/convex/domains/agents/digestAgent.ts b/backend/convex/domains/agents/digestAgent.ts index 779d9eba5..bd736900b 100644 --- a/backend/convex/domains/agents/digestAgent.ts +++ b/backend/convex/domains/agents/digestAgent.ts @@ -398,7 +398,7 @@ async function loadPersonaSkill( logger.logSkillSearch(`digest ${persona}`, [], 1); const searchResult = await ctx.runQuery( - internal.tools.meta.skillDiscoveryQueries.getSkillByName, + api.tools.meta.skillDiscoveryQueries.getSkillByName, { name: skillName } ); diff --git a/backend/convex/domains/agents/emailAgent.ts b/backend/convex/domains/agents/emailAgent.ts index 4c243fb2b..83f2f98d6 100644 --- a/backend/convex/domains/agents/emailAgent.ts +++ b/backend/convex/domains/agents/emailAgent.ts @@ -769,7 +769,7 @@ export const testEmailAnalysis = action({ handler: async (ctx, args) => { console.log(`[testEmailAnalysis] Testing with subject: "${args.subject}"`); - const analysis = await ctx.runAction(internal.domains.agents.emailAgent.analyzeEmail, { + const analysis: EmailAnalysis = await ctx.runAction(internal.domains.agents.emailAgent.analyzeEmail, { subject: args.subject, from: args.from, bodySnippet: args.bodySnippet, diff --git a/backend/convex/domains/agents/orchestrator/toolRouter.ts b/backend/convex/domains/agents/orchestrator/toolRouter.ts index dc1663097..a4d2b9945 100644 --- a/backend/convex/domains/agents/orchestrator/toolRouter.ts +++ b/backend/convex/domains/agents/orchestrator/toolRouter.ts @@ -10,7 +10,7 @@ import { v } from "convex/values"; import { internalAction, internalMutation, action } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import type { Doc } from "../../../_generated/dataModel"; // ═══════════════════════════════════════════════════════════════════════════ @@ -48,7 +48,7 @@ export const isCircuitOpen = internalAction({ args: { toolName: v.string() }, returns: v.boolean(), handler: async (ctx, args): Promise => { - const health = await ctx.runQuery(internal.domains.agents.orchestrator.toolHealth.getToolHealth, { + const health = await ctx.runQuery(api.domains.agents.orchestrator.toolHealth.getToolHealth, { toolName: args.toolName, }); return health?.circuitOpen ?? false; diff --git a/backend/convex/domains/agents/receipts/actionReceipts.ts b/backend/convex/domains/agents/receipts/actionReceipts.ts index 5a7218ae3..4b5be2cb4 100644 --- a/backend/convex/domains/agents/receipts/actionReceipts.ts +++ b/backend/convex/domains/agents/receipts/actionReceipts.ts @@ -418,7 +418,7 @@ export const emitReceipt = internalAction({ violations: v.array(violationValidator), }, returns: v.id("actionReceipts"), - handler: async (ctx, args) => { + handler: async (ctx, args): Promise> => { const now = Date.now(); const receiptId = await computeReceiptId({ ...args, createdAt: now }); diff --git a/backend/convex/domains/agents/responseFlywheel.ts b/backend/convex/domains/agents/responseFlywheel.ts index 83ff5d5f5..4ed0561bf 100644 --- a/backend/convex/domains/agents/responseFlywheel.ts +++ b/backend/convex/domains/agents/responseFlywheel.ts @@ -2,7 +2,7 @@ import { getAuthUserId } from "@convex-dev/auth/server"; import { v } from "convex/values"; import { query, internalAction, internalMutation } from "../../_generated/server"; import type { Doc, Id } from "../../_generated/dataModel"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { AGENT_QUESTION_CATALOG, reviewAgentResponse, @@ -398,7 +398,7 @@ export const runResponseFlywheelMaintenance = internalAction({ let syncedLoops: number | undefined; if (args.syncSuccessLoops ?? true) { const syncResult = await ctx.runMutation( - internal.domains.successLoops.mutations.syncSourceRecordToTrajectory, + api.domains.successLoops.mutations.syncSourceRecordToTrajectory, {}, ); syncedLoops = syncResult.synced; diff --git a/backend/convex/domains/agents/swarmDeliberation.ts b/backend/convex/domains/agents/swarmDeliberation.ts index f96abd224..7da6ed691 100644 --- a/backend/convex/domains/agents/swarmDeliberation.ts +++ b/backend/convex/domains/agents/swarmDeliberation.ts @@ -777,7 +777,7 @@ export const startSwarmDeliberation = internalAction({ }) .join("\n\n"); - const synthesis = await ctx.runAction( + const synthesis: DeliberationSynthesis = await ctx.runAction( internal.domains.agents.swarmDeliberation.synthesizeDeliberation, { sessionId, diff --git a/backend/convex/domains/agents/tools/createDCFSpreadsheet.ts b/backend/convex/domains/agents/tools/createDCFSpreadsheet.ts index 1d042bf82..46da27620 100644 --- a/backend/convex/domains/agents/tools/createDCFSpreadsheet.ts +++ b/backend/convex/domains/agents/tools/createDCFSpreadsheet.ts @@ -14,7 +14,7 @@ import { createTool } from "@convex-dev/agent"; import { z } from "zod"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; export const createDCFSpreadsheet = createTool({ description: `Create an interactive DCF (Discounted Cash Flow) valuation model for a company. @@ -49,7 +49,7 @@ Use this when the user wants to: try { // 1. Create DCF session (works for both authenticated and guest users) const { sessionId } = await ctx.runAction( - internal.domains.financial.interactiveDCFSession.createSession, + api.domains.financial.interactiveDCFSession.createSession, { ticker: args.ticker.toUpperCase(), userId: ctx.userId ? (ctx.userId as any) : undefined, @@ -58,7 +58,7 @@ Use this when the user wants to: // 2. Generate spreadsheet from session const { spreadsheetId, cellsCreated } = await ctx.runAction( - internal.domains.financial.dcfSpreadsheetAdapter.generateSpreadsheetFromDCF, + api.domains.financial.dcfSpreadsheetAdapter.generateSpreadsheetFromDCF, { sessionId }, ); diff --git a/backend/convex/domains/auth/userPreferences.ts b/backend/convex/domains/auth/userPreferences.ts index cf477ff95..b7bd0d677 100644 --- a/backend/convex/domains/auth/userPreferences.ts +++ b/backend/convex/domains/auth/userPreferences.ts @@ -101,6 +101,9 @@ export const getUserPreferences = query({ linkReminderOptOut: preferences.linkReminderOptOut ?? false, trackedHashtags: preferences.trackedHashtags ?? [], techStack: preferences.techStack ?? [], + gmailIngestEnabled: preferences.gmailIngestEnabled ?? true, + gcalSyncEnabled: preferences.gcalSyncEnabled ?? true, + calendarAutoAddMode: preferences.calendarAutoAddMode ?? "propose", }; }, }); diff --git a/backend/convex/domains/blips/blipPersonaLens.ts b/backend/convex/domains/blips/blipPersonaLens.ts index 3d87fdc89..5a0bde261 100644 --- a/backend/convex/domains/blips/blipPersonaLens.ts +++ b/backend/convex/domains/blips/blipPersonaLens.ts @@ -9,7 +9,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { PersonaId } from "./types"; // ============================================================================ @@ -98,7 +98,7 @@ export const generatePersonaLenses = internalAction({ handler: async (ctx, args) => { // Get the blip - we need to get it from all blips const blip = await ctx.runQuery( - internal.domains.blips.blipQueries.getBlipsByCategory, + api.domains.blips.blipQueries.getBlipsByCategory, { category: "tech", limit: 100 } ); @@ -153,7 +153,7 @@ export const generatePersonaLensesBatch = internalAction({ // Get blips that need persona lenses // We'll check by looking for blips without lenses const allBlips = await ctx.runQuery( - internal.domains.blips.blipQueries.getBlipsByCategory, + api.domains.blips.blipQueries.getBlipsByCategory, { category: "tech", limit: 50 } ); diff --git a/backend/convex/domains/blips/blipPipeline.ts b/backend/convex/domains/blips/blipPipeline.ts index cff95a749..202ef3d6d 100644 --- a/backend/convex/domains/blips/blipPipeline.ts +++ b/backend/convex/domains/blips/blipPipeline.ts @@ -202,7 +202,11 @@ export const runPersonaLensPhase = internalAction({ */ export const runPipelinePhased = internalAction({ args: {}, - handler: async (ctx) => { + handler: async (ctx): Promise<{ + started: boolean; + ingested: number; + message: string; + }> => { console.log("[BlipPipeline] Starting phased pipeline execution..."); // Phase 1: Ingest now diff --git a/backend/convex/domains/documents/citationValidator.ts b/backend/convex/domains/documents/citationValidator.ts index 5370a0ea8..7d76acd29 100644 --- a/backend/convex/domains/documents/citationValidator.ts +++ b/backend/convex/domains/documents/citationValidator.ts @@ -6,7 +6,7 @@ */ import { v } from "convex/values"; -import { query, internalAction } from "../../_generated/server"; +import { internalQuery, internalAction } from "../../_generated/server"; import { internal } from "../../_generated/api"; import type { Id, Doc } from "../../_generated/dataModel"; @@ -48,7 +48,7 @@ export function extractCitationsFromText(text: string): string[] { /** * Validate document citations - ensures all citations in text have linked artifacts. */ -export const validateDocumentCitations = query({ +export const validateDocumentCitations = internalQuery({ args: { documentId: v.id("documents") }, returns: v.object({ isValid: v.boolean(), @@ -158,7 +158,7 @@ export const validateBatchDocuments = internalAction({ handler: async (ctx, args) => { const results = await Promise.all( args.documentIds.map(async (documentId: Id<"documents">) => { - const validation = await ctx.runQuery( + const validation: CitationValidationResult = await ctx.runQuery( internal.domains.documents.citationValidator.validateDocumentCitations, { documentId } ); @@ -180,7 +180,7 @@ export const validateBatchDocuments = internalAction({ /** * Generate a citation report for a document (human-readable format). */ -export const generateCitationReport = query({ +export const generateCitationReport = internalQuery({ args: { documentId: v.id("documents") }, returns: v.string(), handler: async (ctx, args): Promise => { diff --git a/backend/convex/domains/enrichment/backfillMetadata.ts b/backend/convex/domains/enrichment/backfillMetadata.ts index 7d946eefe..e12c374eb 100644 --- a/backend/convex/domains/enrichment/backfillMetadata.ts +++ b/backend/convex/domains/enrichment/backfillMetadata.ts @@ -10,7 +10,7 @@ */ import { internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { v } from "convex/values"; // Domain to publisher name mapping @@ -385,7 +385,7 @@ export const batchUpdateKnownLocations = internalAction({ console.log("[batchUpdateKnownLocations] Starting..."); - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours: 720, limit: 100, }); @@ -453,7 +453,7 @@ export const batchBackfillAll = internalAction({ console.log(`[batchBackfill] Starting... (dryRun: ${dryRun})`); // Get all recent events - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours, limit, }); diff --git a/backend/convex/domains/enrichment/betterSectorClassifier.ts b/backend/convex/domains/enrichment/betterSectorClassifier.ts index dd9c811ce..e694eb752 100644 --- a/backend/convex/domains/enrichment/betterSectorClassifier.ts +++ b/backend/convex/domains/enrichment/betterSectorClassifier.ts @@ -5,7 +5,7 @@ */ import { internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { v } from "convex/values"; // Manual sector overrides based on known company types @@ -72,7 +72,7 @@ export const improveSectorClassification = internalAction({ handler: async (ctx) => { console.log("[improveSector] Starting sector reclassification..."); - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours: 720, limit: 100, }); diff --git a/backend/convex/domains/enrichment/enrichmentWorker.ts b/backend/convex/domains/enrichment/enrichmentWorker.ts index ee14df5cf..02e14a1c3 100644 --- a/backend/convex/domains/enrichment/enrichmentWorker.ts +++ b/backend/convex/domains/enrichment/enrichmentWorker.ts @@ -6,7 +6,7 @@ */ import { v } from "convex/values"; import { internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { Id } from "../../_generated/dataModel"; import { enrichHighPriorityPool, enrichBackfillPool } from "./workpools"; @@ -30,7 +30,7 @@ export const processJob = internalAction({ }, handler: async (ctx, args) => { // Get the job - const job = await ctx.runQuery(internal.domains.enrichment.enrichmentQueue.getJob, { + const job = await ctx.runQuery(api.domains.enrichment.enrichmentQueue.getJob, { jobId: args.enrichmentJobId, }); @@ -284,7 +284,7 @@ export const startBatchProcessing = internalAction({ // Get pending jobs const pendingJobs = await ctx.runQuery( - internal.domains.enrichment.enrichmentQueue.getRetryableJobs, + api.domains.enrichment.enrichmentQueue.getRetryableJobs, { limit } ); diff --git a/backend/convex/domains/enrichment/fundingDetection.ts b/backend/convex/domains/enrichment/fundingDetection.ts index 3f7de2eb3..4f76fd6ba 100644 --- a/backend/convex/domains/enrichment/fundingDetection.ts +++ b/backend/convex/domains/enrichment/fundingDetection.ts @@ -6,7 +6,7 @@ */ import { v } from "convex/values"; import { internalAction, internalMutation, internalQuery } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { Id } from "../../_generated/dataModel"; // Funding keywords with weight @@ -280,7 +280,7 @@ export const detectFundingCandidates = internalAction({ if (candidates.length > 0) { const toEnqueue = candidates.slice(0, 20).map((c) => c.feedItemId); const result = await ctx.runMutation( - internal.domains.enrichment.enrichmentQueue.bulkEnqueueFundingDetection, + api.domains.enrichment.enrichmentQueue.bulkEnqueueFundingDetection, { feedItemIds: toEnqueue, priority: 5, diff --git a/backend/convex/domains/enrichment/fundingVerification.ts b/backend/convex/domains/enrichment/fundingVerification.ts index 14640aa64..b53d1bd12 100644 --- a/backend/convex/domains/enrichment/fundingVerification.ts +++ b/backend/convex/domains/enrichment/fundingVerification.ts @@ -327,7 +327,18 @@ export const batchVerifyFundingEvents = internalAction({ minConfidence: v.optional(v.number()), limit: v.optional(v.number()), }, - handler: async (ctx, args) => { + handler: async (ctx, args): Promise<{ + total: number; + verified: number; + failed: number; + results: Array<{ + fundingEventId: string; + companyName: string; + verified: boolean; + newConfidence: number; + error?: string; + }>; + }> => { const lookbackMs = (args.lookbackHours ?? 24) * 60 * 60 * 1000; const cutoff = Date.now() - lookbackMs; diff --git a/backend/convex/domains/enrichment/llmEnrichment.ts b/backend/convex/domains/enrichment/llmEnrichment.ts index 4a8bcacad..24d44a6e7 100644 --- a/backend/convex/domains/enrichment/llmEnrichment.ts +++ b/backend/convex/domains/enrichment/llmEnrichment.ts @@ -8,7 +8,7 @@ */ import { internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { v } from "convex/values"; /** @@ -169,7 +169,7 @@ export const batchEnrichTechnologyCompanies = internalAction({ console.log(`[batchEnrichTechnology] Starting... (dryRun: ${dryRun})`); // Get all events - const allEvents = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const allEvents = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours, limit, }); diff --git a/backend/convex/domains/enrichment/quickVerificationUpgrade.ts b/backend/convex/domains/enrichment/quickVerificationUpgrade.ts index a33fc19d8..59fd7b85d 100644 --- a/backend/convex/domains/enrichment/quickVerificationUpgrade.ts +++ b/backend/convex/domains/enrichment/quickVerificationUpgrade.ts @@ -10,7 +10,7 @@ */ import { internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { v } from "convex/values"; export const upgradeVerificationStatus = internalAction({ @@ -18,7 +18,7 @@ export const upgradeVerificationStatus = internalAction({ handler: async (ctx) => { console.log("[upgradeVerification] Starting..."); - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours: 720, limit: 100, }); diff --git a/backend/convex/domains/enrichment/useOfProceedsExtractor.ts b/backend/convex/domains/enrichment/useOfProceedsExtractor.ts index 42562852f..884199717 100644 --- a/backend/convex/domains/enrichment/useOfProceedsExtractor.ts +++ b/backend/convex/domains/enrichment/useOfProceedsExtractor.ts @@ -6,7 +6,7 @@ */ import { internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { v } from "convex/values"; // Common use of proceeds patterns @@ -36,7 +36,7 @@ export const extractUseOfProceeds = internalAction({ handler: async (ctx) => { console.log("[extractUseOfProceeds] Starting..."); - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours: 720, limit: 100, }); diff --git a/backend/convex/domains/evaluation/benchmarkHarness.ts b/backend/convex/domains/evaluation/benchmarkHarness.ts index 763099059..90f31c81a 100644 --- a/backend/convex/domains/evaluation/benchmarkHarness.ts +++ b/backend/convex/domains/evaluation/benchmarkHarness.ts @@ -11,7 +11,7 @@ import { v } from "convex/values"; import { internalMutation, internalQuery, internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { Doc, Id } from "../../_generated/dataModel"; // ═══════════════════════════════════════════════════════════════════════════ @@ -495,7 +495,7 @@ export const executeToolHealthTask = internalAction({ try { // Get tool health snapshot const health = await ctx.runQuery( - internal.domains.agents.orchestrator.toolHealth.getToolHealthSnapshot, + api.domains.agents.orchestrator.toolHealth.getToolHealthSnapshot, {} ); diff --git a/backend/convex/domains/evaluation/financial/dcfEngine.ts b/backend/convex/domains/evaluation/financial/dcfEngine.ts index b979f917e..ee1ab0ffd 100644 --- a/backend/convex/domains/evaluation/financial/dcfEngine.ts +++ b/backend/convex/domains/evaluation/financial/dcfEngine.ts @@ -653,7 +653,7 @@ export const runDcfCalculation = internalAction({ const version = existingModels.length + 1; // Store DCF model - const dcfModelDbId = await ctx.runMutation( + const dcfModelDbId: Id<"dcfModels"> = await ctx.runMutation( internal.domains.evaluation.financial.dcfEngine.createDcfModel, { modelId, diff --git a/backend/convex/domains/evaluation/financial/reproPack.ts b/backend/convex/domains/evaluation/financial/reproPack.ts index 4509cedea..c03316f3b 100644 --- a/backend/convex/domains/evaluation/financial/reproPack.ts +++ b/backend/convex/domains/evaluation/financial/reproPack.ts @@ -13,7 +13,7 @@ */ import { internalQuery, internalMutation, mutation, query, action } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import { v } from "convex/values"; /** @@ -210,7 +210,7 @@ export const validateReproPack = action({ errors: v.array(v.string()), }), handler: async (ctx, args) => { - const pack = await ctx.runQuery(internal.domains.evaluation.financial.reproPack.getReproPack, { + const pack = await ctx.runQuery(api.domains.evaluation.financial.reproPack.getReproPack, { packId: args.packId, }); diff --git a/backend/convex/domains/evaluation/financial/sourceQuality.ts b/backend/convex/domains/evaluation/financial/sourceQuality.ts index a3a265572..2fe73341f 100644 --- a/backend/convex/domains/evaluation/financial/sourceQuality.ts +++ b/backend/convex/domains/evaluation/financial/sourceQuality.ts @@ -16,7 +16,7 @@ */ import { internalQuery, internalMutation, query, action } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import { v } from "convex/values"; // Tier definitions @@ -455,7 +455,7 @@ export const scoreDCFSourceQuality = action({ // Classify source const classification = await ctx.runAction( - internal.domains.evaluation.financial.sourceQuality.classifySource, + api.domains.evaluation.financial.sourceQuality.classifySource, { url: artifact.sourceUrl || "", sourceDate: artifact.fetchedAt ? new Date(artifact.fetchedAt).toISOString() : undefined, diff --git a/backend/convex/domains/evaluation/inference/llmJudge.ts b/backend/convex/domains/evaluation/inference/llmJudge.ts index db1204057..ae3f21f64 100644 --- a/backend/convex/domains/evaluation/inference/llmJudge.ts +++ b/backend/convex/domains/evaluation/inference/llmJudge.ts @@ -20,7 +20,7 @@ import { v } from "convex/values"; import { internalAction } from "../../../_generated/server"; -import { api } from "../../../_generated/api"; +import { internal, api } from "../../../_generated/api"; import { DDClaim, DDRiskSignal, DDRiskCategory } from "../../agents/dueDiligence/types"; import { SourceCitation } from "../scoring/claimLifecycle"; @@ -492,7 +492,7 @@ export const batchEvaluateClaims = internalAction({ // Evaluate claims in batches to avoid rate limits for (const claim of args.claims) { const verdict = await ctx.runAction( - api.domains.evaluation.inference.llmJudge.evaluateClaim, + internal.domains.evaluation.inference.llmJudge.evaluateClaim, { entityName: args.entityName, claim, diff --git a/backend/convex/domains/graph/expandEntity.ts b/backend/convex/domains/graph/expandEntity.ts index 366ac54ba..09c5d61f2 100644 --- a/backend/convex/domains/graph/expandEntity.ts +++ b/backend/convex/domains/graph/expandEntity.ts @@ -25,7 +25,7 @@ import { mutation, query, } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { searchWithFallback, readBoundedResponse, @@ -154,13 +154,13 @@ export const executeExpansion = internalAction({ const linkupKey = process.env.LINKUP_API_KEY; // Load the run record - const run = await ctx.runQuery(internal.domains.graph.expandEntity.internalGetRun, { + const run = await ctx.runQuery(api.domains.graph.expandEntity.internalGetRun, { runId: args.expansionRunId, }); if (!run || run.status !== "queued") return; // Load entity profile - const entity = await ctx.runQuery(internal.domains.graph.expandEntity.internalGetEntity, { + const entity = await ctx.runQuery(api.domains.graph.expandEntity.internalGetEntity, { entityId: run.targetEntityId, }); if (!entity) { diff --git a/backend/convex/domains/integrations/__tests__/telegramAdmission.test.ts b/backend/convex/domains/integrations/__tests__/telegramAdmission.test.ts new file mode 100644 index 000000000..733de05d9 --- /dev/null +++ b/backend/convex/domains/integrations/__tests__/telegramAdmission.test.ts @@ -0,0 +1,233 @@ +/// +// @vitest-environment node +import { convexTest } from "convex-test"; +import { httpRouter } from "convex/server"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import schema from "../../../schema"; +import { internal } from "../../../_generated/api"; +import * as telegram from "../telegram"; +import { telegramWebhookHandler } from "../telegramAgent"; + +const modules = Object.fromEntries(Object.entries(import.meta.glob("../../../**/*.{ts,js}")) + .map(([key, loader]) => { + const parts = key.replace(/^\.\//, "").split("/"); + const base = ["domains", "integrations", "__tests__"]; + while (parts[0] === "..") { parts.shift(); base.pop(); } + return [[...base, ...parts].join("/"), loader]; + })); +// Mount the actual handler on the same path without loading unrelated provider +// components. The tested storage, actions and mutations are the real modules. +modules["http.ts"] = async () => { + const router = httpRouter(); + router.route({ path: "/telegram/webhook", method: "POST", handler: telegramWebhookHandler }); + return { default: router }; +}; +const ops = internal.domains.integrations.telegram; +const secret = "fixture-webhook-secret-not-a-credential"; +const fixture = () => convexTest({ schema, modules, transactionLimits: true }); +const update = (text = "/start", id = 41001, sequence = 1) => ({ + update_id: sequence, + message: { message_id: sequence, date: 1, from: { id, is_bot: false, first_name: "Fixture" }, chat: { id, type: "private" }, text }, +}); +const callback = () => ({ update_id: 2, callback_query: { + id: "fixture-button", from: { id: 41001, is_bot: false, first_name: "Fixture" }, + message: { message_id: 1, date: 1, chat: { id: 41001, type: "private" } }, data: "refresh", +} }); +function post(t: ReturnType, body: unknown, suppliedSecret: string | null = secret) { + return t.fetch("/telegram/webhook", { + method: "POST", headers: { "Content-Type": "application/json", ...(suppliedSecret === null ? {} : { "X-Telegram-Bot-Api-Secret-Token": suppliedSecret }) }, + body: typeof body === "string" ? body : JSON.stringify(body), + }); +} +const sentBodies: Record[] = []; +let provider: ReturnType; +beforeEach(() => { + vi.stubEnv("TELEGRAM_BOT_TOKEN", "000000:fixture-token"); + vi.stubEnv("TELEGRAM_WEBHOOK_SECRET", secret); + sentBodies.length = 0; + provider = vi.fn(async (url: unknown, init?: RequestInit) => { + sentBodies.push(JSON.parse(String(init?.body))); + const method = String(url).split("/").at(-1); + const result = ["answerCallbackQuery", "setWebhook", "deleteWebhook"].includes(method ?? "") + ? true + : { message_id: sentBodies.length, date: 1, chat: { id: 41001, type: "private" } }; + return new Response(JSON.stringify({ ok: true, result }), { status: 200 }); + }); + vi.stubGlobal("fetch", provider); +}); +afterEach(() => { vi.useRealTimers(); vi.unstubAllGlobals(); vi.unstubAllEnvs(); }); + +describe("a bot user and an unrelated website visitor at the Telegram boundary", () => { + it.each([null, "forged-secret"])("rejects a visitor using %s before any provider work", async supplied => { + const response = await post(fixture(), update(), supplied); + expect([401, 403]).toContain(response.status); + expect(provider).not.toHaveBeenCalled(); + }); + it.each(["", "contains spaces", "x".repeat(257)])("holds unusable server configuration before parsing a body", async configured => { + vi.stubEnv("TELEGRAM_WEBHOOK_SECRET", configured); + const response = await post(fixture(), "{not-json"); + expect(response.status).toBe(503); + expect(provider).not.toHaveBeenCalled(); + }); + it.each(["{", "null", "[]", JSON.stringify({ update_id: "wrong" }), JSON.stringify({ update_id: 1, message: { text: "/start" } }), JSON.stringify({ update_id: 1, callback_query: { id: "x", data: "refresh" } })])("rejects malformed authenticated input %s without calling providers", async body => { + expect((await post(fixture(), body)).status).toBe(400); + expect(provider).not.toHaveBeenCalled(); + }); + it("bounds an authenticated body even without a Content-Length header", async () => { + expect((await post(fixture(), JSON.stringify(update("x".repeat(256 * 1024))))).status).toBe(413); + expect(provider).not.toHaveBeenCalled(); + }); + it("explicitly ignores an authentic unsupported update without reporting provider work", async () => { + const response = await post(fixture(), { update_id: 4, edited_message: { text: "edit" } }); + expect(response.status).toBe(204); + expect(provider).not.toHaveBeenCalled(); + }); + it("keeps all data and bot-management registrations internal", () => { + // convex-test itself permits internal references; it does not emulate + // the deployment HTTP API's visibility enforcement. Inspect registrations. + for (const name of ["registerTelegramUser", "getTelegramUser", "toggleNotifications", "getRecentMessages", "setWebhook", "getWebhookInfo", "deleteWebhook", "getBotInfo", "isConfigured"] as const) { + expect(telegram[name], name).toHaveProperty("isInternal", true); + expect(telegram[name], name).not.toHaveProperty("isPublic", true); + } + }); + it("registers a real chat, stops notifications and re-enables them with /start", async () => { + const t = fixture(); + expect((await post(t, update())).status).toBe(200); + const first = await t.query(ops.getTelegramUser, { telegramChatId: "41001" }); + expect(first).toMatchObject({ notificationsEnabled: true }); + expect((await post(t, update("/stop", 41001, 2))).status).toBe(200); + expect(await t.query(ops.getTelegramUser, { telegramChatId: "41001" })).toMatchObject({ _id: first?._id, notificationsEnabled: false }); + expect((await post(t, update("/start", 41001, 3))).status).toBe(200); + expect(await t.query(ops.getTelegramUser, { telegramChatId: "41001" })).toMatchObject({ _id: first?._id, notificationsEnabled: true }); + expect(sentBodies).toHaveLength(3); + }); + it("keeps independent chats isolated across overlapping registration and successive history reads", async () => { + const t = fixture(); + await Promise.all(Array.from({ length: 24 }, (_, n) => t.mutation(ops.registerTelegramUser, { telegramChatId: String(42000 + n % 4) }))); + expect(await t.run(ctx => ctx.db.query("telegramUsers").collect())).toHaveLength(4); + for (let round = 0; round < 8; round++) { + await Promise.all(Array.from({ length: 20 }, (_, n) => t.mutation(ops.logTelegramMessage, { + telegramChatId: String(42000 + n % 4), messageText: `round-${round}-chat-${n % 4}`, messageType: "incoming", messageId: round * 20 + n, + }))); + for (let chat = 0; chat < 4; chat++) { + const history = await t.query(ops.getRecentMessages, { telegramChatId: String(42000 + chat), limit: 10 }); + expect(history.length).toBeLessThanOrEqual(10); + expect(history.every(row => row.telegramChatId === String(42000 + chat) && row.messageText.endsWith(`chat-${chat}`))).toBe(true); + } + } + expect(await t.run(ctx => ctx.db.query("telegramMessages").collect())).toHaveLength(160); + }, 30000); + it.each([0, -1, 1.5, 101, 1e9])("rejects an invalid history size %s instead of an unbounded read", async limit => { + await expect(fixture().query(ops.getRecentMessages, { telegramChatId: "41001", limit })).rejects.toThrow(); + }); + it("handles an authentic button through its actual acknowledgement and response actions", async () => { + expect((await post(fixture(), callback())).status).toBe(200); + expect(sentBodies).toHaveLength(2); + expect(sentBodies[0]).toMatchObject({ callback_query_id: "fixture-button" }); + expect(sentBodies[1]).toMatchObject({ chat_id: "41001" }); + }); + it.each([update(), callback(), update("research request")])("does not acknowledge failed delivery as successful webhook work", async body => { + provider.mockImplementation(async () => new Response(JSON.stringify({ ok: false, description: "fixture rejection" }), { status: 200 })); + const t = fixture(); + const response = await post(t, body); + expect(response.status).toBeGreaterThanOrEqual(500); + const messages = await t.run(ctx => ctx.db.query("telegramMessages").collect()); + expect(messages.filter(row => row.messageType === "outgoing")).toEqual([]); + }); + it.each(["/start", "/help", "/status", "research request"])("reports the implemented capabilities honestly for %s", async text => { + expect((await post(fixture(), update(text))).status).toBe(200); + const copy = sentBodies.map(body => body.text ?? "").join("\n"); + expect(copy).not.toMatch(/Searching\.\.\.|Active \(FREE\)|Ready for queries|I'll find the answers|Free-tier search across/i); + expect(copy).toMatch(/not (yet )?(available|connected|implemented)|unavailable|not enabled/i); + }); + it("retains the capability disclosure when a long user query consumes the reply budget", async () => { + expect((await post(fixture(), update("q".repeat(4096)))).status).toBe(200); + const reply = String(sentBodies.at(-1)?.text ?? ""); + expect(reply.length).toBeLessThanOrEqual(4096); + expect(reply).toMatch(/not (yet )?(available|connected|implemented)|unavailable|not enabled/i); + }); +}); + +describe("an operator configuring the same admitted Telegram ingress", () => { + it("sets the configured secret and retains pending messages", async () => { + expect(await fixture().action(ops.setWebhook, { webhookUrl: "https://fixture.example/telegram/webhook" })).toMatchObject({ ok: true }); + expect(sentBodies[0]).toMatchObject({ secret_token: secret }); + expect(sentBodies[0].drop_pending_updates).not.toBe(true); + }); + it("holds setup when the secret is absent instead of configuring an unauthenticated hook", async () => { + vi.stubEnv("TELEGRAM_WEBHOOK_SECRET", ""); + expect(await fixture().action(ops.setWebhook, { webhookUrl: "https://fixture.example/telegram/webhook" })).toMatchObject({ ok: false }); + expect(provider).not.toHaveBeenCalled(); + }); + it.each(["http://fixture.example/telegram/webhook", "file:///private", "https://user:pass@fixture.example/"])("rejects an invalid webhook URL %s before contacting Telegram", async webhookUrl => { + expect(await fixture().action(ops.setWebhook, { webhookUrl })).toMatchObject({ ok: false }); + expect(provider).not.toHaveBeenCalled(); + }); + it.each([503, 429])("does not trust ok:true in a failed HTTP%s provider reply", async status => { + provider.mockImplementation(async () => new Response(JSON.stringify({ ok: true, result: { message_id: 7 } }), { status })); + expect(await fixture().action(ops.sendMessage, { chatId: "41001", text: "Fixture" })).toMatchObject({ sent: false }); + }); + it("caps a large provider response before it can become a false sent result", async () => { + provider.mockImplementation(async () => new Response(JSON.stringify({ ok: true, result: { message_id: 7 }, padding: "x".repeat(2 * 1024 * 1024) }))); + expect(await fixture().action(ops.sendMessage, { chatId: "41001", text: "Fixture" })).toMatchObject({ sent: false }); + }); + it.each([null, [], { ok: "true", result: { message_id: 7 } }, { ok: true }, { ok: true, result: true }, { ok: true, result: { message_id: "7" } }, { ok: true, result: { message_id: 1.5 } }].map(body => [body]))("does not treat a malformed provider body as delivered: %j", async body => { + provider.mockImplementation(async () => new Response(JSON.stringify(body))); + expect(await fixture().action(ops.sendMessage, { chatId: "41001", text: "Fixture" })).toMatchObject({ sent: false }); + }); + it("does not acknowledge a button when the provider returned an unsuccessful result", async () => { + provider.mockImplementation(async () => new Response(JSON.stringify({ ok: true, result: false }))); + expect((await post(fixture(), callback())).status).toBeGreaterThanOrEqual(500); + }); + it("does not follow a provider redirect carrying the bot credential in its URL", async () => { + await fixture().action(ops.sendMessage, { chatId: "41001", text: "Fixture" }); + expect(provider.mock.calls[0][1]).toMatchObject({ redirect: "error" }); + }); + it.each(["headers", "body"])("releases a stalled provider %s at its finite deadline", async stage => { + vi.useFakeTimers(); + let cancelled = false; + provider.mockImplementation(async (_url: unknown, init?: RequestInit) => { + if (stage === "headers") { + return new Promise((_resolve, reject) => { + init?.signal?.addEventListener("abort", () => { + cancelled = true; + reject(new DOMException("fixture aborted", "AbortError")); + }, { once: true }); + }); + } + return new Response(new ReadableStream({ cancel() { cancelled = true; } })); + }); + const result = fixture().action(ops.sendMessage, { chatId: "41001", text: "Fixture" }); + await vi.waitFor(() => expect(provider).toHaveBeenCalled()); + await vi.advanceTimersByTimeAsync(15000); + expect(await result).toMatchObject({ sent: false }); + expect(cancelled).toBe(true); + expect(vi.getTimerCount()).toBe(0); + }); + it("contains successive overlapping network failures without accumulating timers or success claims", async () => { + vi.useFakeTimers(); + provider.mockImplementation(async () => { throw new Error("fixture offline"); }); + const t = fixture(); + for (let round = 0; round < 5; round++) { + const replies = await Promise.all(Array.from({ length: 10 }, () => t.action(ops.sendMessage, { chatId: "41001", text: `Fixture ${round}` }))); + expect(replies.every(reply => reply.sent === false)).toBe(true); + expect(vi.getTimerCount()).toBe(0); + } + expect(provider).toHaveBeenCalledTimes(50); + }); + it("releases a stalled authenticated request body before any provider action", async () => { + vi.useFakeTimers(); + let cancelled = false; + const body = new ReadableStream({ cancel() { cancelled = true; } }); + const init: RequestInit & { duplex: "half" } = { + method: "POST", duplex: "half", headers: { "Content-Type": "application/json", "X-Telegram-Bot-Api-Secret-Token": secret }, body, + }; + const response = fixture().fetch("/telegram/webhook", init); + await vi.waitFor(() => expect(vi.getTimerCount()).toBeGreaterThan(0)); + await vi.advanceTimersByTimeAsync(15000); + expect((await response).status).toBe(408); + expect(cancelled).toBe(true); + expect(provider).not.toHaveBeenCalled(); + expect(vi.getTimerCount()).toBe(0); + }); +}); diff --git a/backend/convex/domains/integrations/discordAgent.ts b/backend/convex/domains/integrations/discordAgent.ts index d61d3330d..ed00098d7 100644 --- a/backend/convex/domains/integrations/discordAgent.ts +++ b/backend/convex/domains/integrations/discordAgent.ts @@ -17,7 +17,7 @@ import { v } from "convex/values"; import { internalAction, httpAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { DiscordInteraction, DiscordEmbed } from "./discord"; import { InteractionType, @@ -186,7 +186,7 @@ export const handleSlashCommand = internalAction({ }); // Register/update user - await ctx.runMutation(internal.domains.integrations.discord.registerDiscordUser, { + await ctx.runMutation(api.domains.integrations.discord.registerDiscordUser, { discordUserId: userId, discordUsername: username, discordGuildId: interaction.guild_id, @@ -604,7 +604,7 @@ export const sendDiscordNotification = internalAction({ handler: async (ctx, args) => { // Check if user has notifications enabled (if targeting a user) if (args.discordUserId) { - const user = await ctx.runQuery(internal.domains.integrations.discord.getDiscordUser, { + const user = await ctx.runQuery(api.domains.integrations.discord.getDiscordUser, { discordUserId: args.discordUserId, }); diff --git a/backend/convex/domains/integrations/telegram.ts b/backend/convex/domains/integrations/telegram.ts index ac7326584..732884509 100644 --- a/backend/convex/domains/integrations/telegram.ts +++ b/backend/convex/domains/integrations/telegram.ts @@ -1,8 +1,8 @@ /** * Telegram Bot Integration * - * 100% FREE unlimited messaging via Telegram Bot API. - * Enables bidirectional mobile communication with your app. + * Server-side messaging via the configured Telegram Bot API. + * Delivery is subject to provider availability and rate limits. * * Features: * - Send messages with Markdown/HTML formatting @@ -14,16 +14,21 @@ * 1. Message @BotFather on Telegram: /newbot * 2. Set name and username (must end in "bot") * 3. Copy API token → TELEGRAM_BOT_TOKEN env var - * 4. Set webhook via setWebhook endpoint + * 4. Configure TELEGRAM_WEBHOOK_SECRET and use the internal setWebhook action * * @see https://core.telegram.org/bots/api * @module integrations/telegram */ import { v } from "convex/values"; -import { action, internalAction, mutation, query, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; -import { Doc } from "../../_generated/dataModel"; +import { internalAction, internalQuery, internalMutation } from "../../_generated/server"; +import { + getTelegramWebhookSecret, + readTelegramJson, + TELEGRAM_RESPONSE_MAX_BYTES, + TelegramHttpError, + withTelegramDeadline, +} from "./telegramHttp"; // ═══════════════════════════════════════════════════════════════════════════ // TYPES @@ -85,14 +90,19 @@ interface TelegramMessage { }>; } -/** Telegram update object (webhook payload) */ +/** Fields consumed by this integration from a Telegram webhook update. */ export interface TelegramUpdate { update_id: number; - message?: TelegramMessage; + message?: { + message_id: number; + chat: { id: number }; + text?: string; + from?: { id: number; username?: string; first_name?: string }; + }; callback_query?: { id: string; - from: TelegramMessage["from"]; - message?: TelegramMessage; + from: { id: number }; + message?: { chat: { id: number } }; data?: string; }; } @@ -103,32 +113,69 @@ export interface TelegramUpdate { function getBotToken(): string { const token = process.env.TELEGRAM_BOT_TOKEN; - if (!token) { - throw new Error("TELEGRAM_BOT_TOKEN environment variable is not set"); + if (!token || token.length > 256 || !/^[A-Za-z0-9:_-]+$/.test(token)) { + throw new TelegramHttpError(503, "Telegram bot token is not configured correctly"); } return token; } +/** Check the fields callers use before an ok:true provider result is trusted. */ +function validTelegramResult(method: string, result: unknown): boolean { + if (["answerCallbackQuery", "setWebhook", "deleteWebhook"].includes(method)) { + return result === true; + } + if (!result || typeof result !== "object" || Array.isArray(result)) return false; + const value = result as Record; + switch (method) { + case "sendMessage": + case "sendPhoto": + return typeof value.message_id === "number" && Number.isSafeInteger(value.message_id) && value.message_id >= 0; + case "getWebhookInfo": + return typeof value.url === "string" && typeof value.pending_update_count === "number" && + Number.isSafeInteger(value.pending_update_count) && value.pending_update_count >= 0; + case "getMe": + return typeof value.id === "number" && Number.isSafeInteger(value.id) && value.id > 0 && + value.is_bot === true && typeof value.first_name === "string" && + (value.username === undefined || typeof value.username === "string"); + default: + return false; + } +} + async function callTelegramApi( method: string, body: Record ): Promise> { + const methods = ["sendMessage", "sendPhoto", "answerCallbackQuery", "setWebhook", "getWebhookInfo", "deleteWebhook", "getMe"]; + if (!methods.includes(method)) throw new Error("Unsupported Telegram method"); const token = getBotToken(); const url = `https://api.telegram.org/bot${token}/${method}`; - - const response = await fetch(url, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), + return withTelegramDeadline(async signal => { + const response = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + redirect: "error", + signal, + }); + const data = await readTelegramJson(response, TELEGRAM_RESPONSE_MAX_BYTES, signal); + if (!response.ok) { + throw new TelegramHttpError(502, `Telegram returned HTTP ${response.status}`); + } + if (!data || typeof data !== "object" || !("ok" in data) || typeof data.ok !== "boolean") { + throw new TelegramHttpError(502, "Invalid Telegram response"); + } + const payload = data as { ok: boolean; result?: T }; + if (payload.ok && !validTelegramResult(method, payload.result)) { + throw new TelegramHttpError(502, "Invalid Telegram result"); + } + return { + ok: payload.ok, + result: payload.result, + // Provider error text can echo request data. Keep it out of callers/logs. + description: payload.ok ? undefined : "Telegram rejected the request", + }; }); - - const data: TelegramResponse = await response.json(); - - if (!data.ok) { - console.error(`[Telegram] API error: ${data.description}`, { method, error_code: data.error_code }); - } - - return data; } // ═══════════════════════════════════════════════════════════════════════════ @@ -162,13 +209,12 @@ export const sendMessage = internalAction({ const response = await callTelegramApi("sendMessage", body); if (response.ok && response.result) { - console.log(`[Telegram] Message sent to ${args.chatId}, messageId: ${response.result.message_id}`); return { sent: true, messageId: response.result.message_id }; } return { sent: false, error: response.description }; } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); + const errorMsg = error instanceof TelegramHttpError ? error.message : "Telegram request failed"; console.error("[Telegram] sendMessage failed:", errorMsg); return { sent: false, error: errorMsg }; } @@ -219,7 +265,7 @@ export const sendMessageWithButtons = internalAction({ return { sent: false, error: response.description }; } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); + const errorMsg = error instanceof TelegramHttpError ? error.message : "Telegram request failed"; return { sent: false, error: errorMsg }; } }, @@ -253,7 +299,7 @@ export const sendPhoto = internalAction({ return { sent: false, error: response.description }; } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); + const errorMsg = error instanceof TelegramHttpError ? error.message : "Telegram request failed"; return { sent: false, error: errorMsg }; } }, @@ -293,25 +339,30 @@ export const answerCallbackQuery = internalAction({ * Set the webhook URL for receiving updates. * Call this once after deployment to configure Telegram. */ -export const setWebhook = action({ +export const setWebhook = internalAction({ args: { webhookUrl: v.string(), }, handler: async (ctx, args): Promise<{ ok: boolean; description?: string }> => { try { + const secret = getTelegramWebhookSecret(); + const webhookUrl = new URL(args.webhookUrl); + if (webhookUrl.protocol !== "https:" || webhookUrl.username || webhookUrl.password) { + throw new TelegramHttpError(400, "Webhook URL must use HTTPS without credentials"); + } const response = await callTelegramApi("setWebhook", { - url: args.webhookUrl, + url: webhookUrl.href, + secret_token: secret, allowed_updates: ["message", "callback_query"], - drop_pending_updates: true, }); if (response.ok) { - console.log(`[Telegram] Webhook set to: ${args.webhookUrl}`); + console.log("[Telegram] Webhook configured"); } return { ok: response.ok, description: response.description }; } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); + const errorMsg = error instanceof TelegramHttpError ? error.message : "Telegram request failed"; return { ok: false, description: errorMsg }; } }, @@ -320,7 +371,7 @@ export const setWebhook = action({ /** * Get current webhook info. */ -export const getWebhookInfo = action({ +export const getWebhookInfo = internalAction({ args: {}, handler: async (ctx): Promise<{ ok: boolean; webhookUrl?: string; pendingUpdates?: number }> => { try { @@ -352,13 +403,11 @@ export const getWebhookInfo = action({ /** * Delete the current webhook. */ -export const deleteWebhook = action({ +export const deleteWebhook = internalAction({ args: {}, handler: async (ctx): Promise<{ ok: boolean }> => { try { - const response = await callTelegramApi("deleteWebhook", { - drop_pending_updates: true, - }); + const response = await callTelegramApi("deleteWebhook", {}); return { ok: response.ok }; } catch (error) { return { ok: false }; @@ -373,7 +422,7 @@ export const deleteWebhook = action({ /** * Store a user's Telegram chat ID for notifications. */ -export const registerTelegramUser = mutation({ +export const registerTelegramUser = internalMutation({ args: { telegramChatId: v.string(), telegramUsername: v.optional(v.string()), @@ -384,7 +433,7 @@ export const registerTelegramUser = mutation({ const existing = await ctx.db .query("telegramUsers") .withIndex("by_chat_id", (q) => q.eq("telegramChatId", args.telegramChatId)) - .first() as Doc<"telegramUsers"> | null; + .first(); if (existing) { // Update existing @@ -413,7 +462,7 @@ export const registerTelegramUser = mutation({ /** * Get Telegram user by chat ID. */ -export const getTelegramUser = query({ +export const getTelegramUser = internalQuery({ args: { telegramChatId: v.string(), }, @@ -421,14 +470,14 @@ export const getTelegramUser = query({ return await ctx.db .query("telegramUsers") .withIndex("by_chat_id", (q) => q.eq("telegramChatId", args.telegramChatId)) - .first() as Doc<"telegramUsers"> | null; + .first(); }, }); /** * Toggle notifications for a Telegram user. */ -export const toggleNotifications = mutation({ +export const toggleNotifications = internalMutation({ args: { telegramChatId: v.string(), enabled: v.boolean(), @@ -437,7 +486,7 @@ export const toggleNotifications = mutation({ const user = await ctx.db .query("telegramUsers") .withIndex("by_chat_id", (q) => q.eq("telegramChatId", args.telegramChatId)) - .first() as Doc<"telegramUsers"> | null; + .first(); if (user) { await ctx.db.patch(user._id, { @@ -480,19 +529,22 @@ export const logTelegramMessage = internalMutation({ /** * Get recent messages for a chat. */ -export const getRecentMessages = query({ +export const getRecentMessages = internalQuery({ args: { telegramChatId: v.string(), limit: v.optional(v.number()), }, handler: async (ctx, args) => { - const limit = args.limit || 20; + const limit = args.limit ?? 20; + if (!Number.isInteger(limit) || limit < 1 || limit > 100) { + throw new Error("History limit must be an integer from 1 to 100"); + } return await ctx.db .query("telegramMessages") .withIndex("by_chat_id", (q) => q.eq("telegramChatId", args.telegramChatId)) .order("desc") - .take(limit) as Doc<"telegramMessages">[]; + .take(limit); }, }); @@ -503,7 +555,7 @@ export const getRecentMessages = query({ /** * Check if Telegram integration is configured. */ -export const isConfigured = action({ +export const isConfigured = internalAction({ args: {}, handler: async (ctx): Promise<{ configured: boolean }> => { try { @@ -518,7 +570,7 @@ export const isConfigured = action({ /** * Get bot information. */ -export const getBotInfo = action({ +export const getBotInfo = internalAction({ args: {}, handler: async (ctx) => { try { @@ -526,7 +578,7 @@ export const getBotInfo = action({ id: number; is_bot: boolean; first_name: string; - username: string; + username?: string; can_join_groups: boolean; can_read_all_group_messages: boolean; supports_inline_queries: boolean; @@ -545,7 +597,7 @@ export const getBotInfo = action({ return { ok: false, error: response.description }; } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); + const errorMsg = error instanceof TelegramHttpError ? error.message : "Telegram request failed"; return { ok: false, error: errorMsg }; } }, diff --git a/backend/convex/domains/integrations/telegramAgent.ts b/backend/convex/domains/integrations/telegramAgent.ts index a7694827a..9732c4041 100644 --- a/backend/convex/domains/integrations/telegramAgent.ts +++ b/backend/convex/domains/integrations/telegramAgent.ts @@ -1,24 +1,31 @@ /** * Telegram Agent Handler * - * Processes incoming Telegram messages through the agent system. - * Enables natural language queries like "who raised money today?" + * Processes admitted Telegram commands and notification preferences. + * Research queries currently receive an explicit unavailable response. * * Flow: * 1. User sends message to Telegram bot * 2. Telegram webhook → HTTP handler → this module - * 3. Parse message, route to coordinator agent - * 4. Agent processes with FREE-FIRST search tools - * 5. Format response for Telegram (Markdown) - * 6. Send reply back to user + * 3. Authenticate and validate the update before dispatch + * 4. Handle the command or disclose unavailable research integration + * 5. Acknowledge successful delivery; failures remain retryable * * @module integrations/telegramAgent */ import { v } from "convex/values"; import { internalAction, httpAction } from "../../_generated/server"; +import type { ActionCtx } from "../../_generated/server"; import { internal } from "../../_generated/api"; import type { TelegramUpdate } from "./telegram"; +import { + getTelegramWebhookSecret, + readTelegramJson, + TELEGRAM_UPDATE_MAX_BYTES, + TelegramHttpError, + withTelegramDeadline, +} from "./telegramHttp"; // ═══════════════════════════════════════════════════════════════════════════ // CONSTANTS @@ -38,36 +45,79 @@ const COMMANDS = { // WEBHOOK HANDLER // ═══════════════════════════════════════════════════════════════════════════ +function isRecord(value: unknown): value is Record { + return value !== null && typeof value === "object" && !Array.isArray(value); +} + +function isChatId(value: unknown): value is number { + return typeof value === "number" && Number.isSafeInteger(value) && value !== 0; +} + +/** Validate exactly the fields passed to the existing internal handlers. */ +function isTelegramUpdate(value: unknown): value is TelegramUpdate { + if (!isRecord(value) || typeof value.update_id !== "number" || + !Number.isSafeInteger(value.update_id) || value.update_id < 0) return false; + if (value.message !== undefined && value.callback_query !== undefined) return false; + if (value.message !== undefined) { + const message = value.message; + if (!isRecord(message) || typeof message.message_id !== "number" || + !Number.isSafeInteger(message.message_id) || message.message_id < 0 || + !isRecord(message.chat) || !isChatId(message.chat.id) || + (message.text !== undefined && typeof message.text !== "string")) return false; + if (message.from !== undefined && + (!isRecord(message.from) || !isChatId(message.from.id) || + (message.from.username !== undefined && typeof message.from.username !== "string") || + (message.from.first_name !== undefined && typeof message.from.first_name !== "string"))) return false; + } + if (value.callback_query !== undefined) { + const callback = value.callback_query; + if (!isRecord(callback) || typeof callback.id !== "string" || !callback.id || + !isRecord(callback.from) || !isChatId(callback.from.id) || + (callback.data !== undefined && typeof callback.data !== "string")) return false; + if (callback.message !== undefined && + (!isRecord(callback.message) || !isRecord(callback.message.chat) || !isChatId(callback.message.chat.id))) return false; + } + return true; +} + /** * HTTP webhook handler for Telegram updates. * Register this in convex/http.ts */ export const telegramWebhookHandler = httpAction(async (ctx, request) => { try { - const update: TelegramUpdate = await request.json(); + const secret = getTelegramWebhookSecret(); + if (request.headers.get("X-Telegram-Bot-Api-Secret-Token") !== secret) { + return new Response("Unauthorized", { status: 401 }); + } + const update = await withTelegramDeadline(signal => + readTelegramJson(request, TELEGRAM_UPDATE_MAX_BYTES, signal)); + if (!isTelegramUpdate(update)) throw new TelegramHttpError(400, "Invalid Telegram update"); // Handle text messages - if (update.message?.text) { + if (update.message?.text?.trim()) { await ctx.runAction(internal.domains.integrations.telegramAgent.handleMessage, { update, }); + return new Response("OK", { status: 200 }); } // Handle callback queries (button presses) if (update.callback_query) { await ctx.runAction(internal.domains.integrations.telegramAgent.handleCallbackQuery, { callbackQueryId: update.callback_query.id, - chatId: String(update.callback_query.message?.chat.id || update.callback_query.from?.id), - data: update.callback_query.data || "", + chatId: String(update.callback_query.message?.chat.id ?? update.callback_query.from.id), + data: update.callback_query.data ?? "", }); + return new Response("OK", { status: 200 }); } - // Always return 200 OK to Telegram - return new Response("OK", { status: 200 }); + return new Response(null, { status: 204, headers: { "X-Telegram-Update": "ignored" } }); } catch (error) { - console.error("[TelegramAgent] Webhook error:", error); - // Still return 200 to prevent Telegram from retrying - return new Response("OK", { status: 200 }); + // Telegram retries non-2xx updates. Earlier effects can already exist; + // this boundary does not promise exactly-once delivery. + const status = error instanceof TelegramHttpError ? error.status : 500; + return new Response(status < 500 ? "Invalid Telegram request" : "Telegram processing failed", { status }); } }); @@ -82,7 +132,7 @@ export const handleMessage = internalAction({ args: { update: v.any(), }, - handler: async (ctx, args) => { + handler: async (ctx, args): Promise => { const update = args.update as TelegramUpdate; const message = update.message; @@ -95,8 +145,6 @@ export const handleMessage = internalAction({ const username = message.from?.username; const firstName = message.from?.first_name; - console.log(`[TelegramAgent] Message from ${username || chatId}: ${text.slice(0, 100)}`); - // Log incoming message await ctx.runMutation(internal.domains.integrations.telegram.logTelegramMessage, { telegramChatId: chatId, @@ -118,194 +166,127 @@ export const handleMessage = internalAction({ return; } - // Process as natural language query through agent + // Disclose the currently unavailable research integration. await processAgentQuery(ctx, chatId, text); }, }); /** - * Handle slash commands. + * Require a real delivery acknowledgement on webhook processing paths. */ +async function sendRequiredReply( + ctx: ActionCtx, + args: { chatId: string; text: string; parseMode?: "Markdown"; disablePreview?: boolean }, +): Promise { + const delivery = await ctx.runAction(internal.domains.integrations.telegram.sendMessage, args); + if (!delivery.sent) throw new TelegramHttpError(502, "Telegram delivery failed"); +} + async function handleCommand( - ctx: any, + ctx: ActionCtx, chatId: string, - command: string + command: string, ): Promise { const cmd = command.toLowerCase().split(" ")[0]; - switch (cmd) { - case COMMANDS.START: - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { + case COMMANDS.START: { + const preference = await ctx.runMutation(internal.domains.integrations.telegram.toggleNotifications, { + telegramChatId: chatId, + enabled: true, + }); + if (!preference.success) throw new Error("Telegram notification preference update failed"); + await sendRequiredReply(ctx, { chatId, - text: `*Welcome to NodeBench AI!* 🚀 - -I'm your intelligent research assistant. You can ask me questions like: + text: `*Welcome to NodeBench AI!* -• "Who raised money today?" -• "Latest news on AI agents" -• "Tell me about Anthropic" -• "What are the top funding rounds this week?" +Notifications are enabled for this chat. Research search is not connected to this bot yet. *Commands:* -/help - Show this help message -/status - Check system status -/funding - Today's funding news -/news - Latest tech news -/stop - Disable notifications - -Just type your question and I'll find the answers for you!`, +/help - Available commands +/status - Integration capabilities +/funding or /news - Research availability notice +/stop - Disable proactive notifications +/start - Re-enable proactive notifications`, parseMode: "Markdown", }); - break; - + return; + } case COMMANDS.HELP: - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { + await sendRequiredReply(ctx, { chatId, - text: `*How to use NodeBench AI Bot:* - -*Natural Language Queries:* -Just type your question naturally: -• "Who raised Series A this week?" -• "Latest Claude announcements" -• "Show me SEC filings for Tesla" - -*Quick Commands:* -/funding - Today's funding events -/news - Latest tech news -/status - System status -/stop - Disable notifications - -*Tips:* -• Be specific for better results -• Include company names or topics -• Ask follow-up questions for details`, + text: `*NodeBench AI Bot commands* + +/start - Enable proactive notifications +/stop - Disable proactive notifications +/status - Integration capabilities +/funding or /news - Research availability notice + +Research search is not connected. Questions receive an availability notice, not researched answers.`, parseMode: "Markdown", }); - break; - + return; case COMMANDS.STATUS: - // TODO: Call actual status check - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { + await sendRequiredReply(ctx, { chatId, - text: `*System Status:* ✅ Online + text: `*Telegram integration* -*Search Providers:* -• Brave: ✅ Active (FREE) -• Serper: ✅ Active (FREE) -• Tavily: ✅ Active (FREE) -• Linkup: ✅ Fallback - -*Agent:* Ready for queries`, +Commands and notification preferences are implemented. Research search is not connected. This response is not a health check of external search providers.`, parseMode: "Markdown", }); - break; - + return; case COMMANDS.FUNDING: - // Quick funding query await processAgentQuery(ctx, chatId, "What funding announcements happened today?"); - break; - + return; case COMMANDS.NEWS: - // Quick news query await processAgentQuery(ctx, chatId, "What's the latest tech and AI news today?"); - break; - - case COMMANDS.STOP: - await ctx.runMutation(internal.domains.integrations.telegram.toggleNotifications, { + return; + case COMMANDS.STOP: { + const preference = await ctx.runMutation(internal.domains.integrations.telegram.toggleNotifications, { telegramChatId: chatId, enabled: false, }); - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { + if (!preference.success) throw new Error("Telegram notification preference update failed"); + await sendRequiredReply(ctx, { chatId, text: "Notifications disabled. Send /start to re-enable.", }); - break; - + return; + } default: - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { + await sendRequiredReply(ctx, { chatId, text: "Unknown command. Try /help for available commands.", }); } } -/** - * Process a natural language query through the agent system. - */ +/** Reply honestly while the research-agent integration is unavailable. */ async function processAgentQuery( - ctx: any, + ctx: ActionCtx, chatId: string, - query: string + query: string, ): Promise { - try { - // Send typing indicator - // Note: Telegram Bot API doesn't have a direct "typing" action in our implementation - // but we could add it later - - // Send initial acknowledgment - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { - chatId, - text: "🔍 Searching...", - }); - - // TODO: Route through coordinator agent when available - // For now, use a simplified search approach - const response = await performQuickSearch(ctx, query); - - // Format response for Telegram - const formattedResponse = formatForTelegram(response); - - // Send response - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { - chatId, - text: formattedResponse, - parseMode: "Markdown", - disablePreview: true, - }); - - // Log outgoing message - await ctx.runMutation(internal.domains.integrations.telegram.logTelegramMessage, { - telegramChatId: chatId, - messageText: query, - messageType: "outgoing", - agentResponse: formattedResponse, - }); - } catch (error) { - console.error("[TelegramAgent] Query processing error:", error); - - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { - chatId, - text: "Sorry, I encountered an error processing your request. Please try again.", - }); - } + // Plain text avoids treating the user's query as Telegram Markdown. + const response = formatForTelegram(`Research search is not connected to this bot. No search or agent research was performed. Use /help for the available commands. + +Query: ${query}`); + await sendRequiredReply(ctx, { chatId, text: response, disablePreview: true }); + // Do not claim an outgoing message until its provider delivery succeeded. + await ctx.runMutation(internal.domains.integrations.telegram.logTelegramMessage, { + telegramChatId: chatId, + messageText: response, + messageType: "outgoing", + agentResponse: response, + }); } /** - * Perform a quick search using the FREE-FIRST fusion search. - */ -async function performQuickSearch(ctx: any, query: string): Promise { - // This is a placeholder - in production, route through coordinator agent - // For now, return a helpful message - return `*Query:* ${query} - -_I received your query. Full agent integration coming soon!_ - -*Current capabilities:* -• Free-tier search across Brave, Serper, Tavily -• Funding event detection -• News aggregation -• Entity research - -Try again later or check the web app for full functionality.`; -} - -/** - * Format response for Telegram (handle length limits, markdown). + * Keep the plain-text availability response within Telegram's length limit. */ function formatForTelegram(text: string): string { // Truncate if too long if (text.length > MAX_MESSAGE_LENGTH) { - return text.slice(0, MAX_MESSAGE_LENGTH - 50) + "\n\n_(truncated)_"; + return text.slice(0, MAX_MESSAGE_LENGTH - 50) + "\n\n(truncated)"; } return text; } @@ -323,11 +304,12 @@ export const handleCallbackQuery = internalAction({ chatId: v.string(), data: v.string(), }, - handler: async (ctx, args) => { - // Acknowledge the button press - await ctx.runAction(internal.domains.integrations.telegram.answerCallbackQuery, { + handler: async (ctx, args): Promise => { + // Acknowledge the button press; do not hide a rejected acknowledgement. + const acknowledgement = await ctx.runAction(internal.domains.integrations.telegram.answerCallbackQuery, { callbackQueryId: args.callbackQueryId, }); + if (!acknowledgement.ok) throw new TelegramHttpError(502, "Telegram callback acknowledgement failed"); // Parse callback data const [action, ...params] = args.data.split(":"); @@ -351,14 +333,14 @@ export const handleCallbackQuery = internalAction({ case "refresh": // Re-run the last query // TODO: Implement message history lookup - await ctx.runAction(internal.domains.integrations.telegram.sendMessage, { + await sendRequiredReply(ctx, { chatId: args.chatId, - text: "Refresh functionality coming soon.", + text: "Refresh is not implemented in this integration.", }); break; default: - console.log(`[TelegramAgent] Unknown callback action: ${action}`); + // The button was acknowledged; this callback has no implemented action. } }, }); @@ -395,7 +377,6 @@ export const sendTelegramNotification = internalAction({ }); if (!user?.notificationsEnabled) { - console.log(`[TelegramAgent] Notifications disabled for ${args.telegramChatId}`); return { sent: false, reason: "notifications_disabled" }; } diff --git a/backend/convex/domains/integrations/telegramHttp.ts b/backend/convex/domains/integrations/telegramHttp.ts new file mode 100644 index 000000000..3fb7bdf35 --- /dev/null +++ b/backend/convex/domains/integrations/telegramHttp.ts @@ -0,0 +1,97 @@ +/** Bounded HTTP I/O for this Telegram integration, including streamed bodies. */ +export const TELEGRAM_HTTP_TIMEOUT_MS = 10_000; +export const TELEGRAM_UPDATE_MAX_BYTES = 64 * 1024; +export const TELEGRAM_RESPONSE_MAX_BYTES = 1024 * 1024; + +export class TelegramHttpError extends Error { + constructor(public readonly status: number, message: string) { + super(message); + this.name = "TelegramHttpError"; + } +} + +export function getTelegramWebhookSecret(): string { + const secret = process.env.TELEGRAM_WEBHOOK_SECRET; + // Telegram's setWebhook secret_token alphabet and length contract. + if (!secret || !/^[A-Za-z0-9_-]{1,256}$/.test(secret)) { + throw new TelegramHttpError(503, "Telegram webhook is not configured"); + } + return secret; +} + +export async function withTelegramDeadline( + operation: (signal: AbortSignal) => Promise, +): Promise { + const controller = new AbortController(); + let timer: ReturnType | undefined; + const deadline = new Promise((_, reject) => { + timer = setTimeout(() => { + controller.abort(); + reject(new TelegramHttpError(408, "Telegram HTTP operation timed out")); + }, TELEGRAM_HTTP_TIMEOUT_MS); + }); + try { + // The explicit race also settles if a transport never rejects on abort. + return await Promise.race([operation(controller.signal), deadline]); + } finally { + clearTimeout(timer); + controller.abort(); + } +} + +export async function readTelegramJson( + message: Request | Response, + maxBytes: number, + signal: AbortSignal, +): Promise { + if (signal.aborted) { + void message.body?.cancel().catch(() => {}); + throw new TelegramHttpError(408, "Telegram body read timed out"); + } + const reader = message.body?.getReader(); + if (!reader) throw new TelegramHttpError(400, "JSON body is required"); + let complete = false; + let cancelled = false; + const cancel = () => { + if (!cancelled) { + cancelled = true; + void reader.cancel().catch(() => {}); + } + }; + let onAbort: () => void = () => {}; + const aborted = new Promise((_, reject) => { + onAbort = () => { + cancel(); + reject(new TelegramHttpError(408, "Telegram body read timed out")); + }; + signal.addEventListener("abort", onAbort, { once: true }); + if (signal.aborted) onAbort(); + }); + try { + const declaredLength = message.headers.get("content-length"); + if (declaredLength !== null && + (!/^\d+$/.test(declaredLength) || Number(declaredLength) > maxBytes)) { + throw new TelegramHttpError(413, "Telegram body exceeds the byte limit"); + } + const bytes = new Uint8Array(maxBytes); + let length = 0; + while (true) { + const chunk = await Promise.race([reader.read(), aborted]); + if (chunk.done) { complete = true; break; } + if (length + chunk.value.byteLength > maxBytes) { + throw new TelegramHttpError(413, "Telegram body exceeds the byte limit"); + } + bytes.set(chunk.value, length); + length += chunk.value.byteLength; + } + try { + return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(0, length))); + } catch { + throw new TelegramHttpError(400, "Invalid JSON body"); + } + } finally { + signal.removeEventListener("abort", onAbort); + if (!complete) cancel(); + reader.releaseLock(); + } +} diff --git a/backend/convex/domains/knowledge/sourceDiffs.ts b/backend/convex/domains/knowledge/sourceDiffs.ts index 37a2df674..cb0150c45 100644 --- a/backend/convex/domains/knowledge/sourceDiffs.ts +++ b/backend/convex/domains/knowledge/sourceDiffs.ts @@ -637,7 +637,7 @@ export const fetchAndSnapshotSource = internalAction({ // If the content changed, immediately record a diff against the previous snapshot. // This avoids fragile "re-fetch latest snapshot" logic in cron loops. if (changed) { - const source = await ctx.runQuery(internal.domains.knowledge.sourceRegistry.getSource, { + const source = await ctx.runQuery(api.domains.knowledge.sourceRegistry.getSource, { registryId: args.registryId, }); diff --git a/backend/convex/domains/openclaw/executionEngine.ts b/backend/convex/domains/openclaw/executionEngine.ts index 0cc42d28d..ab5c1fcdb 100644 --- a/backend/convex/domains/openclaw/executionEngine.ts +++ b/backend/convex/domains/openclaw/executionEngine.ts @@ -10,6 +10,7 @@ import { internal } from "../../_generated/api"; import { v } from "convex/values"; import { buildForecastAwareOpenClawHandoff } from "./forecastHandoffPolicy"; import type { ForecastGateDecision } from "../temporal/forecastGatePolicy"; +import type { Id } from "../../_generated/dataModel"; /** * Log a skill execution (called after proxy enforcement) @@ -150,7 +151,7 @@ export const executeSkill = internalAction({ : "success"; // Log the execution attempt - const execId = await ctx.runMutation( + const execId: Id<"openclawExecutions"> = await ctx.runMutation( internal.domains.openclaw.executionEngine.logExecution, { sessionId: args.sessionId, diff --git a/backend/convex/domains/operations/__tests__/privacyAdmission.auth.test.ts b/backend/convex/domains/operations/__tests__/privacyAdmission.auth.test.ts new file mode 100644 index 000000000..c155c7c54 --- /dev/null +++ b/backend/convex/domains/operations/__tests__/privacyAdmission.auth.test.ts @@ -0,0 +1,202 @@ +/// +import { convexTest } from "convex-test"; +import { describe, expect, it } from "vitest"; +import { api, internal } from "../../../_generated/api"; +import schema from "../../../schema"; +import { internalMutation } from "../../../_generated/server"; +import { v } from "convex/values"; +import * as privacy from "../privacyEnforcement"; +import * as citations from "../../documents/citationValidator"; + +function reroot(key: string) { + const parts = key.replace(/^\.\//, "").split("/"); + const base = ["domains", "operations", "__tests__"]; + while (parts[0] === "..") { parts.shift(); base.pop(); } + return [...base, ...parts].join("/"); +} +const modules = Object.fromEntries(Object.entries(import.meta.glob("../../../**/*.{ts,js}")) + .map(([key, loader]) => [reroot(key), loader])); +const publicPrivacy = api.domains.operations.privacyEnforcement; +const privatePrivacy = internal.domains.operations.privacyEnforcement; + +async function fixture(moduleMap = modules) { + const t = convexTest(schema, moduleMap); + const data = await t.run(async ctx => { + const member = await ctx.db.insert("users", { email: "member@example.test" }); + const other = await ctx.db.insert("users", { email: "other@example.test" }); + const admin = await ctx.db.insert("users", { email: "admin@example.test" }); + const viewer = await ctx.db.insert("users", { email: "viewer@example.test" }); + const adminRole = await ctx.db.insert("adminUsers", { + userId: admin, email: "admin@example.test", role: "admin", permissions: [], createdAt: 1, + }); + await ctx.db.insert("adminUsers", { + userId: viewer, email: "viewer@example.test", role: "viewer", permissions: [], createdAt: 1, + }); + const documentId = await ctx.db.insert("documents", { + title: "Private cited memo", createdBy: other, isPublic: false, content: "Source [1]", + }); + return { member, other, admin, viewer, adminRole, documentId }; + }); + return { t, ...data }; +} + +describe("privacy admission for people and maintenance operators", () => { + it("denies an anonymous caller for every scope without creating requests or audit entries", async () => { + const { t, other, admin } = await fixture(); + for (const scope of ["user_data", "entity_data", "specific_records"] as const) { + await expect(t.mutation(publicPrivacy.createDeletionRequest, { + scope, subject: other, requestedBy: admin, recordIds: [`users:${other}`], + })).rejects.toThrow(/authenticated/i); + } + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toEqual([]); + expect(await t.run(ctx => ctx.db.query("adminAuditLog").collect())).toEqual([]); + }); + + it("denies cross-owner, entity and record deletion for members and read-only operators", async () => { + const { t, member, viewer, other, admin } = await fixture(); + for (const caller of [member, viewer]) { + const session = t.withIdentity({ subject: caller }); + for (const scope of ["user_data", "entity_data", "specific_records"] as const) { + await expect(session.mutation(publicPrivacy.createDeletionRequest, { + scope, subject: other, requestedBy: admin, recordIds: [`users:${other}`], + })).rejects.toThrow(/owner or admin/i); + } + } + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toEqual([]); + }); + + it("lets a person request their own data while deriving both request and audit actor from the session", async () => { + const { t, member, admin } = await fixture(); + const id = await t.withIdentity({ subject: member }).mutation(publicPrivacy.createDeletionRequest, { + scope: "user_data", subject: member, requestedBy: admin, + }); + const request = await t.run(ctx => ctx.db.get(id)); + expect(request).toMatchObject({ requestedBy: member, authorizedBy: member, subject: member, status: "pending" }); + const logs = await t.run(ctx => ctx.db.query("adminAuditLog").collect()); + expect(logs).toHaveLength(1); + expect(logs[0]).toMatchObject({ actor: member, resourceId: id }); + expect(await t.query(privatePrivacy.getDeletionRequest, { requestId: id })).toMatchObject({ _id: id }); + }); + + it("lets an authenticated admin submit a bounded, valid broader request", async () => { + const { t, admin, other, documentId } = await fixture(); + const id = await t.withIdentity({ subject: admin }).mutation(publicPrivacy.createDeletionRequest, { + scope: "specific_records", subject: "Reviewed support request", requestedBy: other, + recordIds: [`documents:${documentId}`], + }); + expect(await t.query(privatePrivacy.getDeletionRequest, { requestId: id })).toMatchObject({ + requestedBy: admin, authorizedBy: admin, recordIds: [`documents:${documentId}`], + }); + expect(await t.action(privatePrivacy.processDeletionRequest, { requestId: id })).toEqual({ + success: true, status: "completed", recordsDeleted: 1, tablesAffected: ["documents"], + }); + expect(await t.run(ctx => ctx.db.get(documentId))).toBeNull(); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(1); + }); + + it("rejects oversized or malformed requests atomically even for an admin", async () => { + const { t, admin, other, documentId } = await fixture(); + const session = t.withIdentity({ subject: admin }); + const invalid = [ + { subject: "", recordIds: [`documents:${documentId}`] }, + { subject: "x".repeat(513), recordIds: [`documents:${documentId}`] }, + { subject: "reviewed", recordIds: [] }, + { subject: "reviewed", recordIds: [`documents:${other}`] }, + { subject: "reviewed", recordIds: ["not-a-record-reference"] }, + { subject: "reviewed", recordIds: Array(201).fill(`documents:${documentId}`) }, + ]; + for (const args of invalid) { + await expect(session.mutation(publicPrivacy.createDeletionRequest, { + scope: "specific_records", requestedBy: admin, ...args, + })).rejects.toThrow(/invalid|limit|between|record|subject/i); + } + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toEqual([]); + }); + + it("holds legacy requests even when an attacker copied a real admin's ID", async () => { + const { t, admin, documentId } = await fixture(); + const id = await t.run(ctx => ctx.db.insert("deletionRequests", { + requestId: "legacy", scope: "specific_records", subject: "legacy", + recordIds: [`documents:${documentId}`], requestedBy: admin, requestedAt: 1, status: "pending", + })); + await expect(t.query(privatePrivacy.getDeletionRequest, { requestId: id })).rejects.toThrow(/authorization|review/i); + await expect(t.action(privatePrivacy.processDeletionRequest, { requestId: id })).rejects.toThrow(/authorization|review/i); + expect(await t.run(ctx => ctx.db.get(documentId))).not.toBeNull(); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toEqual([]); + }); + + it("rechecks admin authority when a queued request is processed after role revocation", async () => { + const { t, admin, adminRole, documentId } = await fixture(); + const id = await t.withIdentity({ subject: admin }).mutation(publicPrivacy.createDeletionRequest, { + scope: "specific_records", subject: "reviewed", requestedBy: admin, recordIds: [`documents:${documentId}`], + }); + await t.run(ctx => ctx.db.patch(adminRole, { role: "viewer" })); + await expect(t.action(privatePrivacy.processDeletionRequest, { requestId: id })).rejects.toThrow(/owner or admin/i); + expect(await t.run(ctx => ctx.db.get(documentId))).not.toBeNull(); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toEqual([]); + }); + + it("keeps identities isolated through concurrent abuse and repeated legitimate request histories", async () => { + const { t, member, other, admin } = await fixture(); + const session = t.withIdentity({ subject: member }); + for (let round = 0; round < 12; round++) { + const attacks = await Promise.allSettled(Array.from({ length: 10 }, () => session.mutation( + publicPrivacy.createDeletionRequest, { scope: "user_data", subject: other, requestedBy: admin }, + ))); + expect(attacks.every(result => result.status === "rejected")).toBe(true); + await session.mutation(publicPrivacy.createDeletionRequest, { + scope: "user_data", subject: member, + }); + } + const requests = await t.run(ctx => ctx.db.query("deletionRequests").collect()); + expect(requests).toHaveLength(12); + expect(requests.every(row => row.subject === member && row.requestedBy === member)).toBe(true); + expect(await t.run(ctx => ctx.db.get(other))).not.toBeNull(); + }); + + it("rejects a session whose user was removed before admission", async () => { + const { t, member } = await fixture(); + await t.run(ctx => ctx.db.delete(member)); + await expect(t.withIdentity({ subject: member }).mutation(publicPrivacy.createDeletionRequest, { + scope: "user_data", subject: member, requestedBy: member, + })).rejects.toThrow(/authenticated|user/i); + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toEqual([]); + }); + + it("rolls back admission when the mandatory audit write fails", async () => { + // Controlled audit outage; admission and transactional storage are the real implementation. + const { t, member } = await fixture({ ...modules, + "domains/operations/adminAuditLog.ts": async () => ({ + logAdminActionInternal: internalMutation({ args: v.any(), handler: async () => { + throw new Error("Controlled audit storage outage"); + } }), + }), + }); + await expect(t.withIdentity({ subject: member }).mutation(publicPrivacy.createDeletionRequest, { + scope: "user_data", subject: member, + })).rejects.toThrow(/audit storage outage/i); + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toEqual([]); + }); + + it("rejects a caller attempting to supply the server-only authorization field", async () => { + const { t, member, admin } = await fixture(); + await expect(t.withIdentity({ subject: member }).mutation(publicPrivacy.createDeletionRequest, { + scope: "user_data", subject: member, authorizedBy: admin, + } as never)).rejects.toThrow(); + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toEqual([]); + }); + + it("keeps maintenance metadata and document citation tools off the public function surface", async () => { + // convex-test intentionally allows internal calls; the real registration flag is the visibility contract. + for (const endpoint of [privacy.getQueuedDeletionRequests, privacy.getExpiredRecords, privacy.getDeletionRequest, + citations.validateDocumentCitations, citations.generateCitationReport]) { + expect(endpoint).toHaveProperty("isInternal", true); + expect(endpoint).not.toHaveProperty("isPublic", true); + } + const { t, documentId } = await fixture(); + expect(await t.query(internal.domains.documents.citationValidator.validateDocumentCitations, { documentId })) + .toMatchObject({ isValid: false, orphanCitations: ["[1]"] }); + expect(await t.action(internal.domains.documents.citationValidator.validateBatchDocuments, { documentIds: [documentId] })) + .toMatchObject({ allValid: false, results: [{ documentId, isValid: false, orphanCount: 1 }] }); + }); +}); diff --git a/backend/convex/domains/operations/__tests__/privacyExecution.transactions.test.ts b/backend/convex/domains/operations/__tests__/privacyExecution.transactions.test.ts new file mode 100644 index 000000000..845785f47 --- /dev/null +++ b/backend/convex/domains/operations/__tests__/privacyExecution.transactions.test.ts @@ -0,0 +1,210 @@ +/// +import { convexTest } from "convex-test"; +import { describe, expect, it, vi } from "vitest"; +import schema from "../../../schema"; +import { api, internal } from "../../../_generated/api"; +import type { Id } from "../../../_generated/dataModel"; + +const modules = Object.fromEntries(Object.entries(import.meta.glob("../../../**/*.{ts,js}")) + .map(([key, loader]) => { + const parts = key.replace(/^\.\//, "").split("/"); + const base = ["domains", "operations", "__tests__"]; + while (parts[0] === "..") { parts.shift(); base.pop(); } + return [[...base, ...parts].join("/"), loader]; + })); +const ops = internal.domains.operations.privacyEnforcement; +const admission = api.domains.operations.privacyEnforcement.createDeletionRequest; + +async function fixture(documentsWritten?: number) { + const t = convexTest({ schema, modules, transactionLimits: documentsWritten ? { documentsWritten } : true }); + const admin = await t.run(ctx => ctx.db.insert("users", { email: "operator@example.test" })); + const member = await t.run(ctx => ctx.db.insert("users", { email: "member@example.test" })); + const role = await t.run(ctx => ctx.db.insert("adminUsers", { + userId: admin, email: "operator@example.test", role: "admin", permissions: [], createdAt: 1, + })); + async function document(content = "Reviewed memo") { + return t.run(ctx => ctx.db.insert("documents", { title: "Memo", content, createdBy: member, isPublic: false })); + } + async function request(ids: Id<"documents">[]) { + return t.withIdentity({ subject: admin }).mutation(admission, { + scope: "specific_records", subject: "Reviewed support request", recordIds: ids.map(id => `documents:${id}`), + }); + } + return { t, admin, member, role, document, request }; +} + +describe("deletion execution for people and maintenance operators", () => { + it("holds an incomplete whole-account plan before removing any of the person's data", async () => { + const { t, member, document } = await fixture(); + const doc = await document(); + const server = await t.run(ctx => ctx.db.insert("mcpServers", { + name: "Owned connection", userId: member, createdAt: 1, updatedAt: 1, + })); + const requestId = await t.withIdentity({ subject: member }).mutation(admission, { scope: "user_data", subject: member }); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: false, status: "failed", recordsDeleted: 0 }); + expect(await t.run(ctx => ctx.db.get(doc))).not.toBeNull(); + expect(await t.run(ctx => ctx.db.get(server))).not.toBeNull(); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ + status: "failed", deletionSummary: { failedDeletions: [{ error: expect.stringMatching(/coverage.*review/i) }] }, + }); + }); + + it("records an unsupported entity request as a hold, without action/database misuse or a success claim", async () => { + const { t, admin } = await fixture(); + const requestId = await t.withIdentity({ subject: admin }).mutation(admission, { scope: "entity_data", subject: "reviewed-entity" }); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: false, status: "failed", recordsDeleted: 0 }); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ status: "failed" }); + }); + + it("counts only real deletions when a reviewed list repeats IDs or another process already removed a row", async () => { + const { t, document, request } = await fixture(); + const present = await document(); const missing = await document(); + const requestId = await request([present, present, missing]); + await t.run(ctx => ctx.db.delete(missing)); + const expected = { success: true, status: "completed", recordsDeleted: 1, tablesAffected: ["documents"] }; + expect(await t.action(ops.processDeletionRequest, { requestId })).toEqual(expected); + expect(await t.action(ops.processDeletionRequest, { requestId })).toEqual(expected); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(1); + }); + + it("resumes an interrupted 200-record request from durable progress without double-counting", async () => { + const { t, document, request } = await fixture(); + const ids: Id<"documents">[] = []; + for (let i = 0; i < 200; i++) ids.push(await document(`Support record ${i}`)); + const requestId = await request(ids); + const partial = await t.mutation(ops.advanceDeletionRequest, { requestId }); + expect(partial).toMatchObject({ success: false, status: "in_progress", recordsDeleted: 8 }); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ execution: { version: 1, nextIndex: 8 } }); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: true, status: "completed", recordsDeleted: 200 }); + expect(await t.run(ctx => ctx.db.query("documents").collect())).toEqual([]); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(200); + }, 30000); + + it("keeps repeated overlapping workers idempotent through twelve successive request histories", async () => { + const { t, document, request } = await fixture(); + for (let round = 0; round < 12; round++) { + const requestId = await request([await document(), await document()]); + const results = await Promise.all(Array.from({ length: 10 }, () => t.action(ops.processDeletionRequest, { requestId }))); + expect(results.every(result => result.success && result.recordsDeleted === 2)).toBe(true); + } + expect(await t.run(ctx => ctx.db.query("documents").collect())).toEqual([]); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(24); + expect(await t.run(ctx => ctx.db.query("deletionRequests").collect())).toHaveLength(12); + }, 30000); + + it("defers a slow request at the action budget, then resumes the committed work on the next run", async () => { + const { t, document, request } = await fixture(); + const ids: Id<"documents">[] = []; + for (let i = 0; i < 40; i++) ids.push(await document()); + const requestId = await request(ids); + // Advance wall time to represent slow storage without sleeping in the suite. + const start = Date.now(); let ticks = 0; + const clock = vi.spyOn(Date, "now").mockImplementation(() => start + ticks++ * 2_000); + try { + const result = await t.action(ops.processDeletionRequest, { requestId }); + expect(result).toMatchObject({ success: false, status: "in_progress" }); + expect(result.recordsDeleted).toBeGreaterThan(0); + expect(result.recordsDeleted).toBeLessThan(ids.length); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ + status: "in_progress", deletionSummary: { recordsDeleted: result.recordsDeleted }, + }); + } finally { clock.mockRestore(); } + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: true, status: "completed", recordsDeleted: 40 }); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(40); + }); + + it("rolls back rows, tombstones and progress together when a real transaction write limit interrupts the batch", async () => { + // Four writes permit admission and individual inserts, but not two tombstones, + // two deletes AND a progress update. Exercise actual storage rollback. + const { t, document, request } = await fixture(4); + const ids = [await document(), await document()]; + const requestId = await request(ids); + await expect(t.action(ops.processDeletionRequest, { requestId })).rejects.toThrow(/limit/i); + for (const id of ids) expect(await t.run(ctx => ctx.db.get(id))).not.toBeNull(); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toEqual([]); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ + status: "failed", deletionSummary: { recordsDeleted: 0, failedDeletions: [{ error: expect.stringMatching(/limit/i) }] }, + }); + }); + + it("rechecks revoked operator authority before the next batch of an interrupted request", async () => { + const { t, role, document, request } = await fixture(); + const ids: Id<"documents">[] = []; + for (let i = 0; i < 10; i++) ids.push(await document()); + const requestId = await request(ids); + await t.mutation(ops.advanceDeletionRequest, { requestId }); + await t.run(ctx => ctx.db.patch(role, { role: "viewer" })); + await expect(t.action(ops.processDeletionRequest, { requestId })).rejects.toThrow(/owner or admin/i); + expect(await t.run(ctx => ctx.db.query("documents").collect())).toHaveLength(2); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ status: "failed", deletionSummary: { recordsDeleted: 8 } }); + }); + + it("validates every reference before the first destructive batch even when a bad reference is later in the list", async () => { + const { t, member, document, request } = await fixture(); + const ids: Id<"documents">[] = []; + for (let i = 0; i < 9; i++) ids.push(await document()); + const requestId = await request(ids); + await t.run(ctx => ctx.db.patch(requestId, { recordIds: [...ids.map(id => `documents:${id}`), `documents:${member}`] })); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: false, status: "failed", recordsDeleted: 0 }); + expect(await t.run(ctx => ctx.db.query("documents").collect())).toHaveLength(9); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toEqual([]); + }); + + it("rejects requests to erase the executor's authority and audit records, and defends against legacy admission bypass", async () => { + const { t, admin, member, role, document, request } = await fixture(); + const requestId = await request([await document()]); + const audit = (await t.run(ctx => ctx.db.query("adminAuditLog").collect()))[0]; + for (const ref of [`deletionRequests:${requestId}`, `adminAuditLog:${audit._id}`, `adminUsers:${role}`, `users:${member}`]) { + await expect(t.withIdentity({ subject: admin }).mutation(admission, { + scope: "specific_records", subject: "reviewed", recordIds: [ref], + })).rejects.toThrow(/protected/i); + } + await t.run(ctx => ctx.db.patch(requestId, { recordIds: [`deletionRequests:${requestId}`] })); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: false, status: "failed" }); + expect(await t.run(ctx => ctx.db.get(requestId))).not.toBeNull(); + }); + + it("holds legacy in-progress state instead of assuming its previous partial deletions were safe or complete", async () => { + const { t, document, request } = await fixture(); + const doc = await document(); const requestId = await request([doc]); + await t.run(ctx => ctx.db.patch(requestId, { status: "in_progress" })); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: false, status: "failed", recordsDeleted: 0 }); + expect(await t.run(ctx => ctx.db.get(doc))).not.toBeNull(); + }); + + it("processes resumed and pending requests through the cron while reporting unsupported requests as failures", async () => { + const { t, member, document, request } = await fixture(); + const ids: Id<"documents">[] = []; + for (let i = 0; i < 10; i++) ids.push(await document()); + const resumed = await request(ids); + await t.mutation(ops.advanceDeletionRequest, { requestId: resumed }); + await request([await document()]); + await t.withIdentity({ subject: member }).mutation(admission, { scope: "user_data", subject: member }); + expect(await t.action(ops.processPendingDeletionRequests, { limit: 3 })).toEqual({ processed: 3, succeeded: 2, failed: 1, deferred: 0 }); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(11); + expect(await t.action(ops.processPendingDeletionRequests, { limit: 3 })).toEqual({ processed: 0, succeeded: 0, failed: 0, deferred: 0 }); + }); + + it("rejects invalid cron budgets and handles an empty valid queue without touching storage from an action", async () => { + const { t } = await fixture(); + for (const limit of [0, -1, 1.5, 11]) await expect(t.action(ops.processPendingDeletionRequests, { limit })).rejects.toThrow(/limit|integer/i); + expect(await t.action(ops.processPendingDeletionRequests, { limit: 1 })).toEqual({ processed: 0, succeeded: 0, failed: 0, deferred: 0 }); + }); + + it("handles representative large stored documents within real transaction bandwidth limits", async () => { + const { t, document, request } = await fixture(); + const ids: Id<"documents">[] = []; + for (let i = 0; i < 18; i++) ids.push(await document("x".repeat(850_000))); + const requestId = await request(ids); + expect(await t.action(ops.processDeletionRequest, { requestId })).toMatchObject({ success: true, status: "completed", recordsDeleted: 18 }); + expect(await t.run(ctx => ctx.db.query("deletionTombstones").collect())).toHaveLength(18); + }, 30000); + + it("does not let a late failure report overwrite a completed concurrent transaction", async () => { + const { t, document, request } = await fixture(); + const requestId = await request([await document()]); + await t.action(ops.processDeletionRequest, { requestId }); + await t.mutation(ops.recordDeletionFailure, { requestId, error: "Late worker timeout" }); + expect(await t.run(ctx => ctx.db.get(requestId))).toMatchObject({ status: "completed", deletionSummary: { recordsDeleted: 1, failedDeletions: [] } }); + }); +}); diff --git a/backend/convex/domains/operations/monitoring/industryUpdatesEnhanced.ts b/backend/convex/domains/operations/monitoring/industryUpdatesEnhanced.ts index 7fc3351b7..820e4af5f 100644 --- a/backend/convex/domains/operations/monitoring/industryUpdatesEnhanced.ts +++ b/backend/convex/domains/operations/monitoring/industryUpdatesEnhanced.ts @@ -11,7 +11,7 @@ import { v } from "convex/values"; import { internalAction, internalMutation, query } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; // ═══════════════════════════════════════════════════════════════════════════ // X SEARCH INTEGRATION @@ -36,7 +36,7 @@ export const searchXForTrends = internalAction({ for (const keyword of keywords) { try { // Use Grok with X search tool - const response = await ctx.runAction(internal.lib.xaiClient.callGrokWithXSearch, { + const response = await ctx.runAction(api.lib.xaiClient.callGrokWithXSearch, { model: "grok-3-mini", query: `Find trending discussions about ${keyword} on X. What are developers saying?`, maxTokens: 500, @@ -75,7 +75,7 @@ export const searchWebForBreakingNews = internalAction({ for (const topic of topics) { try { // Use Grok with web search tool - const response = await ctx.runAction(internal.lib.xaiClient.callGrokWithWebSearch, { + const response = await ctx.runAction(api.lib.xaiClient.callGrokWithWebSearch, { model: "grok-4-1-fast-reasoning", query: `What are the latest developments in ${topic} today? Find recent announcements and releases.`, maxTokens: 800, diff --git a/backend/convex/domains/operations/observability/dashboardData.ts b/backend/convex/domains/operations/observability/dashboardData.ts index 52e7d2e94..0081c4b23 100644 --- a/backend/convex/domains/operations/observability/dashboardData.ts +++ b/backend/convex/domains/operations/observability/dashboardData.ts @@ -12,7 +12,7 @@ import { v } from "convex/values"; import { internalAction, internalQuery, query } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import { PERSONA_CONFIG, type PersonaId } from "../../../config/autonomousConfig"; import type { Doc } from "../../../_generated/dataModel"; import { isActiveHealthStatus, normalizeHealthCheckDoc } from "./healthMonitor"; @@ -604,22 +604,22 @@ export const generateDashboardSnapshot = internalAction({ // Note: In a real implementation, these would be parallel queries // For now, we'll use the public queries const overview = await ctx.runQuery( - internal.domains.observability.dashboardData.getSystemOverview, + api.domains.observability.dashboardData.getSystemOverview, {} ); const personas = await ctx.runQuery( - internal.domains.observability.dashboardData.getPersonaDashboards, + api.domains.observability.dashboardData.getPersonaDashboards, {} ); const channels = await ctx.runQuery( - internal.domains.observability.dashboardData.getChannelDashboards, + api.domains.observability.dashboardData.getChannelDashboards, {} ); const recentActivity = await ctx.runQuery( - internal.domains.observability.dashboardData.getActivityFeed, + api.domains.observability.dashboardData.getActivityFeed, { limit: 20 } ); diff --git a/backend/convex/domains/operations/observability/selfHealer.ts b/backend/convex/domains/operations/observability/selfHealer.ts index adcc07abe..3819eedd5 100644 --- a/backend/convex/domains/operations/observability/selfHealer.ts +++ b/backend/convex/domains/operations/observability/selfHealer.ts @@ -520,7 +520,7 @@ export const getHealingStatsSummary = query({ escalated: v.number(), }), handler: async (ctx, { hours = 24 }) => { - const stats = await ctx.runQuery( + const stats: HealingStatsSummary = await ctx.runQuery( internal.domains.observability.selfHealer.getHealingStats, { hours }, ); @@ -557,7 +557,7 @@ export const getRecentHealingActions = query({ result: v.optional(v.string()), })), handler: async (ctx, { hours = 24, limit = 20 }) => { - const actions = await ctx.runQuery( + const actions: StoredHealingAction[] = await ctx.runQuery( internal.domains.observability.selfHealer.getHealingHistory, { hours, limit }, ); diff --git a/backend/convex/domains/operations/privacyEnforcement.ts b/backend/convex/domains/operations/privacyEnforcement.ts index e691dd89f..48036cfd6 100644 --- a/backend/convex/domains/operations/privacyEnforcement.ts +++ b/backend/convex/domains/operations/privacyEnforcement.ts @@ -40,9 +40,11 @@ // ============================================================================ import { v } from "convex/values"; -import { internalAction, internalMutation, mutation, query } from "../../_generated/server"; +import { getAuthUserId } from "@convex-dev/auth/server"; +import { internalAction, internalMutation, internalQuery, mutation, query, type MutationCtx, type QueryCtx } from "../../_generated/server"; import { internal } from "../../_generated/api"; -import type { Id } from "../../_generated/dataModel"; +import type { Doc, Id, TableNames } from "../../_generated/dataModel"; +import { requireAutonomousAdminAccess } from "./autonomousControlTower"; /* ------------------------------------------------------------------ */ /* DATA CLASS DEFINITIONS */ @@ -363,177 +365,49 @@ export const runTtlDeletion = internalAction({ }); /** - * Process a user deletion request + * Process a reviewed request in bounded, resumable transactions. + * Full user/entity erasure is held until its ownership/coverage plan is reviewed. */ -export const processDeletionRequest = internalAction({ - args: { - requestId: v.id("deletionRequests"), - }, - returns: v.object({ - success: v.boolean(), - recordsDeleted: v.number(), - tablesAffected: v.array(v.string()), - }), - handler: async (ctx, args) => { - // Get deletion request - const request = await ctx.runQuery( - internal.domains.operations.privacyEnforcement.getDeletionRequest, - { requestId: args.requestId } - ); - - if (!request) { - throw new Error(`Deletion request not found: ${args.requestId}`); - } - - // Mark as in progress - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.updateDeletionRequestStatus, - { requestId: args.requestId, status: "in_progress" } - ); - - const tablesAffected: string[] = []; - let recordsDeleted = 0; - const failedDeletions: Array<{ table: string; recordId: string; error: string }> = []; - - if (request.scope === "user_data") { - // Delete all data for a user - const userTables = [ - "mcpServers", - "agentRuns", - "narrativeThreads", - "narrativePosts", - "narrativeReplies", - "evidenceArtifacts", - "narrativeSearchLog", - "groundTruthVersions", - "validationFindings", - "calibrationProposals", - // Add more user-linkable tables - ]; - - for (const table of userTables) { - const records = await ctx.runQuery( - internal.domains.operations.privacyEnforcement.getUserRecords, - { table, userId: request.subject } - ); - - for (const recordId of records) { - try { - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.deleteRecordWithTombstone, - { table, recordId, deletionRequestId: args.requestId } - ); - recordsDeleted++; - } catch (error) { - failedDeletions.push({ - table, - recordId, - error: error instanceof Error ? error.message : String(error), - }); - } - } - - if (records.length > 0) { - tablesAffected.push(table); - } - } - } else if (request.scope === "entity_data") { - // Delete data associated with a single entity key (best-effort). - const entityKey = request.subject; - const entityTables = [ - { table: "groundTruthVersions", field: "entityKey" }, - { table: "groundTruthFinancials", field: "ticker" }, - ]; - - for (const { table, field } of entityTables) { - const docs = await (ctx.db.query(table as any) as any) - .filter((q: any) => q.eq(q.field(field), entityKey)) - .collect(); - for (const d of docs) { - try { - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.deleteRecordWithTombstone, - { table, recordId: String(d._id), deletionRequestId: args.requestId } - ); - recordsDeleted++; - } catch (error) { - failedDeletions.push({ - table, - recordId: String(d._id), - error: error instanceof Error ? error.message : String(error), - }); - } - } - if (docs.length > 0) tablesAffected.push(table); - } +const DELETION_BATCH_SIZE = 8; +const MAX_DELETION_RECORDS = 200; +const DELETION_ACTION_BUDGET_MS = 10_000; +const deletionOutcomeValidator = v.object({ + success: v.boolean(), + status: v.union(v.literal("pending"), v.literal("in_progress"), v.literal("completed"), v.literal("failed")), + recordsDeleted: v.number(), + tablesAffected: v.array(v.string()), +}); +type DeletionOutcome = { + success: boolean; + status: Doc<"deletionRequests">["status"]; + recordsDeleted: number; + tablesAffected: string[]; +}; - // Narrative threads where entityKeys contains the entityKey. - const threads = await ctx.db.query("narrativeThreads").collect(); - const matchingThreads = threads.filter((t) => Array.isArray(t.entityKeys) && t.entityKeys.includes(entityKey)); - for (const t of matchingThreads) { - try { - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.deleteRecordWithTombstone, - { table: "narrativeThreads", recordId: String(t._id), deletionRequestId: args.requestId } - ); - recordsDeleted++; - } catch (error) { - failedDeletions.push({ - table: "narrativeThreads", - recordId: String(t._id), - error: error instanceof Error ? error.message : String(error), - }); - } - } - if (matchingThreads.length > 0) tablesAffected.push("narrativeThreads"); - - } else if (request.scope === "specific_records" && request.recordIds) { - // Delete specific records, encoded as "table:recordId" - for (const ref of request.recordIds) { - const [table, recordId] = String(ref).split(":", 2); - if (!table || !recordId) { - failedDeletions.push({ table: "unknown", recordId: String(ref), error: "invalid_record_ref_format" }); - continue; - } - try { - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.deleteRecordWithTombstone, - { table, recordId, deletionRequestId: args.requestId } - ); - recordsDeleted++; - if (!tablesAffected.includes(table)) tablesAffected.push(table); - } catch (error) { - failedDeletions.push({ - table, - recordId, - error: error instanceof Error ? error.message : String(error), - }); +export const processDeletionRequest = internalAction({ + args: { requestId: v.id("deletionRequests") }, + returns: deletionOutcomeValidator, + handler: async (ctx, args): Promise => { + const deadline = Date.now() + DELETION_ACTION_BUDGET_MS; + try { + let result: DeletionOutcome; + // Each committed batch persists its cursor. If this action is interrupted, + // the cron can resume it; no action-local lease or counter is authoritative. + for (let batch = 0; ; batch++) { + result = await ctx.runMutation(internal.domains.operations.privacyEnforcement.advanceDeletionRequest, args); + if (result.status !== "in_progress" || batch + 1 >= MAX_DELETION_RECORDS / DELETION_BATCH_SIZE || Date.now() >= deadline) { + return result; } } - } - - // Create deletion summary - const summary = { - tablesAffected, - recordsDeleted, - tombstonesCreated: recordsDeleted, - failedDeletions, - }; - - // Mark as completed - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.completeDeletionRequest, - { + } catch (error) { + // The failed batch rolls back before this independent failure write. + // Do not swallow failure of the failure write: callers must see the outage. + await ctx.runMutation(internal.domains.operations.privacyEnforcement.recordDeletionFailure, { requestId: args.requestId, - summary, - } - ); - - return { - success: failedDeletions.length === 0, - recordsDeleted, - tablesAffected, - }; + error: (error instanceof Error ? error.message : String(error)).slice(0, 512), + }); + throw error; + } }, }); @@ -580,7 +454,7 @@ export function minimizePersonalData(data: { /* CONVEX QUERIES/MUTATIONS */ /* ------------------------------------------------------------------ */ -export const getExpiredRecords = query({ +export const getExpiredRecords = internalQuery({ args: { table: v.string(), expiresAt: v.number(), @@ -689,222 +563,192 @@ export const archiveRecords = internalMutation({ }, }); -export const getDeletionRequest = query({ +async function authorizedDeletionRequest(ctx: QueryCtx, requestId: Id<"deletionRequests">): Promise | null> { + const request = await ctx.db.get(requestId); + if (!request) return null; + // Legacy requester strings are untrusted, even when they name a real admin. + if (!request.authorizedBy || request.requestedBy !== request.authorizedBy) { + throw new Error("Deletion request requires authorization review and resubmission"); + } + await authorizeDeletionScope(ctx, request.authorizedBy, request.scope, request.subject); + return request; +} + +export const getDeletionRequest = internalQuery({ args: { requestId: v.id("deletionRequests") }, returns: v.union(v.null(), v.any()), - handler: async (ctx, args) => { - return await ctx.db.get(args.requestId); - }, + handler: (ctx, args): Promise | null> => authorizedDeletionRequest(ctx, args.requestId), }); -export const updateDeletionRequestStatus = internalMutation({ - args: { - requestId: v.id("deletionRequests"), - status: v.string(), - }, - returns: v.null(), - handler: async (ctx, args) => { - await ctx.db.patch(args.requestId, { - status: args.status, - }); - return null; - }, -}); +// These rows establish the authority and evidence used by this executor. Their +// lifecycle requires a dedicated reviewed operation, not generic row deletion. +const PROTECTED_DELETION_TABLES = new Set([ + "deletionRequests", "deletionTombstones", "adminAuditLog", "adminUsers", "users", +]); -export const completeDeletionRequest = internalMutation({ - args: { - requestId: v.id("deletionRequests"), - summary: v.any(), - }, - returns: v.null(), - handler: async (ctx, args) => { +function specificRecordReferences(ctx: QueryCtx, refs: string[] | undefined): Array<{ table: TableNames; id: Id }> { + if (!refs?.length || refs.length > MAX_DELETION_RECORDS) { + throw new Error("Specific deletion requires between 1 and 200 record references"); + } + return refs.map(ref => { + const [table, recordId, extra] = ref.split(":"); + if (!table || !recordId || extra !== undefined || ref.length > 256) throw new Error("Invalid table-bound record reference"); + if (PROTECTED_DELETION_TABLES.has(table)) throw new Error("Protected authority or audit table requires a dedicated reviewed operation"); + const id = ctx.db.normalizeId(table as TableNames, recordId); + if (!id) throw new Error("Invalid table-bound record reference"); + return { table: table as TableNames, id }; + }); +} + +function deletionOutcome(request: Doc<"deletionRequests">): DeletionOutcome { + return { + success: request.status === "completed", + status: request.status, + recordsDeleted: request.deletionSummary?.recordsDeleted ?? 0, + tablesAffected: request.deletionSummary?.tablesAffected ?? [], + }; +} + +async function failDeletionRequest(ctx: MutationCtx, request: Doc<"deletionRequests">, error: string): Promise { + const summary = { + tablesAffected: request.deletionSummary?.tablesAffected ?? [], + recordsDeleted: request.deletionSummary?.recordsDeleted ?? 0, + tombstonesCreated: request.deletionSummary?.tombstonesCreated ?? 0, + failedDeletions: [{ table: "deletionRequests", recordId: String(request._id), error: error.slice(0, 512) }], + }; + await ctx.db.patch(request._id, { status: "failed", deletionSummary: summary, completedAt: undefined, completedBy: undefined }); + return { success: false, status: "failed", recordsDeleted: summary.recordsDeleted, tablesAffected: summary.tablesAffected }; +} + +export const advanceDeletionRequest = internalMutation({ + args: { requestId: v.id("deletionRequests") }, + returns: deletionOutcomeValidator, + handler: async (ctx, args): Promise => { + // Authority, rows, tombstones, counters and cursor share one transaction. + // Overlapping processors conflict on this row and retry from committed state. + const request = await authorizedDeletionRequest(ctx, args.requestId); + if (!request) throw new Error("Deletion request not found"); + if (request.status === "failed") return deletionOutcome(request); + if (request.scope !== "specific_records") { + return failDeletionRequest(ctx, request, "Full user/entity deletion coverage requires review; no automatic broad deletion was performed. Review ownership, dependent data and retention, then submit explicitly reviewed records."); + } + let refs: ReturnType; + try { + // Validate the whole bounded plan before writing even the first batch. + refs = specificRecordReferences(ctx, request.recordIds); + } catch (error) { + return failDeletionRequest(ctx, request, error instanceof Error ? error.message : String(error)); + } + if (!request.execution && (request.status !== "pending" || request.deletionSummary)) { + return failDeletionRequest(ctx, request, "Legacy execution state requires review and resubmission; previous deletion coverage cannot be certified."); + } + const nextIndex = request.execution?.nextIndex ?? 0; + if (!Number.isInteger(nextIndex) || nextIndex < 0 || nextIndex > refs.length || + (request.status === "completed" && nextIndex !== refs.length)) { + return failDeletionRequest(ctx, request, "Invalid execution progress requires review and resubmission"); + } + if (request.status === "completed") return deletionOutcome(request); + const summary = request.deletionSummary ?? { tablesAffected: [], recordsDeleted: 0, tombstonesCreated: 0, failedDeletions: [] }; + const tables = new Set(summary.tablesAffected); + let deleted = 0; + const end = Math.min(nextIndex + DELETION_BATCH_SIZE, refs.length); + for (const { table, id } of refs.slice(nextIndex, end)) { + // A repeated or already-removed ID is satisfied but is not a deletion. + if (!await ctx.db.get(id)) continue; + await ctx.db.insert("deletionTombstones", { + table, recordId: id, deletionRequestId: args.requestId, deletedAt: Date.now(), deletedBy: request.authorizedBy, + }); + await ctx.db.delete(id); + deleted++; + tables.add(table); + } + const status = end === refs.length ? "completed" : "in_progress"; + const deletionSummary = { + tablesAffected: [...tables].sort(), recordsDeleted: summary.recordsDeleted + deleted, + tombstonesCreated: summary.tombstonesCreated + deleted, failedDeletions: [], + }; await ctx.db.patch(args.requestId, { - status: "completed", - deletionSummary: args.summary, - completedAt: Date.now(), + status, execution: { version: 1, nextIndex: end }, deletionSummary, + ...(status === "completed" ? { completedAt: Date.now(), completedBy: request.authorizedBy } : {}), }); - return null; + return { success: status === "completed", status, recordsDeleted: deletionSummary.recordsDeleted, tablesAffected: deletionSummary.tablesAffected }; }, }); -export const getUserRecords = query({ - args: { - table: v.string(), - userId: v.string(), - }, - returns: v.array(v.string()), +export const recordDeletionFailure = internalMutation({ + args: { requestId: v.id("deletionRequests"), error: v.string() }, + returns: v.null(), handler: async (ctx, args) => { - const table = args.table; - const userId = args.userId; - const limit = 2000; - - try { - if (table === "mcpServers") { - const docs = await ctx.db - .query("mcpServers") - .withIndex("by_user", (q) => q.eq("userId", userId as any)) - .take(limit); - return docs.map((d) => String(d._id)); - } - - if (table === "agentRuns") { - const docs = await ctx.db - .query("agentRuns") - .withIndex("by_user", (q) => q.eq("userId", userId as any)) - .take(limit); - return docs.map((d) => String(d._id)); - } - - if (table === "narrativeThreads") { - const docs = await ctx.db - .query("narrativeThreads") - .withIndex("by_user", (q) => q.eq("userId", userId as any)) - .take(limit); - return docs.map((d) => String(d._id)); - } - - if (table === "narrativePosts") { - const docs = await ctx.db.query("narrativePosts").collect(); - return docs - .filter((p) => p.authorType === "human" && p.authorId === userId) - .slice(0, limit) - .map((d) => String(d._id)); - } - - if (table === "narrativeReplies") { - const docs = await ctx.db.query("narrativeReplies").collect(); - return docs - .filter((r) => r.authorType === "human" && r.authorId === userId) - .slice(0, limit) - .map((d) => String(d._id)); - } - - if (table === "groundTruthVersions") { - const docs = await ctx.db - .query("groundTruthVersions") - .withIndex("by_author", (q) => q.eq("authorId", userId as any).eq("status", "approved")) - .take(limit); - return docs.map((d) => String(d._id)); - } - - if (table === "validationFindings") { - const docs = await ctx.db.query("validationFindings").collect(); - return docs - .filter((f: any) => f.createdBy === userId || f.updatedBy === userId) - .slice(0, limit) - .map((d: any) => String(d._id)); - } - - if (table === "calibrationProposals") { - const docs = await ctx.db.query("calibrationProposals").collect(); - return docs - .filter((p: any) => p.proposedBy === userId) - .slice(0, limit) - .map((d: any) => String(d._id)); - } - - if (table === "evidenceArtifacts") { - const docs = await ctx.db.query("evidenceArtifacts").collect(); - return docs - .filter((a: any) => a.retrievalTrace?.agentName === userId) - .slice(0, limit) - .map((d: any) => String(d._id)); - } - - if (table === "narrativeSearchLog") { - const docs = await ctx.db - .query("narrativeSearchLog") - .withIndex("by_user", (q) => q.eq("userId", userId as any)) - .take(limit); - return docs.map((d) => String(d._id)); - } - - return []; - } catch (err) { - console.warn("[privacyEnforcement] getUserRecords failed:", args.table, err); - return []; + const request = await ctx.db.get(args.requestId); + if (request && request.status !== "completed" && request.status !== "failed") { + await failDeletionRequest(ctx, request, args.error); } + return null; }, }); -export const deleteRecordWithTombstone = internalMutation({ - args: { - table: v.string(), - recordId: v.string(), - deletionRequestId: v.id("deletionRequests"), - }, - returns: v.null(), - handler: async (ctx, args) => { - // Create tombstone for audit trail - await ctx.db.insert("deletionTombstones", { - table: args.table, - recordId: args.recordId, - deletionRequestId: args.deletionRequestId, - deletedAt: Date.now(), - }); +function deletionQueueLimit(limit = 10): number { + if (!Number.isInteger(limit) || limit < 1 || limit > 10) throw new Error("Deletion queue limit must be an integer between 1 and 10"); + return limit; +} - const id = args.recordId as unknown as Id; - const existing = await ctx.db.get(id); - if (existing) { - await ctx.db.delete(id); +export const getQueuedDeletionRequests = internalQuery({ + args: { limit: v.number() }, + returns: v.array(v.id("deletionRequests")), + handler: async (ctx, args): Promise[]> => { + const limit = deletionQueueLimit(args.limit); + const queued: Doc<"deletionRequests">[] = []; + for (const status of ["pending", "in_progress"] as const) { + queued.push(...await ctx.db.query("deletionRequests").withIndex("by_status", q => q.eq("status", status)).take(limit)); } - - return null; + return queued.sort((a, b) => a.requestedAt - b.requestedAt || String(a._id).localeCompare(String(b._id))).slice(0, limit).map(row => row._id); }, }); -/** - * Process pending deletion requests (cron-friendly) - */ +/** Process pending and interrupted requests with bounded work per cron run. */ export const processPendingDeletionRequests = internalAction({ - args: { - limit: v.optional(v.number()), - }, - returns: v.object({ - processed: v.number(), - succeeded: v.number(), - failed: v.number(), - }), - handler: async (ctx, args) => { - const limit = args.limit ?? 10; - const pending = await ctx.db - .query("deletionRequests") - .withIndex("by_status", (q) => q.eq("status", "pending")) - .order("asc") - .take(limit); - - let processed = 0; - let succeeded = 0; - let failed = 0; - - for (const req of pending) { + args: { limit: v.optional(v.number()) }, + returns: v.object({ processed: v.number(), succeeded: v.number(), failed: v.number(), deferred: v.number() }), + handler: async (ctx, args): Promise<{ processed: number; succeeded: number; failed: number; deferred: number }> => { + const limit = deletionQueueLimit(args.limit); + const deadline = Date.now() + 20_000; + const queued = await ctx.runQuery(internal.domains.operations.privacyEnforcement.getQueuedDeletionRequests, { limit }); + let processed = 0; let succeeded = 0; let failed = 0; let deferred = 0; + for (const requestId of queued) { + if (Date.now() >= deadline) { deferred += queued.length - processed; break; } processed++; try { - const result = await ctx.runAction( - internal.domains.operations.privacyEnforcement.processDeletionRequest, - { requestId: req._id } - ); + const result = await ctx.runAction(internal.domains.operations.privacyEnforcement.processDeletionRequest, { requestId }); if (result.success) succeeded++; - else failed++; - } catch (err) { + else if (result.status === "failed") failed++; + else deferred++; + } catch (error) { + // Retry the durable failure write if the child action could not finish it. + // If storage is still unavailable, let this cron fail visibly too. + await ctx.runMutation(internal.domains.operations.privacyEnforcement.recordDeletionFailure, { + requestId, error: (error instanceof Error ? error.message : String(error)).slice(0, 512), + }); failed++; - console.warn("[privacyEnforcement] Failed processing deletion request:", req._id, err); - try { - await ctx.runMutation( - internal.domains.operations.privacyEnforcement.updateDeletionRequestStatus, - { requestId: req._id, status: "failed" } - ); - } catch {} } } - - return { processed, succeeded, failed }; + return { processed, succeeded, failed, deferred }; }, }); /** * Create a deletion request */ +async function authorizeDeletionScope( + ctx: QueryCtx, + actorId: Id<"users">, + scope: DeletionRequest["scope"], + subject: string, +): Promise { + if (!await ctx.db.get(actorId)) throw new Error("Authenticated user no longer exists"); + if (scope === "user_data" && subject === actorId) return; + await requireAutonomousAdminAccess(ctx, actorId, "write"); +} + export const createDeletionRequest = mutation({ args: { scope: v.union( @@ -914,16 +758,33 @@ export const createDeletionRequest = mutation({ ), subject: v.string(), recordIds: v.optional(v.array(v.string())), - requestedBy: v.string(), + // Accepted for old callers only. It never determines authority or audit identity. + requestedBy: v.optional(v.string()), }, returns: v.id("deletionRequests"), handler: async (ctx, args) => { + const actorId = await getAuthUserId(ctx); + if (!actorId) throw new Error("Not authenticated"); + await authorizeDeletionScope(ctx, actorId, args.scope, args.subject); + if (!args.subject.trim() || args.subject.length > 512) { + throw new Error("Invalid deletion subject: use between 1 and 512 characters"); + } + if (args.scope === "user_data") { + const subjectId = ctx.db.normalizeId("users", args.subject); + if (!subjectId || !await ctx.db.get(subjectId)) throw new Error("Invalid subject user"); + } + if (args.scope === "specific_records") { + specificRecordReferences(ctx, args.recordIds); + } else if (args.recordIds !== undefined) { + throw new Error("Record references are only valid for specific_records"); + } const requestId = await ctx.db.insert("deletionRequests", { requestId: `del_req_${Date.now()}`, scope: args.scope, subject: args.subject, recordIds: args.recordIds, - requestedBy: args.requestedBy, + requestedBy: actorId, + authorizedBy: actorId, requestedAt: Date.now(), status: "pending", }); @@ -932,7 +793,7 @@ export const createDeletionRequest = mutation({ await ctx.runMutation(internal.domains.operations.adminAuditLog.logAdminActionInternal, { action: "create_deletion_request", actionCategory: "security_event", - actor: args.requestedBy, + actor: actorId, resourceType: "deletionRequests", resourceId: requestId, before: null, @@ -948,8 +809,6 @@ export const createDeletionRequest = mutation({ recordIdsCount: args.recordIds?.length ?? 0, gdprCompliance: true, }, - }).catch((err) => { - console.warn('[createDeletionRequest] Failed to log audit entry:', err); }); return requestId; diff --git a/backend/convex/domains/operations/selfMaintenance.ts b/backend/convex/domains/operations/selfMaintenance.ts index e01c96498..e3969b1f5 100644 --- a/backend/convex/domains/operations/selfMaintenance.ts +++ b/backend/convex/domains/operations/selfMaintenance.ts @@ -277,7 +277,7 @@ export const runNightlySelfMaintenance = internalAction({ export const runNightlySelfMaintenanceCron = internalAction({ args: {}, - handler: async (ctx) => { + handler: async (ctx): Promise => { return await ctx.runAction(internal.domains.operations.selfMaintenance.runNightlySelfMaintenance, { includeLlmExplanation: true, }); diff --git a/backend/convex/domains/operations/sloCollector.ts b/backend/convex/domains/operations/sloCollector.ts index 2e7fb778f..101cb887f 100644 --- a/backend/convex/domains/operations/sloCollector.ts +++ b/backend/convex/domains/operations/sloCollector.ts @@ -11,7 +11,7 @@ import { v } from "convex/values"; import { internalAction, internalMutation, internalQuery } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { Id } from "../../_generated/dataModel"; import { SERVICE_LEVEL_OBJECTIVES, @@ -425,7 +425,7 @@ export const collectAndEvaluateAlerts = internalAction({ // Get active alerts for this SLO const activeAlerts = await ctx.runQuery( - internal.domains.operations.sloFramework.getActiveAlertsForSlo, + api.domains.operations.sloFramework.getActiveAlertsForSlo, { sloId: alertCfg.sloId } ); diff --git a/backend/convex/domains/pipelines/pipelineOwnership.auth.test.ts b/backend/convex/domains/pipelines/pipelineOwnership.auth.test.ts index 22e422e11..d6b7cd64e 100644 --- a/backend/convex/domains/pipelines/pipelineOwnership.auth.test.ts +++ b/backend/convex/domains/pipelines/pipelineOwnership.auth.test.ts @@ -226,6 +226,56 @@ describe.skipIf(!convexTestAvailable)("pipeline caller ownership", () => { ]); }, 20_000); + it("keeps owned and denied history reads isolated during bursts as history accumulates", async () => { + const t = convexTest(schema, convexModules); + const readHistory = async (runId: string, owned: boolean) => { + const [detail, internalDetail, stream, bundle] = await Promise.all([ + t.query(pipelines.pipelineRunsQueries.getRunDetail, { ...sessionA, runId }), + t.query((internal as any).domains.pipelines.pipelineRunsQueries.getRunDetailInternal, { + runId, + ownerKey: "session:anon-session-a", + }), + t.query(pipelines.pipelineStreamMutations.getPipelineStream, { ...sessionA, runId }), + t.query(pipelines.pipelineRunsQueries.getRunBundleDownloadUrl, { ...sessionA, runId }), + ]); + if (owned) { + expect(detail).toMatchObject({ run: { runId }, steps: [{ name: `step-${runId}` }] }); + expect(internalDetail).toMatchObject({ run: { runId } }); + expect(stream).toMatchObject({ runId, partialText: `private-${runId}` }); + expect(bundle).toEqual({ bundleUrl: null, imageUrl: null }); + } else { + expect([detail, internalDetail, stream, bundle]).toEqual([null, null, null, null]); + } + }; + + for (let batch = 0; batch < 6; batch += 1) { + await t.run(async (ctx: any) => { + for (const [label, ownerKey] of [ + ["owned", "session:anon-session-a"], + ["foreign", "session:anon-session-b"], + ["legacy", undefined], + ] as const) { + const runId = `${label}-${batch}`; + const pipelineRunId = await ctx.db.insert("pipelineRuns", runFields(runId, ownerKey)); + await ctx.db.insert("pipelineSteps", { + runId, pipelineRunId, seq: 1, name: `step-${runId}`, status: "ok", startedAt: NOW, + }); + await ctx.db.insert("pipelineRunStreams", { + runId, pipelineRunId, stepName: `step-${runId}`, partialText: `private-${runId}`, + status: "streaming", startedAt: NOW, updatedAt: NOW + batch, + }); + } + }); + await Promise.all([ + readHistory("owned-0", true), + readHistory(`owned-${batch}`, true), + readHistory(`foreign-${batch}`, false), + readHistory(`legacy-${batch}`, false), + readHistory("missing-run", false), + ]); + } + }, 20_000); + it("anchors schedules to authenticated callers and rejects cross-user control", async () => { const t = convexTest(schema, convexModules); const { userA, userB } = await t.run(async (ctx: any) => ({ diff --git a/backend/convex/domains/pipelines/pipelineOwnership.ts b/backend/convex/domains/pipelines/pipelineOwnership.ts index 1f667fb86..4c4a70ae4 100644 --- a/backend/convex/domains/pipelines/pipelineOwnership.ts +++ b/backend/convex/domains/pipelines/pipelineOwnership.ts @@ -40,9 +40,10 @@ export async function requireAuthenticatedPipelineOwnerKey( return `user:${String(userId)}`; } -export function pipelineOwnerMatches( - row: { ownerKey?: string | null } | null | undefined, +/** Return the original owned record, or null for missing and differently owned records. */ +export function getOwnedPipelineRow( + row: T | null | undefined, ownerKey: string, -): boolean { - return Boolean(row && row.ownerKey === ownerKey); +): T | null { + return row && row.ownerKey === ownerKey ? row : null; } diff --git a/backend/convex/domains/pipelines/pipelineRunsQueries.ts b/backend/convex/domains/pipelines/pipelineRunsQueries.ts index a97e3a9c6..e64ae841f 100644 --- a/backend/convex/domains/pipelines/pipelineRunsQueries.ts +++ b/backend/convex/domains/pipelines/pipelineRunsQueries.ts @@ -9,7 +9,7 @@ import { v } from "convex/values"; import { internalQuery, query } from "../../_generated/server"; import { - pipelineOwnerMatches, + getOwnedPipelineRow, requirePipelineCallerOwnerKey, } from "./pipelineOwnership"; @@ -177,11 +177,14 @@ export const getRunDetail = query({ ctx, args.anonymousSessionId, ); - const run = await ctx.db - .query("pipelineRuns") - .withIndex("by_runId", (q) => q.eq("runId", args.runId)) - .first(); - if (!pipelineOwnerMatches(run, ownerKey)) return null; + const run = getOwnedPipelineRow( + await ctx.db + .query("pipelineRuns") + .withIndex("by_runId", (q) => q.eq("runId", args.runId)) + .first(), + ownerKey, + ); + if (!run) return null; const stepDocs = await ctx.db .query("pipelineSteps") @@ -252,11 +255,14 @@ export const getRunBundleDownloadUrl = query({ ctx, args.anonymousSessionId, ); - const run = await ctx.db - .query("pipelineRuns") - .withIndex("by_runId", (q) => q.eq("runId", args.runId)) - .first(); - if (!pipelineOwnerMatches(run, ownerKey)) return null; + const run = getOwnedPipelineRow( + await ctx.db + .query("pipelineRuns") + .withIndex("by_runId", (q) => q.eq("runId", args.runId)) + .first(), + ownerKey, + ); + if (!run) return null; const bundleUrl = run.outputZipStorageId ? await ctx.storage.getUrl(run.outputZipStorageId) : null; @@ -398,11 +404,14 @@ export const listRecentRunsInternal = internalQuery({ export const getRunDetailInternal = internalQuery({ args: { runId: v.string(), ownerKey: v.string() }, handler: async (ctx, args) => { - const run = await ctx.db - .query("pipelineRuns") - .withIndex("by_runId", (q) => q.eq("runId", args.runId)) - .first(); - if (!pipelineOwnerMatches(run, args.ownerKey)) return null; + const run = getOwnedPipelineRow( + await ctx.db + .query("pipelineRuns") + .withIndex("by_runId", (q) => q.eq("runId", args.runId)) + .first(), + args.ownerKey, + ); + if (!run) return null; const stepDocs = await ctx.db .query("pipelineSteps") diff --git a/backend/convex/domains/pipelines/pipelineSchedule.ts b/backend/convex/domains/pipelines/pipelineSchedule.ts index e689bdeec..49a301217 100644 --- a/backend/convex/domains/pipelines/pipelineSchedule.ts +++ b/backend/convex/domains/pipelines/pipelineSchedule.ts @@ -28,7 +28,7 @@ import { internal } from "../../_generated/api"; import type { Id } from "../../_generated/dataModel"; import { DEFAULT_PIPELINE_MODEL_ROUTE } from "../agents/mcp_tools/models/modelResolver"; import { - pipelineOwnerMatches, + getOwnedPipelineRow, requireAuthenticatedPipelineOwnerKey, } from "./pipelineOwnership"; import { normalizePipelineLaunchText } from "./pipelineAdmission"; @@ -106,8 +106,8 @@ export const setScheduleEnabled = mutation({ returns: v.null(), handler: async (ctx, args) => { const ownerKey = await requireAuthenticatedPipelineOwnerKey(ctx); - const schedule = await ctx.db.get(args.scheduleId); - if (!pipelineOwnerMatches(schedule, ownerKey)) { + const schedule = getOwnedPipelineRow(await ctx.db.get(args.scheduleId), ownerKey); + if (!schedule) { throw new Error("Schedule not found or unauthorized"); } await ctx.db.patch(args.scheduleId, { @@ -125,8 +125,8 @@ export const deleteSchedule = mutation({ returns: v.null(), handler: async (ctx, args) => { const ownerKey = await requireAuthenticatedPipelineOwnerKey(ctx); - const schedule = await ctx.db.get(args.scheduleId); - if (!pipelineOwnerMatches(schedule, ownerKey)) { + const schedule = getOwnedPipelineRow(await ctx.db.get(args.scheduleId), ownerKey); + if (!schedule) { throw new Error("Schedule not found or unauthorized"); } await ctx.db.delete(args.scheduleId); diff --git a/backend/convex/domains/pipelines/pipelineStreamMutations.ts b/backend/convex/domains/pipelines/pipelineStreamMutations.ts index 1f1076714..a775c6896 100644 --- a/backend/convex/domains/pipelines/pipelineStreamMutations.ts +++ b/backend/convex/domains/pipelines/pipelineStreamMutations.ts @@ -17,7 +17,7 @@ import { v } from "convex/values"; import { internalMutation, query } from "../../_generated/server"; import { - pipelineOwnerMatches, + getOwnedPipelineRow, requirePipelineCallerOwnerKey, } from "./pipelineOwnership"; @@ -192,11 +192,14 @@ export const getPipelineStream = query({ ctx, args.anonymousSessionId, ); - const run = await ctx.db - .query("pipelineRuns") - .withIndex("by_runId", (q) => q.eq("runId", args.runId)) - .first(); - if (!pipelineOwnerMatches(run, ownerKey)) return null; + const run = getOwnedPipelineRow( + await ctx.db + .query("pipelineRuns") + .withIndex("by_runId", (q) => q.eq("runId", args.runId)) + .first(), + ownerKey, + ); + if (!run) return null; let row; if (args.stepName) { diff --git a/backend/convex/domains/product/__tests__/preferencesReturnContract.test.ts b/backend/convex/domains/product/__tests__/preferencesReturnContract.test.ts new file mode 100644 index 000000000..b4950b927 --- /dev/null +++ b/backend/convex/domains/product/__tests__/preferencesReturnContract.test.ts @@ -0,0 +1,114 @@ +import { describe, expect, it } from "vitest"; +import { convexTest } from "convex-test"; +import schema from "../../../schema"; +import { api } from "../../../_generated/api"; + +const modules = { + "_generated/server.js": () => import("../../../_generated/server"), + "domains/product/me.ts": () => import("../me"), + "domains/auth/userPreferences.ts": () => import("../../auth/userPreferences"), + "domains/operations/personaChangeTracking.ts": () => import("../../operations/personaChangeTracking"), +}; +const me = api.domains.product.me; +const prefs = api.domains.auth.userPreferences; +const icons = ["flow", "tools", "mcp", "sms", "email", "gmail", "phone", "slack", "discord", "webhook", "zapier"]; +const defaults = { + sidebarPinned: true, showFileSizes: true, organizationMode: "folders", + ungroupedSectionName: "Ungrouped Documents", ungroupedSectionExpanded: true, + iconOrder: icons, docOrderByGroup: {}, linkReminderOptOut: false, trackedHashtags: [], techStack: [], +}; +async function setup() { + const t = convexTest(schema, modules); + const [a, b] = await t.run(async (ctx) => [await ctx.db.insert("users", { name: "Fixture A" }), await ctx.db.insert("users", { name: "Fixture B" })]); + return { t, a, b, A: t.withIdentity({ subject: a }), B: t.withIdentity({ subject: b }) }; +} + +describe("a returning owner reads saved calendar choices", () => { + it("returns saved false/false/auto instead of silently selecting client defaults", async () => { + const { t, a, A } = await setup(); + await A.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: false, gcalSyncEnabled: false, calendarAutoAddMode: "auto" }); + const stored = await t.run((ctx) => ctx.db.query("userPreferences").withIndex("by_user", (q) => q.eq("userId", a)).unique()); + const result = await A.query(prefs.getUserPreferences, {}); + console.info("PREFERENCE_QUERY_OBSERVATION", JSON.stringify({ stored: { gmailIngestEnabled: stored?.gmailIngestEnabled, gcalSyncEnabled: stored?.gcalSyncEnabled, calendarAutoAddMode: stored?.calendarAutoAddMode }, returned: result })); + expect(stored).toMatchObject({ gmailIngestEnabled: false, gcalSyncEnabled: false, calendarAutoAddMode: "auto" }); + expect(result).toMatchObject({ gmailIngestEnabled: false, gcalSyncEnabled: false, calendarAutoAddMode: "auto" }); + }); + + it("keeps absent-user and absent-row public shapes, rejecting unauthenticated writes", async () => { + const { t, A, a } = await setup(); + const noAuth = { ...defaults, needsReauth: true, ungroupedSectionName: "Ungrouped" }; + expect(await t.query(prefs.getUserPreferences, {})).toEqual(noAuth); + expect(await A.query(prefs.getUserPreferences, {})).toEqual(defaults); + await expect(t.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: false })).rejects.toThrow(/Not authenticated/); + await t.run((ctx) => ctx.db.delete(a)); + expect(await A.query(prefs.getUserPreferences, {})).toEqual(noAuth); + await expect(A.mutation(prefs.updateUserPreferences, { calendarAutoAddMode: "auto" })).rejects.toThrow(/Not authenticated/); + }); + + it("defaults only unset fields on an existing row and never projects unrelated private data", async () => { + const { t, A, a } = await setup(); + await t.run((ctx) => ctx.db.insert("userPreferences", { userId: a, createdAt: 1, updatedAt: 1, timeZone: "private-fixture-sentinel" })); + const result = await A.query(prefs.getUserPreferences, {}); + expect(result).toEqual({ ungroupedSectionName: "Ungrouped Documents", isUngroupedExpanded: true, organizationMode: "folders", iconOrder: icons, docOrderByGroup: {}, linkReminderOptOut: false, trackedHashtags: [], techStack: [], gmailIngestEnabled: true, gcalSyncEnabled: true, calendarAutoAddMode: "propose" }); + expect(JSON.stringify(result)).not.toContain("private-fixture-sentinel"); + expect(result).not.toHaveProperty("userId"); + expect(result).not.toHaveProperty("_id"); + }); + + it("keeps two owners isolated through a burst and twenty accumulated alternating updates", async () => { + const { t, A, B, a, b } = await setup(); + for (let i = 0; i < 20; i++) { + const enabled = i % 2 === 0; + await Promise.all([ + A.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: enabled, gcalSyncEnabled: enabled, calendarAutoAddMode: enabled ? "propose" : "auto" }), + B.mutation(prefs.updateUserPreferences, { gmailIngestEnabled: !enabled, gcalSyncEnabled: !enabled, calendarAutoAddMode: enabled ? "auto" : "propose" }), + ]); + const [left, right] = await Promise.all([A.query(prefs.getUserPreferences, {}), B.query(prefs.getUserPreferences, {})]); + expect(left).toMatchObject({ gmailIngestEnabled: enabled, gcalSyncEnabled: enabled, calendarAutoAddMode: enabled ? "propose" : "auto" }); + expect(right).toMatchObject({ gmailIngestEnabled: !enabled, gcalSyncEnabled: !enabled, calendarAutoAddMode: enabled ? "auto" : "propose" }); + } + const rows = await t.run((ctx) => ctx.db.query("userPreferences").collect()); + expect(rows.map((row) => row.userId).sort()).toEqual([a, b].sort()); + // An attacker cannot choose another user's row through the public argument shape. + await expect(A.query(prefs.getUserPreferences, { userId: b } as never)).rejects.toThrow(); + }); +}); + +describe("a returning research user keeps their existing profile contract", () => { + it("round-trips all six lenses, roles and explicit false tone without changing stored preference shapes", async () => { + const { A } = await setup(); + for (const preferredLens of ["founder", "investor", "banker", "ceo", "legal", "student"] as const) { + await A.mutation(me.updateProfile, { preferredLens, backgroundSummary: " A representative research brief ", rolesOfInterest: ["Analyst", "Operator"], preferences: { communicationStyle: "concise", evidenceStyle: "citation_heavy", avoidCorporateTone: false } }); + expect((await A.query(me.getMeSnapshot, {})).profile).toMatchObject({ preferredLens, backgroundSummary: "A representative research brief", rolesOfInterest: ["Analyst", "Operator"], preferences: { communicationStyle: "concise", evidenceStyle: "citation_heavy", avoidCorporateTone: false } }); + } + }); + + it("normalizes existing blank/placeholder summaries and preserves migrated or extra legacy preferences", async () => { + const { t, A, a } = await setup(); + const id = await t.run((ctx) => ctx.db.insert("productProfileSummaries", { ownerKey: `user:${a}`, backgroundSummary: "", preferredLens: "banker", rolesOfInterest: [], createdAt: 1, updatedAt: 1, preferences: { theme: "dark", timeZone: "UTC", legacyFixture: { keep: true } } })); + for (const summary of ["", " ", "Private account context migrated into the new Me surface.", "Private context saved in Me."]) { + await t.run((ctx) => ctx.db.patch(id, { backgroundSummary: summary })); + const profile = (await A.query(me.getMeSnapshot, {})).profile; + expect(profile?.backgroundSummary).toBe(""); + expect(profile?.preferences).toEqual({ theme: "dark", timeZone: "UTC", legacyFixture: { keep: true } }); + } + await A.mutation(me.updateProfile, { rolesOfInterest: ["Operator"] }); + expect((await A.query(me.getMeSnapshot, {})).profile?.preferences).toEqual({ theme: "dark", timeZone: "UTC", legacyFixture: { keep: true } }); + }); + + it("preserves signed-in precedence and the explicit anonymous bearer fallback without crossing authenticated owners", async () => { + const { t, A, B } = await setup(); + await A.mutation(me.updateProfile, { preferredLens: "investor" }); + await B.mutation(me.updateProfile, { preferredLens: "legal" }); + await t.mutation(me.updateProfile, { anonymousSessionId: "fixture-bearer", preferredLens: "student" }); + expect((await A.query(me.getMeSnapshot, { anonymousSessionId: "fixture-bearer" })).profile?.preferredLens).toBe("investor"); + expect((await B.query(me.getMeSnapshot, {})).profile?.preferredLens).toBe("legal"); + expect((await t.query(me.getMeSnapshot, { anonymousSessionId: "fixture-bearer" })).profile?.preferredLens).toBe("student"); + const fresh = await t.run((ctx) => ctx.db.insert("users", { name: "Fresh fixture" })); + const freshViewer = t.withIdentity({ subject: fresh }); + expect((await freshViewer.query(me.getMeSnapshot, { anonymousSessionId: "fixture-bearer" })).profile?.preferredLens).toBe("student"); + expect((await freshViewer.query(me.getMeSnapshot, {})).profile).toBeNull(); + expect(await t.query(me.getMeSnapshot, {})).toEqual({ profile: null, files: [], savedContext: [], settings: [] }); + await expect(t.mutation(me.updateProfile, { preferredLens: "founder" })).rejects.toThrow(/Authentication or anonymous session required/); + }); +}); diff --git a/backend/convex/domains/product/me.ts b/backend/convex/domains/product/me.ts index 26dd45dd3..71a6b7bc9 100644 --- a/backend/convex/domains/product/me.ts +++ b/backend/convex/domains/product/me.ts @@ -1,4 +1,5 @@ import { mutation, query } from "../../_generated/server"; +import type { Doc } from "../../_generated/dataModel"; import { v } from "convex/values"; import { resolveProductReadOwnerKeys, resolveProductIdentitySafely, requireProductIdentity } from "./helpers"; import { slugifyProductEntityName } from "./entities"; @@ -32,7 +33,7 @@ export const getMeSnapshot = query({ }; } - let profile: Record | null = null; + let profile: Doc<"productProfileSummaries"> | null = null; let files: any[] = []; let contextItems: any[] = []; try { diff --git a/backend/convex/domains/research/documentDiscovery.ts b/backend/convex/domains/research/documentDiscovery.ts index cfb0184ac..eb0b201f5 100644 --- a/backend/convex/domains/research/documentDiscovery.ts +++ b/backend/convex/domains/research/documentDiscovery.ts @@ -539,7 +539,7 @@ export const generateDocumentRecommendations = internalAction({ console.log(`[documentDiscovery] Scored ${scored.length} documents`); // STEP 3: Diversity Filtering - const diversified = await ctx.runAction( + const diversified: ScoredDocument[] = await ctx.runAction( internal.domains.research.documentDiscovery.applyDiversityFilter, { scored, targetCount: count } ); @@ -694,7 +694,7 @@ export const saveRecommendations = internalMutation({ export const testDocumentCandidates = query({ args: {}, handler: async (ctx) => { - const trending = await ctx.runQuery( + const trending: DocumentCandidate[] = await ctx.runQuery( internal.domains.research.documentDiscovery.getTrendingDocuments, { limit: 10 } ); diff --git a/backend/convex/domains/research/financial/dcfOrchestrator.ts b/backend/convex/domains/research/financial/dcfOrchestrator.ts index b3f9a4af8..01aa1dcf7 100644 --- a/backend/convex/domains/research/financial/dcfOrchestrator.ts +++ b/backend/convex/domains/research/financial/dcfOrchestrator.ts @@ -13,7 +13,7 @@ */ import { action, internalMutation, internalQuery } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import { v } from "convex/values"; /** @@ -583,7 +583,7 @@ export const runDCFEvaluation = action({ let sensitivityMatrix: any; try { sensitivityMatrix = await ctx.runAction( - internal.domains.financial.sensitivityAnalysis.generateSensitivityMatrix, + api.domains.financial.sensitivityAnalysis.generateSensitivityMatrix, { baseFCF: state.financialData?.freeCashFlow || 10000, fcfGrowthRates: state.userAssumptions?.revenueGrowth || [0.10, 0.08, 0.06, 0.05, 0.04], @@ -776,7 +776,7 @@ export const runDCFEvaluation = action({ const reportGenStart = Date.now(); const markdownReport = await ctx.runAction( - internal.domains.financial.reportGenerator.generateMarkdownReport, + api.domains.financial.reportGenerator.generateMarkdownReport, { state, sensitivity: sensitivityMatrix, @@ -784,7 +784,7 @@ export const runDCFEvaluation = action({ ); const jsonReport = await ctx.runAction( - internal.domains.financial.reportGenerator.generateJSONReport, + api.domains.financial.reportGenerator.generateJSONReport, { state, sensitivity: sensitivityMatrix, diff --git a/backend/convex/domains/research/financial/dcfSpreadsheetAdapter.ts b/backend/convex/domains/research/financial/dcfSpreadsheetAdapter.ts index 77a85ed2b..b7e3b978f 100644 --- a/backend/convex/domains/research/financial/dcfSpreadsheetAdapter.ts +++ b/backend/convex/domains/research/financial/dcfSpreadsheetAdapter.ts @@ -11,7 +11,7 @@ */ import { internalMutation, internalQuery, action } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import { v } from "convex/values"; import { DCF_SHEET, mapCellToField } from "./dcfSpreadsheetMapping"; @@ -66,7 +66,7 @@ export const generateSpreadsheetFromDCF = action({ let cellsCreated = 0; for (const cell of cells) { await ctx.runMutation( - internal.domains.integrations.spreadsheets.applyOperations, + api.domains.integrations.spreadsheets.applyOperations, { sheetId: spreadsheetId, operations: [ @@ -207,7 +207,7 @@ export const syncDCFToSpreadsheet = action({ let cellsUpdated = 0; for (const cell of cellsToUpdate) { await ctx.runMutation( - internal.domains.integrations.spreadsheets.applyOperations, + api.domains.integrations.spreadsheets.applyOperations, { sheetId: args.spreadsheetId, operations: [ @@ -244,14 +244,14 @@ export const applyDCFSpreadsheetCellEdit = action({ field: v.optional(v.string()), recalculated: v.boolean(), }), - handler: async (ctx, args) => { + handler: async (ctx, args): Promise<{ applied: boolean; field?: string; recalculated: boolean }> => { const sheet = await ctx.runQuery( internal.domains.financial.dcfSpreadsheetAdapter.getSpreadsheetInfo, { spreadsheetId: args.spreadsheetId } ); const sessionId = (sheet as any)?.dcfSessionId as string | undefined; if (!sessionId) { - await ctx.runMutation(internal.domains.integrations.spreadsheets.applyOperations, { + await ctx.runMutation(api.domains.integrations.spreadsheets.applyOperations, { sheetId: args.spreadsheetId, operations: [ { op: "setCell", row: args.row, col: args.col, value: args.newValue, type: "text" }, @@ -262,7 +262,7 @@ export const applyDCFSpreadsheetCellEdit = action({ const field = mapCellToField(args.row, args.col); if (!field) { - await ctx.runMutation(internal.domains.integrations.spreadsheets.applyOperations, { + await ctx.runMutation(api.domains.integrations.spreadsheets.applyOperations, { sheetId: args.spreadsheetId, operations: [ { op: "setCell", row: args.row, col: args.col, value: args.newValue, type: "text" }, diff --git a/backend/convex/domains/research/financial/interactiveDCFSession.ts b/backend/convex/domains/research/financial/interactiveDCFSession.ts index 3a9891077..ed935ee77 100644 --- a/backend/convex/domains/research/financial/interactiveDCFSession.ts +++ b/backend/convex/domains/research/financial/interactiveDCFSession.ts @@ -293,7 +293,7 @@ export const recalculateSession = action({ fairValue: v.number(), calculationTime: v.number(), }), - handler: async (ctx, args) => { + handler: async (ctx, args): Promise<{ fairValue: number; calculationTime: number }> => { const startTime = Date.now(); const session = await ctx.runQuery( diff --git a/backend/convex/domains/research/financial/reportGenerator.ts b/backend/convex/domains/research/financial/reportGenerator.ts index 0ed9b96e4..f1724a901 100644 --- a/backend/convex/domains/research/financial/reportGenerator.ts +++ b/backend/convex/domains/research/financial/reportGenerator.ts @@ -8,7 +8,7 @@ */ import { action } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import { v } from "convex/values"; import { formatSensitivityTable } from "./sensitivityAnalysis"; @@ -292,8 +292,8 @@ export const testReportGenerator = action({ handler: async (ctx, args) => { console.log("\n[Test] Generating comprehensive report..."); - const markdown = await ctx.runAction( - internal.domains.financial.reportGenerator.generateMarkdownReport, + const markdown: string = await ctx.runAction( + api.domains.financial.reportGenerator.generateMarkdownReport, { state: args.state } ); diff --git a/backend/convex/domains/research/financial/sensitivityAnalysis.ts b/backend/convex/domains/research/financial/sensitivityAnalysis.ts index e0a9d800e..da6b86595 100644 --- a/backend/convex/domains/research/financial/sensitivityAnalysis.ts +++ b/backend/convex/domains/research/financial/sensitivityAnalysis.ts @@ -266,7 +266,7 @@ export const testSensitivityAnalysis = action({ args: { ticker: v.optional(v.string()), }, - handler: async (ctx, args) => { + handler: async (ctx, args): Promise<{ waccRange: number[]; terminalGrowthRange: number[]; matrix: number[][]; baseCase: { wacc: number; terminalGrowth: number; fairValue: number } }> => { const ticker = args.ticker || "NVDA"; console.log(`\n[Test] Running sensitivity analysis for ${ticker}...`); diff --git a/backend/convex/domains/research/forYouFeed.ts b/backend/convex/domains/research/forYouFeed.ts index 2b6d0cc69..1e68fef8c 100644 --- a/backend/convex/domains/research/forYouFeed.ts +++ b/backend/convex/domains/research/forYouFeed.ts @@ -1616,7 +1616,7 @@ export const getRelatedFeedItems = query({ export const testCandidateSourcing = query({ args: {}, handler: async (ctx) => { - const trending = await ctx.runQuery(internal.domains.research.forYouFeed.getTrendingCandidates, { + const trending: FeedCandidate[] = await ctx.runQuery(internal.domains.research.forYouFeed.getTrendingCandidates, { limit: 10, }); diff --git a/backend/convex/domains/research/githubExplorer.ts b/backend/convex/domains/research/githubExplorer.ts index 5fd74f8e3..d0908581c 100644 --- a/backend/convex/domains/research/githubExplorer.ts +++ b/backend/convex/domains/research/githubExplorer.ts @@ -240,7 +240,7 @@ export const discoverTrendingRepos = internalAction({ } // STEP 2: Phoenix ML Scoring - const scored = await ctx.runAction( + const scored: ScoredRepo[] = await ctx.runAction( internal.domains.research.githubExplorer.scoreReposWithPhoenix, { repos, userInterests } ); diff --git a/backend/convex/domains/research/narrative/didYouKnow.ts b/backend/convex/domains/research/narrative/didYouKnow.ts index c1de9b194..0671370f9 100644 --- a/backend/convex/domains/research/narrative/didYouKnow.ts +++ b/backend/convex/domains/research/narrative/didYouKnow.ts @@ -763,7 +763,12 @@ export const generateAndJudgeDidYouKnowFromUrls = internalAction({ maxUrls: 5, }); - const didYouKnow = await ctx.runAction(internal.domains.narrative.didYouKnow.generateDidYouKnow, { + const didYouKnow: { + output: DidYouKnowOutput; + modelUsed: string; + artifactId: Id<"sourceArtifacts">; + parseError?: string; + } = await ctx.runAction(internal.domains.narrative.didYouKnow.generateDidYouKnow, { workflowId, sources: prepared.map((s: any) => ({ url: s.url, @@ -776,7 +781,19 @@ export const generateAndJudgeDidYouKnowFromUrls = internalAction({ temperature: 0.6, }); - const judge = await ctx.runAction(internal.domains.narrative.didYouKnow.judgeDidYouKnow, { + const judge: { + passed: boolean; + checks: ReturnType; + reasons: string[]; + explanation: string; + llmJudge: { + passed: boolean; + modelUsed: string; + artifactId: Id<"sourceArtifacts">; + result: { passed: boolean; reasons?: string[] } | null; + parseError?: string; + }; + } = await ctx.runAction(internal.domains.narrative.didYouKnow.judgeDidYouKnow, { workflowId, didYouKnowArtifactId: didYouKnow.artifactId, output: didYouKnow.output, diff --git a/backend/convex/domains/research/narrative/experiments/freshNewsDidYouKnowExperiment.ts b/backend/convex/domains/research/narrative/experiments/freshNewsDidYouKnowExperiment.ts index 23adbe856..af16aef09 100644 --- a/backend/convex/domains/research/narrative/experiments/freshNewsDidYouKnowExperiment.ts +++ b/backend/convex/domains/research/narrative/experiments/freshNewsDidYouKnowExperiment.ts @@ -271,7 +271,7 @@ export const runFreshNewsDidYouKnowExperiment = internalAction({ }); const validation = args.validate - ? await ctx.runAction(internal.domains.narrative.tests.qaFramework.validateWorkflowRun, { + ? await ctx.runAction(api.domains.narrative.tests.qaFramework.validateWorkflowRun, { workflowId, includeLlmExplanation: true, } as any) diff --git a/backend/convex/domains/research/narrative/guards/claimClassifier.ts b/backend/convex/domains/research/narrative/guards/claimClassifier.ts index 41caae7de..05062684c 100644 --- a/backend/convex/domains/research/narrative/guards/claimClassifier.ts +++ b/backend/convex/domains/research/narrative/guards/claimClassifier.ts @@ -451,7 +451,7 @@ export const checkPublishingEligibility = internalAction({ const minCoverage = args.minCoverageScore ?? 0.8; // 80% default // Classify claims - const classification = await ctx.runAction( + const classification: ClaimClassificationResult = await ctx.runAction( internal.domains.narrative.guards.claimClassifier.classifyPostClaims, { postId: args.postId, diff --git a/backend/convex/domains/research/narrative/guards/trustScoring.ts b/backend/convex/domains/research/narrative/guards/trustScoring.ts index 4f89d7e2c..64b5b9378 100644 --- a/backend/convex/domains/research/narrative/guards/trustScoring.ts +++ b/backend/convex/domains/research/narrative/guards/trustScoring.ts @@ -273,7 +273,7 @@ export const updateTrustScore = internalMutation({ // Create profile if doesn't exist if (!profile) { - const profileId = await ctx.runMutation( + const profileId: Id<"authorTrust"> = await ctx.runMutation( internal.domains.narrative.guards.trustScoring.initializeTrustProfile, { authorId: args.authorId, diff --git a/backend/convex/domains/research/narrative/mutations/dedup.ts b/backend/convex/domains/research/narrative/mutations/dedup.ts index 6aa9a0c12..ab98b049e 100644 --- a/backend/convex/domains/research/narrative/mutations/dedup.ts +++ b/backend/convex/domains/research/narrative/mutations/dedup.ts @@ -721,7 +721,7 @@ export const createEventWithDedup = internalAction({ }), handler: async (ctx, args) => { // Run dedup ladder - const dedupResult = await ctx.runAction( + const dedupResult: DedupResult = await ctx.runAction( internal.domains.narrative.mutations.dedup.deduplicateEvent, { threadId: args.threadId, @@ -750,7 +750,7 @@ export const createEventWithDedup = internalAction({ const primaryUrl = args.sourceUrls[0]; const canonicalUrl = primaryUrl ? normalizeUrl(primaryUrl) : undefined; - const eventId = await ctx.runMutation( + const eventId: { docId: Id<"narrativeEvents">; eventId: string } = await ctx.runMutation( internal.domains.narrative.mutations.dedup.createEventInternal, { threadId: args.threadId, diff --git a/backend/convex/domains/research/narrative/tests/validatePipeline.ts b/backend/convex/domains/research/narrative/tests/validatePipeline.ts index f448ed65d..e2ecc85c9 100644 --- a/backend/convex/domains/research/narrative/tests/validatePipeline.ts +++ b/backend/convex/domains/research/narrative/tests/validatePipeline.ts @@ -14,7 +14,7 @@ import { action } from "../../../../_generated/server"; import { v } from "convex/values"; -import { internal } from "../../../../_generated/api"; +import { api, internal } from "../../../../_generated/api"; import { getCurrentWeekNumber } from "../newsroom/state"; /** @@ -175,7 +175,7 @@ export const runValidation = action({ for (let i = 0; i < TEST_NARRATIVES.length; i++) { const result = await ctx.runAction( - internal.domains.narrative.tests.validatePipeline.validateSingleNarrative, + api.domains.narrative.tests.validatePipeline.validateSingleNarrative, { narrativeIndex: i, userId: args.userId, diff --git a/backend/convex/domains/search/fusion/crossProviderEval.ts b/backend/convex/domains/search/fusion/crossProviderEval.ts index d4108f9d7..4aff24afb 100644 --- a/backend/convex/domains/search/fusion/crossProviderEval.ts +++ b/backend/convex/domains/search/fusion/crossProviderEval.ts @@ -568,7 +568,19 @@ export const compareToBaseline = action({ }))), }, returns: v.any(), - handler: async (ctx, args) => { + handler: async (ctx, args): Promise<{ + baselineSnapshotId: string; + newSnapshotId: string; + baseline: BaselineSnapshot["aggregateMetrics"]; + current: BaselineSnapshot["aggregateMetrics"]; + deltas: { + urlOverlap: number; + titleOverlap: number; + rankingAgreement: number; + duplicateRate: number; + }; + status: "improved" | "regressed" | "stable"; + }> => { // Get baseline const baseline = await ctx.runQuery( internal.domains.search.fusion.crossProviderEval.getBaseline, diff --git a/backend/convex/domains/social/instagramIngestion.ts b/backend/convex/domains/social/instagramIngestion.ts index bc64c569b..31ebcf7eb 100644 --- a/backend/convex/domains/social/instagramIngestion.ts +++ b/backend/convex/domains/social/instagramIngestion.ts @@ -7,7 +7,7 @@ import { v } from "convex/values"; import { action, mutation, query, internalAction, internalMutation } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { getAuthUserId } from "@convex-dev/auth/server"; import type { Id } from "../../_generated/dataModel"; @@ -64,7 +64,7 @@ export const ingestPost = action({ } // Check for existing post - const existing = await ctx.runQuery(internal.domains.social.instagramIngestion.getPostByUrl, { + const existing = await ctx.runQuery(api.domains.social.instagramIngestion.getPostByUrl, { postUrl: args.postUrl, }); if (existing) { @@ -186,7 +186,7 @@ export const processPost = internalAction({ returns: v.null(), handler: async (ctx, args): Promise => { // Step 1: Fetch metadata - const post = await ctx.runQuery(internal.domains.social.instagramIngestion.getPost, { + const post = await ctx.runQuery(api.domains.social.instagramIngestion.getPost, { postId: args.postId, }); @@ -313,7 +313,7 @@ export const processPost = internalAction({ // If we have a caption but no claims extracted yet, analyze the caption if (metadata.caption) { - const currentPost = await ctx.runQuery(internal.domains.social.instagramIngestion.getPost, { + const currentPost = await ctx.runQuery(api.domains.social.instagramIngestion.getPost, { postId: args.postId, }); @@ -335,7 +335,7 @@ export const processPost = internalAction({ }); // Step 6: Schedule fact verification for extracted claims (async) - const finalPost = await ctx.runQuery(internal.domains.social.instagramIngestion.getPost, { + const finalPost = await ctx.runQuery(api.domains.social.instagramIngestion.getPost, { postId: args.postId, }); if (finalPost?.extractedClaims && finalPost.extractedClaims.length > 0) { diff --git a/backend/convex/domains/social/linkedinArchiveAudit.ts b/backend/convex/domains/social/linkedinArchiveAudit.ts index 3e5004896..dfac8c063 100644 --- a/backend/convex/domains/social/linkedinArchiveAudit.ts +++ b/backend/convex/domains/social/linkedinArchiveAudit.ts @@ -15,7 +15,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; type ArchiveRow = { _id: string; @@ -110,7 +110,7 @@ export const runArchiveAudit = internalAction({ }; while (scanned < maxRows) { - const res = await ctx.runQuery(internal.domains.social.linkedinArchiveQueries.getArchivedPosts, { + const res = await ctx.runQuery(api.domains.social.linkedinArchiveQueries.getArchivedPosts, { limit: pageSize, cursor: cursor ?? undefined, dedupe: false, diff --git a/backend/convex/domains/social/linkedinArchiveEdits.ts b/backend/convex/domains/social/linkedinArchiveEdits.ts index 2d23cafb3..cdfc744b9 100644 --- a/backend/convex/domains/social/linkedinArchiveEdits.ts +++ b/backend/convex/domains/social/linkedinArchiveEdits.ts @@ -9,7 +9,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; type ProposedEdit = { archiveRowId: string; @@ -79,7 +79,7 @@ export const proposeAndApplyLegacyEdits = internalAction({ let cursor: string | undefined = undefined; for (let page = 0; page < 50 && proposals.length < maxEdits; page++) { - const res = await ctx.runQuery(internal.domains.social.linkedinArchiveQueries.getArchivedPosts, { + const res = await ctx.runQuery(api.domains.social.linkedinArchiveQueries.getArchivedPosts, { limit: 200, cursor, dedupe: true, diff --git a/backend/convex/domains/social/linkedinArchivePurge.ts b/backend/convex/domains/social/linkedinArchivePurge.ts index 05450f544..2f49843e9 100644 --- a/backend/convex/domains/social/linkedinArchivePurge.ts +++ b/backend/convex/domains/social/linkedinArchivePurge.ts @@ -10,7 +10,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { Id } from "../../_generated/dataModel"; type ArchiveRow = { @@ -50,7 +50,7 @@ export const scanAndPurgeObviousTestRows = internalAction({ const maxScan = Math.min(Math.max(args.maxScan ?? 10000, 1), 200000); const maxDeletes = Math.min(Math.max(args.maxDeletes ?? 200, 1), 5000); - const rows = await ctx.runQuery(internal.domains.social.linkedinArchiveQueries.getArchivedPosts, { + const rows = await ctx.runQuery(api.domains.social.linkedinArchiveQueries.getArchivedPosts, { limit: Math.min(maxScan, 500), dedupe: false, }); @@ -61,7 +61,7 @@ export const scanAndPurgeObviousTestRows = internalAction({ let cursor: string | undefined = undefined; while (scanned < maxScan) { - const pageRes = scanned === 0 ? rows : await ctx.runQuery(internal.domains.social.linkedinArchiveQueries.getArchivedPosts, { + const pageRes = scanned === 0 ? rows : await ctx.runQuery(api.domains.social.linkedinArchiveQueries.getArchivedPosts, { limit: 500, cursor, dedupe: false, diff --git a/backend/convex/domains/social/linkedinFundingPosts.ts b/backend/convex/domains/social/linkedinFundingPosts.ts index 966ca0aca..2d0f36d9d 100644 --- a/backend/convex/domains/social/linkedinFundingPosts.ts +++ b/backend/convex/domains/social/linkedinFundingPosts.ts @@ -637,7 +637,7 @@ export const recordPostedCompanyWithEntityLink = internalAction({ : undefined; // Step 4: Record the post with entity ID - const postId = await ctx.runMutation( + const postId: Id<"linkedinFundingPosts"> = await ctx.runMutation( internal.domains.social.linkedinFundingPosts.recordPostedCompany, { companyName: args.companyName, diff --git a/backend/convex/domains/social/linkedinPosting.ts b/backend/convex/domains/social/linkedinPosting.ts index 5f444e81c..a62ae329b 100644 --- a/backend/convex/domains/social/linkedinPosting.ts +++ b/backend/convex/domains/social/linkedinPosting.ts @@ -1045,7 +1045,7 @@ export const createTargetedTextPost = internalAction({ held: v.optional(v.boolean()), gateFailures: v.optional(v.array(v.string())), }), - handler: async (ctx, args) => { + handler: async (ctx, args): Promise => { const effectiveTarget = args.target || (process.env.LINKEDIN_DEFAULT_TARGET as "personal" | "organization") || "personal"; @@ -1086,7 +1086,7 @@ export const createTargetedTextPost = internalAction({ } if (effectiveTarget === "organization") { - const result = await ctx.runAction( + const result: LinkedInPostResult = await ctx.runAction( internal.domains.social.linkedinPosting.createOrgTextPost, { text: args.text }, ); @@ -1197,7 +1197,7 @@ export const processQueuedPost = internalAction({ } try { - const postResult = await ctx.runAction( + const postResult: LinkedInPostResult = await ctx.runAction( internal.domains.social.linkedinPosting.createTargetedTextPost, { text: item.content, diff --git a/backend/convex/domains/social/linkedinUnknownCompanyFixes.ts b/backend/convex/domains/social/linkedinUnknownCompanyFixes.ts index 336c7d696..80c8d2692 100644 --- a/backend/convex/domains/social/linkedinUnknownCompanyFixes.ts +++ b/backend/convex/domains/social/linkedinUnknownCompanyFixes.ts @@ -155,7 +155,7 @@ export const runUnknownCompanyFixes = internalAction({ const all: ArchiveRow[] = []; let cursor: string | undefined = undefined; for (let page = 0; page < 50; page++) { - const res = await ctx.runQuery(internal.domains.social.linkedinArchiveQueries.getArchivedPosts, { + const res = await ctx.runQuery(api.domains.social.linkedinArchiveQueries.getArchivedPosts, { limit: 200, cursor, dedupe: true, diff --git a/backend/convex/domains/temporal/feynmanEditor.ts b/backend/convex/domains/temporal/feynmanEditor.ts index c2b56287a..3189e9633 100644 --- a/backend/convex/domains/temporal/feynmanEditor.ts +++ b/backend/convex/domains/temporal/feynmanEditor.ts @@ -233,7 +233,7 @@ export const generateContentThread = action({ platform: v.optional(v.union(v.literal("linkedin"), v.literal("twitter"), v.literal("blog"))), }, handler: async (ctx, { signalKey, chainKey, platform }) => { - const feynmanOutput = await ctx.runAction( + const feynmanOutput: FeynmanOutput = await ctx.runAction( api.domains.temporal.feynmanEditor.simplifySignal, { signalKey, chainKey }, ); diff --git a/backend/convex/domains/verification/contradictionDetector.ts b/backend/convex/domains/verification/contradictionDetector.ts index e320cd9e1..753630c6a 100644 --- a/backend/convex/domains/verification/contradictionDetector.ts +++ b/backend/convex/domains/verification/contradictionDetector.ts @@ -16,7 +16,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { Id } from "../../_generated/dataModel"; // Note: getThreadClaims and getPostsNeedingCheck queries are in contradictionDetectorQueries.ts @@ -370,7 +370,7 @@ export const batchDetectContradictions = internalAction({ for (const postId of args.postIds) { const post = await ctx.runQuery( - internal.domains.narrative.queries.posts.getPost, + api.domains.narrative.queries.posts.getPost, { postId } ); diff --git a/backend/convex/domains/verification/instagramClaimVerification.ts b/backend/convex/domains/verification/instagramClaimVerification.ts index 629c07e55..ef97ac86a 100644 --- a/backend/convex/domains/verification/instagramClaimVerification.ts +++ b/backend/convex/domains/verification/instagramClaimVerification.ts @@ -11,7 +11,7 @@ import { v } from "convex/values"; import { internalAction } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { generateText } from "ai"; import { getLanguageModel, getLanguageModelSafe } from "../agents/mcp_tools/models/modelResolver"; import { Doc, Id } from "../../_generated/dataModel"; @@ -403,7 +403,7 @@ export const getRecentlyVerifiedPosts = internalAction({ handler: async (ctx, args) => { // Query posts verified after the given timestamp // This is a simplified query - in production, add proper index - const allPosts = await ctx.runQuery(internal.domains.social.instagramIngestion.listAllPosts, {}); + const allPosts = await ctx.runQuery(api.domains.social.instagramIngestion.listAllPosts, {}); return allPosts.filter( (p: any) => p.verifiedAt && p.verifiedAt >= args.since && p.verificationResults ); diff --git a/backend/convex/domains/verification/integrations/feedVerification.ts b/backend/convex/domains/verification/integrations/feedVerification.ts index 1c92738c6..ef6d302fa 100644 --- a/backend/convex/domains/verification/integrations/feedVerification.ts +++ b/backend/convex/domains/verification/integrations/feedVerification.ts @@ -478,7 +478,7 @@ export const rankWithInsightOptimization = internalAction({ }, handler: async (ctx, { candidates, userPreferences }) => { // Enrich with verification signals - const enriched = await ctx.runAction( + const enriched: EnrichedFeedCandidate[] = await ctx.runAction( internal.domains.verification.integrations.feedVerification.enrichCandidatesWithVerification, { candidates, maxToVerify: 30 } ); diff --git a/backend/convex/domains/verification/integrations/narrativeVerification.ts b/backend/convex/domains/verification/integrations/narrativeVerification.ts index fa9dcd94f..2072af33b 100644 --- a/backend/convex/domains/verification/integrations/narrativeVerification.ts +++ b/backend/convex/domains/verification/integrations/narrativeVerification.ts @@ -14,7 +14,7 @@ import { v } from "convex/values"; import { internalAction } from "../../../_generated/server"; -import { internal } from "../../../_generated/api"; +import { api, internal } from "../../../_generated/api"; import type { Id } from "../../../_generated/dataModel"; // ═══════════════════════════════════════════════════════════════════════════ @@ -328,7 +328,7 @@ export const getPostVerificationReport = internalAction({ // Get source credibility for linked artifacts const post = await ctx.runQuery( - internal.domains.narrative.queries.posts.getPost, + api.domains.narrative.queries.posts.getPost, { postId: args.postId } ); diff --git a/backend/convex/schema.ts b/backend/convex/schema.ts index 506cac542..e332d15ef 100644 --- a/backend/convex/schema.ts +++ b/backend/convex/schema.ts @@ -4226,6 +4226,8 @@ export default defineSchema({ tagRefs, smsLogs, smsUsageDaily, + telegramUsers, + telegramMessages, embeddings, gridProjects, files, @@ -12747,6 +12749,10 @@ export default defineSchema({ subject: v.string(), // User ID or entity key recordIds: v.optional(v.array(v.string())), requestedBy: v.string(), + // Set only by authenticated admission. Missing on legacy rows: require review. + authorizedBy: v.optional(v.id("users")), + // Only the transactional executor advances this cursor. Legacy runs need review. + execution: v.optional(v.object({ version: v.literal(1), nextIndex: v.number() })), requestedAt: v.number(), status: v.union( v.literal("pending"), diff --git a/backend/convex/tools/knowledge/distiller.ts b/backend/convex/tools/knowledge/distiller.ts index db4c85450..aedd8408e 100644 --- a/backend/convex/tools/knowledge/distiller.ts +++ b/backend/convex/tools/knowledge/distiller.ts @@ -4,7 +4,7 @@ import { v } from "convex/values"; import { action, internalQuery } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import type { Id, Doc } from "../../_generated/dataModel"; import { generateText } from "ai"; import { @@ -425,8 +425,8 @@ export const distillSingleArtifact = action({ latencyMs: v.number(), }), handler: async (ctx, args) => { - const result = await ctx.runAction( - internal.tools.knowledge.distiller.distillArtifacts, + const result: DistillationResult = await ctx.runAction( + api.tools.knowledge.distiller.distillArtifacts, { artifactIds: [args.artifactId], query: args.query, @@ -478,8 +478,8 @@ export const distillWithModel = action({ }), }), handler: async (ctx, args) => { - const result = await ctx.runAction( - internal.tools.knowledge.distiller.distillArtifacts, + const result: DistillationResult = await ctx.runAction( + api.tools.knowledge.distiller.distillArtifacts, { artifactIds: args.artifactIds, query: args.query, diff --git a/backend/convex/tools/media/linkupFetch.ts b/backend/convex/tools/media/linkupFetch.ts index 5b9e1b92c..a987d4c20 100644 --- a/backend/convex/tools/media/linkupFetch.ts +++ b/backend/convex/tools/media/linkupFetch.ts @@ -10,7 +10,7 @@ import { v } from "convex/values"; import { internalAction, action } from "../../_generated/server"; -import { internal } from "../../_generated/api"; +import { api, internal } from "../../_generated/api"; import { generateCacheKey, getTTL } from "../../globalResearch/cacheSimple"; import { createHash } from "crypto"; @@ -367,7 +367,7 @@ export const linkupFetchEvidence = action({ preview: v.string(), }), handler: async (ctx, args) => { - const content = await ctx.runAction(internal.tools.media.linkupFetch.linkupFetch, { + const content: string = await ctx.runAction(api.tools.media.linkupFetch.linkupFetch, { url: args.url, renderJs: args.renderJs, includeRawHtml: args.includeRawHtml, @@ -409,7 +409,7 @@ export const linkupFetchInternal = internalAction({ }, handler: async (ctx, args) => { // Delegate to the public action to keep caching/telemetry/artifact persistence consistent. - const result = await ctx.runAction(internal.tools.media.linkupFetch.linkupFetch, { + const result: string = await ctx.runAction(api.tools.media.linkupFetch.linkupFetch, { url: args.url, renderJs: args.renderJs, }); diff --git a/backend/convex/workflows/dailyLinkedInPost.ts b/backend/convex/workflows/dailyLinkedInPost.ts index 86fffafda..58c6ac7cb 100644 --- a/backend/convex/workflows/dailyLinkedInPost.ts +++ b/backend/convex/workflows/dailyLinkedInPost.ts @@ -13,7 +13,7 @@ import { v } from "convex/values"; import { internalAction } from "../_generated/server"; -import { internal } from "../_generated/api"; +import { api, internal } from "../_generated/api"; import type { Id } from "../_generated/dataModel"; import type { AgentDigestOutput } from "../domains/agents/digestAgent"; import type { FastVerifyResult } from "../domains/verification/fastVerification"; @@ -3222,7 +3222,7 @@ export const postStartupFundingBrief = internalAction({ let fundingEvents: any[] = []; try { fundingEvents = await ctx.runQuery( - internal.domains.enrichment.fundingMutations.getRecentFundingEvents, + api.domains.enrichment.fundingMutations.getRecentFundingEvents, { lookbackHours: hoursBack, roundTypes: roundTypes as any, diff --git a/backend/convex/workflows/endToEndQa.ts b/backend/convex/workflows/endToEndQa.ts index 9617d7d02..9ca3f51ac 100644 --- a/backend/convex/workflows/endToEndQa.ts +++ b/backend/convex/workflows/endToEndQa.ts @@ -20,6 +20,7 @@ import { computeQaWorkflowVerdict, type QaGateJudgeResult, } from "../domains/evaluation/agentRunJudge"; +import type { Id } from "../_generated/dataModel"; /* ── Types ─────────────────────────────────────────────────────── */ @@ -240,7 +241,7 @@ export const startQaWorkflow = action({ const baseUrl = args.baseUrl ?? "http://localhost:5173"; const batchSize = args.parallelBatchSize ?? PARALLEL_BATCH_SIZE; - const sessionId = await ctx.runMutation( + const sessionId: Id<"agentTaskSessions"> = await ctx.runMutation( internal.workflows.endToEndQa.createQaSession, { title, diff --git a/backend/convex/workflows/enhancedWeeklySummary.ts b/backend/convex/workflows/enhancedWeeklySummary.ts index 5755f2f59..fa61aa7ef 100644 --- a/backend/convex/workflows/enhancedWeeklySummary.ts +++ b/backend/convex/workflows/enhancedWeeklySummary.ts @@ -18,7 +18,7 @@ import { v } from "convex/values"; import { internalAction } from "../_generated/server"; -import { internal } from "../_generated/api"; +import { api, internal } from "../_generated/api"; /** * Generate comprehensive weekly intelligence summary @@ -118,7 +118,7 @@ export const generateEnhancedWeeklySummary = internalAction({ const hoursBack = daysBack * 24; // Get all funding events - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours: hoursBack, limit: 1000, }); diff --git a/backend/convex/workflows/scheduledPDFReports.ts b/backend/convex/workflows/scheduledPDFReports.ts index 957f6ee04..1eea4f55e 100644 --- a/backend/convex/workflows/scheduledPDFReports.ts +++ b/backend/convex/workflows/scheduledPDFReports.ts @@ -26,7 +26,7 @@ import { v } from "convex/values"; import { internalAction } from "../_generated/server"; -import { internal } from "../_generated/api"; +import { api, internal } from "../_generated/api"; import { generate } from "@pdfme/generator"; import { text, image } from "@pdfme/schemas"; import type { Template } from "@pdfme/common"; @@ -1111,7 +1111,7 @@ export const distributeReport = internalAction({ } case "ntfy": { // Send push notification via ntfy - await ctx.runAction(internal.domains.integrations.ntfy.sendNotification, { + await ctx.runAction(api.domains.integrations.ntfy.sendNotification, { title: `${args.reportType} Funding Report Ready`, message: `${args.dealCount} deals | ${formatCurrency(args.totalAmountUsd)} | ${args.quarterLabel}`, priority: "default", @@ -1137,7 +1137,7 @@ export const distributeReport = internalAction({ */ export const runWeeklyReportCron = internalAction({ args: {}, - handler: async (ctx) => { + handler: async (ctx): Promise => { return await ctx.runAction(internal.workflows.scheduledPDFReports.generateScheduledReport, { reportType: "weekly", lookbackDays: 7, @@ -1151,7 +1151,7 @@ export const runWeeklyReportCron = internalAction({ */ export const runMonthlyReportCron = internalAction({ args: {}, - handler: async (ctx) => { + handler: async (ctx): Promise => { return await ctx.runAction(internal.workflows.scheduledPDFReports.generateScheduledReport, { reportType: "monthly", lookbackDays: 30, diff --git a/backend/convex/workflows/weeklySourceSummary.ts b/backend/convex/workflows/weeklySourceSummary.ts index 7e22a7ca3..5a78aebd0 100644 --- a/backend/convex/workflows/weeklySourceSummary.ts +++ b/backend/convex/workflows/weeklySourceSummary.ts @@ -16,7 +16,7 @@ import { v } from "convex/values"; import { internalAction } from "../_generated/server"; -import { internal } from "../_generated/api"; +import { api, internal } from "../_generated/api"; /** * Generate weekly source summary showing all media domains monitored @@ -67,7 +67,7 @@ export const generateWeeklySourceSummary = internalAction({ const hoursBack = daysBack * 24; // Get all funding events from the past week - const events = await ctx.runQuery(internal.domains.enrichment.fundingQueries.getRecentFundingEvents, { + const events = await ctx.runQuery(api.domains.enrichment.fundingQueries.getRecentFundingEvents, { lookbackHours: hoursBack, limit: 1000, }); diff --git a/docs/runbooks/CONVEX_API_TYPE_CONTRACT.md b/docs/runbooks/CONVEX_API_TYPE_CONTRACT.md new file mode 100644 index 000000000..d51846b30 --- /dev/null +++ b/docs/runbooks/CONVEX_API_TYPE_CONTRACT.md @@ -0,0 +1,259 @@ +# Backend call typing and application handoff + +A developer adding a screen must know which backend function can be called, what arguments it accepts and what it returns. At this repository's size, the previous generated API could become `any` or `never`, allowing invalid calls or making valid namespaces unusable. The root TypeScript command also checked zero files. A green result from that command did not establish that the application compiled. + +The default installation now applies `scripts/patch-convex-api-codegen.mjs` to Convex 1.45.0's exact reviewed CLI bytes. It changes only the dynamic declaration generator: namespaces are constructed structurally and Convex's existing argument, result and public/internal inference runs per module. Runtime function bindings and the SDK's type helpers are unchanged. The existing stats-package repair still runs first. + +This repair supports the default JavaScript plus `.d.ts` generation mode used here. Static API generation and generated TypeScript mode are separate implementations and are not covered. Any Convex version change, unexpected CLI modification or unexpected repair output fails installation. Review the published package and update the guarded repair before upgrading; do not skip postinstall to obtain a green check. + +## Reproduce the checks + +1. Use the repository's declared Node/npm versions in a fresh checkout and run the normal dependency installation. Do not install through another checkout's dependency junction. +2. Run `npm run test:convex-api-codegen`. This checks installed bytes, repeat installation, package/version drift, current module bindings, repeated large generations and nested/reserved/empty names in temporary owned fixtures. +3. Run the existing coordinated `npx convex codegen` workflow against the configured development/CI deployment. It must preserve the module-local declaration. Do not deploy out of band to shared production. The CI job performs this step with its existing credential configuration. +4. Run `npm run typecheck:app`. This loads `tsconfig.app.json`, requires the actual application entrypoint and rejects the permissive backend shims. A virtual caller checks valid public/internal arguments and results, then requires five deliberate invalid argument/result/visibility cases to fail. Those five expected diagnostics are test evidence; every real application diagnostic remains a failure. +5. Read `.tmp/app-typecheck/report.json` and `diagnostics.log`. After successful installation, CI runs the generator contracts and application check even when codegen's embedded backend typecheck fails. That original failure remains a failed job; no failure is masked. CI uploads the application report even when its check fails. Run `npm run build` and the relevant runtime tests separately; a bundle build cannot substitute for application typing. + +## Current result and limits + +The current application program includes 1,378 roots and retains 1,547 backend module imports. Its five API caller contracts pass with no ambient SDK overrides. Native Windows application checking still reports **1,399 source diagnostics**. The complete backend program uses 1,678 roots and the real SDK, reporting **1,091 diagnostics**. Both checks remain failures; developer/user readiness is incomplete. + +The two obsolete Convex ambient declaration files have been removed. They replaced validators, database/function builders and table IDs with permissive stand-ins, causing valid SDK exports to disappear while allowing invalid identities and values. The old 3,601-diagnostic result came from that different type environment and is not a source-bug repair count. Six backend consumer cases now reject incorrect arguments, namespace visibility, table identities and validator values under the actual backend configuration. + +Run `npx tsc -p backend/convex --noEmit --pretty false` for the direct backend check and `npm run preflight:json` for release preflight. Preflight calls the existing application checker through the current Node executable with a fifteen-minute limit. A known-broken app no longer passes through the empty root project. Compiler errors, process timeouts and startup failures remain failures with an actionable diagnostic excerpt. Read artifacts from the completed current run; visual, responsive and interaction grades require separate rendered evidence. + +If the generator changes, verify normal installation, idempotence, unknown-version/source rejection, failed-write preservation, deterministic complete module bindings and semantic caller checks with real Convex types. Do not widen types, ignore real diagnostics or add a score floor to make the gate pass. + +## Research dashboard type exports + +The research type barrel now re-exports its 15 dashboard interfaces from the +sibling `features/research/types.ts`. The directory migration had changed that +reference to `./`, which resolved back to the barrel and produced circular aliases. +This restores the original type owner without changing any interface or runtime +JavaScript. + +With a normal npm 11.5.2 install on Node 22.22.2, the complete application check +falls from 1,546 to 1,531 diagnostics: exactly the 15 circular aliases disappear, +and every other diagnostic is unchanged. The generated API caller checks still +pass without ambient shims. A compiler consumer probe confirms all 15 declaration +identities and rejects five invalid chart, dashboard, update, evidence and toggle +inputs. All nine existing research tests and the bundle build pass. The first +full-check attempt exceeded four minutes; the retained completed before/after +runs used a fifteen-minute limit. + +Full application and legacy backend typing remain failed. These source checks +do not establish visual, responsive, interaction or production acceptance. + +## Pipeline ownership records + +Pipeline readers need the accepted record after checking caller ownership. The +shared `getOwnedPipelineRow` helper returns that original record or `null` when +it is missing or differently owned. All six callers consume this result while +preserving their existing null response or unauthorized error. Avoid a +`row is T` predicate here: a rejected result can still be a non-null record +belonging to another caller. + +The complete Windows application check falls from 1,531 to 1,488 diagnostics: +exactly 43 nullable-record errors disappear from pipeline queries, with no new +or otherwise changed diagnostics. All 21 ownership/isolation tests pass before +and after, including 120 public/internal detail, stream and bundle reads in six +bursts while 18 runs and their steps/streams accumulate. Five invalid typed +consumer cases reject, the local build passes, and all 17 endpoint registrations +and input/output validators in the touched files remain unchanged. The API +caller checks still pass with zero ambient shims. +The CI runtime smoke job runs both ownership and truth-isolation suites. + +This does not complete application typing or certify sustained production load, +provider behavior, security of unrelated endpoints or visual/UI acceptance. + +## Preflight and SDK declaration verification + +Before the repair, the isolated preflight app gate returned success even though +the actual application check reported 1,488 errors. It now exits 1 at `tsc-app`, +preserves the same complete app diagnostic set and reports concrete source +locations. Direct backend compilation reports exactly the 1,173 diagnostics +observed in the earlier in-memory probe with only the two shim roots excluded. +No remaining implementation error is suppressed. + +The six backend typed-consumer cases pass with zero shims. Sixteen existing +workflow tests and the local build pass. A stale workflow assertion was corrected +to exercise the existing configured-project resolver. Controlled child-result +checks exercise clean, invalid, timed-out, missing-executable and output-limit +outcomes across both platform branches; actual compiler/preflight evidence is +recorded separately. + +## Action result contracts + +A workflow author needs the concrete result of a backend call before reading its +fields. Some wrappers inferred that result through the generated API, which maps +all exports in the same module, including the wrapper itself. That circular +dependency prevented callers from using otherwise declared result contracts. + +Twenty-seven modules now reuse existing callee result types, primitive results, +or table-specific IDs at the awaited binding or wrapper handler. The agent work +cycle declares its four numeric metrics, and event creation retains its actual +`{ docId, eventId }` object. No validators, API visibility, permissions, provider +calls, runtime statements or generated declarations change. Emitted JavaScript +matches exactly in all 27 modules; 180 endpoint contracts remain unchanged. + +Complete diagnostic comparison removes 28 circular errors (77 to 49). Application +diagnostics fall from 1,488 to 1,463 and backend diagnostics from 1,173 to 1,154. +Fifteen newly exposed diagnostic locations identify existing namespace, argument, +missing-function and result-field defects. They remain failures. A separate wiki +evaluation result depends on a table missing from the current schema; that module +is unchanged pending investigation of its intended data owner. + +Check result fields as well as broad scalar incompatibility: a scalar-only probe +missed an incorrect intermediate event-ID annotation, which the complete source +diagnostics caught before commit. Targeted consumer verification covers all 27 +wrapper references, rejects 29 invalid scalar/table/field uses, and compares new +local annotations with their producer handler results. All 24 existing ownership, +receipt, posting-policy, maintenance and handoff scenarios pass before and after; +the corrected source build passes. These checks do not certify provider behavior, +visual quality, responsiveness, interaction quality or full application typing. + +## Backend function visibility at call sites + +A backend workflow must select the namespace in which its callee is actually +registered. Eighty-two calls now use the correct public/internal namespace while +retaining their function paths, kinds and arguments. Each corrected root binds +to the generated API import. The installed runtime resolves every old/new pair +to the same function address; 234 endpoint registrations and validator contracts +remain unchanged. Emitted code matches after normalizing only those verified +equivalent references and their namespace imports, rather than matching as raw +JavaScript bytes. + +Three financial handler results also declare their existing concrete return +contracts. Otherwise their circular inference errors turn internal namespaces +into TypeScript error values and mask negative tests. All 82 corrected references +now resolve with concrete kind/visibility, and all 82 wrong-namespace probes are +rejected. The first 83-call attempt and its three missed negative checks were +retained during verification. The banking workflow's `step.runQuery` accepts +internal queries only, so that caller remains unchanged pending the citation +access-boundary repair. + +Complete Windows diagnostics fall from 1,463 to 1,399 for the app and 1,154 to +1,091 for the backend. The comparison removes 82 namespace errors and three +cycles; the app additionally clears one downstream diagnostic. It exposes 22 +other source errors, and two retained messages now describe more precise types. +Those failures remain visible. All 26 existing document, pipeline, operations +authorization and posting-policy scenarios pass before and after; the final +source build passes. + +Registration equivalence does not certify authorization. The follow-up boundary +repair below restricts the workflow-only helpers and secures deletion admission. +Full typing, provider behavior and product/UI acceptance remain open. + +## Deletion admission and workflow-only metadata + +A signed-in person may request deletion of their own user data. Requests for +another user, an entity, or explicit records require the existing owner/admin +maintenance role. The backend derives both requester and audit actor from the +authenticated user. The old optional `requestedBy` argument is ignored. Specific +requests accept at most 200 table-bound IDs; subjects are limited to 512 +characters. Admission and its audit write must both succeed. + +The optional `deletionRequests.authorizedBy` field is written only by that +admission boundary. The processor's internal request read rejects older rows +without this field, inconsistent actor fields, deleted users and revoked admin +authority. Operators must review and resubmit legacy requests through the +authenticated entrypoint; never backfill authorization from `requestedBy`. +Deploy this additive schema and the functions together through the coordinated +review/release path. Do not deploy a legacy unguarded processor afterward. + +At the admission revision, `getUserRecords`, `getExpiredRecords`, `getDeletionRequest`, +`validateDocumentCitations` and `generateCitationReport` are internal queries. +The caller inventory found only backend workflows. Their known callers now use +`internal`; the banking workflow can retain its internal-only query contract. +These operations are not public document-sharing APIs. + +Twelve local scenarios cover anonymous/foreign access, a valid admin deletion, +server-derived audit identity, malformed/oversized input, legacy and revoked +requests, removed users, 120 concurrent abuse attempts across 12 successive +request histories, an audit-storage outage, server-field forgery and actual +query registration visibility. Together with neighboring authorization and +policy suites, 38 tests pass with no skips. The original ten boundary scenarios +failed against the unchanged source after correcting an initial test loader +path. A separate compiler probe must reject the five public references and +resolve five concrete internal references; test-harness internal calls alone +cannot prove public visibility. + +At the admission revision, full erasure was not certified: existing actions +still access database APIs unavailable in actions, some scans are unbounded or +truncate results, concurrent processing lacks a claim, and partial deletion can +be marked completed. These remain release-blocking follow-ups. No production +deletion or Convex deployment was performed for this repair. Windows app typing +falls from 1,399 to 1,396 diagnostics, with no added diagnostic messages; backend +typing falls from 1,091 to 1,088. Both still fail. The 12 admission scenarios run +in the normal CI runtime-smoke step. Independent review and full application/UI +readiness remain open. + +## Transactional explicit-record deletion + +A maintenance operator can submit up to 200 reviewed `table:recordId` references. +The executor deletes only those database rows; it does not imply dependent-record, +external-file, account, or entity erasure. Duplicate and already-absent IDs are +satisfied without incrementing the deletion count or creating extra tombstones. + +The optional `deletionRequests.execution` object stores `{ version: 1, +nextIndex: number }`. `advanceDeletionRequest({ requestId })` is an internal +mutation that rechecks current authority, validates the entire bounded record +list, and processes at most eight records. Deletions, tombstones, summary and +cursor commit together. Concurrent processors conflict on the request row and +resume from committed state. Large records stay within a bounded batch rather +than being loaded across the entire request. The normal coordinated release +must include the optional schema field and executor together. + +`processDeletionRequest({ requestId })` remains an internal action. It returns +`{ success, status, recordsDeleted, tablesAffected }`, where `success` is true +only for completed transactional execution. It performs at most 25 batches and +checks a ten-second budget between transactions. A transaction in progress is +subject to the platform's runtime limits; the action does not pretend to cancel +or roll it back with an external timeout. Interrupted work retains its durable +cursor. Storage or authorization errors reject the action and are recorded as +failed without overwriting a concurrent completed result. A failure-reporting +storage outage also propagates. + +The hourly queue reads pending and in-progress IDs through the internal query +`getQueuedDeletionRequests({ limit })`. Its limit is an integer from 1 to 10. +The action processes at most that many requests, checks a twenty-second budget +between requests, and reports `{ processed, succeeded, failed, deferred }`. +`deferred` covers unfinished selected requests, not a count of the whole queue. + +Whole-user and whole-entity requests are accepted for tracking but held as failed +before any destructive write, with an explicit coverage-review reason. The +previous hard-coded table list omitted user documents, truncated results, used +nonexistent ownership fields, and confused agent names with ownership. This +repair does **not** certify broad erasure. Operators must review ownership, +dependencies and retention before submitting an explicit record list. Existing +in-progress/completed requests without the new execution marker also require +review; never infer their completeness or backfill progress. Failed requests +require review and resubmission rather than an automatic destructive retry. + +Generic record deletion rejects the request, tombstone, admin audit, admin role +and user identity tables that establish this operation's authority and evidence. +Their lifecycle requires a dedicated reviewed operation. Four obsolete internal +helpers, `getUserRecords`, `deleteRecordWithTombstone`, +`updateDeletionRequestStatus` and `completeDeletionRequest`, were removed after +their implementation caller inventory found no users outside the old executor. +The replacement execution functions remain internal. + +The transaction suite exercises 200-record interruption/resume, 120 overlapping +workers over twelve request histories, revoked authority between batches, +duplicate/missing records, malformed and protected plans, legacy progress, a +forced real transaction write-limit rollback, cron continuation and large stored +documents with transaction limits enabled. These are local storage scenarios; +they do not certify production scheduling or full Convex OCC load behavior. +The broad-erasure coverage gap, separate TTL/archive/hash behavior, full typing, +independent review and portfolio product/UI acceptance remain release holds. + + +## Finite returns for funding verification and phased scheduling + +A developer reading a funding-verification batch needs its counts and per-event results. A caller scheduling the brief pipeline needs to know that ingestion and phase scheduling completed, rather than mistaking the reply for completion of the scheduled work. Both handlers previously inferred their return through a generated API that included the same handler, creating a circular type-inference dependency. + +`batchVerifyFundingEvents` now declares its existing total/verified/failed counts and result rows, including optional per-item error text. `runPipelinePhased` declares its existing started/ingested/message reply. No runtime statement, validator, visibility, schedule, rejection path or result changes. Installed TypeScript emission using the backend project options is byte-identical before and after for both modules; source maps are excluded from this runtime comparison. + +The normal application checker includes clients reading these actual internal generated references. It verifies concrete non-any/non-never results, numeric counts, string event IDs, optional errors, scheduling fields, invalid return assignments and refusal of public access. All nine deliberately invalid client calls are rejected with their expected diagnostics, including the five existing API checks. + +One Windows baseline and one candidate application run used the same explicit 6-GiB heap and project. Diagnostics decreased from 1,295 to 1,292: three full diagnostic messages were removed, with no added file/code/message identities after accounting for source-line shifts. Both targeted return cycles are removed. The application still fails; the latest earlier Linux shared count is a different observation and must not be substituted for this local comparison. No codegen, provider, scheduler or production execution was run for this type-only repair. Independent review and shared candidate CI follow this local evidence. diff --git a/docs/runbooks/DELEGATION_REGISTRATION_CONTRACT.md b/docs/runbooks/DELEGATION_REGISTRATION_CONTRACT.md new file mode 100644 index 000000000..cb8b78750 --- /dev/null +++ b/docs/runbooks/DELEGATION_REGISTRATION_CONTRACT.md @@ -0,0 +1,20 @@ +# Delegation registration and argument contracts + +A developer wiring parallel research needs an internal progress writer and owner-filtered queries for the person watching the results. `agentDelegations.ts` already registered those functions, but casting its builders and handler arguments to `any` hid the actual contract from the generated API. Changing call sites to the public namespace would misdescribe the functions and expose an unsafe design if their runtime visibility were also changed. + +The module now infers its registrations and arguments from the existing builders and validators. Three public queries retain their authenticated owner checks; two internal queries and five internal mutations retain their visibility. No schema, generated API, SDK, runtime validator, handler statement or caller changes are needed. Emitted JavaScript is byte-identical before and after the typing repair. + +The focused [scenario and compiler contracts](../../backend/convex/domains/agents/__tests__/delegationRegistration.test.ts) exercise real local Convex storage and ownership. Together with the existing swarm ownership suite, ten scenarios pass without skips: two owners sharing a run label, guest/foreign reads, twelve rounds accumulating 60 delegations and 240 events, concurrent distinct-delegation writes, and a separate 501-event history with the existing 500-result cap. These are bounded emulator observations, not production load or provider results. + +The same file contains compile-time member/kind/visibility checks, explicit non-any argument checks, ten forbidden-namespace references and five invalid argument cases. Vitest alone does not check those contracts; the real backend TypeScript command does: + +```sh +node node_modules/vitest/vitest.mjs run backend/convex/domains/agents/__tests__/delegationRegistration.test.ts backend/convex/domains/agents/swarmOwnership.auth.test.ts +node node_modules/typescript/bin/tsc -p backend/convex --noEmit --pretty false +``` + +The first compiler observation showed why builder casts alone were insufficient: handler `args: any` annotations still accepted the five deliberately invalid inputs. Removing those ten argument annotations completed the named proof without changing runtime bytes. Backend diagnostics fall from 1,061 to 1,051: ten missing-member errors disappear, with no added or changed diagnostic. The full backend check remains failed. + +The separately labelled 6-GiB application diagnostic reports 1,356 errors, down from 1,369 (13 removed; 0 added). Its existing five invalid API-call checks still pass with no ambient shims. This is not a default-gate pass: the earlier default-heap run exhausted memory and remains historical evidence. Full application typing remains failed. + +Existing handler context/result `any` annotations, internal caller-selected IDs, missing-record no-ops, status/cancellation races, unbounded run-list reads, invalid event-limit handling and the unsupported parallel Dossier choice remain separate review holds. Cancellation storage does not prove worker cancellation. No provider call, deployment, UI verification or full delegation-readiness claim is included. diff --git a/docs/runbooks/NODE_WORKER_CONTAINER.md b/docs/runbooks/NODE_WORKER_CONTAINER.md new file mode 100644 index 000000000..c8d5d94a8 --- /dev/null +++ b/docs/runbooks/NODE_WORKER_CONTAINER.md @@ -0,0 +1,102 @@ +# Build and verify the Node worker + +A developer receiving this repository needs a worker image built from committed source, with its search routes and tool registry actually loaded. A frontend build or a `/health` response alone does not establish that result. + +## Build inputs + +The worker remains `workers/node/index.ts`, compiled with the existing `build:voice` command and started through the existing Docker entrypoint. The image uses a digest-pinned official Node22.22.2 Debian base, matching the `.nvmrc` major, and the declared npm11.5.2. Its build and runtime stages share the same root package files and public `legacy-peer-deps=true` setting. + +The root `package-lock.json` is required source. When changing root dependencies, update that lock with npm11.5.2 and the repository `.npmrc`; do not substitute an installed `node_modules/.package-lock.json`. Nested package lock policies are unchanged. All 233 package version ranges remain unchanged; `dotenv` moves from development to production dependencies because the worker entrypoint imports it at startup. + +Before this repair, a leftover template ignore rule excluded the root lock, both Docker stages copied a deleted patch script, Node20 differed from `.nvmrc`, and the peer-dependency setting was omitted. The workflow captures the base commit's build outcome, then requires the candidate image to build and pass its startup proof. + +The first Linux checkout also exposed an accidentally tracked Claude worktree as an invalid submodule. Its Gitlink is removed from the candidate; the existing ignore rule already prevents reintroduction. The referenced commit remains reachable from main, and the inspected local directories were empty. No local worktree directory or branch was deleted. + +The subsequent Linux run built the image but caught a real startup failure: `npm ci --omit=dev` correctly omitted development-only `dotenv`, then Node failed to import it. Correcting its dependency category keeps production-only installation intact. Lock regeneration changed only the root dependency metadata and the `dotenv` development flag; resolved versions and integrity values are unchanged. + +## Local proof + +Use a functioning Linux Docker engine. From a clean checkout: + +```powershell +docker build --platform linux/amd64 -f workers/node/Dockerfile -t nodebench-worker-proof:local . +docker run -d --name nodebench-worker-proof --network none --memory 2g --cpus 2 nodebench-worker-proof:local +Get-Content -Raw scripts/worker-container-smoke.mjs | docker exec -i nodebench-worker-proof node --input-type=module +docker cp scripts/oss-stats-http-contracts.node.mjs nodebench-worker-proof:/tmp/oss-stats-http-contracts.node.mjs +docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/oss-stats-http-contracts.node.mjs +docker cp scripts/oss-stats-token-contracts.node.mjs nodebench-worker-proof:/tmp/oss-stats-token-contracts.node.mjs +docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/oss-stats-token-contracts.node.mjs +docker cp scripts/ai-sdk-download-contracts.node.mjs nodebench-worker-proof:/tmp/ai-sdk-download-contracts.node.mjs +docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/ai-sdk-download-contracts.node.mjs +docker cp scripts/anthropic-client-contracts.node.mjs nodebench-worker-proof:/tmp/anthropic-client-contracts.node.mjs +docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/anthropic-client-contracts.node.mjs +docker cp scripts/anthropic-memory-contracts.node.mjs nodebench-worker-proof:/tmp/anthropic-memory-contracts.node.mjs +docker exec nodebench-worker-proof node --test --test-concurrency=1 /tmp/anthropic-memory-contracts.node.mjs +docker logs nodebench-worker-proof +docker rm -f nodebench-worker-proof +# A separate container requires Internet access for one fixed public tarball. +Get-Content -Raw scripts/ai-sdk-public-download-proof.mjs | docker run --rm -i --name nodebench-download-public-proof --memory 1g --cpus 1 nodebench-worker-proof:local node --input-type=module +``` + +Reserve both temporary container names for this proof and retain logs when it fails. The startup/contract container has no external network. The separate public-download container has Internet access for its fixed registry input. Neither has a published host port, mounted user data or supplied provider credentials. If interrupted, close the owned public-download container after retaining its logs. The proof requires: + +- Correct Node worker identity and nonempty MCP tool inventory. +- Pipelinev2 health reporting that its Linkup/Gemini credentials are absent. +- Twelve concurrent and twenty repeated empty/whitespace requests rejected with HTTP400 before provider hooks, followed by malformed-JSON rejection and stable tool/session state. +- No dotenv or MCP registry-token files in the runtime image; only the public root npm policy is retained. + +The CI `Worker container` job also fails on unresolved module/tool-loading errors in the worker log, uploads build and startup evidence on failure, and removes its own temporary container. It does not push images or deploy Cloud Run. Manual dispatch becomes available after the workflow exists on the default branch; PR events provide the candidate proof before adoption. See [GitHub's workflow-dispatch requirements](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#workflow_dispatch). + +## Cloud Build context + +The existing `workers/node/cloudbuild.yaml` remains the deployment recipe. Its upload context must include the root public `.npmrc` and root lock, while excluding nested npm credentials, dotenv files and the MCP registry-token files. The old exception allowing the LangGraph dotenv file into uploads is removed. This does not delete that local file or transfer its credentials elsewhere. + +Before an authorized upload, `gcloud meta list-files-for-upload` shows the files selected by `.gcloudignore`. The controlled context proof for this repair includes the three required root package/config files and excludes five credential canaries without uploading anything. + +## Acceptance boundaries + +The installed statistics component retains an unused `npm-api` dependency, which brings in `paged-request` and an old Axios0.x client. A root override scopes Axios0.33.0 to `paged-request`; it leaves other Axios users and application package ranges unchanged. The component is still installed and registered, but its current source does not import `npm-api`. Do not describe the dependency finding as a demonstrated exploit of a deployed statistics action. + +The container gate runs `scripts/oss-stats-http-contracts.node.mjs` against the actual production install. Its11 local-HTTP scenarios cover pagination, caching,12 concurrent owners,24 repeated rounds, error/retry behavior, request options, redirect credential boundaries, inherited auth fields, timeouts, response limits and cycle/invalid-input handling. The same source test fails on inherited credentials with Axios0.21.4 and passes all11 cases with0.33.0. These are library contract and security-canary checks, not a real registry or Convex sync. + +Each dependency update requires a fresh image build, startup and the installed-library contracts before acceptance. Independent final review remains open. The original Windows host's Docker Desktop failed during local socket initialization; its startup attempt was closed with Docker data retained. That host problem is separate from a repository build result. + +The original fresh npm resolution reported31 affected packages, including13 high findings, on September8,2026. The scoped Axios repair removes the four affected-package findings on that chain: at that stage the full audit had27 findings, including9 high, and the production-only audit had13 findings, including1 high. The subsequent scoped Undici update removes the remaining production high finding: the fresh production audit has12 findings (6 moderate,6 low), while the full audit remains27 (9 high,12 moderate,6 low). These are remaining dependency-security holds, not a zero-audit release. A lockfile makes the graph repeatable; it does not by itself repair vulnerabilities. + +This proof supplies no working provider credentials and accepts no fabricated provider answers. It does not establish a deployed worker, application tenant/auth coverage, provider-backed golden-query results, complete app typing, visual quality, responsiveness, accessibility or full developer/user handoff. Keep those gates explicit before production use. + +Some tool helpers load optional file, OCR, image and browser dependencies only when invoked. A registered tool is not proof that its optional dependency, browser binary or provider is available. Those capabilities need their own actual-call acceptance. The existing worker compile command uses `--noCheck`, so emitted JavaScript is also not a full application typecheck. + +The published statistics component also logs sync arguments containing its GitHub token. The root `postinstall` hook runs `scripts/patch-oss-stats-token-log.mjs` to remove exactly that statement from both the TypeScript source and compiled JavaScript. The hook verifies package version and both files against published/repaired SHA256 values before writing either file. Repeated runs preserve already repaired files; unknown versions or source drift fail installation. All token forwarding, API arguments and scheduling remain unchanged. The emptied line preserves subsequent source-map line positions, and the map has no embedded source. + +Docker copies this hook before both dependency-install stages. Default `npm ci` and `npm install` run it through the [npm postinstall lifecycle](https://docs.npmjs.com/cli/v11/using-npm/scripts/#life-cycle-operation-order). An install with scripts disabled has not applied the repair: run `npm run postinstall` explicitly before building or using this component. Review and remove/update this package-specific repair when adopting an upstream fixed version; do not bypass the version/hash failure. + +The container runs six additional token-boundary scenarios against its real installed handler with fake tokens and local Convex context/handle stand-ins. These cover all source kinds, existing-cron replacement, clear-and-sync, provider rejection, 12 concurrent operators, 24 repeated rounds, idempotent repair and refusal on changed version/source. The unpatched package logs canaries on both success and failure. No real token or production log is read; these tests do not establish hosted sync, storage or tenant authorization. + +## Guarded external downloads + +An agent retrieving external content must not let a supplied URL reach private systems or accept a response that exceeds the caller's budget. The installed AI SDK provider-utils3.0.36 uses Undici Agent/fetch with a DNS lookup guard, validates literal URLs and every redirect hop, and exposes a bounded response reader. Preserve that path when updating dependencies; replacing it with an unguarded fetch would remove an existing protection. + +The override parent selector matches the declared direct dependency range, `@ai-sdk/provider-utils@^3.0.12`, and pins its Undici child to6.28.1. npm rejects a conflicting exact parent selector; the committed lock and scenario assertion retain SDK3.0.36. The version6 line remains supported through April30,2027 according to the [maintainer's LTS table](https://github.com/nodejs/undici#long-term-support). All application dependency ranges are unchanged. The lock changes only the root Undici version/integrity, makes its former Busboy dependency development-only, and removes the redundant nested Vercel Blob copy of the same6.28.1 version. Vercel Node's separate development-only Undici5.28.4 remains unchanged and unaccepted. + +The11 download scenarios use the actual installed client and SDK reader: compressed input,12 concurrent downloads,24 repeated rounds, HTTP503 and recovery, advertised/chunked size rejection, abort/recovery, an8-layer content-encoding canary, redirect authorization stripping, private literal/scheme rejection, private/mixed DNS rejection and redirect/cycle guards. The DNS answers and redirect-response transport are explicit controlled stand-ins; ordinary HTTP client behavior uses real local sockets. The [content-encoding advisory](https://github.com/nodejs/undici/security/advisories/GHSA-g9mf-h72j-4rw9) explains the canary. The same final source yields10pass/1canary failure under5.29.0 and11pass under6.28.1 in isolated native installs. + +A separate proof retrieves one fixed public npm tarball through the SDK's unchanged native-fetch/DNS path, checks its published SHA512 identity, limits the body to1MiB and aborts after15seconds. CI additionally bounds the container command to30seconds. It uses no custom fetch or DNS, no provider token and no generated model answer. It is an Internet-download compatibility proof, not provider quality or hosted-application acceptance. + +These tests pass an explicit body limit. The SDK's default is2GiB; this change does not establish that every application caller chooses an appropriate memory budget. The remaining provider-utils resource-consumption advisory requires separate application-call analysis and is not cleared by upgrading Undici. + +## Anthropic client and memory permissions + +An agent's saved working memory must remain private on a shared Linux machine. The installed pi-ai0.70.6 brought its own Anthropic SDK0.90.0, whose local filesystem helper used default creation modes. The [maintainer advisory](https://github.com/anthropics/anthropic-sdk-typescript/security/advisories/GHSA-p7fg-763f-g4gf) identifies0.91.1 as patched. Root SDK0.91.1 already existed separately. A scoped child override under `@mariozechner/pi-ai@^0.70.2` makes this caller use that existing patched version; all application ranges and the Pi-AI model/provider interface remain unchanged. + +The root lock removes only the old nested SDK record. npm11.5.2 initially reported success from lock-only install and a named SDK update while retaining that invalid nested record. `npm ls --package-lock-only` exposed the unresolved override. Removing the one stale record and regenerating the lock with declared npm produced a valid graph; every other record is unchanged. A manifest override alone is insufficient evidence. Require the clean production install and the client-version assertion below. + +`scripts/anthropic-client-contracts.node.mjs` runs nine scenarios through actual Pi-AI completeSimple/streamSimple and its installed SDK against local HTTP/SSE. It checks split Unicode answers, usage, tool-call/result IDs and roles,12 concurrent users,24 repeated rounds, HTTP429/no retry, explicit503 retry, malformed stream failure, abort/recovery and missing-key failure before HTTP. Pi-AI returns missing-key errors as terminal error results through its lazy provider wrapper; it does not reject that completion promise. Both old/new SDKs pass the same final native source. Only fake local credentials and controlled answers are used; no provider quality is claimed. + +`scripts/anthropic-memory-contracts.node.mjs` uses the actual SDK helper in one owned temporary directory. Four operation scenarios cover create/view/edit/rename/delete, concurrent creation,24 repeated edits, invalid operations and path/symlink containment. Two additional Linux scenarios check owner-only file/directory modes through create, atomic replacement, insert and rename under umask022 and000. Windows runs explicitly skip these two mode checks. The suite closes and removes only its checked temporary root. + +The Linux gate fetches an exact historical0.90.0 tarball with `scripts/anthropic-memory-before-fixture.mjs`: fixed public URL, no redirects,15-second abort,4MiB preallocated body cap, publishedSHA512 and exclusive new-file write. It extracts only the manifest and two required memory modules, then runs the same six memory scenarios in the network-disabled Node22.22.2 container. The old helper must fail exactly the two permission cases while passing four operation cases; the actual production dependency must pass all six. The historical fixture is used only by this canary. It is not installed into the production dependency graph or registered as a tool. + +The latest scoped audits have24 affected packages overall (9high,9moderate,6low), and9 production findings (0high,3moderate,6low). The three removed affected-package rollups represent one SDK advisory chain. No direct memory-helper symbol was found in the searched tracked application surfaces, and no deployed exploit or inspection of personal memory is claimed. Existing files/directories are not migrated or chmodded by this change; adopting an upstream fix for new writes does not establish custody or permissions of old stores. + +The Pi-AI package namespace is deprecated in favor of @earendil-works/pi-ai. Its provider-stack migration remains a separate readiness task requiring adapter/model/tool proofs. This dependency repair does not certify that migration, full application typing, provider behavior, tenant authorization or UI/device acceptance. diff --git a/docs/runbooks/OPTIONAL_QUERY_REFERENCE_CONTRACT.md b/docs/runbooks/OPTIONAL_QUERY_REFERENCE_CONTRACT.md new file mode 100644 index 000000000..e910d6c39 --- /dev/null +++ b/docs/runbooks/OPTIONAL_QUERY_REFERENCE_CONTRACT.md @@ -0,0 +1,61 @@ +# Queries while the API loads + +A notebook owner opening a screen should wait for its API reference before the +screen subscribes. If ownership or the selected notebook changes, the previous +result must not remain visible merely because the new query is loading. + +Use `useOptionalQuery` from `@/lib/convexApi` for a public query reference returned +through `useConvexApi`. Pass the optional reference directly, and preserve the +existing owner/session/entity gate in the arguments position: + +```tsx +const api = useConvexApi(); +const authority = useOptionalQuery( + api?.domains.agents.autonomy.grants.getAuthorityState, + api && isOwner ? { entityId } : "skip", +); +``` + +For an already-static generated reference, keep the ordinary SDK `useQuery` and +put `"skip"` only in its arguments position. A string in the reference position +is a legacy function address, not the SDK's skip control. + +The adapter sends zero or one entries to the public `useQueries` hook. Its memo +identity follows the SDK's function-name and Convex-serialized argument identity. +It preserves undefined loading/skipped results, legitimate falsy data, reactive +updates, Error propagation, provider requirements and subscription cleanup. +Types retain the actual public query's arguments and result. The sole result +assertion bridges the SDK's erased map value at its fixed query key. + +This does not change the lazy import/prewarm/cache policy, backend admission, +mutations/actions, paginated queries or API availability. A truthy generated +proxy path does not prove a function is deployed. Client ownership gates do not +replace server authorization. The loader's rejected-import handling and existing +Settings mutation/action cold-start failures remain separate work. + +Run the focused hook scenarios with: + +```sh +node node_modules/vitest/vitest.mjs run apps/web/src/lib/__tests__/convexApiQuery.test.tsx +``` + +The scenarios use the installed React SDK and its query observer with locally +controlled watch results. They cover delayed import, owner revocation, query and +argument changes, errors, falsy data, provider changes, cleanup, and 20 consumers +through 20 ownership cycles. They establish local hook behavior, not backend +authorization, production performance or full-screen readiness. + +The same file includes ordinary TypeScript negative consumers of real generated +queries. It is included by `tsconfig.app.json`; Vitest transpilation alone does +not validate them. Read the complete application checker results and its five +existing API contracts. Full application/backend typing, adjacent errors and +visual/product grades remain open. + +The final local scenarios pass 11/11. The actual application diagnostic includes +this test file and accepts its eight negative argument/result/visibility contracts +without fixture errors; the five existing generated-API contracts also pass. +Application diagnostics fall from 1,356 to 1,321: all 61 mapped reference errors +disappear, while concrete inference exposes 26 existing result-field mismatches +in HomeLanding, MeHome and SettingsModal. Those product contracts are unresolved; +the full application check still fails. The 6-GiB diagnostic does not establish +a default-heap gate pass or full-screen readiness. diff --git a/docs/runbooks/PREFERENCES_RETURN_CONTRACT.md b/docs/runbooks/PREFERENCES_RETURN_CONTRACT.md new file mode 100644 index 000000000..f42421417 --- /dev/null +++ b/docs/runbooks/PREFERENCES_RETURN_CONTRACT.md @@ -0,0 +1,53 @@ +# Saved preference return contracts + +A returning user should see the research lens and calendar choices they saved. `getMeSnapshot` now retains the generated stored-document type; its emitted JavaScript is unchanged. `getUserPreferences` returns the three owned calendar fields already accepted by `updateUserPreferences`: `gmailIngestEnabled`, `gcalSyncEnabled`, and `calendarAutoAddMode`. Explicit `false` and `auto` survive readback; only unset fields on an existing row use `true`, `true`, and `propose`. + +The no-authentication and no-row response shapes remain unchanged. The query still accepts no caller-supplied user ID and projects an allowlist, without returning the private preferences document. Profile reads keep authenticated-owner precedence and the existing explicit anonymous-session bearer fallback. Nested profile preferences remain schema-any: migrated theme/time-zone settings and other legacy keys are not newly narrowed or validated. + +## Reproduce the focused proof + +From the repository root, with its existing dependencies and no provider configuration: + +```sh +node node_modules/vitest/vitest.mjs run backend/convex/domains/product/__tests__/preferencesReturnContract.test.ts apps/web/src/lib/__tests__/preferencesReturnContract.test.tsx apps/web/src/features/entities/components/notebook/EntityNotebookLive.empty-state.test.tsx --maxWorkers=1 --minWorkers=1 --no-file-parallelism --no-cache +``` + +The joint local run passed 24 scenarios: 12 preference scenarios plus 12 existing notebook cases. Preference coverage includes registered queries/mutations and storage, all six lenses, blank/placeholder normalization, migrated preferences, absent/deleted users, owner isolation, concurrent writes, twenty accumulated updates, actual Settings control saves, Home URL-lens precedence, Me hydration, query errors and SDK subscription cleanup. The frontend controls use the installed Convex React hooks and optional-query adapter; local watch results come from actual `convex-test` queries. Actions are blocked and unrelated panels are stubbed. This is local subscription-boundary evidence, not a deployed subscription or provider test. + +Before the fix, stored `false,false,"auto"` was omitted from the query and displayed as `true,true,"propose"`. Both the storage failure and the actual control failure were retained. An initial legacy-profile fixture omitted the schema-required empty summary; that fixture error and the subsequent passing run remain distinct. + +The compiler also exposed a generic-rest forwarding error in the earlier notebook fixture. That mock now calls `useQuery(args[0], args[1])`; its missing-reference/skip guard, controlled query data and all existing assertions remain unchanged. This separately authorized fixture correction changes no production behavior. The two new preference scenario paths still require reviewed CI Runtime Smoke selection before publication. + +## Historical preference-only limits + +- Settings control evidence is scoped to the existing reduced-motion branch. The first normal-motion mount fails in `DialogOverlay`/`SheetContent`: `asChild` forwards an array containing conditional null siblings to Radix Slot. No motion/portal/Slot mock produced this error. Normal-motion dialog interaction and production-browser confirmation remain a separate open UI issue; this preference repair does not fix or certify them. +- DOM state assertions do not certify visual, responsive, accessibility or full application quality. The tests do not operate Gmail, Google Calendar, billing or authentication providers. Returning a saved flag does not prove an external action enforces it. +- The profile change is type-only, with identical emitted JavaScript. Existing catch-to-empty behavior and anonymous-session bearer semantics are unchanged, not stronger privacy or error guarantees. +- The normal application type gate remains required. A separate diagnostic run with an explicit 6 GiB heap measures remaining errors; that heap choice is not a changed repository default or a full-gate pass. The included compiler fixture checks concrete profile/lens/calendar results, forbidden properties/types and rejected arbitrary-owner arguments; it makes no non-any claim about nested profile preferences. + +No schema, generated API, client markup/defaults, SDK, dependency, CI rule, provider or deployment configuration changed in this slice. Independent acceptance and publication are separate from these author observations. + +Final local diagnostic: **1,321 → 1,295**, exactly the 26 named preference-return errors removed, zero added. The included frontend contract fixture and corrected notebook fixture have zero diagnostics; all five existing invalid-API-call checks pass. The whole application checker still exits nonzero for the remaining 1,295 errors. Its earlier 1,297 and 1,296 results retain the two fixture corrections separately. + +## Settings dialog follow-up + +A person opening Settings with normal animation previously encountered a Radix Slot exception. The shared Sheet now marks its caller child with the existing `Slottable`; title, Close, forwarded properties and animation remain. Native observation also found focus still on the page body two seconds after closing the triggerless controlled dialog. `DialogOverlay` now records the connected opener before automatic focus and restores it on close; a removed opener retains the existing fallback. + +Run the focused scenarios with: + +```sh +node node_modules/vitest/vitest.mjs run apps/web/src/components/ai-ui/__tests__/sheet.test.tsx apps/web/src/lib/__tests__/preferencesReturnContract.test.tsx --maxWorkers=1 --minWorkers=1 --no-file-parallelism --no-cache +``` + +The joint run passed 26 cases. After removing three unsupported test-query options, the changed Sheet fixture passed all 20 cases again; the six unchanged preference cases carry from that joint run. A local fixture importing actual Settings, CSS, Radix, Framer and Convex React components passed keyboard/pointer, focus return/trap and cleanup at 390 and 1440 pixels in both motion modes, including 80 reopen cycles. It uses controlled SDK data and blocked external requests, not an authenticated route or provider integration. In that dialog-only snapshot, the cramped mobile Connections layout remained unresolved; the separate responsive follow-up below addresses its measured layout cause. + +The normal build passed. One explicit 6 GiB application diagnostic reported 1,298 errors, including those three subsequently corrected fixture errors. A final semantic check using the same whole-program source selection found zero diagnostics in the corrected fixture only; it does not establish a new whole-application count or pass. The existing motion-variants diagnostic remains. Browser evidence and the build precede only that test-option correction and this note. No full UI or responsive grade is assigned. + + +## Settings responsive follow-up + +A phone user could open the repaired dialog but its fixed sidebar left only 106 pixels of content at a 320-pixel viewport, clipping text and controls. Below the existing large-screen breakpoint, the same three navigation buttons now occupy a top row. The body takes the remaining modal height, and existing service rows and key-input controls wrap within the content pane. Desktop retains its sidebar; measured shell, header, body, navigation and content bounds remain unchanged within one pixel. Only layout classes changed in SettingsModal; handlers, data, preference defaults, dialog behavior and the existing mobile 44-pixel button rule remain unchanged. + +The same 26 focused scenarios and the ordinary build passed once on this source. Actual-component browser evidence passed all 24 combinations of Connections, Usage and Profile at 320, 390, 768 and 1440 pixels with normal and reduced motion. It records natural forward/reverse keyboard traversal, focus containment and hit targets, visible control/card horizontal bounds, native touch tab navigation, 30 compact close/reopen cycles, Configure-to-Usage navigation and empty-key Show/Hide with Save disabled. Saved false/false/auto remains visible, and cleanup leaves no dialog, scroll lock, SDK subscription, mutation or action. Before images and the six failing narrow-width states remain preserved separately. + +This is a local component fixture importing actual Settings, CSS, Radix, Framer and the Convex React provider with controlled SDK state. Unrelated panels and external requests are held; Google Fonts is blocked, so the screenshots use fallback fonts. It does not certify authentication, provider actions, those held panels or whole-product visual quality. The previous complete shared check at commit d8e2363 remains a 1,290-error application failure and is separate from this responsive successor. No new whole-application compiler result is claimed. The tested build remains current; its prior output is retained for restoration. Independent review and publication follow the author evidence. diff --git a/docs/runbooks/SHARED_CODE_DISPLAY.md b/docs/runbooks/SHARED_CODE_DISPLAY.md new file mode 100644 index 000000000..9a6f3c48f --- /dev/null +++ b/docs/runbooks/SHARED_CODE_DISPLAY.md @@ -0,0 +1,25 @@ +# Read and copy agent output + +A reviewer inspecting an execution trace or product direction memo needs the exact source, even when syntax highlighting or the clipboard is unavailable. The shared `LazyCodeBlock` keeps source and its copy action present while the renderer loads, reports copy failure with a retry/manual-selection option, and invalidates copied feedback when the source changes. + +## Owning surfaces + +- `apps/web/src/shared/components/LazyCodeBlock.tsx`: stable wrapper, copy lifecycle, lazy loading and chunk-failure fallback. +- `apps/web/src/components/ai-elements/code-block.tsx`: existing Shiki renderer shared with agent chat and tool output. +- `/execution-trace` and `/product-direction`: the strategy views use the wrapper for typed output and schema JSON. Their backend/query and navigation behavior is unchanged. + +The wrapper accepts `code`, optional `language`, `showLineNumbers`, and `className`. Unknown languages and sources longer than 64,000 UTF-16 code units remain plain text; the content is never truncated. The highlighter is optional. A renderer chunk failure leaves readable, copyable code with a visible status. A grammar failure preserves plain source. Both rendered paths use real newline text nodes, with line numbers supplied through CSS rather than copied source text. + +Shiki's asynchronous shorthand reuses its grammar/theme singleton. The application no longer retains lifetime Maps of private snippets, token results or subscribers. Results belong to mounted components and are checked against their source/language; late results from a changed or closed review cannot replace current content. This removes app-owned snippet caches, not every allocation or cache inside the third-party engine. See [Shiki performance guidance](https://shiki.style/guide/best-performance). + +The Copy action preserves the original string, including trailing newlines. Manual selection follows the browser's native `
` behavior; Chromium can trim final newlines from a selection even when the DOM contains them. Copy completion belongs to the current request and source. Repeated clicks coalesce while a request is pending; source changes and unmounts clear feedback timers and invalidate late completions.
+
+## Verification
+
+Run the five suites in CI's **Shared code renderer contracts** step. They cover delayed/out-of-order highlights, 12 concurrent reviews, 256 source updates, unknown/prototype-shaped languages, large output, blank lines and HTML-like text, load failure, clipboard rejection/retry, 12 rapid clicks, 24 source changes, unmount and surrounding-form behavior. Clipboard and loader failures are controlled test boundaries; these are not paid-provider or production-tenant tests.
+
+For visual acceptance, compare actual rendered before/after pixels at 1440, 768 and 390 CSS pixels in both themes. Inspect keyboard focus and horizontal code scrolling, visible copy labels, copy failure/retry, loading and failed-module states, and full source preservation. Keep DOM, console and screenshot evidence for each exact viewport before resizing. Test real device/clipboard permissions and assistive technology separately; a component fixture cannot certify the full authenticated route.
+
+Measure failure-text contrast against the computed background in both themes, with a minimum target of 4.5:1. The dark destructive token is a background color and is too dark for this text. Error foregrounds use red-700/red-300, and the message disables transitions so switching from screen-reader-only feedback cannot animate its spacing or color. Inspect the settled failure state as well as the immediate response.
+
+The retired `react-syntax-highlighter` package and its types are no longer needed. Keep the separate patched root `prismjs` dependency: proposal diff rendering still requires it. Do not remove it based only on the shared wrapper's migration.
diff --git a/docs/runbooks/TELEGRAM_WEBHOOK_ADMISSION.md b/docs/runbooks/TELEGRAM_WEBHOOK_ADMISSION.md
new file mode 100644
index 000000000..c8ed06f1c
--- /dev/null
+++ b/docs/runbooks/TELEGRAM_WEBHOOK_ADMISSION.md
@@ -0,0 +1,31 @@
+# Telegram webhook admission
+
+A person using the NodeBench bot should be able to start or stop notifications without another website visitor reading their history or controlling the bot. The Telegram HTTP route is the public entry point; chat storage and bot-management functions are internal Convex functions. A chat ID supplied to a public RPC is not proof of chat ownership.
+
+## Entry point and configuration
+
+`POST /telegram/webhook` requires a valid `TELEGRAM_WEBHOOK_SECRET` in the server environment and the matching `X-Telegram-Bot-Api-Secret-Token` request header. The configured value must contain 1–256 ASCII letters, digits, underscores or hyphens. Missing or invalid server configuration is an unavailable integration; missing or incorrect request authentication is denied before parsing the body or calling an action.
+
+The deployment owner must configure this value through the existing secure environment workflow and arrange the existing internal `domains/integrations/telegram:setWebhook` action to register the same value with Telegram. `TELEGRAM_BOT_TOKEN` remains server-side. Neither value belongs in a browser bundle, Git, a screenshot, a test artifact or a handoff. This repair does not configure a real provider or deploy a schema.
+
+The internal setup action accepts an HTTPS URL without embedded credentials and sends `secret_token` to Telegram. It retains pending messages. The two registered tables, `telegramUsers` and `telegramMessages`, use the existing schema definitions and indexes; this change does not backfill or inspect production records. Management, registration, history and notification-control functions are internal; the three existing callers in `telegramAgent.ts` use `internal` references.
+
+Telegram documents the header, accepted secret characters and retry behavior in its [official Bot API](https://core.telegram.org/bots/api#setwebhook). A non-2xx response can cause Telegram to retry. This integration does not promise exactly-once outbound messages: a provider may accept a send before a later network failure or database error becomes visible. Evaluate delivery deduplication separately before adopting workflows that require exactly-once effects.
+
+## Accepted work and failures
+
+Only authenticated, bounded, structurally valid text messages and button callbacks are dispatched. Authentic unsupported update kinds are explicitly ignored. Invalid input, excessive bodies and failed processing receive unsuccessful HTTP responses. A provider's `sent:false` or `ok:false` must reach that failure path; an outgoing log must never imply a reply was sent when its send failed.
+
+`/start` enables notifications and `/stop` disables them for the admitted chat. Help and status describe the implemented notification controls. Search, funding/news research and broadcast scaffolds are not evidence of working research or operational providers. Do not describe them as active based on a configured token or an HTTP 200 acknowledgment.
+
+Provider requests use the fixed Telegram API host, reject redirects, have a finite deadline including body consumption, and reject oversized or malformed responses. History readers require a positive integer limit no greater than 100. No new in-memory cache, score, public route or provider dependency is introduced. There is no compare-and-swap hashing operation in this slice.
+
+## Verification and adoption
+
+1. Run the actual handlers with the registered schema in `backend/convex/domains/integrations/__tests__/telegramAdmission.test.ts`. The fixture provider must remain synthetic. Cases cover forged/unconfigured/malformed input, start/stop/start, independent chat histories, repeated/overlapping activity, delivery rejection, slow bodies, timeouts and oversized provider responses.
+2. Run `node node_modules/vitest/vitest.mjs run backend/convex/domains/integrations/__tests__/telegramAdmission.test.ts --maxWorkers=1 --minWorkers=1 --no-file-parallelism`. The same file is part of CI's runtime smoke gate.
+3. Run the unchanged generator contracts, backend typecheck and `npm run typecheck:app`. A reduction in Telegram diagnostics does not certify the remaining application or backend diagnostics.
+4. Review the actual source diff and CI at the candidate commit. Coordinate any eventual schema deployment through the repository release workflow; never deploy out-of-band to shared Convex.
+5. After the deployment owner configures the real provider, separately verify an authentic text/callback, a denied forged request, notification persistence and actual delivered messages. Local Convex emulation and synthetic provider responses do not certify production delivery, provider permissions, load capacity or a visual/UI quality grade.
+
+The test HTTP router mounts the actual Telegram handler at the application path without initializing unrelated provider components. Convex-test allows direct calls to internal functions, so visibility is verified against the actual registered function flags, not inferred from its emulated calls. Overlapping scenarios exercise application/storage behavior in that emulator; they are not a benchmark of distributed production concurrency.
diff --git a/docs/runbooks/WORKFLOW_INPUT_BOUNDARY.md b/docs/runbooks/WORKFLOW_INPUT_BOUNDARY.md
new file mode 100644
index 000000000..433e17450
--- /dev/null
+++ b/docs/runbooks/WORKFLOW_INPUT_BOUNDARY.md
@@ -0,0 +1,13 @@
+# Issue-comment and manual workflow input
+
+A repository maintainer uses `@nodebench ` to request an intelligence packet on an issue or pull request. Comment text previously became shell source, then response values became a `sed` program. A quote or command substitution could change what the runner executed. The packet action now reads the GitHub event directly in a static JavaScript action, serializes the query as JSON, and formats parsed response data without a shell.
+
+The packet request accepts 1–2,000 characters from the first query line after the last marker. Its repository-configured API must be a trusted HTTPS origin without credentials, a path, query or fragment. Redirects are refused, the request and response read have a 60-second budget, and the response is capped at 256 KiB. Failed HTTP, parsing, unsuccessful packets or failed GitHub posting fail the job. Missing or invalid confidence is displayed as unavailable. Bot comments cannot restart the packet workflow. No repository code is checked out by this privileged workflow.
+
+The Attrition crawl now binds its manual URL through the environment instead of inserting it into shell source. Its existing API-routing and golden-query failure-suppression defects are separate open work; this change does not claim those gates are green.
+
+Run `node --test scripts/nodebench-packet-contracts.node.mjs` with Bash available on PATH (Git for Windows Bash for local Windows verification). The scenarios execute the actual static action against a local HTTP fixture and capture attempted GitHub posts. They cover hostile text, burst and sustained requests, UTF-8 chunks, invalid configuration, HTTP/redirect/body/timeout failures and posting failure. No live search, provider request or public comment is performed by the scenarios.
+
+The candidate fix is not default-branch protection until it is reviewed, integrated and read back from the default branch. Existing unrelated TypeScript, deployment, product and benchmark failures retain their status. The verification evidence does not certify provider quality or a live end-to-end research packet.
+
+Reference: [GitHub script-injection guidance](https://docs.github.com/en/actions/concepts/security/script-injections).
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..0e120369d
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,33973 @@
+{
+  "name": "nodebench-ai",
+  "version": "0.1.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "nodebench-ai",
+      "version": "0.1.0",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@ai-sdk/anthropic": "^2.0.53",
+        "@ai-sdk/google": "^2.0.44",
+        "@ai-sdk/openai": "^2.0.52",
+        "@ai-sdk/provider-utils": "^3.0.12",
+        "@anthropic-ai/sdk": "^0.91.1",
+        "@auth/core": "^0.41.2",
+        "@blocknote/core": "^0.49.0",
+        "@blocknote/mantine": "^0.49.0",
+        "@blocknote/react": "^0.49.0",
+        "@capacitor/core": "^8.3.1",
+        "@capacitor/haptics": "^8.0.2",
+        "@capacitor/keyboard": "^8.0.3",
+        "@capacitor/status-bar": "^8.0.2",
+        "@codemirror/lang-markdown": "^6.5.0",
+        "@convex-dev/agent": "0.2.10",
+        "@convex-dev/auth": "0.0.80",
+        "@convex-dev/crons": "0.2.2",
+        "@convex-dev/persistent-text-streaming": "0.2.3",
+        "@convex-dev/polar": "0.6.3",
+        "@convex-dev/presence": "0.1.2",
+        "@convex-dev/prosemirror-sync": "^0.2.0",
+        "@convex-dev/rag": "0.5.4",
+        "@convex-dev/twilio": "0.1.7",
+        "@convex-dev/workflow": "0.2.7",
+        "@convex-dev/workpool": "0.2.18",
+        "@dnd-kit/core": "^6.3.1",
+        "@dnd-kit/modifiers": "^9.0.0",
+        "@dnd-kit/sortable": "^10.0.0",
+        "@erquhart/convex-oss-stats": "^0.8.1",
+        "@google/genai": "^1.47.0",
+        "@google/generative-ai": "^0.24.1",
+        "@langchain/core": "^1.2.1",
+        "@langchain/langgraph": "^1.4.7",
+        "@lexical/code": "^0.43.0",
+        "@lexical/link": "^0.43.0",
+        "@lexical/list": "^0.43.0",
+        "@lexical/markdown": "^0.43.0",
+        "@lexical/react": "^0.43.0",
+        "@lexical/rich-text": "^0.43.0",
+        "@lexical/selection": "^0.43.0",
+        "@mantine/core": "^8.3.9",
+        "@mantine/hooks": "^8.3.9",
+        "@mariozechner/pi-agent-core": "^0.70.2",
+        "@mariozechner/pi-ai": "^0.70.2",
+        "@modelcontextprotocol/sdk": "^1.29.0",
+        "@number-flow/react": "^0.6.0",
+        "@openrouter/ai-sdk-provider": "^1.5.4",
+        "@pdfme/common": "^5.5.8",
+        "@pdfme/generator": "^5.5.8",
+        "@pdfme/schemas": "^5.5.8",
+        "@polar-sh/checkout": "^0.2.0",
+        "@polar-sh/sdk": "^0.47.0",
+        "@radix-ui/react-accordion": "^1.2.16",
+        "@radix-ui/react-checkbox": "^1.3.7",
+        "@radix-ui/react-collapsible": "^1.1.16",
+        "@radix-ui/react-context-menu": "^2.3.3",
+        "@radix-ui/react-dialog": "^1.1.19",
+        "@radix-ui/react-dropdown-menu": "^2.1.20",
+        "@radix-ui/react-hover-card": "^1.1.19",
+        "@radix-ui/react-popover": "^1.1.19",
+        "@radix-ui/react-progress": "^1.1.12",
+        "@radix-ui/react-scroll-area": "^1.2.14",
+        "@radix-ui/react-select": "^2.3.3",
+        "@radix-ui/react-separator": "^1.1.11",
+        "@radix-ui/react-slot": "^1.3.0",
+        "@radix-ui/react-switch": "^1.3.3",
+        "@radix-ui/react-tabs": "^1.1.17",
+        "@radix-ui/react-toggle-group": "^1.1.15",
+        "@radix-ui/react-tooltip": "^1.2.12",
+        "@radix-ui/react-use-controllable-state": "^1.2.3",
+        "@remotion/cli": "4.0.486",
+        "@sigma/node-border": "3.0.0",
+        "@streamdown/cjk": "^1.0.3",
+        "@streamdown/code": "^1.1.1",
+        "@streamdown/math": "^1.0.2",
+        "@streamdown/mermaid": "^1.0.2",
+        "@testing-library/dom": "^10.4.1",
+        "@tiptap/core": "^3.12.0",
+        "@tiptap/extension-blockquote": "^3.12.0",
+        "@tiptap/extension-bullet-list": "^3.6.6",
+        "@tiptap/extension-hard-break": "^3.12.0",
+        "@tiptap/extension-heading": "^3.12.0",
+        "@tiptap/extension-highlight": "^3.12.0",
+        "@tiptap/extension-horizontal-rule": "^3.12.0",
+        "@tiptap/extension-image": "^3.12.0",
+        "@tiptap/extension-link": "^3.12.0",
+        "@tiptap/extension-list": "^3.12.0",
+        "@tiptap/extension-list-item": "^3.6.6",
+        "@tiptap/extension-mention": "^3.12.0",
+        "@tiptap/extension-ordered-list": "^3.6.6",
+        "@tiptap/extension-paragraph": "^3.12.0",
+        "@tiptap/extension-placeholder": "^3.22.4",
+        "@tiptap/extension-table": "^3.12.0",
+        "@tiptap/extension-table-cell": "^3.6.6",
+        "@tiptap/extension-table-header": "^3.6.6",
+        "@tiptap/extension-table-row": "^3.6.6",
+        "@tiptap/extension-task-item": "^3.6.6",
+        "@tiptap/extension-task-list": "^3.6.6",
+        "@tiptap/extension-text-style": "^3.12.0",
+        "@tiptap/pm": "3.22.3",
+        "@tiptap/react": "^3.12.0",
+        "@tiptap/starter-kit": "^3.12.0",
+        "@tiptap/suggestion": "^3.12.0",
+        "@types/d3": "^7.4.3",
+        "@types/dompurify": "^3.0.5",
+        "@types/katex": "^0.16.8",
+        "@types/ws": "^8.18.1",
+        "@uiw/react-codemirror": "^4.25.9",
+        "@vercel/edge": "^1.3.1",
+        "ai": "^5.0.71",
+        "better-sqlite3": "^11.10.0",
+        "class-variance-authority": "^0.7.1",
+        "clsx": "^2.1.1",
+        "cmdk": "^1.1.1",
+        "convex": "^1.31.3",
+        "convex-helpers": "^0.1.105",
+        "cors": "^2.8.5",
+        "d3": "^7.9.0",
+        "docx": "^9.6.1",
+        "dompurify": "^3.4.11",
+        "dotenv": "^16.6.1",
+        "embla-carousel-react": "^8.6.0",
+        "express": "^5.1.0",
+        "fractional-indexing": "^3.2.0",
+        "framer-motion": "^12.23.25",
+        "googleapis": "^171.4.0",
+        "graphology": "0.26.0",
+        "graphology-layout-forceatlas2": "0.10.1",
+        "helmet": "^8.1.0",
+        "katex": "^0.16.28",
+        "lexical": "^0.43.0",
+        "linkup-sdk": "^2.4.1",
+        "lucide-react": "^0.515.0",
+        "motion": "^12.42.2",
+        "nanoid": "^6.0.0",
+        "openai": "^5.8.2",
+        "papaparse": "^5.5.3",
+        "prismjs": "^1.30.0",
+        "react": "^19.1.1",
+        "react-dom": "^19.1.1",
+        "react-dropzone": "^14.3.8",
+        "react-grid-layout": "^1.5.2",
+        "react-markdown": "^10.1.0",
+        "react-resizable-panels": "^3.0.4",
+        "react-router-dom": "^7.18.1",
+        "react-spreadsheet": "^0.10.1",
+        "react-virtualized-auto-sizer": "^1.0.26",
+        "react-window": "^1.8.11",
+        "recharts": "^3.6.0",
+        "rehype-katex": "^7.0.1",
+        "rehype-raw": "^7.0.0",
+        "rehype-sanitize": "^6.0.0",
+        "remark-math": "^6.0.0",
+        "remotion": "4.0.451",
+        "resend": "^4.0.0",
+        "scheduler": "^0.27.0",
+        "shiki": "^4.3.1",
+        "sigma": "3.0.3",
+        "sonner": "^2.0.3",
+        "streamdown": "^2.5.0",
+        "tailwind-merge": "^3.1.0",
+        "tokenlens": "^1.3.1",
+        "tweetnacl": "^1.0.3",
+        "use-stick-to-bottom": "^1.1.6",
+        "uuid": "^14.0.0",
+        "vega": "^6.2.0",
+        "vega-embed": "^7.1.0",
+        "vega-lite": "^6.4.3",
+        "ws": "^8.21.0",
+        "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
+        "zod": "^3.25.76",
+        "zod-to-json-schema": "^3.25.2",
+        "zustand": "^4.5.7"
+      },
+      "devDependencies": {
+        "@capacitor/android": "^8.3.1",
+        "@capacitor/cli": "^8.3.1",
+        "@capacitor/ios": "^8.3.1",
+        "@chromatic-com/storybook": "^4.1.1",
+        "@edge-runtime/vm": "^5.0.0",
+        "@eslint/js": "^9.21.0",
+        "@google-cloud/local-auth": "^3.0.1",
+        "@playwright/test": "^1.59.1",
+        "@storybook/addon-a11y": "^9.1.10",
+        "@storybook/addon-docs": "^9.1.10",
+        "@storybook/addon-onboarding": "^9.1.10",
+        "@storybook/addon-vitest": "^9.1.10",
+        "@storybook/react-vite": "^9.1.10",
+        "@tailwindcss/typography": "^0.5.19",
+        "@testing-library/jest-dom": "^6.6.3",
+        "@testing-library/react": "^16.0.0",
+        "@testing-library/user-event": "^14.5.2",
+        "@types/cors": "^2.8.19",
+        "@types/express": "^5.0.5",
+        "@types/node": "^22.13.10",
+        "@types/papaparse": "^5.3.15",
+        "@types/react": "^19.0.10",
+        "@types/react-dom": "^19.0.4",
+        "@types/uuid": "^10.0.0",
+        "@vercel/blob": "^2.2.0",
+        "@vercel/node": "^5.6.22",
+        "@vitejs/plugin-react": "^6.0.1",
+        "agent-browser": "^0.26.0",
+        "autoprefixer": "~10",
+        "convex-test": "^0.0.53",
+        "critters": "^0.0.25",
+        "cross-env": "^10.1.0",
+        "eslint": "^9.21.0",
+        "eslint-plugin-react-hooks": "^5.1.0",
+        "eslint-plugin-react-refresh": "^0.5.2",
+        "eslint-plugin-storybook": "^9.1.10",
+        "fake-indexeddb": "^6.2.5",
+        "ffmpeg-static": "^5.2.0",
+        "globals": "^15.15.0",
+        "jsdom": "^25.0.1",
+        "npm-run-all": "^4.1.5",
+        "playwright": "^1.59.1",
+        "postcss": "~8",
+        "prettier": "^3.5.3",
+        "puppeteer": "^24.40.0",
+        "rollup-plugin-visualizer": "^6.0.5",
+        "sharp": "^0.35.0",
+        "storybook": "^9.1.10",
+        "tailwindcss": "~3",
+        "terser": "^5.46.0",
+        "tsx": "^4.20.6",
+        "typescript": "5.9.3",
+        "typescript-eslint": "^8.24.1",
+        "vite": "^8.0.10",
+        "vite-imagetools": "^9.0.2",
+        "vite-plugin-pwa": "^1.2.0",
+        "vitest": "^3.2.6",
+        "workbox-window": "^7.4.0"
+      }
+    },
+    "node_modules/@adobe/css-tools": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz",
+      "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@ai-sdk/anthropic": {
+      "version": "2.0.101",
+      "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.101.tgz",
+      "integrity": "sha512-jLAtSFPiB9mftqZyIbZ/FXIB/jBwgbrbVM9M6jDGbSapYCsqUlfbiWszjkEiX2nHK+BxgeQOPqKbWyuzFJPBqA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@ai-sdk/provider": "2.0.3",
+        "@ai-sdk/provider-utils": "3.0.36"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.76 || ^4.1.8"
+      }
+    },
+    "node_modules/@ai-sdk/gateway": {
+      "version": "2.0.147",
+      "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.147.tgz",
+      "integrity": "sha512-uBi+N+9ApEKPrasD+QeUhGoDaXGZF4VuEfBrd1eh/taKQeThK02RzbPsLP9UmJNZJnqjr+7VPcZ5+Cj65QfGiw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@ai-sdk/provider": "2.0.3",
+        "@ai-sdk/provider-utils": "3.0.36",
+        "@vercel/oidc": "3.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.76 || ^4.1.8"
+      }
+    },
+    "node_modules/@ai-sdk/gateway/node_modules/@vercel/oidc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz",
+      "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">= 20"
+      }
+    },
+    "node_modules/@ai-sdk/google": {
+      "version": "2.0.96",
+      "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-2.0.96.tgz",
+      "integrity": "sha512-00A9+mPGqg154FoxPS4rpkIbpOlxEIWiBAFz8saj3fuvpJB3TxhTehFwz0vZnzOIyxZypRq/qzqqKIUkmyApYg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@ai-sdk/provider": "2.0.3",
+        "@ai-sdk/provider-utils": "3.0.36"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.76 || ^4.1.8"
+      }
+    },
+    "node_modules/@ai-sdk/openai": {
+      "version": "2.0.125",
+      "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.125.tgz",
+      "integrity": "sha512-9VWeQuY8eJwKlTQO8qbYGb18nPREb80DcWZVlhP6534tc1vEalRDCDXfv5zg3ied5wrAksLpvWQPa2379w4kmQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@ai-sdk/provider": "2.0.3",
+        "@ai-sdk/provider-utils": "3.0.36"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.76 || ^4.1.8"
+      }
+    },
+    "node_modules/@ai-sdk/provider": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.3.tgz",
+      "integrity": "sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "json-schema": "^0.4.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@ai-sdk/provider-utils": {
+      "version": "3.0.36",
+      "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.36.tgz",
+      "integrity": "sha512-2eSw90hn32Je6n2a8Gf4dJ2EoecPJuOCWqwZCw+BkhPq2LOS01HX3s6ljgOm0iIkZiD5aAuMdpOw17rYKQF/Zg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@ai-sdk/provider": "2.0.3",
+        "@standard-schema/spec": "^1.0.0",
+        "eventsource-parser": "^3.0.6",
+        "undici": "^5.29.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.76 || ^4.1.8"
+      }
+    },
+    "node_modules/@alloc/quick-lru": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz",
+      "integrity": "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@antfu/install-pkg": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.0.1.tgz",
+      "integrity": "sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==",
+      "license": "MIT",
+      "dependencies": {
+        "package-manager-detector": "^1.7.0",
+        "tinyexec": "^1.2.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@anthropic-ai/sdk": {
+      "version": "0.91.1",
+      "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz",
+      "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==",
+      "license": "MIT",
+      "dependencies": {
+        "json-schema-to-ts": "^3.1.1"
+      },
+      "bin": {
+        "anthropic-ai-sdk": "bin/cli"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.0 || ^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@apideck/better-ajv-errors": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.7.tgz",
+      "integrity": "sha512-TajUJwGWbDwkCx/CZi7tRE8PVB7simCvKJfHUsSdvps+aTM/PDPP4gkLmKnc+x3CE//y9i/nj74GqdL/hwk7Iw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "jsonpointer": "^5.0.1",
+        "leven": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "ajv": ">=8"
+      }
+    },
+    "node_modules/@asamuzakjp/css-color": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
+      "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@csstools/css-calc": "^2.1.3",
+        "@csstools/css-color-parser": "^3.0.9",
+        "@csstools/css-parser-algorithms": "^3.0.4",
+        "@csstools/css-tokenizer": "^3.0.3",
+        "lru-cache": "^10.4.3"
+      }
+    },
+    "node_modules/@auth/core": {
+      "version": "0.41.3",
+      "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.41.3.tgz",
+      "integrity": "sha512-sJ3JMHHkXMD3aOjopv7mOBTO1Ocw4b0fAEXJBz6k7YHLpYQI6C40jCUPc5fNvUKxXRXNE1/sRISA15UrwWJBTw==",
+      "license": "ISC",
+      "dependencies": {
+        "@panva/hkdf": "^1.2.1",
+        "jose": "^6.0.6",
+        "oauth4webapi": "^3.3.0",
+        "preact": "10.24.3",
+        "preact-render-to-string": "6.5.11"
+      },
+      "peerDependencies": {
+        "@simplewebauthn/browser": "^9.0.1",
+        "@simplewebauthn/server": "^9.0.2",
+        "nodemailer": "^7.0.7 || ^8.0.5"
+      },
+      "peerDependenciesMeta": {
+        "@simplewebauthn/browser": {
+          "optional": true
+        },
+        "@simplewebauthn/server": {
+          "optional": true
+        },
+        "nodemailer": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@aws-sdk/client-bedrock-runtime": {
+      "version": "3.1127.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1127.0.tgz",
+      "integrity": "sha512-IDl/lrPb90aH+pZFHGNDmgH9nAUQj5PlZH1sJ3w7RikctyjHSnY3oNjZhrLoaBoQn/rNK0zsP6OHEqEhj2tdLA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/credential-provider-node": "^3.972.82",
+        "@aws-sdk/eventstream-handler-node": "^3.972.34",
+        "@aws-sdk/middleware-eventstream": "^3.972.29",
+        "@aws-sdk/middleware-websocket": "^3.972.52",
+        "@aws-sdk/token-providers": "3.1127.0",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/fetch-http-handler": "^5.7.2",
+        "@smithy/node-http-handler": "^4.11.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/core": {
+      "version": "3.977.9",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.977.9.tgz",
+      "integrity": "sha512-reqPFEQrZxDZpeGj4PFMepBeR5LGYHRqq/L0motTzgFkCRBA4rFdaVXDSLYyGHhxVz7sT2PDnPN9CluGSfgyJA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/types": "^3.974.5",
+        "@aws-sdk/xml-builder": "^3.972.40",
+        "@aws/lambda-invoke-store": "^0.3.0",
+        "@smithy/core": "^3.33.3",
+        "@smithy/signature-v4": "^5.6.12",
+        "@smithy/types": "^4.17.2",
+        "bowser": "^2.11.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-env": {
+      "version": "3.972.70",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.70.tgz",
+      "integrity": "sha512-H404B7dJl2mCrBqahDEYsanB0xhdDp6tXnXcTUnXmmpy2Q3J0Ho0bUajZ2jr/RdwzCyS59Gi8xXIFwPLGBl6Uw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-http": {
+      "version": "3.972.72",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.72.tgz",
+      "integrity": "sha512-X98zYOrVOeuosCX+6ktf29FC2N2GHPLia7qv6mzPzTc+RPAuHWCDS++Z6JK7eGYqb/v6uaW7bAXaOvDBfol+0w==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/fetch-http-handler": "^5.7.2",
+        "@smithy/node-http-handler": "^4.11.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-ini": {
+      "version": "3.973.15",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.15.tgz",
+      "integrity": "sha512-Rykg6s5ceBuynMOGWgoowO4N+27JfnqXAnVaSunZl0hOO1XodSrxGNz6sCEbnmS0lAfQZDKyb3fbr46gSuv6Sg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/credential-provider-env": "^3.972.70",
+        "@aws-sdk/credential-provider-http": "^3.972.72",
+        "@aws-sdk/credential-provider-login": "^3.972.77",
+        "@aws-sdk/credential-provider-process": "^3.972.70",
+        "@aws-sdk/credential-provider-sso": "^3.973.14",
+        "@aws-sdk/credential-provider-web-identity": "^3.972.76",
+        "@aws-sdk/nested-clients": "^3.997.44",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/credential-provider-imds": "^4.4.16",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-login": {
+      "version": "3.972.77",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.77.tgz",
+      "integrity": "sha512-Jb59xfEISoN5mmbnA+HYqdtrSX3CgCtJoof+V5D8/TgUI56W63GEEd5Y58WijU3Ou6+WEgaLD1feVzaRXV5IDQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/nested-clients": "^3.997.44",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-node": {
+      "version": "3.972.82",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.82.tgz",
+      "integrity": "sha512-znDkEOGXB8W3kG1LJUKP3foBZY/9qLM0eil/DxWXSp37XsdsRLQHE/d/OaCGGVgKpA6znR38h/+INk8do1FjiA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/credential-provider-env": "^3.972.70",
+        "@aws-sdk/credential-provider-http": "^3.972.72",
+        "@aws-sdk/credential-provider-ini": "^3.973.15",
+        "@aws-sdk/credential-provider-process": "^3.972.70",
+        "@aws-sdk/credential-provider-sso": "^3.973.14",
+        "@aws-sdk/credential-provider-web-identity": "^3.972.76",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/credential-provider-imds": "^4.4.16",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-process": {
+      "version": "3.972.70",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.70.tgz",
+      "integrity": "sha512-2ry03fGRJr4sV3jI+ocjj5JqALnFD6ymM5KiNCDZMvq8bX2GSbE0vji4aM43TVCl2nXqqLRZaUxdq/KeWRAY4Q==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso": {
+      "version": "3.973.14",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.14.tgz",
+      "integrity": "sha512-jkhg/8ocAAoc0RFyLMhCw+/zZh7gystQgd4F4hznNa8P4Cc501PQmxd+jGLiMHodPJ+7Zv/3znM62gZojyasmA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/nested-clients": "^3.997.44",
+        "@aws-sdk/token-providers": "3.1116.0",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": {
+      "version": "3.1116.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1116.0.tgz",
+      "integrity": "sha512-ygIivKqh8aHzNkucOCXHyIBgBpLPfrSI0mCqXF+vLBsPTUKqj0VSqAY0GFPe7lQl4HntjOcQ+KSyS7oUV2C54Q==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/nested-clients": "^3.997.44",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/credential-provider-web-identity": {
+      "version": "3.972.76",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.76.tgz",
+      "integrity": "sha512-d3AGyVu759PGr35mEB2s22xxlNEA5rpdxtSPJthfPFJvoQ8dt357iVPECqWfUxXp1toJAvKmbtcIYVGigaGsCA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/nested-clients": "^3.997.44",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/eventstream-handler-node": {
+      "version": "3.972.34",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.34.tgz",
+      "integrity": "sha512-cTeVzpu1xEAkryTZBYhGwnQ6gOGyp8ZYZvmn0Sg/nI/ABmy/CRHHxPDJDUi9PxwxUtGGaatvfRUB3FCgT/rSWw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/middleware-eventstream": {
+      "version": "3.972.29",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.29.tgz",
+      "integrity": "sha512-dlRzHCgyB8W6hLuDC5pcT5q+ziPt00n4QGgGBE17ucLVU4zMa6lsbuUdQ2Pm75Z5VA8GF+R/+SgrRcaTdIzSIQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/middleware-websocket": {
+      "version": "3.972.52",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.52.tgz",
+      "integrity": "sha512-vsPPM+nMbKJlUCFU+eoGZbdxdxDIAX9LbpjSXaR5Ufpmqgp8TdYQnoExhLu4T3umW/JIIPny1ydbhWidZZYokQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/fetch-http-handler": "^5.7.2",
+        "@smithy/signature-v4": "^5.6.12",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/nested-clients": {
+      "version": "3.997.44",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.44.tgz",
+      "integrity": "sha512-NhEgryjlBF9w38ZXqGymQV28IhkYa1mKhlbYnqIis57AYwWGVYfUPgg/qC2rLRqOUfblxx++irvju10kVTa8Vw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/signature-v4-multi-region": "^3.996.46",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/fetch-http-handler": "^5.7.2",
+        "@smithy/node-http-handler": "^4.11.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/signature-v4-multi-region": {
+      "version": "3.996.46",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.46.tgz",
+      "integrity": "sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/signature-v4": "^5.6.12",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/token-providers": {
+      "version": "3.1127.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1127.0.tgz",
+      "integrity": "sha512-Dv2TMWBshJ+tF6ahs2Sy5bh4Iabsd4GAQqVvE9XZmYmnoaVbpS2QKIKE/HRacc7bTtbjEEvP+laGzHvHlf1CiQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@aws-sdk/core": "^3.977.9",
+        "@aws-sdk/nested-clients": "^3.997.44",
+        "@aws-sdk/types": "^3.974.5",
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/types": {
+      "version": "3.974.5",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.5.tgz",
+      "integrity": "sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws-sdk/xml-builder": {
+      "version": "3.972.40",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.40.tgz",
+      "integrity": "sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@aws/lambda-invoke-store": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz",
+      "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+      "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.29.7",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+      "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+      "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.7",
+        "@babel/generator": "^7.29.7",
+        "@babel/helper-compilation-targets": "^7.29.7",
+        "@babel/helper-module-transforms": "^7.29.7",
+        "@babel/helpers": "^7.29.7",
+        "@babel/parser": "^7.29.7",
+        "@babel/template": "^7.29.7",
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7",
+        "@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"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/core/node_modules/@babel/parser": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+      "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.8"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/core/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+      "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.29.8",
+        "@babel/types": "^7.29.8",
+        "@jridgewell/gen-mapping": "^0.3.12",
+        "@jridgewell/trace-mapping": "^0.3.28",
+        "jsesc": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/generator/node_modules/@babel/parser": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+      "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.8"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/generator/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
+      "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+      "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
+      "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz",
+      "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.29.7",
+        "regexpu-core": "^6.3.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider": {
+      "version": "0.6.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+      "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "debug": "^4.4.3",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.22.11"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/@babel/helper-globals": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+      "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
+      "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+      "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+      "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
+      "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+      "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-remap-async-to-generator": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz",
+      "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.29.7",
+        "@babel/helper-wrap-function": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
+      "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-member-expression-to-functions": "^7.29.7",
+        "@babel/helper-optimise-call-expression": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
+      "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+      "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+      "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+      "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-wrap-function": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz",
+      "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.29.7",
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+      "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.24.1",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz",
+      "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
+      "license": "MIT",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz",
+      "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz",
+      "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz",
+      "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz",
+      "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz",
+      "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+        "@babel/plugin-transform-optional-chaining": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz",
+      "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.0-placeholder-for-preset-env.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+      "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-assertions": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz",
+      "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz",
+      "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz",
+      "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-generator-functions": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz",
+      "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-remap-async-to-generator": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz",
+      "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-remap-async-to-generator": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz",
+      "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz",
+      "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-properties": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz",
+      "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-static-block": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz",
+      "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.12.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz",
+      "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.29.7",
+        "@babel/helper-compilation-targets": "^7.29.7",
+        "@babel/helper-globals": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-replace-supers": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz",
+      "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/template": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz",
+      "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz",
+      "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz",
+      "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz",
+      "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dynamic-import": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz",
+      "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-explicit-resource-management": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz",
+      "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/plugin-transform-destructuring": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz",
+      "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-export-namespace-from": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz",
+      "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-for-of": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz",
+      "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-function-name": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz",
+      "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-json-strings": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz",
+      "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-literals": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz",
+      "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz",
+      "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-member-expression-literals": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz",
+      "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-amd": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz",
+      "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-commonjs": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz",
+      "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-systemjs": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz",
+      "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7",
+        "@babel/traverse": "^7.29.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-umd": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz",
+      "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz",
+      "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-new-target": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz",
+      "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz",
+      "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-numeric-separator": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz",
+      "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-rest-spread": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz",
+      "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/plugin-transform-destructuring": "^7.29.7",
+        "@babel/plugin-transform-parameters": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-super": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz",
+      "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-replace-supers": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-catch-binding": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz",
+      "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-chaining": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz",
+      "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-parameters": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz",
+      "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-methods": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz",
+      "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-property-in-object": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz",
+      "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-property-literals": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz",
+      "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-regenerator": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz",
+      "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-regexp-modifiers": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz",
+      "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-reserved-words": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz",
+      "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-shorthand-properties": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz",
+      "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-spread": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz",
+      "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-sticky-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz",
+      "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-template-literals": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz",
+      "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typeof-symbol": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz",
+      "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-escapes": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz",
+      "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-property-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz",
+      "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz",
+      "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz",
+      "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/preset-env": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz",
+      "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.29.7",
+        "@babel/helper-compilation-targets": "^7.29.7",
+        "@babel/helper-plugin-utils": "^7.29.7",
+        "@babel/helper-validator-option": "^7.29.7",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7",
+        "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7",
+        "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+        "@babel/plugin-syntax-import-assertions": "^7.29.7",
+        "@babel/plugin-syntax-import-attributes": "^7.29.7",
+        "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+        "@babel/plugin-transform-arrow-functions": "^7.29.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.29.7",
+        "@babel/plugin-transform-async-to-generator": "^7.29.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.29.7",
+        "@babel/plugin-transform-block-scoping": "^7.29.7",
+        "@babel/plugin-transform-class-properties": "^7.29.7",
+        "@babel/plugin-transform-class-static-block": "^7.29.7",
+        "@babel/plugin-transform-classes": "^7.29.7",
+        "@babel/plugin-transform-computed-properties": "^7.29.7",
+        "@babel/plugin-transform-destructuring": "^7.29.7",
+        "@babel/plugin-transform-dotall-regex": "^7.29.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.29.7",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7",
+        "@babel/plugin-transform-dynamic-import": "^7.29.7",
+        "@babel/plugin-transform-explicit-resource-management": "^7.29.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.29.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.29.7",
+        "@babel/plugin-transform-for-of": "^7.29.7",
+        "@babel/plugin-transform-function-name": "^7.29.7",
+        "@babel/plugin-transform-json-strings": "^7.29.7",
+        "@babel/plugin-transform-literals": "^7.29.7",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.29.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.29.7",
+        "@babel/plugin-transform-modules-amd": "^7.29.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.29.7",
+        "@babel/plugin-transform-modules-systemjs": "^7.29.7",
+        "@babel/plugin-transform-modules-umd": "^7.29.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7",
+        "@babel/plugin-transform-new-target": "^7.29.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7",
+        "@babel/plugin-transform-numeric-separator": "^7.29.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.29.7",
+        "@babel/plugin-transform-object-super": "^7.29.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.29.7",
+        "@babel/plugin-transform-optional-chaining": "^7.29.7",
+        "@babel/plugin-transform-parameters": "^7.29.7",
+        "@babel/plugin-transform-private-methods": "^7.29.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.29.7",
+        "@babel/plugin-transform-property-literals": "^7.29.7",
+        "@babel/plugin-transform-regenerator": "^7.29.7",
+        "@babel/plugin-transform-regexp-modifiers": "^7.29.7",
+        "@babel/plugin-transform-reserved-words": "^7.29.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.29.7",
+        "@babel/plugin-transform-spread": "^7.29.7",
+        "@babel/plugin-transform-sticky-regex": "^7.29.7",
+        "@babel/plugin-transform-template-literals": "^7.29.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.29.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.29.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.29.7",
+        "@babel/plugin-transform-unicode-regex": "^7.29.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.29.7",
+        "@babel/preset-modules": "0.1.6-no-external-plugins",
+        "babel-plugin-polyfill-corejs2": "^0.4.15",
+        "babel-plugin-polyfill-corejs3": "^0.14.0",
+        "babel-plugin-polyfill-regenerator": "^0.6.6",
+        "core-js-compat": "^3.48.0",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-env/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/preset-modules": {
+      "version": "0.1.6-no-external-plugins",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+      "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+      "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+      "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.7",
+        "@babel/parser": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/template/node_modules/@babel/parser": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+      "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.8"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/template/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
+      "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.7",
+        "@babel/generator": "^7.29.8",
+        "@babel/helper-globals": "^7.29.7",
+        "@babel/parser": "^7.29.8",
+        "@babel/template": "^7.29.7",
+        "@babel/types": "^7.29.8",
+        "debug": "^4.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/@babel/parser": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+      "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.8"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
+      "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.23.4",
+        "@babel/helper-validator-identifier": "^7.22.20",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@blocknote/core": {
+      "version": "0.49.0",
+      "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.49.0.tgz",
+      "integrity": "sha512-WrkJ9DubvjfMP7+bfrKfp4Oe1SSYpVhojqSORHqh1IjU/qx7CWhwG62k2yyAJdr9K63aoVnS9c6p+xxbuW0PWA==",
+      "license": "MPL-2.0",
+      "dependencies": {
+        "@emoji-mart/data": "^1.2.1",
+        "@handlewithcare/prosemirror-inputrules": "^0.1.4",
+        "@shikijs/types": "^4",
+        "@tanstack/store": "^0.7.7",
+        "@tiptap/core": "^3.13.0",
+        "@tiptap/extension-bold": "^3.13.0",
+        "@tiptap/extension-code": "^3.13.0",
+        "@tiptap/extension-horizontal-rule": "^3.13.0",
+        "@tiptap/extension-italic": "^3.13.0",
+        "@tiptap/extension-paragraph": "^3.13.0",
+        "@tiptap/extension-strike": "^3.13.0",
+        "@tiptap/extension-text": "^3.13.0",
+        "@tiptap/extension-underline": "^3.13.0",
+        "@tiptap/extensions": "^3.13.0",
+        "@tiptap/pm": "^3.13.0",
+        "emoji-mart": "^5.6.0",
+        "fast-deep-equal": "^3.1.3",
+        "hast-util-from-dom": "^5.0.1",
+        "lib0": "^0.2.99",
+        "prosemirror-highlight": "^0.15.1",
+        "prosemirror-model": "^1.25.4",
+        "prosemirror-state": "^1.4.4",
+        "prosemirror-tables": "^1.8.3",
+        "prosemirror-transform": "^1.11.0",
+        "prosemirror-view": "^1.41.4",
+        "rehype-format": "^5.0.1",
+        "rehype-parse": "^9.0.1",
+        "rehype-remark": "^10.0.1",
+        "rehype-stringify": "^10.0.1",
+        "remark-gfm": "^4.0.1",
+        "remark-parse": "^11.0.0",
+        "remark-rehype": "^11.1.2",
+        "remark-stringify": "^11.0.0",
+        "unified": "^11.0.5",
+        "unist-util-visit": "^5.0.0",
+        "y-prosemirror": "^1.3.7",
+        "y-protocols": "^1.0.6",
+        "yjs": "^13.6.27"
+      }
+    },
+    "node_modules/@blocknote/mantine": {
+      "version": "0.49.0",
+      "resolved": "https://registry.npmjs.org/@blocknote/mantine/-/mantine-0.49.0.tgz",
+      "integrity": "sha512-MdR6WHk1yJsemhWw3d8ZDiuIigiit7DhBvbtG0XSceBU01jWJca5OYq/W4QMNS9aDEOML83a0sn7aU9dRhp8MQ==",
+      "license": "MPL-2.0",
+      "dependencies": {
+        "@blocknote/core": "0.49.0",
+        "@blocknote/react": "0.49.0",
+        "react-icons": "^5.5.0"
+      },
+      "peerDependencies": {
+        "@mantine/core": "^8.3.11",
+        "@mantine/hooks": "^8.3.11",
+        "@mantine/utils": "^6.0.22",
+        "react": "^18.0 || ^19.0 || >= 19.0.0-rc",
+        "react-dom": "^18.0 || ^19.0 || >= 19.0.0-rc"
+      }
+    },
+    "node_modules/@blocknote/react": {
+      "version": "0.49.0",
+      "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.49.0.tgz",
+      "integrity": "sha512-yqThZhMuxbyejWXWc4/gIRiOzNnhtZeoQqlqwGRwexPuSeZLYV/HvmquN98KAiBCYn2ORN5k37O5VerKG2dfcw==",
+      "license": "MPL-2.0",
+      "dependencies": {
+        "@blocknote/core": "0.49.0",
+        "@emoji-mart/data": "^1.2.1",
+        "@floating-ui/react": "^0.27.18",
+        "@floating-ui/utils": "^0.2.10",
+        "@tanstack/react-store": "0.7.7",
+        "@tiptap/core": "^3.13.0",
+        "@tiptap/pm": "^3.13.0",
+        "@tiptap/react": "^3.13.0",
+        "@types/use-sync-external-store": "1.5.0",
+        "emoji-mart": "^5.6.0",
+        "fast-deep-equal": "^3.1.3",
+        "lodash.merge": "^4.6.2",
+        "react-icons": "^5.5.0",
+        "use-sync-external-store": "1.6.0"
+      },
+      "peerDependencies": {
+        "react": "^18.0 || ^19.0 || >= 19.0.0-rc",
+        "react-dom": "^18.0 || ^19.0 || >= 19.0.0-rc"
+      }
+    },
+    "node_modules/@braintree/sanitize-url": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",
+      "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",
+      "license": "MIT"
+    },
+    "node_modules/@capacitor/android": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-8.5.1.tgz",
+      "integrity": "sha512-o8fUIPDSEASeXHHrDz26WU7OlyiRb+QqtI9KFdnLS1jUL77o5iGrvegibaZX8rWpiCyDJ6jlUhhhHlfeq3ou9A==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": "^8.5.0"
+      }
+    },
+    "node_modules/@capacitor/cli": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-8.5.1.tgz",
+      "integrity": "sha512-LKQFSyLg1QbTN6CGDoFqeRtAlj8C3c9OymP8OuhwlmkbSQwh9i1HQjwUCaNyVem2XkY9rv0v2UOfVlgoxH5pAw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/cli-framework-output": "^2.2.8",
+        "@ionic/utils-subprocess": "^3.0.1",
+        "@ionic/utils-terminal": "^2.3.5",
+        "commander": "^12.1.0",
+        "debug": "^4.4.0",
+        "env-paths": "^2.2.0",
+        "fs-extra": "^11.2.0",
+        "kleur": "^4.1.5",
+        "native-run": "^2.0.3",
+        "open": "^8.4.0",
+        "plist": "^3.1.0",
+        "prompts": "^2.4.2",
+        "rimraf": "^6.0.1",
+        "semver": "^7.6.3",
+        "tar": "^7.5.3",
+        "tslib": "^2.8.1",
+        "xcode": "^3.0.1",
+        "xml2js": "^0.6.2"
+      },
+      "bin": {
+        "cap": "bin/capacitor",
+        "capacitor": "bin/capacitor"
+      },
+      "engines": {
+        "node": ">=22.0.0"
+      }
+    },
+    "node_modules/@capacitor/core": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.5.1.tgz",
+      "integrity": "sha512-IOQ7ynG1qgrJ/RLuCO3WgyRGmkmmG/cdStRR4ftU2dWEN1FdtLrnI/XpZmZuUsOEHEnzBRJY/PmRH8eTLiXfhA==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@capacitor/haptics": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-8.0.2.tgz",
+      "integrity": "sha512-c2hZzRR5Fk1tbTvhG1jhh2XBAf3EhnIerMIb2sl7Mt41Gxx1fhBJFDa0/BI1IbY4loVepyyuqNC9820/GZuoWQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": ">=8.0.0"
+      }
+    },
+    "node_modules/@capacitor/ios": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-8.5.1.tgz",
+      "integrity": "sha512-0EVqwCYf3RUp2JAjUGZ04xmG6dSpIsPmPacI9zKxn6mu9RSiHhmFF230ghe00HrkyB6ig6SfNdoADvVODxYhlQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": "^8.5.0"
+      }
+    },
+    "node_modules/@capacitor/keyboard": {
+      "version": "8.0.5",
+      "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-8.0.5.tgz",
+      "integrity": "sha512-oFXygC4eKYA5l2MdpTR06L2M/4x6e2SLD5yS1T9+UBDKTkzyvhWKEhbYLUaTIBPpLKqlfGudJw1X73S1H9eUzQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": ">=8.0.0"
+      }
+    },
+    "node_modules/@capacitor/status-bar": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.3.tgz",
+      "integrity": "sha512-csSpfNeN49Hx9JaQBSJEIiEbOLtXg3kcc2IpScq2fu5L520h3AWEvsxoH8Srk1jxfRKepaJ4S4sqSC3foI4AgA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": ">=8.0.0"
+      }
+    },
+    "node_modules/@cfworker/json-schema": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz",
+      "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==",
+      "license": "MIT"
+    },
+    "node_modules/@chevrotain/types": {
+      "version": "11.1.2",
+      "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz",
+      "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/@chromatic-com/storybook": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-4.1.3.tgz",
+      "integrity": "sha512-hc0HO9GAV9pxqDE6fTVOV5KeLpTiCfV8Jrpk5ogKLiIgeq2C+NPjpt74YnrZTjiK8E19fYcMP+2WY9ZtX7zHmw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@neoconfetti/react": "^1.0.0",
+        "chromatic": "^13.3.3",
+        "filesize": "^10.0.12",
+        "jsonfile": "^6.1.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=20.0.0",
+        "yarn": ">=1.22.18"
+      },
+      "peerDependencies": {
+        "storybook": "^0.0.0-0 || ^9.0.0 || ^9.1.0-0 || ^9.2.0-0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0"
+      }
+    },
+    "node_modules/@codemirror/autocomplete": {
+      "version": "6.20.3",
+      "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz",
+      "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/language": "^6.0.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.17.0",
+        "@lezer/common": "^1.0.0"
+      }
+    },
+    "node_modules/@codemirror/commands": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz",
+      "integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/language": "^6.0.0",
+        "@codemirror/state": "^6.7.0",
+        "@codemirror/view": "^6.27.0",
+        "@lezer/common": "^1.1.0"
+      }
+    },
+    "node_modules/@codemirror/lang-css": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz",
+      "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/autocomplete": "^6.0.0",
+        "@codemirror/language": "^6.0.0",
+        "@codemirror/state": "^6.0.0",
+        "@lezer/common": "^1.0.2",
+        "@lezer/css": "^1.1.7"
+      }
+    },
+    "node_modules/@codemirror/lang-html": {
+      "version": "6.4.12",
+      "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz",
+      "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/autocomplete": "^6.0.0",
+        "@codemirror/lang-css": "^6.0.0",
+        "@codemirror/lang-javascript": "^6.0.0",
+        "@codemirror/language": "^6.4.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.17.0",
+        "@lezer/common": "^1.0.0",
+        "@lezer/css": "^1.1.0",
+        "@lezer/html": "^1.3.12"
+      }
+    },
+    "node_modules/@codemirror/lang-javascript": {
+      "version": "6.2.5",
+      "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz",
+      "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/autocomplete": "^6.0.0",
+        "@codemirror/language": "^6.6.0",
+        "@codemirror/lint": "^6.0.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.17.0",
+        "@lezer/common": "^1.0.0",
+        "@lezer/javascript": "^1.0.0"
+      }
+    },
+    "node_modules/@codemirror/lang-markdown": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz",
+      "integrity": "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/autocomplete": "^6.7.1",
+        "@codemirror/lang-html": "^6.0.0",
+        "@codemirror/language": "^6.3.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.0.0",
+        "@lezer/common": "^1.2.1",
+        "@lezer/markdown": "^1.0.0"
+      }
+    },
+    "node_modules/@codemirror/language": {
+      "version": "6.12.4",
+      "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz",
+      "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.23.0",
+        "@lezer/common": "^1.5.0",
+        "@lezer/highlight": "^1.0.0",
+        "@lezer/lr": "^1.0.0",
+        "style-mod": "^4.0.0"
+      }
+    },
+    "node_modules/@codemirror/lint": {
+      "version": "6.9.7",
+      "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz",
+      "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.42.0",
+        "crelt": "^1.0.5"
+      }
+    },
+    "node_modules/@codemirror/search": {
+      "version": "6.7.2",
+      "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.2.tgz",
+      "integrity": "sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.37.0",
+        "crelt": "^1.0.5"
+      }
+    },
+    "node_modules/@codemirror/state": {
+      "version": "6.7.4",
+      "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.4.tgz",
+      "integrity": "sha512-QhQIVRY+xHZDxwOSFrJ1eUMapJBUID3IdeAjf7dHO7zBUzSkyooHiodnalz5MG3iHzwixKMlAAyn7244y537EA==",
+      "license": "MIT",
+      "dependencies": {
+        "@marijn/find-cluster-break": "^1.0.0"
+      }
+    },
+    "node_modules/@codemirror/theme-one-dark": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz",
+      "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/language": "^6.0.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.0.0",
+        "@lezer/highlight": "^1.0.0"
+      }
+    },
+    "node_modules/@codemirror/view": {
+      "version": "6.43.11",
+      "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.11.tgz",
+      "integrity": "sha512-2+esucbQX6wB2JYi1eDvdCPFTA31BN8oSy6xCmk3G6CloV11yOvEjYk+gH7kLrP0MuHG94E8WDhjs5oMiu3+Wg==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/state": "^6.7.0",
+        "crelt": "^1.0.6",
+        "style-mod": "^4.1.0",
+        "w3c-keyname": "^2.2.4"
+      }
+    },
+    "node_modules/@convex-dev/agent": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmjs.org/@convex-dev/agent/-/agent-0.2.10.tgz",
+      "integrity": "sha512-6xVB9pUGMk7tYmcrYVR4K5eRSyJifQzMRfrsgGTE0/w0CinARJ6Kz1A3D4zjZJcQn6FZT15GgCtv8X750fXhZg==",
+      "license": "Apache-2.0",
+      "optionalDependencies": {
+        "@ungap/structured-clone": "^1.3.0"
+      },
+      "peerDependencies": {
+        "@ai-sdk/provider-utils": "^3.0.7",
+        "ai": "^5.0.29",
+        "convex": "^1.23.0",
+        "convex-helpers": "^0.1.103",
+        "react": "^18.3.1 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@convex-dev/auth": {
+      "version": "0.0.80",
+      "resolved": "https://registry.npmjs.org/@convex-dev/auth/-/auth-0.0.80.tgz",
+      "integrity": "sha512-La/cAlmSxERWW8ekJdFysMVhlkpdD7AAIaZSWCk6mIZgoZIz2uu1XbqhodNzx/8ypLu7wyOlMJqH7ZtncHYDXA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "arctic": "^1.2.0",
+        "cookie": "^1.0.1",
+        "jose": "^5.2.2",
+        "jwt-decode": "^4.0.0",
+        "lucia": "^3.2.0",
+        "oauth4webapi": "^3.1.2",
+        "oslo": "^1.1.2",
+        "path-to-regexp": "^6.3.0",
+        "server-only": "^0.0.1"
+      },
+      "bin": {
+        "auth": "dist/bin.cjs"
+      },
+      "peerDependencies": {
+        "@auth/core": "^0.37.0",
+        "convex": "^1.17.0",
+        "react": "^18.2.0 || ^19.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@convex-dev/auth/node_modules/jose": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
+      "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/@convex-dev/crons": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/@convex-dev/crons/-/crons-0.2.2.tgz",
+      "integrity": "sha512-V5kLBb0kTb2MA6uN0MgEYEgeW1mp+1oioA0tnuh8yWZcb6FToY+e67MJ5SQ98N1JjY2K0JIofAzLUYe9gEdU2A==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "cron-parser": "^4.9.0"
+      },
+      "peerDependencies": {
+        "convex": "^1.24.8"
+      }
+    },
+    "node_modules/@convex-dev/persistent-text-streaming": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/@convex-dev/persistent-text-streaming/-/persistent-text-streaming-0.2.3.tgz",
+      "integrity": "sha512-v6by8JB2lXyd+ZBH0I5TOsd98zk+tvmfPt6ofRuxC2GtNkqUpy6F7CdijRaXiGW+ozlUiQyRsBzhvhTUwVUAHg==",
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "convex": ">=1.23.0 <1.35.0",
+        "react": "~18.3.1 || ^19.0.0",
+        "react-dom": "~18.3.1 || ^19.0.0"
+      }
+    },
+    "node_modules/@convex-dev/polar": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/@convex-dev/polar/-/polar-0.6.3.tgz",
+      "integrity": "sha512-9Yhc1U/A/mKazs6XZEzbfVEte5RAHN+OWd82MzoKE+GQX+344Lk6n5xMyph/4LU6HswNjXZbI8zmZ1hNeI0C3g==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "buffer": "^6.0.3",
+        "convex-helpers": "^0.1.63",
+        "remeda": "^2.20.2",
+        "standardwebhooks": "^1.0.0"
+      },
+      "peerDependencies": {
+        "@polar-sh/checkout": ">=0.1.10",
+        "@polar-sh/sdk": ">=0.32.11",
+        "convex": "^1.25.4",
+        "react": "^18 || ^19",
+        "react-dom": "^18 || ^19"
+      }
+    },
+    "node_modules/@convex-dev/presence": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@convex-dev/presence/-/presence-0.1.2.tgz",
+      "integrity": "sha512-eK6D+MlgZswNrsuH6mJbDm7QUwz8n3ptt6FBjEuu6J2WgZYR0VyEvAgGnYtfTVOvxTzj0lShdRwjaJ9AYqeFcQ==",
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "convex": ">=1.24.8 <1.35.0",
+        "react": "~18.3.1 || ^19.0.0",
+        "react-dom": "~18.3.1 || ^19.0.0"
+      }
+    },
+    "node_modules/@convex-dev/prosemirror-sync": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/@convex-dev/prosemirror-sync/-/prosemirror-sync-0.2.6.tgz",
+      "integrity": "sha512-fCQQUesVrkyXUv6cXOOtXx/XHVZuOqZNuHGuk8+gYYIG4AOzDl6dSmZItexkeXdO2kwJQFBECmKEb4Il4mgJHw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "prosemirror-collab": "^1.3.1"
+      },
+      "peerDependencies": {
+        "@blocknote/core": ">=0.31.0 <=1.0.0",
+        "@blocknote/mantine": ">=0.31.0 <=1.0.0",
+        "@blocknote/react": ">=0.31.0 <=1.0.0",
+        "@tiptap/core": "^2.7.0 || ^3.10.7",
+        "convex": "^1.24.8",
+        "decode-named-character-reference": "^1.3.0",
+        "react": "^18.3.1 || ^19.0.0",
+        "react-dom": "^18.3.1 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@blocknote/core": {
+          "optional": true
+        },
+        "@blocknote/mantine": {
+          "optional": true
+        },
+        "@blocknote/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@convex-dev/rag": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/@convex-dev/rag/-/rag-0.5.4.tgz",
+      "integrity": "sha512-2fBKIimiXJGqNLBftv+bBmqA6E4e1eH01zAG2rnT3ZQlE1BfF/2OU4wYHrqyON2FUFHGtoHG8WIsO8Q0KVpMhg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "ai": "^5.0.0"
+      },
+      "peerDependencies": {
+        "@convex-dev/workpool": "^0.2.14",
+        "convex": "^1.24.8",
+        "convex-helpers": "^0.1.94"
+      }
+    },
+    "node_modules/@convex-dev/twilio": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/@convex-dev/twilio/-/twilio-0.1.7.tgz",
+      "integrity": "sha512-wQlHlsVpXey68vGq6J5pk6WHMPP0IWRuRGaVYQF62IQa1y7w37cmks/1RS5335rn5gOc4PnQv7lmHW+pgSg2Zg==",
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "convex": "~1.16.5 || >=1.17.0 <1.35.0"
+      }
+    },
+    "node_modules/@convex-dev/workflow": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/@convex-dev/workflow/-/workflow-0.2.7.tgz",
+      "integrity": "sha512-BUVJBKSMEuHNztFBlcmCdlsRwdPqLn2iv72teTrHlkMVKvQj1EhBIflT7asjWBrVy3JUgWiVdUbl58xv5+kXSQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "async-channel": "^0.2.0"
+      },
+      "peerDependencies": {
+        "@convex-dev/workpool": "^0.2.18",
+        "convex": ">=1.25.0 <1.35.0",
+        "convex-helpers": "^0.1.99"
+      }
+    },
+    "node_modules/@convex-dev/workpool": {
+      "version": "0.2.18",
+      "resolved": "https://registry.npmjs.org/@convex-dev/workpool/-/workpool-0.2.18.tgz",
+      "integrity": "sha512-tfRfBCukaRiybxwy4/W3rLWpIRhPivFH9tC5++d0XE1sV627vw2mAwOM9SnpY1k+BWVoNrHrHrxBheklSbuAag==",
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "convex": ">=1.25.0 <1.35.0",
+        "convex-helpers": "^0.1.94"
+      }
+    },
+    "node_modules/@csstools/color-helpers": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+      "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT-0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@csstools/css-calc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+      "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4"
+      }
+    },
+    "node_modules/@csstools/css-color-parser": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+      "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "@csstools/color-helpers": "^5.1.0",
+        "@csstools/css-calc": "^2.1.4"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4"
+      }
+    },
+    "node_modules/@csstools/css-parser-algorithms": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+      "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@csstools/css-tokenizer": "^3.0.4"
+      }
+    },
+    "node_modules/@csstools/css-tokenizer": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+      "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@derhuerst/http-basic": {
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.4.tgz",
+      "integrity": "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "caseless": "^0.12.0",
+        "concat-stream": "^2.0.0",
+        "http-response-object": "^3.0.1",
+        "parse-cache-control": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@dnd-kit/accessibility": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
+      "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0"
+      }
+    },
+    "node_modules/@dnd-kit/core": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
+      "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@dnd-kit/accessibility": "^3.1.1",
+        "@dnd-kit/utilities": "^3.2.2",
+        "tslib": "^2.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@dnd-kit/modifiers": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz",
+      "integrity": "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==",
+      "license": "MIT",
+      "dependencies": {
+        "@dnd-kit/utilities": "^3.2.2",
+        "tslib": "^2.0.0"
+      },
+      "peerDependencies": {
+        "@dnd-kit/core": "^6.3.0",
+        "react": ">=16.8.0"
+      }
+    },
+    "node_modules/@dnd-kit/sortable": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz",
+      "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==",
+      "license": "MIT",
+      "dependencies": {
+        "@dnd-kit/utilities": "^3.2.2",
+        "tslib": "^2.0.0"
+      },
+      "peerDependencies": {
+        "@dnd-kit/core": "^6.3.0",
+        "react": ">=16.8.0"
+      }
+    },
+    "node_modules/@dnd-kit/utilities": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
+      "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0"
+      }
+    },
+    "node_modules/@edge-runtime/format": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz",
+      "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@edge-runtime/node-utils": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz",
+      "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@edge-runtime/ponyfill": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz",
+      "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@edge-runtime/primitives": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-6.0.0.tgz",
+      "integrity": "sha512-FqoxaBT+prPBHBwE1WXS1ocnu/VLTQyZ6NMUBAdbP7N2hsFTTxMC/jMu2D/8GAlMQfxeuppcPuCUk/HO3fpIvA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@edge-runtime/vm": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-5.0.0.tgz",
+      "integrity": "sha512-NKBGBSIKUG584qrS1tyxVpX/AKJKQw5HgjYEnPLC0QsTw79JrGn+qUr8CXFb955Iy7GUdiiUv1rJ6JBGvaKb6w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@edge-runtime/primitives": "6.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@emnapi/core": {
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz",
+      "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/wasi-threads": "1.2.3",
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/runtime": {
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
+      "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/wasi-threads": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz",
+      "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emoji-mart/data": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz",
+      "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==",
+      "license": "MIT"
+    },
+    "node_modules/@epic-web/invariant": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz",
+      "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@erquhart/convex-oss-stats": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/@erquhart/convex-oss-stats/-/convex-oss-stats-0.8.2.tgz",
+      "integrity": "sha512-9Vl5DL++xrE4FVWoQ01++gqflDg4RqmyeJgI8/iOrHGZcrj2ffMMWws/ICtGF1fATCG2mod85j0y2Dj7YhEPew==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@octokit/graphql": "^8.1.1",
+        "@octokit/graphql-schema": "^15.25.0",
+        "cheerio": "^1.0.0",
+        "convex-helpers": "^0.1.67",
+        "date-fns": "^4.1.0",
+        "framer-motion": "^11.11.17",
+        "nano": "^10.1.4",
+        "npm-api": "^1.0.1",
+        "octokit": "^4.0.2",
+        "p-limit": "^6.1.0",
+        "remeda": "^2.17.3"
+      },
+      "peerDependencies": {
+        "convex": "^1.29.0",
+        "react": "^18 || ^19",
+        "react-dom": "^18 || ^19"
+      }
+    },
+    "node_modules/@erquhart/convex-oss-stats/node_modules/framer-motion": {
+      "version": "11.18.2",
+      "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz",
+      "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==",
+      "license": "MIT",
+      "dependencies": {
+        "motion-dom": "^11.18.1",
+        "motion-utils": "^11.18.1",
+        "tslib": "^2.4.0"
+      },
+      "peerDependencies": {
+        "@emotion/is-prop-valid": "*",
+        "react": "^18.0.0 || ^19.0.0",
+        "react-dom": "^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@emotion/is-prop-valid": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@erquhart/convex-oss-stats/node_modules/motion-dom": {
+      "version": "11.18.1",
+      "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz",
+      "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==",
+      "license": "MIT",
+      "dependencies": {
+        "motion-utils": "^11.18.1"
+      }
+    },
+    "node_modules/@erquhart/convex-oss-stats/node_modules/motion-utils": {
+      "version": "11.18.1",
+      "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz",
+      "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==",
+      "license": "MIT"
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
+      "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
+      "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
+      "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
+      "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
+      "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
+      "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
+      "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
+      "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
+      "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
+      "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
+      "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
+      "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
+      "cpu": [
+        "loong64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
+      "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
+      "cpu": [
+        "mips64el"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
+      "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
+      "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
+      "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
+      "cpu": [
+        "s390x"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
+      "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
+      "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
+      "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
+      "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
+      "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
+      "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
+      "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
+      "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
+      "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
+      "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
+      "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.4.3"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+      "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/config-array": {
+      "version": "0.21.2",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+      "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/object-schema": "^2.1.7",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.5"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+      "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.17.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/core": {
+      "version": "0.17.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+      "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz",
+      "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.14.0",
+        "debug": "^4.3.2",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.3.2",
+        "minimatch": "^3.1.5",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/ajv": {
+      "version": "6.15.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+      "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/globals": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@eslint/js": {
+      "version": "9.39.5",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz",
+      "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      }
+    },
+    "node_modules/@eslint/object-schema": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+      "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/plugin-kit": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+      "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.17.0",
+        "levn": "^0.4.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@fastify/busboy": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+      "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
+      "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.12"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
+      "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.8.0",
+        "@floating-ui/utils": "^0.2.12"
+      }
+    },
+    "node_modules/@floating-ui/react": {
+      "version": "0.27.20",
+      "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz",
+      "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/react-dom": "^2.1.9",
+        "@floating-ui/utils": "^0.2.12",
+        "tabbable": "^6.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=17.0.0",
+        "react-dom": ">=17.0.0"
+      }
+    },
+    "node_modules/@floating-ui/react-dom": {
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz",
+      "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/dom": "^1.8.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.12",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
+      "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
+      "license": "MIT"
+    },
+    "node_modules/@google-cloud/local-auth": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@google-cloud/local-auth/-/local-auth-3.0.1.tgz",
+      "integrity": "sha512-YJ3GFbksfHyEarbVHPSCzhKpjbnlAhdzg2SEf79l6ODukrSM1qUOqfopY232Xkw26huKSndyzmJz+A6b2WYn7Q==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "arrify": "^2.0.1",
+        "google-auth-library": "^9.0.0",
+        "open": "^7.0.3",
+        "server-destroy": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@google-cloud/local-auth/node_modules/open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@google/genai": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz",
+      "integrity": "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==",
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "google-auth-library": "^10.3.0",
+        "p-retry": "^4.6.2",
+        "protobufjs": "^7.5.4",
+        "ws": "^8.18.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "@modelcontextprotocol/sdk": "^1.25.2"
+      },
+      "peerDependenciesMeta": {
+        "@modelcontextprotocol/sdk": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@google/genai/node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/@google/genai/node_modules/gaxios": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.1.tgz",
+      "integrity": "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "extend": "^3.0.2",
+        "https-proxy-agent": "^7.0.1",
+        "node-fetch": "^3.3.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@google/genai/node_modules/gcp-metadata": {
+      "version": "8.1.2",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
+      "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "gaxios": "^7.0.0",
+        "google-logging-utils": "^1.0.0",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@google/genai/node_modules/google-auth-library": {
+      "version": "10.9.1",
+      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.1.tgz",
+      "integrity": "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "base64-js": "^1.3.0",
+        "ecdsa-sig-formatter": "^1.0.11",
+        "gaxios": "^7.1.4",
+        "gcp-metadata": "8.1.2",
+        "google-logging-utils": "1.1.3",
+        "jws": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@google/genai/node_modules/google-logging-utils": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+      "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@google/genai/node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "license": "MIT",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
+    },
+    "node_modules/@google/generative-ai": {
+      "version": "0.24.1",
+      "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz",
+      "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@handlewithcare/prosemirror-inputrules": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/@handlewithcare/prosemirror-inputrules/-/prosemirror-inputrules-0.1.4.tgz",
+      "integrity": "sha512-GMqlBeG2MKM+tXEFd2N+wIv5z4VvJTg8JtfJUrdjvFq2W6v+AW8oTgiWyFw8L3iEQwvtQcVJxU873iB0LXUNNw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-history": "^1.4.1",
+        "prosemirror-transform": "^1.0.0"
+      },
+      "peerDependencies": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-view": "^1.0.0"
+      }
+    },
+    "node_modules/@hono/node-server": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.1.tgz",
+      "integrity": "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=20"
+      },
+      "peerDependencies": {
+        "hono": "^4"
+      }
+    },
+    "node_modules/@humanfs/core": {
+      "version": "0.19.2",
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+      "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanfs/types": "^0.15.0"
+      },
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanfs/node": {
+      "version": "0.16.8",
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+      "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanfs/core": "^0.19.2",
+        "@humanfs/types": "^0.15.0",
+        "@humanwhocodes/retry": "^0.4.0"
+      },
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanfs/types": {
+      "version": "0.15.0",
+      "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+      "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/retry": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@iconify/types": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+      "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+      "license": "MIT"
+    },
+    "node_modules/@iconify/utils": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.7.tgz",
+      "integrity": "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==",
+      "license": "MIT",
+      "dependencies": {
+        "@antfu/install-pkg": "^2.0.1",
+        "@iconify/types": "^2.0.0",
+        "import-meta-resolve": "^4.2.0"
+      }
+    },
+    "node_modules/@img/colour": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+      "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@img/sharp-darwin-arm64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz",
+      "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-arm64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-darwin-x64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz",
+      "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-x64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-freebsd-wasm32": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz",
+      "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "dependencies": {
+        "@img/sharp-wasm32": "0.35.4"
+      },
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-darwin-arm64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz",
+      "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-darwin-x64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz",
+      "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-arm": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz",
+      "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-arm64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz",
+      "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-ppc64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz",
+      "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-riscv64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz",
+      "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-s390x": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz",
+      "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-x64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz",
+      "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz",
+      "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz",
+      "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-linux-arm": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz",
+      "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-arm64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz",
+      "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-ppc64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz",
+      "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-ppc64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-riscv64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz",
+      "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-riscv64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-s390x": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz",
+      "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-s390x": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-x64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz",
+      "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-x64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linuxmusl-arm64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz",
+      "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-arm64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-linuxmusl-x64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz",
+      "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-x64": "1.3.3"
+      }
+    },
+    "node_modules/@img/sharp-wasm32": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz",
+      "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==",
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/runtime": "^1.11.3"
+      },
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-webcontainers-wasm32": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz",
+      "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==",
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "dependencies": {
+        "@img/sharp-wasm32": "0.35.4"
+      },
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-win32-arm64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz",
+      "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-win32-ia32": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz",
+      "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-win32-x64": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz",
+      "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@ionic/cli-framework-output": {
+      "version": "2.2.8",
+      "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz",
+      "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/utils-terminal": "2.3.5",
+        "debug": "^4.0.0",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-array": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz",
+      "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.0.0",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-fs": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz",
+      "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/fs-extra": "^8.0.0",
+        "debug": "^4.0.0",
+        "fs-extra": "^9.0.0",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-fs/node_modules/fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@ionic/utils-object": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz",
+      "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.0.0",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-process": {
+      "version": "2.1.12",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz",
+      "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/utils-object": "2.1.6",
+        "@ionic/utils-terminal": "2.3.5",
+        "debug": "^4.0.0",
+        "signal-exit": "^3.0.3",
+        "tree-kill": "^1.2.2",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-stream": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz",
+      "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.0.0",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-subprocess": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz",
+      "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/utils-array": "2.1.6",
+        "@ionic/utils-fs": "3.1.7",
+        "@ionic/utils-process": "2.1.12",
+        "@ionic/utils-stream": "3.1.7",
+        "@ionic/utils-terminal": "2.3.5",
+        "cross-spawn": "^7.0.3",
+        "debug": "^4.0.0",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-terminal": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz",
+      "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/slice-ansi": "^4.0.0",
+        "debug": "^4.0.0",
+        "signal-exit": "^3.0.3",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "tslib": "^2.0.1",
+        "untildify": "^4.0.0",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@ionic/utils-terminal/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "license": "ISC",
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+      "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "license": "MIT"
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "license": "MIT",
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/fs-minipass": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^7.0.4"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz",
+      "integrity": "sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "glob": "^10.0.0",
+        "magic-string": "^0.30.0",
+        "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"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.13",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+      "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/remapping": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.11",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+      "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+      "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.31",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+      "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@langchain/core": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.2.9.tgz",
+      "integrity": "sha512-conzSEj9Zu1AyXJLXsSbgrtxtxinmI1yGqQ5CIJZSoV5rvv+yvQE/vgBnoySpBQ/bl3YPgj2FL/gbDjWykLSfg==",
+      "license": "MIT",
+      "dependencies": {
+        "@cfworker/json-schema": "^4.0.2",
+        "@standard-schema/spec": "^1.1.0",
+        "js-tiktoken": "^1.0.12",
+        "langsmith": ">=0.5.0 <1.0.0",
+        "mustache": "^4.2.0",
+        "p-queue": "^6.6.2",
+        "zod": "^3.25.76 || ^4"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@langchain/langgraph": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.4.14.tgz",
+      "integrity": "sha512-uWAdRYTllfKCnTrlyovExPJCHJwcf3Wl2LzUlnaqsT7Rmoo3aCeYtq/7MV/Pw4q11motG8pR8bjr6T6V8Pe1gQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@langchain/langgraph-checkpoint": "^1.1.5",
+        "@langchain/langgraph-sdk": "~1.10.2",
+        "@langchain/protocol": "^0.0.19",
+        "@standard-schema/spec": "1.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@langchain/core": "^1.1.48",
+        "zod": "^3.25.32 || ^4.2.0"
+      }
+    },
+    "node_modules/@langchain/langgraph-checkpoint": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.1.5.tgz",
+      "integrity": "sha512-BwDwl5VeTOh6CVuiIPgsUgfK51vTJDMSbFcSCUfjJWsl8/DPdK/mbv+ejxJstkSk/BlSPMP4JfXWcN6jD2ea2Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@langchain/core": "^1.1.48"
+      }
+    },
+    "node_modules/@langchain/langgraph-sdk": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.10.2.tgz",
+      "integrity": "sha512-86qsfdBZWu1ZgywLN8AThU/jXi9rjPDZPWcTJp4SA1A/L62ypTNoSXbvtiwZt1odokXccYTxK1XWS8tmVdvEmw==",
+      "license": "MIT",
+      "dependencies": {
+        "@langchain/protocol": "^0.0.19",
+        "@types/json-schema": "^7.0.15",
+        "p-queue": "^9.0.1",
+        "p-retry": "^7.1.1"
+      },
+      "peerDependencies": {
+        "@langchain/core": "^1.1.48",
+        "react": "^18 || ^19",
+        "react-dom": "^18 || ^19"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+      "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+      "license": "MIT"
+    },
+    "node_modules/@langchain/langgraph-sdk/node_modules/p-queue": {
+      "version": "9.3.3",
+      "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz",
+      "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==",
+      "license": "MIT",
+      "dependencies": {
+        "eventemitter3": "^5.0.4",
+        "p-timeout": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@langchain/langgraph-sdk/node_modules/p-retry": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz",
+      "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==",
+      "license": "MIT",
+      "dependencies": {
+        "is-network-error": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz",
+      "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@langchain/protocol": {
+      "version": "0.0.19",
+      "resolved": "https://registry.npmjs.org/@langchain/protocol/-/protocol-0.0.19.tgz",
+      "integrity": "sha512-9hKcRrH7cBX6gfutdfXPoft1OCchHe4FEpALoDJMl5Qu+n/YG5ynZmyu8+8cxORlPwHBoKTxggvXz+76M1yX1Q==",
+      "license": "MIT"
+    },
+    "node_modules/@lexical/clipboard": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.43.0.tgz",
+      "integrity": "sha512-3dWDusVyM9EosBt4/n/ERyPIGOyuWuECj9zbvJdzGUdvu/VsqCdlyDsU5M7NxTUNQn2Fhkdj2o00UeB6bagX5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/html": "0.43.0",
+        "@lexical/list": "0.43.0",
+        "@lexical/selection": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/code": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.43.0.tgz",
+      "integrity": "sha512-DwkEC6M0N5+WwSbg47BGIua8mPgPG6W/mmKh3UmH44hHoVBvfF89fdBicauaf1VBs9UIWkIBrhc8fGSu4xqQRg==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/code-core": "0.43.0",
+        "@lexical/code-prism": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/code-core": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/code-core/-/code-core-0.43.0.tgz",
+      "integrity": "sha512-8NtEOI4+hM688Pmd0Qh/aTCS5uovps902V53LGB15DUUwwL+Z5U+Hz7ZYozhyM6W755FQ3x15qtEGIIbDHE5bQ==",
+      "license": "MIT",
+      "dependencies": {
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/code-prism": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/code-prism/-/code-prism-0.43.0.tgz",
+      "integrity": "sha512-e8jMqJc5xAOqhim3KQ5IJ3Dhei0MIQSUUGb1Spcu8LaTkpUtWhPEalCa3jqATRJN93t2CitW1CAqO0IOX1OgXQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/code-core": "0.43.0",
+        "lexical": "0.43.0",
+        "prismjs": "^1.30.0"
+      }
+    },
+    "node_modules/@lexical/devtools-core": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.43.0.tgz",
+      "integrity": "sha512-Hyz8vxvmo0aThXjq3+t0mabozmQeb6U+pxKceAgBSxE9oLWbQmP7RW8jYPZW20bYqEcX1Kgmu+CdW8e3eSF7Kw==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/html": "0.43.0",
+        "@lexical/link": "0.43.0",
+        "@lexical/mark": "0.43.0",
+        "@lexical/table": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      },
+      "peerDependencies": {
+        "react": ">=17.x",
+        "react-dom": ">=17.x"
+      }
+    },
+    "node_modules/@lexical/dragon": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.43.0.tgz",
+      "integrity": "sha512-wB2s8uO9DFwS5err1wM+7Yoz3cixtEXy1ZiU8RoJJ7tmjSEmQsLIflAQq8Lic291tCNPs+lSHKjdw+52vi0Z7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/extension": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/extension": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/extension/-/extension-0.43.0.tgz",
+      "integrity": "sha512-hCFj//3RhsPrCmx8VRTTLIsWtC2n5GG03ZDdyrgmeLzXNuknwDqhzaGAfQi9LSYn+NU+j3yCUROu8pZqaedtvw==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/utils": "0.43.0",
+        "@preact/signals-core": "^1.14.1",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/hashtag": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.43.0.tgz",
+      "integrity": "sha512-oCKjY8/jkxJuu8iBnNX0WSLA6ZIYTn+v3NLpJxDqnAFZJCnJ2i/nM8GKzPMzHCDzJVNxbQB08fOptdXf8eN0Fg==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/text": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/history": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.43.0.tgz",
+      "integrity": "sha512-SdrH3xgtUcolVRLihbQwiANQIiwSLdkKBon9oSsZNNnzVgEb7DUQUtJQGf33oW8HHWObIuWkh72W0fN1dZixOw==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/extension": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/html": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.43.0.tgz",
+      "integrity": "sha512-C6LpUQlRl9J8Hqpm/C8LCX1ZxFHyD/gvOdV+NuNGnXN06uo0jDDm9SNh/HI3VWvFu9ec4OuzUkQRCafW8WC8fQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/selection": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/link": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.43.0.tgz",
+      "integrity": "sha512-jjU9PVWWBA2yEssbVkLQpu1ZIpXi3JwYb+JO20R47hzUm7T8SAPDd/VwU+2tcjqz065YntSGIaQ79dCft7WOJw==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/extension": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/list": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.43.0.tgz",
+      "integrity": "sha512-WyYVeQa2x1LrI8Emr9AiWTjSMiZw77Zy7MRnohPTdX/4fu3Njfw61lpoonCNHlv/r5Mb/RHkIAwWjtjcSzwA+g==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/extension": "0.43.0",
+        "@lexical/selection": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/mark": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.43.0.tgz",
+      "integrity": "sha512-pgwR5ia2ECDS0pyQxIrFvMOKjffI6fo2cGwqYg+Jz+ANMqE5zD4PoOUs7FEuZYAKPOAQR9GrETB7YAVSzKjk3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/markdown": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.43.0.tgz",
+      "integrity": "sha512-bJYhISQkdRo6XxcajgP9T+c8XAGfkJ/DHnSvM5nyJnHD0vZSH/2RZd2Lgt0eAnMVEt9ECG8cUkR557QSaPeJBA==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/code-core": "0.43.0",
+        "@lexical/link": "0.43.0",
+        "@lexical/list": "0.43.0",
+        "@lexical/rich-text": "0.43.0",
+        "@lexical/text": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/offset": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.43.0.tgz",
+      "integrity": "sha512-SYNF16Hk17ePaxFtPcBx3rzSM8yxDYSAzkSOdnUUePSzfTW3DUDzvUfe7q/7QCe/UlZd+4ULI0VjNgYRlR8Uiw==",
+      "license": "MIT",
+      "dependencies": {
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/overflow": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.43.0.tgz",
+      "integrity": "sha512-Usm7UfIwydhsg+qMbkBav79AOKqYa32zXY+TXveTqbaA+IAoIl3vFYP9x9ie4cHz/kgrmt/QuQs66cwPefRakg==",
+      "license": "MIT",
+      "dependencies": {
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/plain-text": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.43.0.tgz",
+      "integrity": "sha512-wza2z2+OSsq3UPsFseqsVvnAWvW9s3W/rjQuf6Bk2/Xde2F3R7fvu3kArsaaVPzUKTVeOPCD8hUKIUpxP5OT2g==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/clipboard": "0.43.0",
+        "@lexical/dragon": "0.43.0",
+        "@lexical/selection": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/react": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.43.0.tgz",
+      "integrity": "sha512-Ov9PCS7Ghm83fmjSDr6CafDLsuMhf7A7FFfEr4DmDM/6Lw2w0a0QQJP+KqxPqaVaRgeQMJAVg38Zgrvuk3v7tw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/react": "^0.27.16",
+        "@lexical/devtools-core": "0.43.0",
+        "@lexical/dragon": "0.43.0",
+        "@lexical/extension": "0.43.0",
+        "@lexical/hashtag": "0.43.0",
+        "@lexical/history": "0.43.0",
+        "@lexical/link": "0.43.0",
+        "@lexical/list": "0.43.0",
+        "@lexical/mark": "0.43.0",
+        "@lexical/markdown": "0.43.0",
+        "@lexical/overflow": "0.43.0",
+        "@lexical/plain-text": "0.43.0",
+        "@lexical/rich-text": "0.43.0",
+        "@lexical/table": "0.43.0",
+        "@lexical/text": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "@lexical/yjs": "0.43.0",
+        "lexical": "0.43.0",
+        "react-error-boundary": "^6.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=17.x",
+        "react-dom": ">=17.x"
+      }
+    },
+    "node_modules/@lexical/rich-text": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.43.0.tgz",
+      "integrity": "sha512-y6uhY5X+PBLg8LSCDazSMAkUfA1RwBW6DFOuUKW5SI1DaB/oc/vpQhkR1DYGqXnytMx7hfiK+7lL51ZC0ydeWg==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/clipboard": "0.43.0",
+        "@lexical/dragon": "0.43.0",
+        "@lexical/selection": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/selection": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.43.0.tgz",
+      "integrity": "sha512-sdKdXIFggtHxTctvXjTyx2RgWuKOOP3PhrzRJF+COGfckrr/YzDtQCOfyvktElyKEeYXa3t9sx/R6Ep3n074fA==",
+      "license": "MIT",
+      "dependencies": {
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/table": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.43.0.tgz",
+      "integrity": "sha512-oLrOBzRwpmdHDpGVRgwBVgO1ro0w50rMdtOVQ6KsL53ijZ6OiI1YE2ZNOy4qfJvjub+2dgp83gKpB7YcmXAP3w==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/clipboard": "0.43.0",
+        "@lexical/extension": "0.43.0",
+        "@lexical/utils": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/text": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.43.0.tgz",
+      "integrity": "sha512-dtUZ79WaAv3nEYBIWPBZIrjwCUPONN8HcgtReY3qku7WQkzqy3FaMwT/lBa92cUhqsn4ChLIBO3lPFhWRALyvg==",
+      "license": "MIT",
+      "dependencies": {
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/utils": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.43.0.tgz",
+      "integrity": "sha512-Y9wzFwoeI9KLDJsztTz45Aobp6sACHSRqUtyjxpCsU0jwL60Tt9rD71QVz7SvpmzxjtnBb040s6LHa6vP0gY+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/selection": "0.43.0",
+        "lexical": "0.43.0"
+      }
+    },
+    "node_modules/@lexical/yjs": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.43.0.tgz",
+      "integrity": "sha512-3ghY9BYZVo3Hg2TmY2+H3Q6+AhhGwNIhnr6mvCbdLBEsnSTXr4VZSPMXN2ae5phCPrI19eHrx4MvFNYodQcqrA==",
+      "license": "MIT",
+      "dependencies": {
+        "@lexical/offset": "0.43.0",
+        "@lexical/selection": "0.43.0",
+        "lexical": "0.43.0"
+      },
+      "peerDependencies": {
+        "yjs": ">=13.5.22"
+      }
+    },
+    "node_modules/@lezer/common": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz",
+      "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==",
+      "license": "MIT"
+    },
+    "node_modules/@lezer/css": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz",
+      "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==",
+      "license": "MIT",
+      "dependencies": {
+        "@lezer/common": "^1.2.0",
+        "@lezer/highlight": "^1.0.0",
+        "@lezer/lr": "^1.3.0"
+      }
+    },
+    "node_modules/@lezer/highlight": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz",
+      "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==",
+      "license": "MIT",
+      "dependencies": {
+        "@lezer/common": "^1.3.0"
+      }
+    },
+    "node_modules/@lezer/html": {
+      "version": "1.3.13",
+      "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz",
+      "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==",
+      "license": "MIT",
+      "dependencies": {
+        "@lezer/common": "^1.2.0",
+        "@lezer/highlight": "^1.0.0",
+        "@lezer/lr": "^1.0.0"
+      }
+    },
+    "node_modules/@lezer/javascript": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz",
+      "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==",
+      "license": "MIT",
+      "dependencies": {
+        "@lezer/common": "^1.2.0",
+        "@lezer/highlight": "^1.1.3",
+        "@lezer/lr": "^1.3.0"
+      }
+    },
+    "node_modules/@lezer/lr": {
+      "version": "1.4.10",
+      "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz",
+      "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==",
+      "license": "MIT",
+      "dependencies": {
+        "@lezer/common": "^1.0.0"
+      }
+    },
+    "node_modules/@lezer/markdown": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.2.tgz",
+      "integrity": "sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@lezer/common": "^1.5.0",
+        "@lezer/highlight": "^1.0.0"
+      }
+    },
+    "node_modules/@mantine/core": {
+      "version": "8.3.18",
+      "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.18.tgz",
+      "integrity": "sha512-9tph1lTVogKPjTx02eUxDUOdXacPzK62UuSqb4TdGliI54/Xgxftq0Dfqu6XuhCxn9J5MDJaNiLDvL/1KRkYqA==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/react": "^0.27.16",
+        "clsx": "^2.1.1",
+        "react-number-format": "^5.4.4",
+        "react-remove-scroll": "^2.7.1",
+        "react-textarea-autosize": "8.5.9",
+        "type-fest": "^4.41.0"
+      },
+      "peerDependencies": {
+        "@mantine/hooks": "8.3.18",
+        "react": "^18.x || ^19.x",
+        "react-dom": "^18.x || ^19.x"
+      }
+    },
+    "node_modules/@mantine/hooks": {
+      "version": "8.3.18",
+      "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.18.tgz",
+      "integrity": "sha512-QoWr9+S8gg5050TQ06aTSxtlpGjYOpIllRbjYYXlRvZeTsUqiTbVfvQROLexu4rEaK+yy9Wwriwl9PMRgbLqPw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^18.x || ^19.x"
+      }
+    },
+    "node_modules/@mapbox/node-pre-gyp": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz",
+      "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "consola": "^3.2.3",
+        "detect-libc": "^2.0.0",
+        "https-proxy-agent": "^7.0.5",
+        "node-fetch": "^2.6.7",
+        "nopt": "^8.0.0",
+        "semver": "^7.5.3",
+        "tar": "^7.4.0"
+      },
+      "bin": {
+        "node-pre-gyp": "bin/node-pre-gyp"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@marijn/find-cluster-break": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz",
+      "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==",
+      "license": "MIT"
+    },
+    "node_modules/@mariozechner/pi-agent-core": {
+      "version": "0.70.6",
+      "resolved": "https://registry.npmjs.org/@mariozechner/pi-agent-core/-/pi-agent-core-0.70.6.tgz",
+      "integrity": "sha512-PovJZJqhY4ajgTJRUcLzfWKnlQuJHxHW3T030CafR9LYeLmOHi/HGS8DbCdRgSJNbnoIG+kl67/7++9DKZ2+sg==",
+      "deprecated": "please use @earendil-works/pi-agent-core instead going forward",
+      "license": "MIT",
+      "dependencies": {
+        "@mariozechner/pi-ai": "^0.70.6",
+        "typebox": "^1.1.24"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@mariozechner/pi-ai": {
+      "version": "0.70.6",
+      "resolved": "https://registry.npmjs.org/@mariozechner/pi-ai/-/pi-ai-0.70.6.tgz",
+      "integrity": "sha512-LVAadu0Y+hb7Bj7EDiLsx6AuGxHlxDq0euLzyqX698i9qt0BW6a+oQSUIZQz4rJwExF18OvyL7ygJ5781ojrIQ==",
+      "deprecated": "please use @earendil-works/pi-ai instead going forward",
+      "license": "MIT",
+      "dependencies": {
+        "@anthropic-ai/sdk": "^0.90.0",
+        "@aws-sdk/client-bedrock-runtime": "^3.1030.0",
+        "@google/genai": "^1.40.0",
+        "@mistralai/mistralai": "^2.2.0",
+        "chalk": "^5.6.2",
+        "openai": "6.26.0",
+        "partial-json": "^0.1.7",
+        "proxy-agent": "^6.5.0",
+        "typebox": "^1.1.24",
+        "undici": "^7.19.1",
+        "zod-to-json-schema": "^3.24.6"
+      },
+      "bin": {
+        "pi-ai": "dist/cli.js"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@mariozechner/pi-ai/node_modules/openai": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/openai/-/openai-6.26.0.tgz",
+      "integrity": "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==",
+      "license": "Apache-2.0",
+      "bin": {
+        "openai": "bin/cli"
+      },
+      "peerDependencies": {
+        "ws": "^8.18.0",
+        "zod": "^3.25 || ^4.0"
+      },
+      "peerDependenciesMeta": {
+        "ws": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mariozechner/pi-ai/node_modules/undici": {
+      "version": "7.29.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz",
+      "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.18.1"
+      }
+    },
+    "node_modules/@mdx-js/react": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
+      "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdx": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16",
+        "react": ">=16"
+      }
+    },
+    "node_modules/@mediabunny/aac-encoder": {
+      "version": "1.50.3",
+      "resolved": "https://registry.npmjs.org/@mediabunny/aac-encoder/-/aac-encoder-1.50.3.tgz",
+      "integrity": "sha512-rVPnhJbn+7BUsu09sEl/bee/DkzmAc33oErJ250RPlCqrPndx61DSb2GLvVmmSx6L2LU2WyCnvJIMUrGPJEXPA==",
+      "license": "MPL-2.0",
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/Vanilagy"
+      },
+      "peerDependencies": {
+        "mediabunny": "^1.0.0"
+      }
+    },
+    "node_modules/@mediabunny/flac-encoder": {
+      "version": "1.50.3",
+      "resolved": "https://registry.npmjs.org/@mediabunny/flac-encoder/-/flac-encoder-1.50.3.tgz",
+      "integrity": "sha512-aIEHE3eQ+hG35rRvtNNYO6ufTiGkZpzgOBjcqK8CQuRAMtUY9/DzV12jj52L0nSj2zmBKXQQ6dWBWsusigV/dQ==",
+      "license": "MPL-2.0",
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/Vanilagy"
+      },
+      "peerDependencies": {
+        "mediabunny": "^1.0.0"
+      }
+    },
+    "node_modules/@mediabunny/mp3-encoder": {
+      "version": "1.50.3",
+      "resolved": "https://registry.npmjs.org/@mediabunny/mp3-encoder/-/mp3-encoder-1.50.3.tgz",
+      "integrity": "sha512-dyjWOhG27+ctlejfjY4vFy0g8wzo0NCRTNQ/GNsCaHxWkduaq0GI2BWKXm6UFCsfnUKgtDWMEu4zOPl9fKpbsA==",
+      "license": "MPL-2.0",
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/Vanilagy"
+      },
+      "peerDependencies": {
+        "mediabunny": "^1.0.0"
+      }
+    },
+    "node_modules/@mermaid-js/parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.1.tgz",
+      "integrity": "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==",
+      "license": "MIT",
+      "dependencies": {
+        "@chevrotain/types": "~11.1.2"
+      }
+    },
+    "node_modules/@mistralai/mistralai": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.6.4.tgz",
+      "integrity": "sha512-PPt4GyJqs2hEsWrYCJZK5f0ORmT+L2MSm75LVGD7kBLf6ZKsoDpld/FRBQXr8xG6iFCBOFJFYzvGYhUb+UCkbw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@opentelemetry/semantic-conventions": "^1.40.0",
+        "ws": "^8.18.0",
+        "zod": "^3.25.0 || ^4.0.0",
+        "zod-to-json-schema": "^3.25.0"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.9.0",
+        "@opentelemetry/exporter-trace-otlp-http": "^0.220.0",
+        "@opentelemetry/resources": "^2.9.0",
+        "@opentelemetry/sdk-trace-base": "^2.9.0"
+      },
+      "peerDependenciesMeta": {
+        "@opentelemetry/api": {
+          "optional": true
+        },
+        "@opentelemetry/exporter-trace-otlp-http": {
+          "optional": true
+        },
+        "@opentelemetry/resources": {
+          "optional": true
+        },
+        "@opentelemetry/sdk-trace-base": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@modelcontextprotocol/sdk": {
+      "version": "1.30.0",
+      "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz",
+      "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==",
+      "license": "MIT",
+      "dependencies": {
+        "@hono/node-server": "^1.19.9 || ^2.0.5",
+        "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"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@cfworker/json-schema": "^4.1.1",
+        "zod": "^3.25 || ^4.0"
+      },
+      "peerDependenciesMeta": {
+        "@cfworker/json-schema": {
+          "optional": true
+        },
+        "zod": {
+          "optional": false
+        }
+      }
+    },
+    "node_modules/@module-federation/error-codes": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz",
+      "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==",
+      "license": "MIT"
+    },
+    "node_modules/@module-federation/runtime": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz",
+      "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==",
+      "license": "MIT",
+      "dependencies": {
+        "@module-federation/error-codes": "0.22.0",
+        "@module-federation/runtime-core": "0.22.0",
+        "@module-federation/sdk": "0.22.0"
+      }
+    },
+    "node_modules/@module-federation/runtime-core": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz",
+      "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==",
+      "license": "MIT",
+      "dependencies": {
+        "@module-federation/error-codes": "0.22.0",
+        "@module-federation/sdk": "0.22.0"
+      }
+    },
+    "node_modules/@module-federation/runtime-tools": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz",
+      "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==",
+      "license": "MIT",
+      "dependencies": {
+        "@module-federation/runtime": "0.22.0",
+        "@module-federation/webpack-bundler-runtime": "0.22.0"
+      }
+    },
+    "node_modules/@module-federation/sdk": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz",
+      "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==",
+      "license": "MIT"
+    },
+    "node_modules/@module-federation/webpack-bundler-runtime": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz",
+      "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==",
+      "license": "MIT",
+      "dependencies": {
+        "@module-federation/runtime": "0.22.0",
+        "@module-federation/sdk": "0.22.0"
+      }
+    },
+    "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+      "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^22.20 || ^24.12 || >=25"
+      }
+    },
+    "node_modules/@napi-rs/wasm-runtime": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
+      "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.5.0",
+        "@emnapi/runtime": "^1.5.0",
+        "@tybys/wasm-util": "^0.10.1"
+      }
+    },
+    "node_modules/@neoconfetti/react": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz",
+      "integrity": "sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@node-rs/argon2": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2/-/argon2-1.7.0.tgz",
+      "integrity": "sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      },
+      "optionalDependencies": {
+        "@node-rs/argon2-android-arm-eabi": "1.7.0",
+        "@node-rs/argon2-android-arm64": "1.7.0",
+        "@node-rs/argon2-darwin-arm64": "1.7.0",
+        "@node-rs/argon2-darwin-x64": "1.7.0",
+        "@node-rs/argon2-freebsd-x64": "1.7.0",
+        "@node-rs/argon2-linux-arm-gnueabihf": "1.7.0",
+        "@node-rs/argon2-linux-arm64-gnu": "1.7.0",
+        "@node-rs/argon2-linux-arm64-musl": "1.7.0",
+        "@node-rs/argon2-linux-x64-gnu": "1.7.0",
+        "@node-rs/argon2-linux-x64-musl": "1.7.0",
+        "@node-rs/argon2-wasm32-wasi": "1.7.0",
+        "@node-rs/argon2-win32-arm64-msvc": "1.7.0",
+        "@node-rs/argon2-win32-ia32-msvc": "1.7.0",
+        "@node-rs/argon2-win32-x64-msvc": "1.7.0"
+      }
+    },
+    "node_modules/@node-rs/argon2-android-arm-eabi": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm-eabi/-/argon2-android-arm-eabi-1.7.0.tgz",
+      "integrity": "sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-android-arm64": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm64/-/argon2-android-arm64-1.7.0.tgz",
+      "integrity": "sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-darwin-arm64": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-arm64/-/argon2-darwin-arm64-1.7.0.tgz",
+      "integrity": "sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-darwin-x64": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-x64/-/argon2-darwin-x64-1.7.0.tgz",
+      "integrity": "sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-freebsd-x64": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-freebsd-x64/-/argon2-freebsd-x64-1.7.0.tgz",
+      "integrity": "sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-linux-arm-gnueabihf": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm-gnueabihf/-/argon2-linux-arm-gnueabihf-1.7.0.tgz",
+      "integrity": "sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-linux-arm64-gnu": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-gnu/-/argon2-linux-arm64-gnu-1.7.0.tgz",
+      "integrity": "sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-linux-arm64-musl": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-musl/-/argon2-linux-arm64-musl-1.7.0.tgz",
+      "integrity": "sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-linux-x64-gnu": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-gnu/-/argon2-linux-x64-gnu-1.7.0.tgz",
+      "integrity": "sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-linux-x64-musl": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-musl/-/argon2-linux-x64-musl-1.7.0.tgz",
+      "integrity": "sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-wasm32-wasi": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-wasm32-wasi/-/argon2-wasm32-wasi-1.7.0.tgz",
+      "integrity": "sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==",
+      "cpu": [
+        "wasm32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^0.45.0",
+        "@emnapi/runtime": "^0.45.0",
+        "@tybys/wasm-util": "^0.8.1",
+        "memfs-browser": "^3.4.13000"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@node-rs/argon2-wasm32-wasi/node_modules/@emnapi/core": {
+      "version": "0.45.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz",
+      "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@node-rs/argon2-wasm32-wasi/node_modules/@emnapi/runtime": {
+      "version": "0.45.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz",
+      "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@node-rs/argon2-wasm32-wasi/node_modules/@tybys/wasm-util": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.3.tgz",
+      "integrity": "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@node-rs/argon2-win32-arm64-msvc": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-arm64-msvc/-/argon2-win32-arm64-msvc-1.7.0.tgz",
+      "integrity": "sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-win32-ia32-msvc": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-ia32-msvc/-/argon2-win32-ia32-msvc-1.7.0.tgz",
+      "integrity": "sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/argon2-win32-x64-msvc": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-x64-msvc/-/argon2-win32-x64-msvc-1.7.0.tgz",
+      "integrity": "sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.9.0.tgz",
+      "integrity": "sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/Brooooooklyn"
+      },
+      "optionalDependencies": {
+        "@node-rs/bcrypt-android-arm-eabi": "1.9.0",
+        "@node-rs/bcrypt-android-arm64": "1.9.0",
+        "@node-rs/bcrypt-darwin-arm64": "1.9.0",
+        "@node-rs/bcrypt-darwin-x64": "1.9.0",
+        "@node-rs/bcrypt-freebsd-x64": "1.9.0",
+        "@node-rs/bcrypt-linux-arm-gnueabihf": "1.9.0",
+        "@node-rs/bcrypt-linux-arm64-gnu": "1.9.0",
+        "@node-rs/bcrypt-linux-arm64-musl": "1.9.0",
+        "@node-rs/bcrypt-linux-x64-gnu": "1.9.0",
+        "@node-rs/bcrypt-linux-x64-musl": "1.9.0",
+        "@node-rs/bcrypt-wasm32-wasi": "1.9.0",
+        "@node-rs/bcrypt-win32-arm64-msvc": "1.9.0",
+        "@node-rs/bcrypt-win32-ia32-msvc": "1.9.0",
+        "@node-rs/bcrypt-win32-x64-msvc": "1.9.0"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-android-arm-eabi": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.9.0.tgz",
+      "integrity": "sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-android-arm64": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.9.0.tgz",
+      "integrity": "sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-darwin-arm64": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.9.0.tgz",
+      "integrity": "sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-darwin-x64": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.9.0.tgz",
+      "integrity": "sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-freebsd-x64": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.9.0.tgz",
+      "integrity": "sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.9.0.tgz",
+      "integrity": "sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-linux-arm64-gnu": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.9.0.tgz",
+      "integrity": "sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-linux-arm64-musl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.9.0.tgz",
+      "integrity": "sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-linux-x64-gnu": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.9.0.tgz",
+      "integrity": "sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-linux-x64-musl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.9.0.tgz",
+      "integrity": "sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-wasm32-wasi": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-wasm32-wasi/-/bcrypt-wasm32-wasi-1.9.0.tgz",
+      "integrity": "sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==",
+      "cpu": [
+        "wasm32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^0.45.0",
+        "@emnapi/runtime": "^0.45.0",
+        "@tybys/wasm-util": "^0.8.1",
+        "memfs-browser": "^3.4.13000"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-wasm32-wasi/node_modules/@emnapi/core": {
+      "version": "0.45.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz",
+      "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-wasm32-wasi/node_modules/@emnapi/runtime": {
+      "version": "0.45.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz",
+      "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-wasm32-wasi/node_modules/@tybys/wasm-util": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.3.tgz",
+      "integrity": "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-win32-arm64-msvc": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.9.0.tgz",
+      "integrity": "sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-win32-ia32-msvc": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.9.0.tgz",
+      "integrity": "sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/bcrypt-win32-x64-msvc": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.9.0.tgz",
+      "integrity": "sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@number-flow/react": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/@number-flow/react/-/react-0.6.2.tgz",
+      "integrity": "sha512-WjZuV4aA+vhRCgCF+adGLgFVVAJ8vdvq6EchRT2FiBIgElTXtDOA3YgkcMr9UHpvpS9v4H70AB5wZv0D9jc3QA==",
+      "license": "MIT",
+      "dependencies": {
+        "esm-env": "^1.1.4",
+        "number-flow": "0.6.2"
+      },
+      "peerDependencies": {
+        "react": "^18 || ^19",
+        "react-dom": "^18 || ^19"
+      }
+    },
+    "node_modules/@octokit/app": {
+      "version": "15.1.6",
+      "resolved": "https://registry.npmjs.org/@octokit/app/-/app-15.1.6.tgz",
+      "integrity": "sha512-WELCamoCJo9SN0lf3SWZccf68CF0sBNPQuLYmZ/n87p5qvBJDe9aBtr5dHkh7T9nxWZ608pizwsUbypSzZAiUw==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-app": "^7.2.1",
+        "@octokit/auth-unauthenticated": "^6.1.3",
+        "@octokit/core": "^6.1.5",
+        "@octokit/oauth-app": "^7.1.6",
+        "@octokit/plugin-paginate-rest": "^12.0.0",
+        "@octokit/types": "^14.0.0",
+        "@octokit/webhooks": "^13.6.1"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-app": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-7.2.2.tgz",
+      "integrity": "sha512-p6hJtEyQDCJEPN9ijjhEC/kpFHMHN4Gca9r+8S0S8EJi7NaWftaEmexjxxpT1DFBeJpN4u/5RE22ArnyypupJw==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-app": "^8.1.4",
+        "@octokit/auth-oauth-user": "^5.1.4",
+        "@octokit/request": "^9.2.3",
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0",
+        "toad-cache": "^3.7.0",
+        "universal-github-app-jwt": "^2.2.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-oauth-app": {
+      "version": "8.1.4",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-8.1.4.tgz",
+      "integrity": "sha512-71iBa5SflSXcclk/OL3lJzdt4iFs56OJdpBGEBl1wULp7C58uiswZLV6TdRaiAzHP1LT8ezpbHlKuxADb+4NkQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-device": "^7.1.5",
+        "@octokit/auth-oauth-user": "^5.1.4",
+        "@octokit/request": "^9.2.3",
+        "@octokit/types": "^14.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-oauth-device": {
+      "version": "7.1.5",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-7.1.5.tgz",
+      "integrity": "sha512-lR00+k7+N6xeECj0JuXeULQ2TSBB/zjTAmNF2+vyGPDEFx1dgk1hTDmL13MjbSmzusuAmuJD8Pu39rjp9jH6yw==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/oauth-methods": "^5.1.5",
+        "@octokit/request": "^9.2.3",
+        "@octokit/types": "^14.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-oauth-user": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-5.1.6.tgz",
+      "integrity": "sha512-/R8vgeoulp7rJs+wfJ2LtXEVC7pjQTIqDab7wPKwVG6+2v/lUnCOub6vaHmysQBbb45FknM3tbHW8TOVqYHxCw==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-device": "^7.1.5",
+        "@octokit/oauth-methods": "^5.1.5",
+        "@octokit/request": "^9.2.3",
+        "@octokit/types": "^14.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-token": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
+      "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-unauthenticated": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-6.1.3.tgz",
+      "integrity": "sha512-d5gWJla3WdSl1yjbfMpET+hUSFCE15qM0KVSB0H1shyuJihf/RL1KqWoZMIaonHvlNojkL9XtLFp8QeLe+1iwA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/core": {
+      "version": "6.1.6",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz",
+      "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-token": "^5.0.0",
+        "@octokit/graphql": "^8.2.2",
+        "@octokit/request": "^9.2.3",
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0",
+        "before-after-hook": "^3.0.2",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/endpoint": {
+      "version": "10.1.4",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz",
+      "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^14.0.0",
+        "universal-user-agent": "^7.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/graphql": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz",
+      "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/request": "^9.2.3",
+        "@octokit/types": "^14.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/graphql-schema": {
+      "version": "15.26.1",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql-schema/-/graphql-schema-15.26.1.tgz",
+      "integrity": "sha512-RFDC2MpRBd4AxSRvUeBIVeBU7ojN/SxDfALUd7iVYOSeEK3gZaqR2MGOysj4Zh2xj2RY5fQAUT+Oqq7hWTraMA==",
+      "license": "MIT",
+      "dependencies": {
+        "graphql": "^16.0.0",
+        "graphql-tag": "^2.10.3"
+      }
+    },
+    "node_modules/@octokit/oauth-app": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-7.1.6.tgz",
+      "integrity": "sha512-OMcMzY2WFARg80oJNFwWbY51TBUfLH4JGTy119cqiDawSFXSIBujxmpXiKbGWQlvfn0CxE6f7/+c6+Kr5hI2YA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-app": "^8.1.3",
+        "@octokit/auth-oauth-user": "^5.1.3",
+        "@octokit/auth-unauthenticated": "^6.1.2",
+        "@octokit/core": "^6.1.4",
+        "@octokit/oauth-authorization-url": "^7.1.1",
+        "@octokit/oauth-methods": "^5.1.4",
+        "@types/aws-lambda": "^8.10.83",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/oauth-authorization-url": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-7.1.1.tgz",
+      "integrity": "sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/oauth-methods": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-5.1.5.tgz",
+      "integrity": "sha512-Ev7K8bkYrYLhoOSZGVAGsLEscZQyq7XQONCBBAl2JdMg7IT3PQn/y8P0KjloPoYpI5UylqYrLeUcScaYWXwDvw==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/oauth-authorization-url": "^7.0.0",
+        "@octokit/request": "^9.2.3",
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/openapi-types": {
+      "version": "25.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz",
+      "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==",
+      "license": "MIT"
+    },
+    "node_modules/@octokit/openapi-webhooks-types": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-11.0.0.tgz",
+      "integrity": "sha512-ZBzCFj98v3SuRM7oBas6BHZMJRadlnDoeFfvm1olVxZnYeU6Vh97FhPxyS5aLh5pN51GYv2I51l/hVUAVkGBlA==",
+      "license": "MIT"
+    },
+    "node_modules/@octokit/plugin-paginate-graphql": {
+      "version": "5.2.4",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-5.2.4.tgz",
+      "integrity": "sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-paginate-rest": {
+      "version": "12.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-12.0.0.tgz",
+      "integrity": "sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^14.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-rest-endpoint-methods": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-14.0.0.tgz",
+      "integrity": "sha512-iQt6ovem4b7zZYZQtdv+PwgbL5VPq37th1m2x2TdkgimIDJpsi2A6Q/OI/23i/hR6z5mL0EgisNR4dcbmckSZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^14.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-retry": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.2.1.tgz",
+      "integrity": "sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0",
+        "bottleneck": "^2.15.3"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-throttling": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-10.0.0.tgz",
+      "integrity": "sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^14.0.0",
+        "bottleneck": "^2.15.3"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": "^6.1.3"
+      }
+    },
+    "node_modules/@octokit/request": {
+      "version": "9.2.4",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz",
+      "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/endpoint": "^10.1.4",
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0",
+        "fast-content-type-parse": "^2.0.0",
+        "universal-user-agent": "^7.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/request-error": {
+      "version": "6.1.8",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz",
+      "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^14.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/types": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
+      "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/openapi-types": "^25.1.0"
+      }
+    },
+    "node_modules/@octokit/webhooks": {
+      "version": "13.9.1",
+      "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-13.9.1.tgz",
+      "integrity": "sha512-Nss2b4Jyn4wB3EAqAPJypGuCJFalz/ZujKBQQ5934To7Xw9xjf4hkr/EAByxQY7hp7MKd790bWGz7XYSTsHmaw==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/openapi-webhooks-types": "11.0.0",
+        "@octokit/request-error": "^6.1.7",
+        "@octokit/webhooks-methods": "^5.1.1"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/webhooks-methods": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-5.1.1.tgz",
+      "integrity": "sha512-NGlEHZDseJTCj8TMMFehzwa9g7On4KJMPVHDSrHxCQumL6uSQR8wIkP/qesv52fXqV1BPf4pTxwtS31ldAt9Xg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@openrouter/ai-sdk-provider": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.5.4.tgz",
+      "integrity": "sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@openrouter/sdk": "^0.1.27"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "ai": "^5.0.0",
+        "zod": "^3.24.1 || ^v4"
+      }
+    },
+    "node_modules/@openrouter/sdk": {
+      "version": "0.1.27",
+      "resolved": "https://registry.npmjs.org/@openrouter/sdk/-/sdk-0.1.27.tgz",
+      "integrity": "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "zod": "^3.25.0 || ^4.0.0"
+      }
+    },
+    "node_modules/@opentelemetry/api": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+      "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/@opentelemetry/semantic-conventions": {
+      "version": "1.43.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz",
+      "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@oslojs/asn1": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@oslojs/asn1/-/asn1-1.0.0.tgz",
+      "integrity": "sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==",
+      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+      "license": "MIT",
+      "dependencies": {
+        "@oslojs/binary": "1.0.0"
+      }
+    },
+    "node_modules/@oslojs/binary": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@oslojs/binary/-/binary-1.0.0.tgz",
+      "integrity": "sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==",
+      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+      "license": "MIT"
+    },
+    "node_modules/@oslojs/crypto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@oslojs/crypto/-/crypto-1.0.1.tgz",
+      "integrity": "sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==",
+      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+      "license": "MIT",
+      "dependencies": {
+        "@oslojs/asn1": "1.0.0",
+        "@oslojs/binary": "1.0.0"
+      }
+    },
+    "node_modules/@oslojs/encoding": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz",
+      "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==",
+      "license": "MIT"
+    },
+    "node_modules/@oxc-project/types": {
+      "version": "0.148.0",
+      "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz",
+      "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/oxc-project"
+      }
+    },
+    "node_modules/@panva/hkdf": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz",
+      "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/@pdf-lib/standard-fonts": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz",
+      "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^1.0.6"
+      }
+    },
+    "node_modules/@pdf-lib/standard-fonts/node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "license": "(MIT AND Zlib)"
+    },
+    "node_modules/@pdf-lib/upng": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz",
+      "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^1.0.10"
+      }
+    },
+    "node_modules/@pdf-lib/upng/node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "license": "(MIT AND Zlib)"
+    },
+    "node_modules/@pdfme/common": {
+      "version": "5.5.10",
+      "resolved": "https://registry.npmjs.org/@pdfme/common/-/common-5.5.10.tgz",
+      "integrity": "sha512-UP4Fm6pT50CwqqAYPO1Dxe7eWfZYAdRo84N0weYMP0NFIwBRUTHaY4/yTbUVNLyXeUi5w0AYJbzKcxflvauKmw==",
+      "license": "MIT",
+      "dependencies": {
+        "@pdfme/pdf-lib": "*",
+        "acorn": "^8.16.0",
+        "buffer": "^6.0.3",
+        "zod": "^4.3.6"
+      },
+      "peerDependencies": {
+        "antd": "^5.11.2",
+        "form-render": "^2.2.20"
+      }
+    },
+    "node_modules/@pdfme/common/node_modules/zod": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz",
+      "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    },
+    "node_modules/@pdfme/generator": {
+      "version": "5.5.10",
+      "resolved": "https://registry.npmjs.org/@pdfme/generator/-/generator-5.5.10.tgz",
+      "integrity": "sha512-CGeEQmy/odNXZLhTgAAlM5aM/Vhv4gcnTyWo+KI5QXW+5hnR4zs7eN3GY/v9ATEOil7yeYNAQkunmpbn+5WHcg==",
+      "license": "MIT",
+      "dependencies": {
+        "@pdfme/pdf-lib": "*",
+        "fontkit": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@pdfme/common": "latest",
+        "@pdfme/schemas": "latest"
+      }
+    },
+    "node_modules/@pdfme/pdf-lib": {
+      "version": "6.1.12",
+      "resolved": "https://registry.npmjs.org/@pdfme/pdf-lib/-/pdf-lib-6.1.12.tgz",
+      "integrity": "sha512-AZJ+grbyrrPm15kmyt/Fc3unui8mhFQBPdPppcoApK+bAfbIV4RnmQBLm/HLr+jsE7ciK13c0IEYSVDkH3tPbw==",
+      "license": "MIT",
+      "dependencies": {
+        "@pdf-lib/standard-fonts": "^1.0.0",
+        "@pdf-lib/upng": "^1.0.1",
+        "color": "^5.0.3",
+        "node-html-better-parser": "^1.5.8",
+        "pako": "^2.1.0"
+      }
+    },
+    "node_modules/@pdfme/schemas": {
+      "version": "5.5.10",
+      "resolved": "https://registry.npmjs.org/@pdfme/schemas/-/schemas-5.5.10.tgz",
+      "integrity": "sha512-vDSNKAfwYenBYYhqYrR3X8rZIRZa8A0BaO1w185WJ18DT1GAdoqNdWfyX2P7qX2KU0+yYW19gUbbcFw3mWza7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@pdfme/pdf-lib": "*",
+        "air-datepicker": "^3.6.0",
+        "bwip-js": "^4.8.0",
+        "date-fns": "^4.1.0",
+        "dompurify": "^3.3.3",
+        "fontkit": "^2.0.2",
+        "lucide": "^0.577.0"
+      },
+      "peerDependencies": {
+        "@pdfme/common": "latest"
+      }
+    },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@playwright/test": {
+      "version": "1.63.0",
+      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz",
+      "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "playwright": "1.63.0"
+      },
+      "bin": {
+        "playwright": "cli.js"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@polar-sh/checkout": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/@polar-sh/checkout/-/checkout-0.2.1.tgz",
+      "integrity": "sha512-AEKKw3o4ykApECA4bU6a2YC0+aQKTFUasca4ZgCDIjG8AHlu3SjW3Taxh2nfeYAczhah0m0axVF9AV8VfdYzfw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "date-fns": "^4.1.0"
+      },
+      "peerDependencies": {
+        "@stripe/react-stripe-js": "^3.6.0 || ^4.0.2",
+        "@stripe/stripe-js": "^7.1.0",
+        "react": "^18 || ^19"
+      }
+    },
+    "node_modules/@polar-sh/sdk": {
+      "version": "0.47.1",
+      "resolved": "https://registry.npmjs.org/@polar-sh/sdk/-/sdk-0.47.1.tgz",
+      "integrity": "sha512-fkz7wPLbqfuDmY9LxuXpE2uP2TAV6J0q/YN5hJ4UBxpjbkB0hKM6c4R35N89t83dfzMlG6EOlqOn+Rd1T6XrJQ==",
+      "dependencies": {
+        "standardwebhooks": "^1.0.0",
+        "zod": "^3.25.65 || ^4.0.0"
+      }
+    },
+    "node_modules/@preact/signals-core": {
+      "version": "1.14.4",
+      "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.4.tgz",
+      "integrity": "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/preact"
+      }
+    },
+    "node_modules/@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/codegen": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+      "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/eventemitter": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
+      "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/fetch": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
+      "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@protobufjs/aspromise": "^1.1.1"
+      }
+    },
+    "node_modules/@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@protobufjs/utf8": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
+      "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@puppeteer/browsers": {
+      "version": "2.13.2",
+      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.2.tgz",
+      "integrity": "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "debug": "^4.4.3",
+        "extract-zip": "^2.0.1",
+        "progress": "^2.0.3",
+        "proxy-agent": "^6.5.0",
+        "semver": "^7.7.4",
+        "tar-fs": "^3.1.1",
+        "yargs": "^17.7.2"
+      },
+      "bin": {
+        "browsers": "lib/cjs/main-cli.js"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@puppeteer/browsers/node_modules/tar-fs": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz",
+      "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pump": "^3.0.0",
+        "tar-stream": "^3.1.5"
+      },
+      "optionalDependencies": {
+        "bare-fs": "^4.0.1",
+        "bare-path": "^3.0.0"
+      }
+    },
+    "node_modules/@puppeteer/browsers/node_modules/tar-stream": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz",
+      "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "b4a": "^1.6.4",
+        "bare-fs": "^4.5.5",
+        "fast-fifo": "^1.2.0",
+        "streamx": "^2.15.0"
+      }
+    },
+    "node_modules/@radix-ui/number": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz",
+      "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==",
+      "license": "MIT"
+    },
+    "node_modules/@radix-ui/primitive": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz",
+      "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==",
+      "license": "MIT"
+    },
+    "node_modules/@radix-ui/react-accordion": {
+      "version": "1.2.20",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz",
+      "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-collapsible": "1.1.20",
+        "@radix-ui/react-collection": "1.1.15",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-arrow": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz",
+      "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-primitive": "2.1.10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-checkbox": {
+      "version": "1.3.11",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz",
+      "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-size": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-collapsible": {
+      "version": "1.1.20",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz",
+      "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-collection": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz",
+      "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-slot": "1.3.3"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-compose-refs": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz",
+      "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-context": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz",
+      "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-context-menu": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.7.tgz",
+      "integrity": "sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-menu": "2.1.24",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-dialog": {
+      "version": "1.1.23",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz",
+      "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-dismissable-layer": "1.1.19",
+        "@radix-ui/react-focus-guards": "1.1.6",
+        "@radix-ui/react-focus-scope": "1.1.16",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-portal": "1.1.17",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-slot": "1.3.3",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-layout-effect": "1.1.4",
+        "aria-hidden": "^1.2.4",
+        "react-remove-scroll": "^2.7.2"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-direction": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz",
+      "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-dismissable-layer": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz",
+      "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-callback-ref": "1.1.4",
+        "@radix-ui/react-use-effect-event": "0.0.5"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-dropdown-menu": {
+      "version": "2.1.24",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz",
+      "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-menu": "2.1.24",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-focus-guards": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz",
+      "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-focus-scope": {
+      "version": "1.1.16",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz",
+      "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-callback-ref": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-hover-card": {
+      "version": "1.1.23",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.23.tgz",
+      "integrity": "sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-dismissable-layer": "1.1.19",
+        "@radix-ui/react-popper": "1.3.7",
+        "@radix-ui/react-portal": "1.1.17",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-id": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz",
+      "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-menu": {
+      "version": "2.1.24",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz",
+      "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-collection": "1.1.15",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-dismissable-layer": "1.1.19",
+        "@radix-ui/react-focus-guards": "1.1.6",
+        "@radix-ui/react-focus-scope": "1.1.16",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-popper": "1.3.7",
+        "@radix-ui/react-portal": "1.1.17",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-roving-focus": "1.1.19",
+        "@radix-ui/react-slot": "1.3.3",
+        "@radix-ui/react-use-callback-ref": "1.1.4",
+        "aria-hidden": "^1.2.4",
+        "react-remove-scroll": "^2.7.2"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-popover": {
+      "version": "1.1.23",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz",
+      "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-dismissable-layer": "1.1.19",
+        "@radix-ui/react-focus-guards": "1.1.6",
+        "@radix-ui/react-focus-scope": "1.1.16",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-popper": "1.3.7",
+        "@radix-ui/react-portal": "1.1.17",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-slot": "1.3.3",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "aria-hidden": "^1.2.4",
+        "react-remove-scroll": "^2.7.2"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-popper": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz",
+      "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/react-dom": "^2.0.0",
+        "@radix-ui/react-arrow": "1.1.15",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-callback-ref": "1.1.4",
+        "@radix-ui/react-use-layout-effect": "1.1.4",
+        "@radix-ui/react-use-rect": "1.1.4",
+        "@radix-ui/react-use-size": "1.1.4",
+        "@radix-ui/rect": "1.1.3"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-portal": {
+      "version": "1.1.17",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz",
+      "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-presence": {
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz",
+      "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-primitive": {
+      "version": "2.1.10",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz",
+      "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-slot": "1.3.3"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-progress": {
+      "version": "1.1.16",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.16.tgz",
+      "integrity": "sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-primitive": "2.1.10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-roving-focus": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz",
+      "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-collection": "1.1.15",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-callback-ref": "1.1.4",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-is-hydrated": "0.1.3",
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-scroll-area": {
+      "version": "1.2.18",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz",
+      "integrity": "sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/number": "1.1.3",
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-callback-ref": "1.1.4",
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-select": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz",
+      "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/number": "1.1.3",
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-collection": "1.1.15",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-dismissable-layer": "1.1.19",
+        "@radix-ui/react-focus-guards": "1.1.6",
+        "@radix-ui/react-focus-scope": "1.1.16",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-popper": "1.3.7",
+        "@radix-ui/react-portal": "1.1.17",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-slot": "1.3.3",
+        "@radix-ui/react-use-callback-ref": "1.1.4",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-layout-effect": "1.1.4",
+        "@radix-ui/react-use-previous": "1.1.4",
+        "@radix-ui/react-visually-hidden": "1.2.11",
+        "aria-hidden": "^1.2.4",
+        "react-remove-scroll": "^2.7.2"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-separator": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz",
+      "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-primitive": "2.1.10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-slot": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz",
+      "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-compose-refs": "1.1.5"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-switch": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.7.tgz",
+      "integrity": "sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-size": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-tabs": {
+      "version": "1.1.21",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz",
+      "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-roving-focus": "1.1.19",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-toggle": {
+      "version": "1.1.18",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz",
+      "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-toggle-group": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz",
+      "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-direction": "1.1.4",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-roving-focus": "1.1.19",
+        "@radix-ui/react-toggle": "1.1.18",
+        "@radix-ui/react-use-controllable-state": "1.2.6"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-tooltip": {
+      "version": "1.2.16",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz",
+      "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-compose-refs": "1.1.5",
+        "@radix-ui/react-context": "1.2.2",
+        "@radix-ui/react-dismissable-layer": "1.1.19",
+        "@radix-ui/react-id": "1.1.4",
+        "@radix-ui/react-popper": "1.3.7",
+        "@radix-ui/react-portal": "1.1.17",
+        "@radix-ui/react-presence": "1.1.10",
+        "@radix-ui/react-primitive": "2.1.10",
+        "@radix-ui/react-slot": "1.3.3",
+        "@radix-ui/react-use-controllable-state": "1.2.6",
+        "@radix-ui/react-use-layout-effect": "1.1.4",
+        "@radix-ui/react-visually-hidden": "1.2.11"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-callback-ref": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz",
+      "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-controllable-state": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz",
+      "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.7",
+        "@radix-ui/react-use-effect-event": "0.0.5",
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-effect-event": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz",
+      "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-is-hydrated": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz",
+      "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-layout-effect": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz",
+      "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-previous": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz",
+      "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-rect": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz",
+      "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/rect": "1.1.3"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-use-size": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz",
+      "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-use-layout-effect": "1.1.4"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-visually-hidden": {
+      "version": "1.2.11",
+      "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz",
+      "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-primitive": "2.1.10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/rect": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz",
+      "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==",
+      "license": "MIT"
+    },
+    "node_modules/@react-email/render": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.1.2.tgz",
+      "integrity": "sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw==",
+      "license": "MIT",
+      "dependencies": {
+        "html-to-text": "^9.0.5",
+        "prettier": "^3.5.3",
+        "react-promise-suspense": "^0.3.4"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "peerDependencies": {
+        "react": "^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc"
+      }
+    },
+    "node_modules/@reduxjs/toolkit": {
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz",
+      "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==",
+      "license": "MIT",
+      "dependencies": {
+        "@standard-schema/spec": "^1.0.0",
+        "@standard-schema/utils": "^0.3.0",
+        "immer": "^11.0.0",
+        "redux": "^5.0.1",
+        "redux-thunk": "^3.1.0",
+        "reselect": "^5.1.0"
+      },
+      "peerDependencies": {
+        "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
+        "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        },
+        "react-redux": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@remirror/core-constants": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz",
+      "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==",
+      "license": "MIT"
+    },
+    "node_modules/@remotion/bundler": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/bundler/-/bundler-4.0.486.tgz",
+      "integrity": "sha512-SrmOxoffKg71RPKytz/Xgl6bL2diTb6FnhyvviM0U/4pU7379ujMtI8M44ApbpWbpRXkqUQk6ber9MA34f09EQ==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@remotion/media-parser": "4.0.486",
+        "@remotion/studio": "4.0.486",
+        "@remotion/studio-shared": "4.0.486",
+        "@remotion/timeline-utils": "4.0.486",
+        "@rspack/core": "1.7.11",
+        "@rspack/plugin-react-refresh": "1.6.1",
+        "css-loader": "7.1.4",
+        "esbuild": "0.28.1",
+        "react-refresh": "0.18.0",
+        "remotion": "4.0.486",
+        "style-loader": "4.0.0",
+        "webpack": "5.105.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/bundler/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/canvas-capture": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/canvas-capture/-/canvas-capture-4.0.486.tgz",
+      "integrity": "sha512-bJsapY/9Fk0GLNXv4tIRxy13emKCHFsP/39ya269CFfa96BM0KrVKO12LV/tvjuLAk3nZ/BejgG/2H05G1P4qg==",
+      "license": "Remotion License",
+      "dependencies": {
+        "mediabunny": "1.50.3",
+        "remotion": "4.0.486"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/canvas-capture/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/cli": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/cli/-/cli-4.0.486.tgz",
+      "integrity": "sha512-6DgDdrGSqAiHCjuZ6YtKbR5XVqPmQTxRiXem/SBTcODLMjbkHKIJVejLCTXtdo6C8aVMSQ0grh2Na6eAy5oqbg==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@remotion/bundler": "4.0.486",
+        "@remotion/media-utils": "4.0.486",
+        "@remotion/player": "4.0.486",
+        "@remotion/renderer": "4.0.486",
+        "@remotion/studio": "4.0.486",
+        "@remotion/studio-server": "4.0.486",
+        "@remotion/studio-shared": "4.0.486",
+        "dotenv": "17.3.1",
+        "minimist": "1.2.6",
+        "prompts": "2.4.2",
+        "remotion": "4.0.486"
+      },
+      "bin": {
+        "remotion": "remotion-cli.js",
+        "remotionb": "remotionb-cli.js",
+        "remotiond": "remotiond-cli.js"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/cli/node_modules/dotenv": {
+      "version": "17.3.1",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz",
+      "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
+    "node_modules/@remotion/cli/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/compositor-darwin-arm64": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.486.tgz",
+      "integrity": "sha512-SOQxrUi7w5cKq4zSWOebsuFpgVefJhFmfd9hTY9wek/WgjuEs9V7NydNq1izIGh9DiYWVQQ/XhBEOq0RQ63UeQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@remotion/compositor-darwin-x64": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.486.tgz",
+      "integrity": "sha512-1ItGa7UdqrzUzAR2+gnRYtwnivnP6pstDy5pTFK2bz9Lu5mCOit6ndfKepo5utSrxdA2mnS2BOtPZXo4f4dsnQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@remotion/compositor-linux-arm64-gnu": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.486.tgz",
+      "integrity": "sha512-XOeKoCCxGDY45RYdua7birDhlv0ZGOTro/oMuLygKmaczpMK325lH7GXfb3k5TC1zGOUkYncVwxoq0aPJlFD/g==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@remotion/compositor-linux-arm64-musl": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.486.tgz",
+      "integrity": "sha512-CMN0wGg+17rKdz7u4S4uGXT00n6+8jDrsrJoKvnBdJikGavzo7ZgfrJrkwRUeHvY2w1owUPfRRTL4qgFbwoFcg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@remotion/compositor-linux-x64-gnu": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.486.tgz",
+      "integrity": "sha512-EvjGUzeNvhSEK6jEJnlfczyzyJFeT2kMDv+rl35nGOOCXEmvQhpeRR5gwuLAyz8n7DaebrTpE4X35fj5XREZ/w==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@remotion/compositor-linux-x64-musl": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.486.tgz",
+      "integrity": "sha512-IYg1BWu1WVERyzJ1lmMgIzcyMqfBj65T+KRIb0mG9wO58pQ9lpLg/NRlL5PTWdjbj9ty2ZrAaaiPFo/eZNw7yw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@remotion/compositor-win32-x64-msvc": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.486.tgz",
+      "integrity": "sha512-+jgyAeVKkib57NprRdptbNsy5zygMHyzWsbG7TuHIfuoWGTxoGVfSePfolD+7CKkEhyfzozl+Wn1QGncnGXPDg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@remotion/licensing": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/licensing/-/licensing-4.0.486.tgz",
+      "integrity": "sha512-9viDTCmthh0LntxGQxKaArHPVW6wAc6FmoZfBNdIHfXoE9FCfhb+VXeJVhfx2Z6awPgu7vn93wstGBMussODOw==",
+      "license": "MIT"
+    },
+    "node_modules/@remotion/media-parser": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/media-parser/-/media-parser-4.0.486.tgz",
+      "integrity": "sha512-s2rkh2gArYjC2F9plPs895H3LGwLOILiQY465J4afopwvgcrYQJ42zga67BfPMHi/DSOPL2b0km1y6AA0AlxEQ==",
+      "license": "Remotion License https://remotion.dev/license"
+    },
+    "node_modules/@remotion/media-utils": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/media-utils/-/media-utils-4.0.486.tgz",
+      "integrity": "sha512-pYd0KXVcv1UDlWJETuhCnOpd3+c7iWgyrNcyTVMT04ft76ToTwqcQF9E9+GmulfZBXZftNdoNFGJg5B4dNhx0g==",
+      "license": "MIT",
+      "dependencies": {
+        "mediabunny": "1.50.3",
+        "remotion": "4.0.486"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/media-utils/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/player": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/player/-/player-4.0.486.tgz",
+      "integrity": "sha512-S8wh+bS695gidwXYNnCjwZzJG9oPzyYBFMjpO0rlTbrNc3naIKT8UP443J0opitP4g8VuXnoIKObF7JzAfpe5A==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "remotion": "4.0.486"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/player/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/renderer": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/renderer/-/renderer-4.0.486.tgz",
+      "integrity": "sha512-ALASwQTK4AfISrpvwk//Gmeh+LXP4tP23UUHnA99KKlceC+3BZFkLtLHD6zluW9Gf0cmIkjVUWmYR5404BAtxg==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@remotion/licensing": "4.0.486",
+        "@remotion/streaming": "4.0.486",
+        "execa": "5.1.1",
+        "remotion": "4.0.486",
+        "source-map": "0.8.0-beta.0",
+        "ws": "8.21.0"
+      },
+      "optionalDependencies": {
+        "@remotion/compositor-darwin-arm64": "4.0.486",
+        "@remotion/compositor-darwin-x64": "4.0.486",
+        "@remotion/compositor-linux-arm64-gnu": "4.0.486",
+        "@remotion/compositor-linux-arm64-musl": "4.0.486",
+        "@remotion/compositor-linux-x64-gnu": "4.0.486",
+        "@remotion/compositor-linux-x64-musl": "4.0.486",
+        "@remotion/compositor-win32-x64-msvc": "4.0.486"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/renderer/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/renderer/node_modules/ws": {
+      "version": "8.21.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
+      "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@remotion/streaming": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/streaming/-/streaming-4.0.486.tgz",
+      "integrity": "sha512-E6C3qIGEYJB62dEPzjMiICDYSU1iL2uiL5R4V2EYUctZW7JZELfsekUBpjL36/QpiD3LiWa1oMvRImBye9O4cA==",
+      "license": "MIT"
+    },
+    "node_modules/@remotion/studio": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/studio/-/studio-4.0.486.tgz",
+      "integrity": "sha512-gm7TBW8eKcCy/Pk31SwXLq2WMEzU1gDpC3IaTFDygN8FmVCMsnvhMM3jVtwFiOWrU56B60DDaI9IZH3R54gFMA==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "0.3.31",
+        "@remotion/canvas-capture": "4.0.486",
+        "@remotion/media-utils": "4.0.486",
+        "@remotion/player": "4.0.486",
+        "@remotion/renderer": "4.0.486",
+        "@remotion/studio-shared": "4.0.486",
+        "@remotion/timeline-utils": "4.0.486",
+        "@remotion/web-renderer": "4.0.486",
+        "@remotion/zod-types": "4.0.486",
+        "mediabunny": "1.50.3",
+        "memfs": "3.4.3",
+        "open": "8.4.2",
+        "remotion": "4.0.486",
+        "semver": "7.5.3",
+        "zod": "4.3.6"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/studio-server": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/studio-server/-/studio-server-4.0.486.tgz",
+      "integrity": "sha512-LaOFDMzwuS3HCoS03Jvog/Gt1urSlfnXbCbwqzZrzefM3R32s2N7ovTqIXPqtnAJqL/htygDll4ScF1jgkDhaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "7.24.1",
+        "@babel/types": "7.24.0",
+        "@remotion/bundler": "4.0.486",
+        "@remotion/renderer": "4.0.486",
+        "@remotion/studio-shared": "4.0.486",
+        "memfs": "3.4.3",
+        "open": "8.4.2",
+        "prettier": "3.8.1",
+        "recast": "0.23.11",
+        "remotion": "4.0.486",
+        "semver": "7.5.3"
+      }
+    },
+    "node_modules/@remotion/studio-server/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@remotion/studio-server/node_modules/prettier": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+      "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+      "license": "MIT",
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/@remotion/studio-server/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/studio-server/node_modules/semver": {
+      "version": "7.5.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+      "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
+      "license": "ISC",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@remotion/studio-server/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "license": "ISC"
+    },
+    "node_modules/@remotion/studio-shared": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/studio-shared/-/studio-shared-4.0.486.tgz",
+      "integrity": "sha512-hoRcSYfbchkFXhX0bS8pB1R4WqpfCuqYHCgcQLqnD1xfcbYkrY9OODMAn0K8tqT0IMMuOOqThCKbm7HOmn24HQ==",
+      "license": "MIT",
+      "dependencies": {
+        "remotion": "4.0.486"
+      }
+    },
+    "node_modules/@remotion/studio-shared/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/studio/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@remotion/studio/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/studio/node_modules/semver": {
+      "version": "7.5.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+      "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
+      "license": "ISC",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@remotion/studio/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "license": "ISC"
+    },
+    "node_modules/@remotion/studio/node_modules/zod": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+      "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    },
+    "node_modules/@remotion/timeline-utils": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/timeline-utils/-/timeline-utils-4.0.486.tgz",
+      "integrity": "sha512-H87sSt/MwabxwIpIPgWD69DfTrmujrieJO+d9o8lWMXSS16iste5/iFBU/ENqF62whnOU6stNvc5+UGuvBy6nA==",
+      "license": "MIT",
+      "dependencies": {
+        "mediabunny": "1.50.3"
+      }
+    },
+    "node_modules/@remotion/web-renderer": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/web-renderer/-/web-renderer-4.0.486.tgz",
+      "integrity": "sha512-RbG4qFmg6paFDDc/rNL/3hooDPEWPnHu8MtDJB5axD/TiXFsaNR009L9dP610b9hPGwlykIOooSlD7INzo0Gqw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@mediabunny/aac-encoder": "1.50.3",
+        "@mediabunny/flac-encoder": "1.50.3",
+        "@mediabunny/mp3-encoder": "1.50.3",
+        "@remotion/licensing": "4.0.486",
+        "mediabunny": "1.50.3",
+        "remotion": "4.0.486"
+      },
+      "peerDependencies": {
+        "react": ">=18.0.0",
+        "react-dom": ">=18.0.0"
+      }
+    },
+    "node_modules/@remotion/web-renderer/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@remotion/zod-types": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/@remotion/zod-types/-/zod-types-4.0.486.tgz",
+      "integrity": "sha512-WXXdNYWySi2Ps0IMSNuC3AXevGMz1kgiZpmZmTe030mjkwkxiaeAxDl7BZYOYU69fh2HeogfpPa8ubzrUYLSlQ==",
+      "license": "MIT",
+      "dependencies": {
+        "remotion": "4.0.486"
+      }
+    },
+    "node_modules/@remotion/zod-types/node_modules/remotion": {
+      "version": "4.0.486",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.486.tgz",
+      "integrity": "sha512-njrfAmfr+fJCr4NXY6hlbzWpIRkfnF0lPdRGZ4DkQao3/XRUtuB166GcVuaVnUpwa8NP+W+Q6TczOPveUpr0pw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@rolldown/binding-android-arm-eabi": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz",
+      "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-android-arm64": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz",
+      "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-darwin-arm64": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz",
+      "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-darwin-x64": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz",
+      "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-freebsd-x64": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz",
+      "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz",
+      "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-arm64-gnu": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz",
+      "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-arm64-musl": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz",
+      "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz",
+      "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-s390x-gnu": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz",
+      "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-x64-gnu": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz",
+      "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-x64-musl": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz",
+      "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-openharmony-arm64": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz",
+      "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-win32-arm64-msvc": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz",
+      "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-win32-x64-msvc": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz",
+      "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/pluginutils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+      "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@rollup/plugin-babel": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz",
+      "integrity": "sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.18.6",
+        "@rollup/pluginutils": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "@types/babel__core": "^7.1.9",
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/babel__core": {
+          "optional": true
+        },
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/plugin-node-resolve": {
+      "version": "16.0.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
+      "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.0.1",
+        "@types/resolve": "1.20.2",
+        "deepmerge": "^4.2.2",
+        "is-module": "^1.0.0",
+        "resolve": "^1.22.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^2.78.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/plugin-node-resolve/node_modules/@types/resolve": {
+      "version": "1.20.2",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+      "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@rollup/plugin-replace": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz",
+      "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.0.1",
+        "magic-string": "^0.30.3"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/plugin-terser": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz",
+      "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "serialize-javascript": "^7.0.3",
+        "smob": "^1.0.0",
+        "terser": "^5.17.4"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+      "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
+      "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
+      "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
+      "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
+      "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
+      "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
+      "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
+      "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
+      "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
+      "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
+      "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
+      "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-musl": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
+      "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
+      "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-musl": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
+      "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
+      "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
+      "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
+      "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
+      "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
+      "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-openbsd-x64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
+      "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-openharmony-arm64": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
+      "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
+      "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
+      "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-gnu": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
+      "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
+      "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rspack/binding": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.11.tgz",
+      "integrity": "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==",
+      "license": "MIT",
+      "optionalDependencies": {
+        "@rspack/binding-darwin-arm64": "1.7.11",
+        "@rspack/binding-darwin-x64": "1.7.11",
+        "@rspack/binding-linux-arm64-gnu": "1.7.11",
+        "@rspack/binding-linux-arm64-musl": "1.7.11",
+        "@rspack/binding-linux-x64-gnu": "1.7.11",
+        "@rspack/binding-linux-x64-musl": "1.7.11",
+        "@rspack/binding-wasm32-wasi": "1.7.11",
+        "@rspack/binding-win32-arm64-msvc": "1.7.11",
+        "@rspack/binding-win32-ia32-msvc": "1.7.11",
+        "@rspack/binding-win32-x64-msvc": "1.7.11"
+      }
+    },
+    "node_modules/@rspack/binding-darwin-arm64": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz",
+      "integrity": "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rspack/binding-darwin-x64": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz",
+      "integrity": "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rspack/binding-linux-arm64-gnu": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz",
+      "integrity": "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rspack/binding-linux-arm64-musl": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz",
+      "integrity": "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rspack/binding-linux-x64-gnu": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz",
+      "integrity": "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rspack/binding-linux-x64-musl": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz",
+      "integrity": "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rspack/binding-wasm32-wasi": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz",
+      "integrity": "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==",
+      "cpu": [
+        "wasm32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@napi-rs/wasm-runtime": "1.0.7"
+      }
+    },
+    "node_modules/@rspack/binding-win32-arm64-msvc": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz",
+      "integrity": "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rspack/binding-win32-ia32-msvc": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz",
+      "integrity": "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rspack/binding-win32-x64-msvc": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz",
+      "integrity": "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rspack/core": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.11.tgz",
+      "integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==",
+      "license": "MIT",
+      "dependencies": {
+        "@module-federation/runtime-tools": "0.22.0",
+        "@rspack/binding": "1.7.11",
+        "@rspack/lite-tapable": "1.1.0"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      },
+      "peerDependencies": {
+        "@swc/helpers": ">=0.5.1"
+      },
+      "peerDependenciesMeta": {
+        "@swc/helpers": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rspack/lite-tapable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz",
+      "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==",
+      "license": "MIT"
+    },
+    "node_modules/@rspack/plugin-react-refresh": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz",
+      "integrity": "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==",
+      "license": "MIT",
+      "dependencies": {
+        "error-stack-parser": "^2.1.4",
+        "html-entities": "^2.6.0"
+      },
+      "peerDependencies": {
+        "react-refresh": ">=0.10.0 <1.0.0",
+        "webpack-hot-middleware": "2.x"
+      },
+      "peerDependenciesMeta": {
+        "webpack-hot-middleware": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@selderee/plugin-htmlparser2": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz",
+      "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==",
+      "license": "MIT",
+      "dependencies": {
+        "domhandler": "^5.0.3",
+        "selderee": "^0.11.0"
+      },
+      "funding": {
+        "url": "https://ko-fi.com/killymxi"
+      }
+    },
+    "node_modules/@shikijs/core": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz",
+      "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/primitive": "4.4.3",
+        "@shikijs/types": "4.4.3",
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "@types/hast": "^3.0.5",
+        "hast-util-to-html": "^9.0.5"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/engine-javascript": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz",
+      "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "4.4.3",
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "oniguruma-to-es": "^4.3.6"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/engine-oniguruma": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz",
+      "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "4.4.3",
+        "@shikijs/vscode-textmate": "^10.0.2"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/langs": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz",
+      "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "4.4.3"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/primitive": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz",
+      "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "4.4.3",
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "@types/hast": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/themes": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz",
+      "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "4.4.3"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/types": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz",
+      "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "@types/hast": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@shikijs/vscode-textmate": {
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+      "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+      "license": "MIT"
+    },
+    "node_modules/@sigma/node-border": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@sigma/node-border/-/node-border-3.0.0.tgz",
+      "integrity": "sha512-mE3zUfjvJVuAMhSjiP/zdlkqe0OVTETxd04XHUwof01YqdzTk0OB4ACJIhWrwgsBXl7tTd9lPuKoroafLh8MtQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "sigma": ">=3.0.0-beta.17"
+      }
+    },
+    "node_modules/@smithy/core": {
+      "version": "3.33.3",
+      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.33.3.tgz",
+      "integrity": "sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@smithy/credential-provider-imds": {
+      "version": "4.5.2",
+      "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.5.2.tgz",
+      "integrity": "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/core": "^3.33.2",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@smithy/fetch-http-handler": {
+      "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.8.0.tgz",
+      "integrity": "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.18.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@smithy/node-http-handler": {
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.12.1.tgz",
+      "integrity": "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.18.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@smithy/signature-v4": {
+      "version": "5.7.3",
+      "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.7.3.tgz",
+      "integrity": "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@smithy/core": "^3.33.3",
+        "@smithy/types": "^4.17.2",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@smithy/types": {
+      "version": "4.18.0",
+      "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.18.0.tgz",
+      "integrity": "sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@stablelib/base64": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz",
+      "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==",
+      "license": "MIT"
+    },
+    "node_modules/@standard-schema/spec": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+      "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+      "license": "MIT"
+    },
+    "node_modules/@standard-schema/utils": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
+      "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
+      "license": "MIT"
+    },
+    "node_modules/@storybook/addon-a11y": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-9.1.20.tgz",
+      "integrity": "sha512-VFZ34y4ApmFwIzPRs2OJrG6jtYhM5y91eCZLTlR/HMGQciKF4TdOJHjj+5vf91SOER5UDcLizXetpiUowiZSgw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@storybook/global": "^5.0.0",
+        "axe-core": "^4.2.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "storybook": "^9.1.20"
+      }
+    },
+    "node_modules/@storybook/addon-docs": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.1.20.tgz",
+      "integrity": "sha512-eUIOd4u/p9994Nkv8Avn6r/xmS7D+RNmhmu6KGROefN3myLe3JfhSdimal2wDFe/h/OUNZ/LVVKMZrya9oEfKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@mdx-js/react": "^3.0.0",
+        "@storybook/csf-plugin": "9.1.20",
+        "@storybook/icons": "^1.4.0",
+        "@storybook/react-dom-shim": "9.1.20",
+        "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "storybook": "^9.1.20"
+      }
+    },
+    "node_modules/@storybook/addon-onboarding": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-9.1.20.tgz",
+      "integrity": "sha512-YSsEEgG44doVfbNCLvihsCVMzpajcXWA0UrkpQLvT7R7uB44lvMfP7T238B+RFj8RcXaqdA+twCgZak9X6UjQw==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "storybook": "^9.1.20"
+      }
+    },
+    "node_modules/@storybook/addon-vitest": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-9.1.20.tgz",
+      "integrity": "sha512-6zN/qe9Z/7pklbUQJrnjwdTTqRG5PWy4Tyx1J90nwQq6yekj436S8/5NrvXaSns0zYNoZLsynh8nWZPweeu05w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@storybook/global": "^5.0.0",
+        "@storybook/icons": "^1.4.0",
+        "prompts": "^2.4.0",
+        "ts-dedent": "^2.2.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "@vitest/browser": "^3.0.0 || ^4.0.0",
+        "@vitest/browser-playwright": "^4.0.0",
+        "@vitest/runner": "^3.0.0 || ^4.0.0",
+        "storybook": "^9.1.20",
+        "vitest": "^3.0.0 || ^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@vitest/browser": {
+          "optional": true
+        },
+        "@vitest/browser-playwright": {
+          "optional": true
+        },
+        "@vitest/runner": {
+          "optional": true
+        },
+        "vitest": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@storybook/builder-vite": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.1.20.tgz",
+      "integrity": "sha512-cdU3Q2/wEaT8h+mApFToRiF/0hYKH1eAkD0scQn67aODgp7xnkr0YHcdA+8w0Uxd2V7U8crV/cmT/HD0ELVOGw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@storybook/csf-plugin": "9.1.20",
+        "ts-dedent": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "storybook": "^9.1.20",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
+      }
+    },
+    "node_modules/@storybook/csf-plugin": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.1.20.tgz",
+      "integrity": "sha512-HHgk50YQhML7mT01Mzf9N7lNMFHWN4HwwRP90kPT9Ct+Jhx7h3LBDbdmWjI96HwujcpY7eoYdTfpB1Sw8Z7nBQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "unplugin": "^1.3.1"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "storybook": "^9.1.20"
+      }
+    },
+    "node_modules/@storybook/global": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
+      "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@storybook/icons": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.6.0.tgz",
+      "integrity": "sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+      }
+    },
+    "node_modules/@storybook/react": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/react/-/react-9.1.20.tgz",
+      "integrity": "sha512-TJhqzggs7HCvLhTXKfx8HodnVq9YizsB2J31s9v6olU0UCxbCY+FYaCF+XdE8qUCyefGRZgHKzGBIczJ/q9e2g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@storybook/global": "^5.0.0",
+        "@storybook/react-dom-shim": "9.1.20"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "storybook": "^9.1.20",
+        "typescript": ">= 4.9.x"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@storybook/react-dom-shim": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.1.20.tgz",
+      "integrity": "sha512-UYdZavfPwHEqCKMqPssUOlyFVZiJExLxnSHwkICSZBmw3gxXJcp1aXWs7PvoZdWz2K4ztl3IcKErXXHeiY6w+A==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "storybook": "^9.1.20"
+      }
+    },
+    "node_modules/@storybook/react-vite": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-9.1.20.tgz",
+      "integrity": "sha512-buXeNvEJ9kp4FKbGYV7zW4sh/KS01EAjeq8Z6AVxaXOh4W2CIRTKM9maWGz+Rr+YyqQIq/Gl+RqNwxctpxeuHA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@joshwooding/vite-plugin-react-docgen-typescript": "0.6.1",
+        "@rollup/pluginutils": "^5.0.2",
+        "@storybook/builder-vite": "9.1.20",
+        "@storybook/react": "9.1.20",
+        "find-up": "^7.0.0",
+        "magic-string": "^0.30.0",
+        "react-docgen": "^8.0.0",
+        "resolve": "^1.22.8",
+        "tsconfig-paths": "^4.2.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+        "storybook": "^9.1.20",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
+      }
+    },
+    "node_modules/@streamdown/cjk": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@streamdown/cjk/-/cjk-1.0.3.tgz",
+      "integrity": "sha512-WRg8HR/gHbBoTgsMd91OKFUClIoDcEFVofJvluvEAyjx3KpU0aGgD9tGDqHkHj14ShoMSkX0IYetWGegTcwIJw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "remark-cjk-friendly": "^2.0.1",
+        "remark-cjk-friendly-gfm-strikethrough": "^2.0.1",
+        "unist-util-visit": "^5.0.0"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/@streamdown/code": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@streamdown/code/-/code-1.1.1.tgz",
+      "integrity": "sha512-i7HTNuDgZWb+VdrNVOam9gQhIc5MSSDXKWXgbUrn/4vSRaSMM+Rtl10MQj4wLWPNpF7p80waJsAqFP8HZfb0Jg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "shiki": "^3.19.0"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/@shikijs/core": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz",
+      "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "3.23.0",
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "@types/hast": "^3.0.4",
+        "hast-util-to-html": "^9.0.5"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/@shikijs/engine-javascript": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz",
+      "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "3.23.0",
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "oniguruma-to-es": "^4.3.4"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/@shikijs/engine-oniguruma": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz",
+      "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "3.23.0",
+        "@shikijs/vscode-textmate": "^10.0.2"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/@shikijs/langs": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz",
+      "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "3.23.0"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/@shikijs/themes": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz",
+      "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/types": "3.23.0"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/@shikijs/types": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz",
+      "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "@types/hast": "^3.0.4"
+      }
+    },
+    "node_modules/@streamdown/code/node_modules/shiki": {
+      "version": "3.23.0",
+      "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz",
+      "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==",
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/@streamdown/math": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@streamdown/math/-/math-1.0.2.tgz",
+      "integrity": "sha512-r8Ur9/lBuFnzZAFdEWrLUF2s/gRwRRRwruqltdZibyjbCBnuW7SJbFm26nXqvpJPW/gzpBUMrBVBzd88z05D5g==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "katex": "^0.16.27",
+        "rehype-katex": "^7.0.1",
+        "remark-math": "^6.0.0"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/@streamdown/mermaid": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@streamdown/mermaid/-/mermaid-1.0.2.tgz",
+      "integrity": "sha512-Fr/4sBWnAeSnxM3PcrV/+DiZe5oPMq9gOkUIAH7ZauJeuwrZ/DVzD4g0zlav6AH0axh2m/sOfrfLtY5aLT7niw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "mermaid": "^11.12.2"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/@swc/helpers": {
+      "version": "0.5.23",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
+      "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.8.0"
+      }
+    },
+    "node_modules/@tailwindcss/typography": {
+      "version": "0.5.20",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz",
+      "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "postcss-selector-parser": "6.0.10"
+      },
+      "peerDependencies": {
+        "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders"
+      }
+    },
+    "node_modules/@tanstack/react-store": {
+      "version": "0.7.7",
+      "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.7.tgz",
+      "integrity": "sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==",
+      "license": "MIT",
+      "dependencies": {
+        "@tanstack/store": "0.7.7",
+        "use-sync-external-store": "^1.5.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "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"
+      }
+    },
+    "node_modules/@tanstack/store": {
+      "version": "0.7.7",
+      "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.7.tgz",
+      "integrity": "sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      }
+    },
+    "node_modules/@testing-library/dom": {
+      "version": "10.4.1",
+      "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz",
+      "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@testing-library/jest-dom": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz",
+      "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=14",
+        "npm": ">=6",
+        "yarn": ">=1"
+      }
+    },
+    "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+      "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@testing-library/react": {
+      "version": "16.3.3",
+      "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.3.tgz",
+      "integrity": "sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.12.5"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@testing-library/dom": "^10.0.0",
+        "@types/react": "^18.0.0 || ^19.0.0",
+        "@types/react-dom": "^18.0.0 || ^19.0.0",
+        "react": "^18.0.0 || ^19.0.0",
+        "react-dom": "^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@testing-library/user-event": {
+      "version": "14.6.7",
+      "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.7.tgz",
+      "integrity": "sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12",
+        "npm": ">=6"
+      },
+      "peerDependencies": {
+        "@testing-library/dom": ">=7.21.4"
+      }
+    },
+    "node_modules/@tiptap/core": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.31.3.tgz",
+      "integrity": "sha512-Cz50pvciQrxdSxgTkHOVz0uD0Yl/8Xt0QatGD6ILm47jW8EzyHR9RkUGs/D5IqzXKuVPntfw1ttaT926vXfiRg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-blockquote": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.31.3.tgz",
+      "integrity": "sha512-fyY2XMbyDDDfOTQ1Qdrnqa1qwC9DWE4n7AfE0EKQI0G8MfLV8RaDlLDcOZDJ9JbMPY7/Gx7EjyK4NKxSW9n2hQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-bold": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.31.3.tgz",
+      "integrity": "sha512-dIuYhKk8TitKU/FeDpoTeWZhU42YgDN5npgWNjAmMmRktPdoxnH3/wGSiwXlqZgJWjehN7kPWDePWpJeAImGpQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-bubble-menu": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.31.3.tgz",
+      "integrity": "sha512-EV6ZnwKc++2OM/OcD54n8s1B7C9LP7GKAtdEPwu0t3BYJf3sG8Ueoinf7SgGPO9oMPg96GneOkDNm1urMV167g==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@floating-ui/dom": "^1.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-bullet-list": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.31.3.tgz",
+      "integrity": "sha512-qEyyoPapPef4LO8XKaN83bxtaNzkJ4kFn/IxLnEKd4BJ3Mvi4MH2yJYlyDqwFnMoev4pMA1zBHRAt/C0THRmZw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-list": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-code": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.31.3.tgz",
+      "integrity": "sha512-SzxOqchrD2AcN3uT67PjKmRFEMOU3vNNiwNaamZJUbZrI6Hmy+bvdHJrc3jrIddyyCrAtsnAfRI0cmorW1jGfg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-code-block": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.31.3.tgz",
+      "integrity": "sha512-nvknt4FhyJQjYcvxptmeUlFsIAc8ibua3E5BN4Pim374/9RWepH4cdE9X0/qUTtguHElLx0iKtSIY3rW2qGTFA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-document": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.31.3.tgz",
+      "integrity": "sha512-EexgmqnyDNyGlISxo7SMrp5MygpJYmqD+0cY5jB6L1U6L4CpKKRWUt8OO1sWzEHDE1+TTvwt+WIFoIWAziOtEA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-dropcursor": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.31.3.tgz",
+      "integrity": "sha512-NWomSfu5CSC7VacnMSDzKT8qm66SzMfZwVPEtwY5bPpRTJgTiT1rNK0neDrrzfMN27MfylGyKWWf7Q5Qf8w/fg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extensions": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-floating-menu": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.31.3.tgz",
+      "integrity": "sha512-rd4VJ9PGSP9Eop8ZTEwaLZcMzMXLuJKe3hUNf58rq+zANpwM+9fI+vB7g9MAc3eXwUNDxNDVACFIL2oeBqpQ3A==",
+      "license": "MIT",
+      "optional": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@floating-ui/dom": "^1.0.0",
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-gapcursor": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.31.3.tgz",
+      "integrity": "sha512-EBXKb1FrVStsNYCcRGtd9jmzveCvR+eqgg1rVqoONrqFK6U7bga6LN+1dMKroP1kliDVgveYkP3vRYxqw+rFqg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extensions": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-hard-break": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.31.3.tgz",
+      "integrity": "sha512-QAdCvNO4+yW9ATwsrej11NTkDYFqPLIEQr3ARNrKOK1qaiS7A0fia2SEukb/hrkP3A6mbozhoQt2r2RGUf/DpQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-heading": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.31.3.tgz",
+      "integrity": "sha512-rk5VHMAeQcg06SLauN6EGdD2jc0O2qY8QkZYPd0LxNvLblw2BxBx+lxUQSYwLAT9Ie5914gKIK2YbRyO2Ts3ig==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-highlight": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-3.31.3.tgz",
+      "integrity": "sha512-97m1nDzTAjJaJZWe5hVOBMC2rjBZvEwTXA39zhjnaE/snb8Cy4H9A3+/sw9HQJBXMoG7tdOPG9kUlM3weYtLcQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-horizontal-rule": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.31.3.tgz",
+      "integrity": "sha512-YnHGy2KShRwvCseAmmxl9VP7R0qaj8QMp3DA6DJWZqp7r5gLGvDkAqhedxqqefqsE4Y43hjkBdjtB9Ce78LkIw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-image": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.31.3.tgz",
+      "integrity": "sha512-wWNG9BOtx2Cg4vwxPVGDIJ5DGX+ETkldeoaFJLB1NXUL4OPUiVTf8cHZ+hdYgJWP704BEB7jQgjlpvdi6VigTg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-italic": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.31.3.tgz",
+      "integrity": "sha512-ibGvdvAPyfxBMUVNRI43eb9h2/Jka1MRG5GtnGqbcCX/2+Y/y0EOfFrPQPkuYphiWQYyu9+FzPKMB/pjuaLuKQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-link": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.31.3.tgz",
+      "integrity": "sha512-986wOQzTL9Zr5lf84LCLpm+YOms8A0K39/8DVoqRfebqcOe0/eq4bnztmAlfabOd+kJY92g3AgZERFUx/w+dcw==",
+      "license": "MIT",
+      "dependencies": {
+        "linkifyjs": "^4.3.3"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-list": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.31.3.tgz",
+      "integrity": "sha512-LoveGnC0FVdCV4jUNBaG1ZA+KWE07+adzV3kGy6uUYFcJEjbVUHTnPDrBOob3IwOSO3sCwIkvQb6EVYeXn/4yg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-list-item": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.31.3.tgz",
+      "integrity": "sha512-4QlKOriJJMvg95QJTEsy9BUYPBQ6UvJyb8WURRwdUtQUkkqb8h32lg/eyQUv2FzW9IT1AdUyNZfVaxH64kRfQA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-list": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-list-keymap": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.31.3.tgz",
+      "integrity": "sha512-If8UOEdDZbPJU6iYTvLtH6DOp2KBy6BKxg9UELL1AevVetGHEF/7lW8hP50Gn1tHMVpPRqmhSzVrJRpEJJgb/Q==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-list": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-mention": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-3.31.3.tgz",
+      "integrity": "sha512-ygOPc3nQijSMUTbEdMeng12P1szk3znubA9xNi84f31VnR18VjmU0we8SIOSSVwDfm1GppSjRER2qHmX/wGIIw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3",
+        "@tiptap/suggestion": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-ordered-list": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.31.3.tgz",
+      "integrity": "sha512-mp3g11NgA/PYu8rj7J7Ez3l4qBy6WfTSmHIG4PZvEGG5w2oUAIkgb9DU7nPPzjmeme27oazFYZw+AtZA0+u4tw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-list": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-paragraph": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.31.3.tgz",
+      "integrity": "sha512-+iPku7wJfy5hbNDNLX8dveFtYVsZMmh7vztjuq8hT3mipSC4IByDehDbU8fzUCjfXiEzmI7mQn7c8LGmHULuzA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-placeholder": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.31.3.tgz",
+      "integrity": "sha512-9jYtR8ELEw7GVaruyrm4oFkPcjig9Q+crc+dpmarhBNXUmxagCdlhVzNwCJ2WJRzvBAtx59sEYqNTU38Wx8S3A==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extensions": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-strike": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.31.3.tgz",
+      "integrity": "sha512-G29bhKttYwcKHT+BI6emWVFol3RO/gUXxQVcmr/iT8LXXy7j8J6HFUnsKM+Kg5YlP1rxMRgsa65dbrQVahZi0A==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-table": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.31.3.tgz",
+      "integrity": "sha512-7cnVPHhdiGGeauYqca6JVyPLTqZbqFEEk9nn2e2E8+fBo6zVtV07AktJBqth/XEzjZxcUmGxjoeuWYAisWjUHg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-table-cell": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-3.31.3.tgz",
+      "integrity": "sha512-5nueKR/p/IX6B4etWqHjyRsjNfDf6dJZaRgfw1/1l90CJe2h3tTZk4JbUKWN3Mo4FzZuYKzmU3fxcZ8pSVOeJQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-table": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-table-header": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-3.31.3.tgz",
+      "integrity": "sha512-sstVtNQiBYX4P16vlhwBYPsthxDnodHWQfGq0EUQM40Z7H796Lgh9t1qYtu8yARQuHKzvINRwJCSy6DZ8YTDtQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-table": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-table-row": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-3.31.3.tgz",
+      "integrity": "sha512-up6tDK+hYVTFDeJ3XqKO0WJqBzyXNfGxMoimo5h83jrq9dcNh0oPCOzglZ7rdo8GH9I3VJ2fNKxxU2Eg2HcMoQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-table": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-task-item": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-3.31.3.tgz",
+      "integrity": "sha512-gCWvvXsCzi9tVFXPqKlkbU81XxtIdfjGy7FM9QFRKiWAvq5uv+Q5nvwrCyMVyP4bA7zRGWFaPzwjL68djgzoBw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-list": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-task-list": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-3.31.3.tgz",
+      "integrity": "sha512-3WgVzmfEnDbmxbjUBlvTiKpT53KSBnnYhXUVQxM0nz1vpoWG8QifhsnCVsNI6TZmhgR0x/jY+UW9Hc/WLF8DkQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/extension-list": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-text": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.31.3.tgz",
+      "integrity": "sha512-gdsWtF+taeaCu6V+5Ct10fGo0ACUy1GnYtbb+mcathBt8OqbT+Ws60p/yEmKesBDz2Hn+B5IcWy6+2BBZl5ZTg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-text-style": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.31.3.tgz",
+      "integrity": "sha512-wgjWWrjZwRZHiaDTQPX2am1y/4ePgRgGWF/2MOfSb7g4d5229p4aVtbT1JT7wu9z8OC482pEqcTlhdvgftvW7A==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extension-underline": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.31.3.tgz",
+      "integrity": "sha512-HghdJaOwRqYzsAxqSyNyb+IWyOMcdCl8IoiBETA9BZCJAqdXzFLcuWp7CqCqJPam9dgkWosSoHqTCAO4nTBfpw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/extensions": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.31.3.tgz",
+      "integrity": "sha512-8sJNPGGUe8f3aDojcOW5cfVL7I5NrBbE0UWxG08qoi9Tea6qWbvQJsCR9tsrOapr/DaLr3kpbGZ9s1gEEfcNcA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tiptap/pm": {
+      "version": "3.22.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.22.3.tgz",
+      "integrity": "sha512-NjfWjZuvrqmpICT+GZWNIjtOdhPyqFKDMtQy7tsQ5rErM9L2ZQdy/+T/BKSO1JdTeBhdg9OP+0yfsqoYp2aT6A==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-changeset": "^2.3.0",
+        "prosemirror-collab": "^1.3.1",
+        "prosemirror-commands": "^1.6.2",
+        "prosemirror-dropcursor": "^1.8.1",
+        "prosemirror-gapcursor": "^1.3.2",
+        "prosemirror-history": "^1.4.1",
+        "prosemirror-inputrules": "^1.4.0",
+        "prosemirror-keymap": "^1.2.2",
+        "prosemirror-markdown": "^1.13.1",
+        "prosemirror-menu": "^1.2.4",
+        "prosemirror-model": "^1.24.1",
+        "prosemirror-schema-basic": "^1.2.3",
+        "prosemirror-schema-list": "^1.5.0",
+        "prosemirror-state": "^1.4.3",
+        "prosemirror-tables": "^1.6.4",
+        "prosemirror-trailing-node": "^3.0.0",
+        "prosemirror-transform": "^1.10.2",
+        "prosemirror-view": "^1.38.1"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      }
+    },
+    "node_modules/@tiptap/react": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.31.3.tgz",
+      "integrity": "sha512-QiwQqvaLFLm5EMFu5tg7nAgXJxCUiUTLD8EsK+TqVV5P4bqOoMOCM39khbhXTJyahCuYpiFWx5YOSDtC/JiPtg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/use-sync-external-store": "^0.0.6",
+        "fast-equals": "^5.3.3",
+        "use-sync-external-store": "^1.4.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "optionalDependencies": {
+        "@tiptap/extension-bubble-menu": "^3.31.3",
+        "@tiptap/extension-floating-menu": "^3.31.3"
+      },
+      "peerDependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3",
+        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+        "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/@tiptap/react/node_modules/@types/use-sync-external-store": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
+      "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
+      "license": "MIT"
+    },
+    "node_modules/@tiptap/starter-kit": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.31.3.tgz",
+      "integrity": "sha512-WKof9RewdmGHvWJ1wn0/HVNG2mV+HOgVRyJkKekuM9fgr6BZAAH/xZsWE1eon+94JnQ+KtK2ThydXQM/qc6b2A==",
+      "license": "MIT",
+      "dependencies": {
+        "@tiptap/core": "3.31.3",
+        "@tiptap/extension-blockquote": "3.31.3",
+        "@tiptap/extension-bold": "3.31.3",
+        "@tiptap/extension-bullet-list": "3.31.3",
+        "@tiptap/extension-code": "3.31.3",
+        "@tiptap/extension-code-block": "3.31.3",
+        "@tiptap/extension-document": "3.31.3",
+        "@tiptap/extension-dropcursor": "3.31.3",
+        "@tiptap/extension-gapcursor": "3.31.3",
+        "@tiptap/extension-hard-break": "3.31.3",
+        "@tiptap/extension-heading": "3.31.3",
+        "@tiptap/extension-horizontal-rule": "3.31.3",
+        "@tiptap/extension-italic": "3.31.3",
+        "@tiptap/extension-link": "3.31.3",
+        "@tiptap/extension-list": "3.31.3",
+        "@tiptap/extension-list-item": "3.31.3",
+        "@tiptap/extension-list-keymap": "3.31.3",
+        "@tiptap/extension-ordered-list": "3.31.3",
+        "@tiptap/extension-paragraph": "3.31.3",
+        "@tiptap/extension-strike": "3.31.3",
+        "@tiptap/extension-text": "3.31.3",
+        "@tiptap/extension-underline": "3.31.3",
+        "@tiptap/extensions": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      }
+    },
+    "node_modules/@tiptap/suggestion": {
+      "version": "3.31.3",
+      "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.31.3.tgz",
+      "integrity": "sha512-z1OQ/Yx6seMZehi1AcmNkyJ8qkHQzybArmCyRdmreS4YL9C4bPMBe5lbMfFsArYs+KD5JyHwps5j7J/YE5BIuw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/ueberdosis"
+      },
+      "peerDependencies": {
+        "@floating-ui/dom": "^1.0.0",
+        "@tiptap/core": "3.31.3",
+        "@tiptap/pm": "3.31.3"
+      }
+    },
+    "node_modules/@tokenlens/core": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@tokenlens/core/-/core-1.3.0.tgz",
+      "integrity": "sha512-d8YNHNC+q10bVpi95fELJwJyPVf1HfvBEI18eFQxRSZTdByXrP+f/ZtlhSzkx0Jl0aEmYVeBA5tPeeYRioLViQ==",
+      "license": "MIT"
+    },
+    "node_modules/@tokenlens/fetch": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@tokenlens/fetch/-/fetch-1.3.0.tgz",
+      "integrity": "sha512-RONDRmETYly9xO8XMKblmrZjKSwCva4s5ebJwQNfNlChZoA5kplPoCgnWceHnn1J1iRjLVlrCNB43ichfmGBKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@tokenlens/core": "1.3.0"
+      }
+    },
+    "node_modules/@tokenlens/helpers": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@tokenlens/helpers/-/helpers-1.3.1.tgz",
+      "integrity": "sha512-t6yL8N6ES8337E6eVSeH4hCKnPdWkZRFpupy9w5E66Q9IeqQ9IO7XQ6gh12JKjvWiRHuyyJ8MBP5I549Cr41EQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@tokenlens/core": "1.3.0",
+        "@tokenlens/fetch": "1.3.0"
+      }
+    },
+    "node_modules/@tokenlens/models": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@tokenlens/models/-/models-1.3.0.tgz",
+      "integrity": "sha512-9mx7ZGeewW4ndXAiD7AT1bbCk4OpJeortbjHHyNkgap+pMPPn1chY6R5zqe1ggXIUzZ2l8VOAKfPqOvpcrisJw==",
+      "license": "MIT",
+      "dependencies": {
+        "@tokenlens/core": "1.3.0"
+      }
+    },
+    "node_modules/@tootallnate/quickjs-emscripten": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+      "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+      "license": "MIT"
+    },
+    "node_modules/@trickfilm400/rollup-plugin-off-main-thread": {
+      "version": "3.0.0-pre1",
+      "resolved": "https://registry.npmjs.org/@trickfilm400/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-3.0.0-pre1.tgz",
+      "integrity": "sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "ejs": "^3.1.10",
+        "json5": "^2.2.3",
+        "magic-string": "^0.30.21",
+        "string.prototype.matchall": "^4.0.12"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@ts-morph/common": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz",
+      "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-glob": "^3.2.7",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^1.0.4",
+        "path-browserify": "^1.0.1"
+      }
+    },
+    "node_modules/@tybys/wasm-util": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
+      "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@types/aria-query": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+      "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/aws-lambda": {
+      "version": "8.10.163",
+      "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.163.tgz",
+      "integrity": "sha512-+4zuoEB3S8RIhimtOFT7zAEk2SbpwrKjjGl9CyYnQR6k08uynxfauIIB0pDU1ssr05F8oyGiETwpn+8eXZMqPw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/babel__core": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "node_modules/@types/babel__generator": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+      "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__template": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__traverse": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+      "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.28.2"
+      }
+    },
+    "node_modules/@types/babel__traverse/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@types/body-parser": {
+      "version": "1.19.6",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+      "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/connect": "*",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/chai": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+      "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/deep-eql": "*",
+        "assertion-error": "^2.0.1"
+      }
+    },
+    "node_modules/@types/connect": {
+      "version": "3.4.38",
+      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/cors": {
+      "version": "2.8.19",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
+      "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/d3": {
+      "version": "7.4.3",
+      "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
+      "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/d3-axis": "*",
+        "@types/d3-brush": "*",
+        "@types/d3-chord": "*",
+        "@types/d3-color": "*",
+        "@types/d3-contour": "*",
+        "@types/d3-delaunay": "*",
+        "@types/d3-dispatch": "*",
+        "@types/d3-drag": "*",
+        "@types/d3-dsv": "*",
+        "@types/d3-ease": "*",
+        "@types/d3-fetch": "*",
+        "@types/d3-force": "*",
+        "@types/d3-format": "*",
+        "@types/d3-geo": "*",
+        "@types/d3-hierarchy": "*",
+        "@types/d3-interpolate": "*",
+        "@types/d3-path": "*",
+        "@types/d3-polygon": "*",
+        "@types/d3-quadtree": "*",
+        "@types/d3-random": "*",
+        "@types/d3-scale": "*",
+        "@types/d3-scale-chromatic": "*",
+        "@types/d3-selection": "*",
+        "@types/d3-shape": "*",
+        "@types/d3-time": "*",
+        "@types/d3-time-format": "*",
+        "@types/d3-timer": "*",
+        "@types/d3-transition": "*",
+        "@types/d3-zoom": "*"
+      }
+    },
+    "node_modules/@types/d3-array": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+      "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-axis": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+      "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-brush": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+      "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-chord": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+      "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-color": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+      "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-contour": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+      "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-dispatch": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",
+      "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-drag": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
+      "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-dsv": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+      "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-ease": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+      "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-fetch": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+      "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-dsv": "*"
+      }
+    },
+    "node_modules/@types/d3-force": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
+      "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-format": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
+      "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-geo": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz",
+      "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-hierarchy": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+      "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-interpolate": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+      "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-color": "*"
+      }
+    },
+    "node_modules/@types/d3-path": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+      "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-polygon": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+      "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-quadtree": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+      "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-random": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz",
+      "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-scale": {
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+      "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-time": "*"
+      }
+    },
+    "node_modules/@types/d3-scale-chromatic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+      "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-selection": {
+      "version": "3.0.11",
+      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz",
+      "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-shape": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz",
+      "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-path": "*"
+      }
+    },
+    "node_modules/@types/d3-time": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+      "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-time-format": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+      "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-timer": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+      "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-transition": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
+      "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-zoom": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
+      "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-interpolate": "*",
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/debug": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+      "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/ms": "*"
+      }
+    },
+    "node_modules/@types/deep-eql": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+      "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/doctrine": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
+      "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/dom-mediacapture-transform": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz",
+      "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/dom-webcodecs": "*"
+      }
+    },
+    "node_modules/@types/dom-webcodecs": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz",
+      "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==",
+      "license": "MIT"
+    },
+    "node_modules/@types/dompurify": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz",
+      "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/trusted-types": "*"
+      }
+    },
+    "node_modules/@types/eslint": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+      "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "node_modules/@types/eslint-scope": {
+      "version": "3.7.7",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+      "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/estree-jsx": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+      "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "*"
+      }
+    },
+    "node_modules/@types/express": {
+      "version": "5.0.6",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz",
+      "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "^5.0.0",
+        "@types/serve-static": "^2"
+      }
+    },
+    "node_modules/@types/express-serve-static-core": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz",
+      "integrity": "sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*",
+        "@types/send": "*"
+      }
+    },
+    "node_modules/@types/fs-extra": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz",
+      "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.16",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
+      "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/hast": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+      "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/@types/http-errors": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+      "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.15",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/katex": {
+      "version": "0.16.8",
+      "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz",
+      "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/linkify-it": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+      "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+      "license": "MIT"
+    },
+    "node_modules/@types/markdown-it": {
+      "version": "14.2.0",
+      "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz",
+      "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/linkify-it": "^5",
+        "@types/mdurl": "^2"
+      }
+    },
+    "node_modules/@types/mdast": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+      "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/@types/mdurl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+      "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+      "license": "MIT"
+    },
+    "node_modules/@types/mdx": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz",
+      "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/ms": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+      "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/node": {
+      "version": "22.20.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz",
+      "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==",
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~6.21.0"
+      }
+    },
+    "node_modules/@types/papaparse": {
+      "version": "5.5.2",
+      "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.2.tgz",
+      "integrity": "sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/qs": {
+      "version": "6.15.1",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz",
+      "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/range-parser": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/react": {
+      "version": "19.2.18",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz",
+      "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "csstype": "^3.2.2"
+      }
+    },
+    "node_modules/@types/react-dom": {
+      "version": "19.2.7",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.7.tgz",
+      "integrity": "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "^19.2.0"
+      }
+    },
+    "node_modules/@types/resolve": {
+      "version": "1.20.6",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz",
+      "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/send": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
+      "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/serve-static": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz",
+      "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/http-errors": "*",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/trusted-types": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+      "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/unist": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+      "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+      "license": "MIT"
+    },
+    "node_modules/@types/use-sync-external-store": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
+      "integrity": "sha512-5dyB8nLC/qogMrlCizZnYWQTA4lnb/v+It+sqNl5YnSRAPMlIqY/X0Xn+gZw8vOL+TgTTr28VEbn3uf8fUtAkw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/uuid": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
+      "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/ws": {
+      "version": "8.18.1",
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+      "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/yauzl": {
+      "version": "2.10.3",
+      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+      "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz",
+      "integrity": "sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/regexpp": "^4.12.2",
+        "@typescript-eslint/scope-manager": "8.70.0",
+        "@typescript-eslint/type-utils": "8.70.0",
+        "@typescript-eslint/utils": "8.70.0",
+        "@typescript-eslint/visitor-keys": "8.70.0",
+        "ignore": "^7.0.5",
+        "natural-compare": "^1.4.0",
+        "ts-api-utils": "^2.5.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "@typescript-eslint/parser": "^8.70.0",
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+      "version": "7.0.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz",
+      "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/@typescript-eslint/parser": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.0.tgz",
+      "integrity": "sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/scope-manager": "8.70.0",
+        "@typescript-eslint/types": "8.70.0",
+        "@typescript-eslint/typescript-estree": "8.70.0",
+        "@typescript-eslint/visitor-keys": "8.70.0",
+        "debug": "^4.4.3"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.0.tgz",
+      "integrity": "sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/tsconfig-utils": "^8.70.0",
+        "@typescript-eslint/types": "^8.70.0",
+        "debug": "^4.4.3"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz",
+      "integrity": "sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.70.0",
+        "@typescript-eslint/visitor-keys": "8.70.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz",
+      "integrity": "sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz",
+      "integrity": "sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.70.0",
+        "@typescript-eslint/typescript-estree": "8.70.0",
+        "@typescript-eslint/utils": "8.70.0",
+        "debug": "^4.4.3",
+        "ts-api-utils": "^2.5.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.0.tgz",
+      "integrity": "sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz",
+      "integrity": "sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/project-service": "8.70.0",
+        "@typescript-eslint/tsconfig-utils": "8.70.0",
+        "@typescript-eslint/types": "8.70.0",
+        "@typescript-eslint/visitor-keys": "8.70.0",
+        "debug": "^4.4.3",
+        "minimatch": "^10.2.2",
+        "semver": "^7.7.3",
+        "tinyglobby": "^0.2.15",
+        "ts-api-utils": "^2.5.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "18 || 20 || >=22"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+      "version": "5.0.9",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+      "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^4.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+      "version": "10.2.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+      "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "brace-expansion": "^5.0.8"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@typescript-eslint/utils": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.0.tgz",
+      "integrity": "sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.9.1",
+        "@typescript-eslint/scope-manager": "8.70.0",
+        "@typescript-eslint/types": "8.70.0",
+        "@typescript-eslint/typescript-estree": "8.70.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz",
+      "integrity": "sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.70.0",
+        "eslint-visitor-keys": "^5.0.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+      "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^20.19.0 || ^22.13.0 || >=24"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@uiw/codemirror-extensions-basic-setup": {
+      "version": "4.25.11",
+      "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.11.tgz",
+      "integrity": "sha512-otyFa+n9IOYtEjaKOxPedHkj15fTPUF21wdR9pv0GpZPfuGl27cvmcv6+tognbRu9VvEcsHKE+ESoszeo3KfTw==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/autocomplete": "^6.0.0",
+        "@codemirror/commands": "^6.0.0",
+        "@codemirror/language": "^6.0.0",
+        "@codemirror/lint": "^6.0.0",
+        "@codemirror/search": "^6.0.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.0.0"
+      },
+      "funding": {
+        "url": "https://jaywcjlove.github.io/#/sponsor"
+      },
+      "peerDependencies": {
+        "@codemirror/autocomplete": ">=6.0.0",
+        "@codemirror/commands": ">=6.0.0",
+        "@codemirror/language": ">=6.0.0",
+        "@codemirror/lint": ">=6.0.0",
+        "@codemirror/search": ">=6.0.0",
+        "@codemirror/state": ">=6.0.0",
+        "@codemirror/view": ">=6.0.0"
+      }
+    },
+    "node_modules/@uiw/react-codemirror": {
+      "version": "4.25.11",
+      "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.11.tgz",
+      "integrity": "sha512-DYVFAKLX+F/4JS9N/7xexh+TICrlncwkX9HKKInrP1bwO0tSfc3k0GB6oawTYhelVKh20cX3TuRx+NJSkVXuMw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.18.6",
+        "@codemirror/commands": "^6.1.0",
+        "@codemirror/state": "^6.1.1",
+        "@codemirror/theme-one-dark": "^6.0.0",
+        "@uiw/codemirror-extensions-basic-setup": "4.25.11",
+        "codemirror": "^6.0.0"
+      },
+      "funding": {
+        "url": "https://jaywcjlove.github.io/#/sponsor"
+      },
+      "peerDependencies": {
+        "@babel/runtime": ">=7.11.0",
+        "@codemirror/state": ">=6.0.0",
+        "@codemirror/theme-one-dark": ">=6.0.0",
+        "@codemirror/view": ">=6.0.0",
+        "codemirror": ">=6.0.0",
+        "react": ">=17.0.0",
+        "react-dom": ">=17.0.0"
+      }
+    },
+    "node_modules/@ungap/structured-clone": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+      "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+      "license": "ISC"
+    },
+    "node_modules/@upsetjs/venn.js": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",
+      "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",
+      "license": "MIT",
+      "optionalDependencies": {
+        "d3-selection": "^3.0.0",
+        "d3-transition": "^3.0.1"
+      }
+    },
+    "node_modules/@vercel/blob": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/@vercel/blob/-/blob-2.8.0.tgz",
+      "integrity": "sha512-Nu+HWKpkgovCh/ezlG7wCVwF7RErTzLzZMbGKFBdGBCbTKyK+s5VXPLl+0+TpNEQPH8AVaGzOpIsXUOtkqylCQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@vercel/oidc": "^3.6.1",
+        "async-retry": "^1.3.3",
+        "is-buffer": "^2.0.5",
+        "is-node-process": "^1.2.0",
+        "throttleit": "^2.1.0",
+        "undici": "^6.23.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/@vercel/build-utils": {
+      "version": "14.2.0",
+      "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-14.2.0.tgz",
+      "integrity": "sha512-GwmtB31tBXQEzFw11grr8BKFCBdUORmYeooB0ZtonaCXZMZaPCHLBFTMFKsvaV6ZciQORPInRwXShbFvmnjqtg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "cjs-module-lexer": "1.2.3",
+        "es-module-lexer": "1.5.0"
+      }
+    },
+    "node_modules/@vercel/build-utils/node_modules/es-module-lexer": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz",
+      "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vercel/cli-config": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.4.tgz",
+      "integrity": "sha512-kZ5SojbrV06GHoU6QIWGwDXLov+s9rWZ7QqdqKfJfBGCNUieGfgaCjeeenNy8Y+QC0bwC0dZ2B4l5Hvdmrgpdw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "xdg-app-paths": "5",
+        "zod": "4.1.11"
+      }
+    },
+    "node_modules/@vercel/cli-config/node_modules/zod": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz",
+      "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    },
+    "node_modules/@vercel/cli-exec": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@vercel/cli-exec/-/cli-exec-1.0.1.tgz",
+      "integrity": "sha512-g9XerViJ/paZujufXYcu5XYI2vU2rtB4sgdpjUHde5RnOkdmpu0ngH46LCFGHoPXO/C+qDPSczIHIRN+8Q2YKQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "execa": "5.1.1"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@vercel/edge": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@vercel/edge/-/edge-1.3.3.tgz",
+      "integrity": "sha512-B4zu4g81nI1JHoOqc2FnXmh1DUpAJlZKPQsZck6iLp23kQ/zZF4ma6+Wejn8p9bKB6WPTbYPqEYrRXx4yl0qaw==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/@vercel/error-utils": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.2.1.tgz",
+      "integrity": "sha512-9DhP8jP7raLML4hGsBemxX5fXuQnu5xxMV+HjGygGbzEmVK/+KyJ3QP2Cw7PdF0uXdb9N0Qa4c3tRGH34ZX6vw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@vercel/nft": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.10.0.tgz",
+      "integrity": "sha512-iLOW4fcsgkipfOh2Bw3wB38YDfxTlxr7+j4uFeui2OswkNT28jIitS/aMce7tS0mef1YPQ8zLIDYr3a0aahNrA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@mapbox/node-pre-gyp": "^2.0.0",
+        "@rollup/pluginutils": "^5.1.3",
+        "acorn": "^8.6.0",
+        "acorn-import-attributes": "^1.9.5",
+        "async-sema": "^3.1.1",
+        "bindings": "^1.4.0",
+        "estree-walker": "2.0.2",
+        "glob": "^13.0.0",
+        "graceful-fs": "^4.2.9",
+        "node-gyp-build": "^4.2.2",
+        "picomatch": "^4.0.2",
+        "resolve-from": "^5.0.0"
+      },
+      "bin": {
+        "nft": "out/cli.js"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/@vercel/nft/node_modules/balanced-match": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "18 || 20 || >=22"
+      }
+    },
+    "node_modules/@vercel/nft/node_modules/brace-expansion": {
+      "version": "5.0.9",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+      "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^4.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/@vercel/nft/node_modules/glob": {
+      "version": "13.0.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+      "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "minimatch": "^10.2.2",
+        "minipass": "^7.1.3",
+        "path-scurry": "^2.0.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@vercel/nft/node_modules/lru-cache": {
+      "version": "11.5.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+      "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/@vercel/nft/node_modules/minimatch": {
+      "version": "10.2.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+      "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "brace-expansion": "^5.0.8"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@vercel/nft/node_modules/path-scurry": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+      "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@vercel/node": {
+      "version": "5.10.2",
+      "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.10.2.tgz",
+      "integrity": "sha512-YBXcoQVOh5O2ySXvzE+POhPEQEPMJJo4ctlMMdp5why/NIoa8m6gotv14j8Uo6D5qyZsnc+0+++JgUiV4mYB6w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@edge-runtime/node-utils": "2.3.0",
+        "@edge-runtime/primitives": "4.1.0",
+        "@edge-runtime/vm": "3.2.0",
+        "@types/node": "20.11.0",
+        "@vercel/build-utils": "14.2.0",
+        "@vercel/error-utils": "2.2.1",
+        "@vercel/nft": "1.10.0",
+        "@vercel/static-config": "3.4.1",
+        "async-listen": "3.0.0",
+        "cjs-module-lexer": "1.2.3",
+        "edge-runtime": "2.5.9",
+        "es-module-lexer": "1.4.1",
+        "esbuild": "0.27.0",
+        "etag": "1.8.1",
+        "mime-types": "2.1.35",
+        "node-fetch": "2.6.9",
+        "path-to-regexp": "6.1.0",
+        "path-to-regexp-updated": "npm:path-to-regexp@6.3.0",
+        "ts-morph": "12.0.0",
+        "tsx": "4.21.0",
+        "typescript": "npm:typescript@5.9.3",
+        "undici": "5.28.4"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@edge-runtime/primitives": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz",
+      "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@edge-runtime/vm": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz",
+      "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "dependencies": {
+        "@edge-runtime/primitives": "4.1.0"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/aix-ppc64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz",
+      "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/android-arm": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz",
+      "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/android-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz",
+      "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/android-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz",
+      "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz",
+      "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/darwin-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz",
+      "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz",
+      "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz",
+      "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-arm": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz",
+      "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz",
+      "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-ia32": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz",
+      "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-loong64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz",
+      "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz",
+      "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz",
+      "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz",
+      "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-s390x": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz",
+      "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/linux-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz",
+      "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz",
+      "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz",
+      "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz",
+      "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz",
+      "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz",
+      "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/sunos-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz",
+      "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/win32-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz",
+      "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/win32-ia32": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz",
+      "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@esbuild/win32-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz",
+      "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/@types/node": {
+      "version": "20.11.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz",
+      "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/esbuild": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz",
+      "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.27.0",
+        "@esbuild/android-arm": "0.27.0",
+        "@esbuild/android-arm64": "0.27.0",
+        "@esbuild/android-x64": "0.27.0",
+        "@esbuild/darwin-arm64": "0.27.0",
+        "@esbuild/darwin-x64": "0.27.0",
+        "@esbuild/freebsd-arm64": "0.27.0",
+        "@esbuild/freebsd-x64": "0.27.0",
+        "@esbuild/linux-arm": "0.27.0",
+        "@esbuild/linux-arm64": "0.27.0",
+        "@esbuild/linux-ia32": "0.27.0",
+        "@esbuild/linux-loong64": "0.27.0",
+        "@esbuild/linux-mips64el": "0.27.0",
+        "@esbuild/linux-ppc64": "0.27.0",
+        "@esbuild/linux-riscv64": "0.27.0",
+        "@esbuild/linux-s390x": "0.27.0",
+        "@esbuild/linux-x64": "0.27.0",
+        "@esbuild/netbsd-arm64": "0.27.0",
+        "@esbuild/netbsd-x64": "0.27.0",
+        "@esbuild/openbsd-arm64": "0.27.0",
+        "@esbuild/openbsd-x64": "0.27.0",
+        "@esbuild/openharmony-arm64": "0.27.0",
+        "@esbuild/sunos-x64": "0.27.0",
+        "@esbuild/win32-arm64": "0.27.0",
+        "@esbuild/win32-ia32": "0.27.0",
+        "@esbuild/win32-x64": "0.27.0"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/path-to-regexp": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz",
+      "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vercel/node/node_modules/tsx": {
+      "version": "4.21.0",
+      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
+      "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "~0.27.0",
+        "get-tsconfig": "^4.7.5"
+      },
+      "bin": {
+        "tsx": "dist/cli.mjs"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/undici": {
+      "version": "5.28.4",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
+      "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@fastify/busboy": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.0"
+      }
+    },
+    "node_modules/@vercel/node/node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vercel/oidc": {
+      "version": "3.8.5",
+      "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.8.5.tgz",
+      "integrity": "sha512-RwXYtnt6za+5UO4IaLywN/6B95AlLqynPRUWRJxeJ/qufwkcLUbZNUxYtzT0uMpuraWhlNcGqPNGkTnZr4BGBw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@vercel/cli-config": "0.2.4",
+        "@vercel/cli-exec": "1.0.1",
+        "jose": "^5.9.6"
+      },
+      "engines": {
+        "node": ">= 20"
+      }
+    },
+    "node_modules/@vercel/oidc/node_modules/jose": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
+      "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/@vercel/static-config": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.4.1.tgz",
+      "integrity": "sha512-kJKTyOg25JDRgDkHEkc+vWlvURxmSQkVKyRPO4EEGD/8HpJT+4u9Z/VGxwnCZ6zZBxYPpma283qBsHwY0gXjfw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "ajv": "8.6.3",
+        "json-schema-to-ts": "1.6.4",
+        "ts-morph": "12.0.0"
+      }
+    },
+    "node_modules/@vercel/static-config/node_modules/ajv": {
+      "version": "8.6.3",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz",
+      "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/@vercel/static-config/node_modules/json-schema-to-ts": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz",
+      "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/json-schema": "^7.0.6",
+        "ts-toolbelt": "^6.15.5"
+      }
+    },
+    "node_modules/@vitejs/plugin-react": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz",
+      "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rolldown/pluginutils": "^1.0.1"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "peerDependencies": {
+        "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
+        "babel-plugin-react-compiler": "^1.0.0",
+        "oxc-transform-react": "^0.145.0",
+        "vite": "^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@rolldown/plugin-babel": {
+          "optional": true
+        },
+        "babel-plugin-react-compiler": {
+          "optional": true
+        },
+        "oxc-transform-react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vitest/expect": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
+      "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/chai": "^5.2.2",
+        "@vitest/spy": "3.2.4",
+        "@vitest/utils": "3.2.4",
+        "chai": "^5.2.0",
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/mocker": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
+      "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/spy": "3.2.4",
+        "estree-walker": "^3.0.3",
+        "magic-string": "^0.30.17"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      },
+      "peerDependencies": {
+        "msw": "^2.4.9",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "msw": {
+          "optional": true
+        },
+        "vite": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vitest/mocker/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/@vitest/pretty-format": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
+      "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/runner": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz",
+      "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/utils": "3.2.7",
+        "pathe": "^2.0.3",
+        "strip-literal": "^3.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz",
+      "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/runner/node_modules/@vitest/utils": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz",
+      "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/pretty-format": "3.2.7",
+        "loupe": "^3.1.4",
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/snapshot": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz",
+      "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/pretty-format": "3.2.7",
+        "magic-string": "^0.30.17",
+        "pathe": "^2.0.3"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz",
+      "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/spy": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
+      "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tinyspy": "^4.0.3"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@vitest/utils": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
+      "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/pretty-format": "3.2.4",
+        "loupe": "^3.1.4",
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+      "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/helper-numbers": "1.13.2",
+        "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-numbers": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+      "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+        "@webassemblyjs/helper-api-error": "1.13.2",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+      "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.14.1",
+        "@webassemblyjs/helper-buffer": "1.14.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+        "@webassemblyjs/wasm-gen": "1.14.1"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+      "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+      "license": "MIT",
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+      "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+      "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.14.1",
+        "@webassemblyjs/helper-buffer": "1.14.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+        "@webassemblyjs/helper-wasm-section": "1.14.1",
+        "@webassemblyjs/wasm-gen": "1.14.1",
+        "@webassemblyjs/wasm-opt": "1.14.1",
+        "@webassemblyjs/wasm-parser": "1.14.1",
+        "@webassemblyjs/wast-printer": "1.14.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+      "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.14.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+        "@webassemblyjs/ieee754": "1.13.2",
+        "@webassemblyjs/leb128": "1.13.2",
+        "@webassemblyjs/utf8": "1.13.2"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+      "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.14.1",
+        "@webassemblyjs/helper-buffer": "1.14.1",
+        "@webassemblyjs/wasm-gen": "1.14.1",
+        "@webassemblyjs/wasm-parser": "1.14.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+      "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.14.1",
+        "@webassemblyjs/helper-api-error": "1.13.2",
+        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+        "@webassemblyjs/ieee754": "1.13.2",
+        "@webassemblyjs/leb128": "1.13.2",
+        "@webassemblyjs/utf8": "1.13.2"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+      "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.14.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@xmldom/xmldom": {
+      "version": "0.9.12",
+      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.12.tgz",
+      "integrity": "sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14.6"
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/abbrev": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
+      "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
+    "node_modules/accepts": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+      "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-types": "^3.0.0",
+        "negotiator": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/accepts/node_modules/mime-db": {
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/accepts/node_modules/mime-types": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+      "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "^1.54.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.18.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+      "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-import-attributes": {
+      "version": "1.9.5",
+      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/acorn-import-phases": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
+      "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "peerDependencies": {
+        "acorn": "^8.14.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/agent-base": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+      "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/agent-browser": {
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/agent-browser/-/agent-browser-0.26.0.tgz",
+      "integrity": "sha512-pdqSfjwbFSp+qnwlb2g23e9wXveIOfMi19xpPA9xZUbzEAUp6W4YBZj6Ybj8z4M7WkcbGDDYc+oDIHDt9R3EDQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "agent-browser": "bin/agent-browser.js"
+      }
+    },
+    "node_modules/ai": {
+      "version": "5.0.253",
+      "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.253.tgz",
+      "integrity": "sha512-Z784HqUI3GOYiK/CACH9H8A7aqf67cuUnNslS2+//TJZZzCCFuQq6L2socSkIeVGkB8kC4arThXAYl6lWOq/lQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@ai-sdk/gateway": "2.0.147",
+        "@ai-sdk/provider": "2.0.3",
+        "@ai-sdk/provider-utils": "3.0.36",
+        "@opentelemetry/api": "1.9.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "zod": "^3.25.76 || ^4.1.8"
+      }
+    },
+    "node_modules/air-datepicker": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/air-datepicker/-/air-datepicker-3.6.0.tgz",
+      "integrity": "sha512-+txUkqa949rXBJDmkQAIb/GehZECJYF4rm9XJxVYtEX22C9WvBpE/XwCUQZBopKIkpg4ycAySJ9lH3JOg9qQTw==",
+      "license": "MIT"
+    },
+    "node_modules/ajv": {
+      "version": "8.20.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+      "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3",
+        "fast-uri": "^3.0.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-formats": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+      "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^8.0.0"
+      },
+      "peerDependencies": {
+        "ajv": "^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "ajv": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3"
+      },
+      "peerDependencies": {
+        "ajv": "^8.8.2"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/ansi-styles/node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/ansi-styles/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/anymatch/node_modules/picomatch": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+      "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/arctic": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/arctic/-/arctic-1.9.2.tgz",
+      "integrity": "sha512-VTnGpYx+ypboJdNrWnK17WeD7zN/xSCHnpecd5QYsBfVZde/5i+7DJ1wrf/ioSDMiEjagXmyNWAE3V2C9f1hNg==",
+      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+      "license": "MIT",
+      "dependencies": {
+        "oslo": "1.2.0"
+      }
+    },
+    "node_modules/arctic/node_modules/oslo": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/oslo/-/oslo-1.2.0.tgz",
+      "integrity": "sha512-OoFX6rDsNcOQVAD2gQD/z03u4vEjWZLzJtwkmgfRF+KpQUXwdgEXErD7zNhyowmHwHefP+PM9Pw13pgpHMRlzw==",
+      "deprecated": "Package is no longer supported. Please see https://oslojs.dev for the successor project.",
+      "license": "MIT",
+      "dependencies": {
+        "@node-rs/argon2": "1.7.0",
+        "@node-rs/bcrypt": "1.9.0"
+      }
+    },
+    "node_modules/arg": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "license": "Python-2.0"
+    },
+    "node_modules/aria-hidden": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+      "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/aria-query": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+      "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "dequal": "^2.0.3"
+      }
+    },
+    "node_modules/array-buffer-byte-length": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+      "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "is-array-buffer": "^3.0.5"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flatmap": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+      "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/arraybuffer.prototype.slice": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+      "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/arrify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+      "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/assertion-error": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+      "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/ast-types": {
+      "version": "0.13.4",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+      "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/async": {
+      "version": "3.2.6",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/async-channel": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/async-channel/-/async-channel-0.2.0.tgz",
+      "integrity": "sha512-BJyjI/sfKlyijaBt2hbOSxT28xGNtLR0QLzAKO1Hlnv5BULY7sAoYoTPW3lfr1ZIC7y+FxabxO9T8GXpyoofGg==",
+      "license": "ISC"
+    },
+    "node_modules/async-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+      "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/async-listen": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz",
+      "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/async-retry": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
+      "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "retry": "0.13.1"
+      }
+    },
+    "node_modules/async-sema": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
+      "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "license": "MIT"
+    },
+    "node_modules/at-least-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/attr-accept": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz",
+      "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/autoprefixer": {
+      "version": "10.5.5",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.5.tgz",
+      "integrity": "sha512-uiRYvQYe/nNSzBJ7OUnd2/TZVsAdob3blml44teEpee9Cc1f4rGZFewO+JT3Wo8mgFOSzNqes4FHZn/Qz8WOuw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.28.9",
+        "caniuse-lite": "^1.0.30001810",
+        "fraction.js": "^5.3.4",
+        "picocolors": "^1.1.1",
+        "postcss-value-parser": "^4.2.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/axe-core": {
+      "version": "4.13.0",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz",
+      "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/axios": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz",
+      "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.16.0",
+        "form-data": "^4.0.6",
+        "https-proxy-agent": "^5.0.1",
+        "proxy-from-env": "^2.1.0"
+      }
+    },
+    "node_modules/axios/node_modules/agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6.0.0"
+      }
+    },
+    "node_modules/axios/node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/b4a": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz",
+      "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "react-native-b4a": "*"
+      },
+      "peerDependenciesMeta": {
+        "react-native-b4a": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs2": {
+      "version": "0.4.17",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+      "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.28.6",
+        "@babel/helper-define-polyfill-provider": "^0.6.8",
+        "semver": "^6.3.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs3": {
+      "version": "0.14.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz",
+      "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.8",
+        "core-js-compat": "^3.48.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-regenerator": {
+      "version": "0.6.8",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+      "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.8"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/bahttext": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/bahttext/-/bahttext-1.1.0.tgz",
+      "integrity": "sha512-3g7DbmCwYhLnnN5hJFB+Mtbst4q2gfXpAdqOMK6tz6FmgtlrhX1n1uhuzkIhEr+WcnFR6eRvebIE5msGuEtA7Q==",
+      "license": "MIT"
+    },
+    "node_modules/bail": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+      "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "license": "MIT"
+    },
+    "node_modules/bare-events": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz",
+      "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "bare-abort-controller": "*"
+      },
+      "peerDependenciesMeta": {
+        "bare-abort-controller": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/bare-fs": {
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.1.tgz",
+      "integrity": "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "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"
+      },
+      "engines": {
+        "bare": ">=1.28.0"
+      },
+      "peerDependencies": {
+        "bare-buffer": "*"
+      },
+      "peerDependenciesMeta": {
+        "bare-buffer": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/bare-path": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz",
+      "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/bare-stream": {
+      "version": "2.13.4",
+      "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz",
+      "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "b4a": "^1.8.1",
+        "streamx": "^2.25.0",
+        "teex": "^1.0.1"
+      },
+      "peerDependencies": {
+        "bare-abort-controller": "*",
+        "bare-buffer": "*",
+        "bare-events": "*"
+      },
+      "peerDependenciesMeta": {
+        "bare-abort-controller": {
+          "optional": true
+        },
+        "bare-buffer": {
+          "optional": true
+        },
+        "bare-events": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/bare-url": {
+      "version": "2.5.4",
+      "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.4.tgz",
+      "integrity": "sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "bare-path": "^3.0.0"
+      }
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/baseline-browser-mapping": {
+      "version": "2.11.21",
+      "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz",
+      "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==",
+      "license": "Apache-2.0",
+      "bin": {
+        "baseline-browser-mapping": "dist/cli.cjs"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/basic-ftp": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
+      "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/before-after-hook": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+      "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/bessel": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bessel/-/bessel-1.0.2.tgz",
+      "integrity": "sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/better-opn": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
+      "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "open": "^8.0.4"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/better-sqlite3": {
+      "version": "11.10.0",
+      "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz",
+      "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "dependencies": {
+        "bindings": "^1.5.0",
+        "prebuild-install": "^7.1.1"
+      }
+    },
+    "node_modules/big-integer": {
+      "version": "1.6.52",
+      "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+      "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+      "dev": true,
+      "license": "Unlicense",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/bignumber.js": {
+      "version": "9.3.1",
+      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+      "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "license": "MIT",
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "license": "MIT",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/bl/node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/body-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz",
+      "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "^3.1.2",
+        "content-type": "^2.0.0",
+        "debug": "^4.4.3",
+        "http-errors": "^2.0.1",
+        "iconv-lite": "^0.7.2",
+        "on-finished": "^2.4.1",
+        "qs": "^6.15.2",
+        "raw-body": "^3.0.2",
+        "type-is": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/body-parser/node_modules/content-type": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+      "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/body-parser/node_modules/iconv-lite": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+      "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "license": "ISC"
+    },
+    "node_modules/bottleneck": {
+      "version": "2.19.5",
+      "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
+      "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==",
+      "license": "MIT"
+    },
+    "node_modules/bowser": {
+      "version": "2.14.1",
+      "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz",
+      "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==",
+      "license": "MIT"
+    },
+    "node_modules/bplist-creator": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
+      "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "stream-buffers": "2.2.x"
+      }
+    },
+    "node_modules/bplist-parser": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
+      "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "big-integer": "1.6.x"
+      },
+      "engines": {
+        "node": ">= 5.10.0"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.18",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+      "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/brotli": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
+      "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.1.2"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.28.9",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz",
+      "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "baseline-browser-mapping": "^2.11.20",
+        "caniuse-lite": "^1.0.30001810",
+        "electron-to-chromium": "^1.5.420",
+        "node-releases": "^2.0.54",
+        "update-browserslist-db": "^1.3.2"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "node_modules/buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/buffer-equal-constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "license": "MIT"
+    },
+    "node_modules/bwip-js": {
+      "version": "4.11.4",
+      "resolved": "https://registry.npmjs.org/bwip-js/-/bwip-js-4.11.4.tgz",
+      "integrity": "sha512-FOXnOQkinxog8FwxdnPB+8k2wRqwPnqXwxX37KcXOtMNW+9CinOkGv9MtIoRC4HX/UyogT0/9lIp6FDm2DcquQ==",
+      "license": "MIT",
+      "bin": {
+        "bwip-js": "bin/bwip-js.js"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/cac": {
+      "version": "6.7.14",
+      "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+      "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+      "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001810",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
+      "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/ccount": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+      "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/chai": {
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+      "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "assertion-error": "^2.0.1",
+        "check-error": "^2.1.1",
+        "deep-eql": "^5.0.1",
+        "loupe": "^3.1.0",
+        "pathval": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "5.6.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+      "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+      "license": "MIT",
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/character-entities": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+      "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/character-entities-html4": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+      "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/character-entities-legacy": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+      "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/character-reference-invalid": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+      "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/check-error": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz",
+      "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      }
+    },
+    "node_modules/cheerio": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
+      "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+      "license": "MIT",
+      "dependencies": {
+        "cheerio-select": "^2.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.2.2",
+        "encoding-sniffer": "^0.2.1",
+        "htmlparser2": "^10.1.0",
+        "parse5": "^7.3.0",
+        "parse5-htmlparser2-tree-adapter": "^7.1.0",
+        "parse5-parser-stream": "^7.1.2",
+        "undici": "^7.19.0",
+        "whatwg-mimetype": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=20.18.1"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+      "license": "BSD-2-Clause",
+      "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"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/cheerio/node_modules/undici": {
+      "version": "7.29.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz",
+      "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.18.1"
+      }
+    },
+    "node_modules/chevrotain": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz",
+      "integrity": "sha512-9bQsXVQ7UAvzMs7iUBBJ9Yv//exOy7bIR3PByOEk4M64vIE/LsiOiX7VIkMF/vEMlrSStwsaE884Bp9CpjtC5g==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "regexp-to-ast": "0.5.0"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chokidar/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/chromatic": {
+      "version": "13.3.5",
+      "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-13.3.5.tgz",
+      "integrity": "sha512-MzPhxpl838qJUo0A55osCF2ifwPbjcIPeElr1d4SHcjnHoIcg7l1syJDrAYK/a+PcCBrOGi06jPNpQAln5hWgw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "chroma": "dist/bin.js",
+        "chromatic": "dist/bin.js",
+        "chromatic-cli": "dist/bin.js"
+      },
+      "peerDependencies": {
+        "@chromatic-com/cypress": "^0.*.* || ^1.0.0",
+        "@chromatic-com/playwright": "^0.*.* || ^1.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@chromatic-com/cypress": {
+          "optional": true
+        },
+        "@chromatic-com/playwright": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/chromium-bidi": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz",
+      "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "mitt": "^3.0.1",
+        "zod": "^3.24.1"
+      },
+      "peerDependencies": {
+        "devtools-protocol": "*"
+      }
+    },
+    "node_modules/cjs-module-lexer": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+      "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/class-variance-authority": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+      "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "clsx": "^2.1.1"
+      },
+      "funding": {
+        "url": "https://polar.sh/cva"
+      }
+    },
+    "node_modules/classnames": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+      "license": "MIT"
+    },
+    "node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/cliui/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/clsx": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+      "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/cmdk": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz",
+      "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==",
+      "license": "MIT",
+      "dependencies": {
+        "@radix-ui/react-compose-refs": "^1.1.1",
+        "@radix-ui/react-dialog": "^1.1.6",
+        "@radix-ui/react-id": "^1.1.0",
+        "@radix-ui/react-primitive": "^2.0.2"
+      },
+      "peerDependencies": {
+        "react": "^18 || ^19 || ^19.0.0-rc",
+        "react-dom": "^18 || ^19 || ^19.0.0-rc"
+      }
+    },
+    "node_modules/code-block-writer": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz",
+      "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/codemirror": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz",
+      "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==",
+      "license": "MIT",
+      "dependencies": {
+        "@codemirror/autocomplete": "^6.0.0",
+        "@codemirror/commands": "^6.0.0",
+        "@codemirror/language": "^6.0.0",
+        "@codemirror/lint": "^6.0.0",
+        "@codemirror/search": "^6.0.0",
+        "@codemirror/state": "^6.0.0",
+        "@codemirror/view": "^6.0.0"
+      }
+    },
+    "node_modules/color": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+      "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^3.1.3",
+        "color-string": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+      "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.6"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz",
+      "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.20"
+      }
+    },
+    "node_modules/color-string": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
+      "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/comma-separated-tokens": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+      "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/commander": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+      "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/common-tags": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/concat-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+      "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+      "dev": true,
+      "engines": [
+        "node >= 6.0"
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.0.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "node_modules/consola": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+      "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^14.18.0 || >=16.10.0"
+      }
+    },
+    "node_modules/content-disposition": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
+      "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/convert-hrtime": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz",
+      "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/convex": {
+      "version": "1.45.0",
+      "resolved": "https://registry.npmjs.org/convex/-/convex-1.45.0.tgz",
+      "integrity": "sha512-AV3B56Ptu/14d76g3urBJ50dwpiZa6uJaLT84OWox5aCwZIJiuAamdjv3lLHDzs8vv5kC31anEZohhUe3qJ2bA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esbuild": "0.27.0",
+        "prettier": "^3.0.0",
+        "ws": "8.21.0"
+      },
+      "bin": {
+        "convex": "bin/main.js"
+      },
+      "engines": {
+        "node": ">=20.0.0",
+        "npm": ">=7.0.0"
+      },
+      "peerDependencies": {
+        "@auth0/auth0-react": "^2.0.1",
+        "@clerk/clerk-react": "^4.12.8 || ^5.0.0",
+        "@clerk/react": "^6.4.3",
+        "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@auth0/auth0-react": {
+          "optional": true
+        },
+        "@clerk/clerk-react": {
+          "optional": true
+        },
+        "@clerk/react": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/convex-helpers": {
+      "version": "0.1.124",
+      "resolved": "https://registry.npmjs.org/convex-helpers/-/convex-helpers-0.1.124.tgz",
+      "integrity": "sha512-Gbu/jq6I3x5Y51cXP5c7+CI3t15vX5Xi2G0tOym3rxpBtYqrI+qWwxkqZgJYrHHccY42wZudB8h6kS3fak8Aeg==",
+      "license": "Apache-2.0",
+      "bin": {
+        "convex-helpers": "bin.cjs"
+      },
+      "peerDependencies": {
+        "@standard-schema/spec": "^1.0.0",
+        "convex": "^1.43.0",
+        "hono": "^4.0.5",
+        "react": "^17.0.2 || ^18.0.0 || ^19.0.0",
+        "typescript": "^5.5 || ^6.0.0 || ^7.0.0",
+        "zod": "^3.25.0 || ^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@standard-schema/spec": {
+          "optional": true
+        },
+        "hono": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/convex-test": {
+      "version": "0.0.53",
+      "resolved": "https://registry.npmjs.org/convex-test/-/convex-test-0.0.53.tgz",
+      "integrity": "sha512-bouZQTnTvZi8IHljHL++yClj1vcV+/9ZxEcd8JZz7RDxOfPkRKrkMgkk/xlX4M1EAiwcEJPNiQE7VJFvDM3lCQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "convex": "^1.32.0"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/aix-ppc64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz",
+      "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/android-arm": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz",
+      "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/android-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz",
+      "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/android-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz",
+      "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz",
+      "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/darwin-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz",
+      "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz",
+      "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz",
+      "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-arm": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz",
+      "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz",
+      "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-ia32": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz",
+      "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-loong64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz",
+      "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==",
+      "cpu": [
+        "loong64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz",
+      "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz",
+      "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz",
+      "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-s390x": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz",
+      "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==",
+      "cpu": [
+        "s390x"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/linux-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz",
+      "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz",
+      "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz",
+      "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz",
+      "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz",
+      "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz",
+      "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/sunos-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz",
+      "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/win32-arm64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz",
+      "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/win32-ia32": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz",
+      "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/@esbuild/win32-x64": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz",
+      "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/convex/node_modules/esbuild": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz",
+      "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.27.0",
+        "@esbuild/android-arm": "0.27.0",
+        "@esbuild/android-arm64": "0.27.0",
+        "@esbuild/android-x64": "0.27.0",
+        "@esbuild/darwin-arm64": "0.27.0",
+        "@esbuild/darwin-x64": "0.27.0",
+        "@esbuild/freebsd-arm64": "0.27.0",
+        "@esbuild/freebsd-x64": "0.27.0",
+        "@esbuild/linux-arm": "0.27.0",
+        "@esbuild/linux-arm64": "0.27.0",
+        "@esbuild/linux-ia32": "0.27.0",
+        "@esbuild/linux-loong64": "0.27.0",
+        "@esbuild/linux-mips64el": "0.27.0",
+        "@esbuild/linux-ppc64": "0.27.0",
+        "@esbuild/linux-riscv64": "0.27.0",
+        "@esbuild/linux-s390x": "0.27.0",
+        "@esbuild/linux-x64": "0.27.0",
+        "@esbuild/netbsd-arm64": "0.27.0",
+        "@esbuild/netbsd-x64": "0.27.0",
+        "@esbuild/openbsd-arm64": "0.27.0",
+        "@esbuild/openbsd-x64": "0.27.0",
+        "@esbuild/openharmony-arm64": "0.27.0",
+        "@esbuild/sunos-x64": "0.27.0",
+        "@esbuild/win32-arm64": "0.27.0",
+        "@esbuild/win32-ia32": "0.27.0",
+        "@esbuild/win32-x64": "0.27.0"
+      }
+    },
+    "node_modules/convex/node_modules/ws": {
+      "version": "8.21.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
+      "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/cookie": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+      "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+      "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.6.0"
+      }
+    },
+    "node_modules/core-js-compat": {
+      "version": "3.50.0",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz",
+      "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.28.7"
+      },
+      "engines": {
+        "node": ">=6.4.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+      "license": "MIT"
+    },
+    "node_modules/cors": {
+      "version": "2.8.6",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+      "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4",
+        "vary": "^1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/cose-base": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
+      "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",
+      "license": "MIT",
+      "dependencies": {
+        "layout-base": "^1.0.0"
+      }
+    },
+    "node_modules/cosmiconfig": {
+      "version": "9.0.2",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz",
+      "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "env-paths": "^2.2.1",
+        "import-fresh": "^3.3.0",
+        "js-yaml": "^4.1.0",
+        "parse-json": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/d-fischer"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.9.5"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/crelt": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz",
+      "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==",
+      "license": "MIT"
+    },
+    "node_modules/critters": {
+      "version": "0.0.25",
+      "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.25.tgz",
+      "integrity": "sha512-ROF/tjJyyRdM8/6W0VqoN5Ql05xAGnkf5b7f3sTEl1bI5jTQQf8O918RD/V9tEb9pRY/TKcvJekDbJtniHyPtQ==",
+      "deprecated": "Ownership of Critters has moved to the Nuxt team, who will be maintaining the project going forward. If you'd like to keep using Critters, please switch to the actively-maintained fork at https://github.com/danielroe/beasties",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "css-select": "^5.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.2",
+        "htmlparser2": "^8.0.2",
+        "postcss": "^8.4.23",
+        "postcss-media-query-parser": "^0.2.3"
+      }
+    },
+    "node_modules/critters/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/critters/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/critters/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/critters/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/critters/node_modules/htmlparser2": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+      "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+      "dev": true,
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1",
+        "entities": "^4.4.0"
+      }
+    },
+    "node_modules/critters/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cron-parser": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
+      "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
+      "deprecated": "v4 is no longer maintained, upgrade to v5",
+      "license": "MIT",
+      "dependencies": {
+        "luxon": "^3.2.1"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/cross-env": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz",
+      "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@epic-web/invariant": "^1.0.0",
+        "cross-spawn": "^7.0.6"
+      },
+      "bin": {
+        "cross-env": "dist/bin/cross-env.js",
+        "cross-env-shell": "dist/bin/cross-env-shell.js"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/crypto-random-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/css-loader": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz",
+      "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==",
+      "license": "MIT",
+      "dependencies": {
+        "icss-utils": "^5.1.0",
+        "postcss": "^8.4.40",
+        "postcss-modules-extract-imports": "^3.1.0",
+        "postcss-modules-local-by-default": "^4.0.5",
+        "postcss-modules-scope": "^3.2.0",
+        "postcss-modules-values": "^4.0.0",
+        "postcss-value-parser": "^4.2.0",
+        "semver": "^7.6.3"
+      },
+      "engines": {
+        "node": ">= 18.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0",
+        "webpack": "^5.27.0"
+      },
+      "peerDependenciesMeta": {
+        "@rspack/core": {
+          "optional": true
+        },
+        "webpack": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/css-select": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+      "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.1.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+      "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css.escape": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+      "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssstyle": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
+      "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@asamuzakjp/css-color": "^3.2.0",
+        "rrweb-cssom": "^0.8.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/cssstyle/node_modules/rrweb-cssom": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
+      "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/csstype": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+      "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/cytoscape": {
+      "version": "3.34.3",
+      "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.3.tgz",
+      "integrity": "sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/cytoscape-cose-bilkent": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",
+      "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cose-base": "^1.0.0"
+      },
+      "peerDependencies": {
+        "cytoscape": "^3.2.0"
+      }
+    },
+    "node_modules/cytoscape-fcose": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
+      "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cose-base": "^2.2.0"
+      },
+      "peerDependencies": {
+        "cytoscape": "^3.2.0"
+      }
+    },
+    "node_modules/cytoscape-fcose/node_modules/cose-base": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
+      "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
+      "license": "MIT",
+      "dependencies": {
+        "layout-base": "^2.0.0"
+      }
+    },
+    "node_modules/cytoscape-fcose/node_modules/layout-base": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
+      "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",
+      "license": "MIT"
+    },
+    "node_modules/d3": {
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
+      "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "3",
+        "d3-axis": "3",
+        "d3-brush": "3",
+        "d3-chord": "3",
+        "d3-color": "3",
+        "d3-contour": "4",
+        "d3-delaunay": "6",
+        "d3-dispatch": "3",
+        "d3-drag": "3",
+        "d3-dsv": "3",
+        "d3-ease": "3",
+        "d3-fetch": "3",
+        "d3-force": "3",
+        "d3-format": "3",
+        "d3-geo": "3",
+        "d3-hierarchy": "3",
+        "d3-interpolate": "3",
+        "d3-path": "3",
+        "d3-polygon": "3",
+        "d3-quadtree": "3",
+        "d3-random": "3",
+        "d3-scale": "4",
+        "d3-scale-chromatic": "3",
+        "d3-selection": "3",
+        "d3-shape": "3",
+        "d3-time": "3",
+        "d3-time-format": "4",
+        "d3-timer": "3",
+        "d3-transition": "3",
+        "d3-zoom": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-array": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+      "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+      "license": "ISC",
+      "dependencies": {
+        "internmap": "1 - 2"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-axis": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-brush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-path": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-color": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-contour": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+      "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+      "license": "ISC",
+      "dependencies": {
+        "delaunator": "5"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dispatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-drag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+      "license": "ISC",
+      "dependencies": {
+        "commander": "7",
+        "iconv-lite": "0.6",
+        "rw": "1"
+      },
+      "bin": {
+        "csv2json": "bin/dsv2json.js",
+        "csv2tsv": "bin/dsv2dsv.js",
+        "dsv2dsv": "bin/dsv2dsv.js",
+        "dsv2json": "bin/dsv2json.js",
+        "json2csv": "bin/json2dsv.js",
+        "json2dsv": "bin/json2dsv.js",
+        "json2tsv": "bin/json2dsv.js",
+        "tsv2csv": "bin/dsv2dsv.js",
+        "tsv2json": "bin/dsv2json.js"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/d3-ease": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-fetch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dsv": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-force": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-quadtree": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-format": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+      "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-geo": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
+      "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2.5.0 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-geo-projection": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz",
+      "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==",
+      "license": "ISC",
+      "dependencies": {
+        "commander": "7",
+        "d3-array": "1 - 3",
+        "d3-geo": "1.12.0 - 3"
+      },
+      "bin": {
+        "geo2svg": "bin/geo2svg.js",
+        "geograticule": "bin/geograticule.js",
+        "geoproject": "bin/geoproject.js",
+        "geoquantize": "bin/geoquantize.js",
+        "geostitch": "bin/geostitch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-geo-projection/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/d3-hierarchy": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-interpolate": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-path": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+      "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-polygon": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-quadtree": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-sankey": {
+      "version": "0.12.3",
+      "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",
+      "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "1 - 2",
+        "d3-shape": "^1.2.0"
+      }
+    },
+    "node_modules/d3-sankey/node_modules/d3-array": {
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+      "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "internmap": "^1.0.0"
+      }
+    },
+    "node_modules/d3-sankey/node_modules/d3-path": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+      "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/d3-sankey/node_modules/d3-shape": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+      "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-path": "1"
+      }
+    },
+    "node_modules/d3-sankey/node_modules/internmap": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+      "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",
+      "license": "ISC"
+    },
+    "node_modules/d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+      "license": "ISC",
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-scale-chromatic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+      "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3",
+        "d3-interpolate": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-selection": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-shape": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+      "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-path": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-time": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+      "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-time-format": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-time": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-timer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "d3-selection": "2 - 3"
+      }
+    },
+    "node_modules/d3-zoom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/dagre-d3-es": {
+      "version": "7.0.14",
+      "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",
+      "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",
+      "license": "MIT",
+      "dependencies": {
+        "d3": "^7.9.0",
+        "lodash-es": "^4.17.21"
+      }
+    },
+    "node_modules/data-uri-to-buffer": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+      "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/data-urls": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+      "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "whatwg-mimetype": "^4.0.0",
+        "whatwg-url": "^14.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/data-view-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+      "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+      "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/inspect-js"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+      "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/date-fns": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz",
+      "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/kossnocorp"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.23",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",
+      "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",
+      "license": "MIT"
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decimal.js": {
+      "version": "10.6.0",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+      "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/decimal.js-light": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
+      "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
+      "license": "MIT"
+    },
+    "node_modules/decode-named-character-reference": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+      "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+      "license": "MIT",
+      "dependencies": {
+        "character-entities": "^2.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/deep-eql": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+      "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-lazy-prop": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/degenerator": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+      "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ast-types": "^0.13.4",
+        "escodegen": "^2.1.0",
+        "esprima": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/delaunator": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",
+      "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",
+      "license": "ISC",
+      "dependencies": {
+        "robust-predicates": "^3.0.2"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/dequal": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+      "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+      "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/detect-node-es": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+      "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+      "license": "MIT"
+    },
+    "node_modules/devlop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+      "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+      "license": "MIT",
+      "dependencies": {
+        "dequal": "^2.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/devtools-protocol": {
+      "version": "0.0.1608973",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz",
+      "integrity": "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/dfa": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
+      "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==",
+      "license": "MIT"
+    },
+    "node_modules/didyoumean": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/dlv": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/docx": {
+      "version": "9.7.1",
+      "resolved": "https://registry.npmjs.org/docx/-/docx-9.7.1.tgz",
+      "integrity": "sha512-ilXFf9Moz47ABjFpDiA5s1w9lpb4EFSp7+5iiJSbfyYDM+bpZdAgLlSr7fW4aXhVe/E+F6QCv0EvRVFEd5CsWg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "^25.2.3",
+        "hash.js": "^1.1.7",
+        "jszip": "^3.10.1",
+        "nanoid": "^5.1.3",
+        "xml": "^1.0.1",
+        "xml-js": "^1.6.8"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/docx/node_modules/@types/node": {
+      "version": "25.9.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz",
+      "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==",
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": ">=7.24.0 <7.24.7"
+      }
+    },
+    "node_modules/docx/node_modules/nanoid": {
+      "version": "5.1.16",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz",
+      "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.js"
+      },
+      "engines": {
+        "node": "^18 || >=20"
+      }
+    },
+    "node_modules/docx/node_modules/undici-types": {
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
+      "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
+      "license": "MIT"
+    },
+    "node_modules/dom-accessibility-api": {
+      "version": "0.5.16",
+      "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+      "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+      "license": "MIT"
+    },
+    "node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/dompurify": {
+      "version": "3.4.15",
+      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.15.tgz",
+      "integrity": "sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==",
+      "license": "(MPL-2.0 OR Apache-2.0)",
+      "optionalDependencies": {
+        "@types/trusted-types": "^2.0.7"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+      "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/dotenv": {
+      "version": "16.6.1",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+      "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
+    "node_modules/download-stats": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/download-stats/-/download-stats-0.3.4.tgz",
+      "integrity": "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==",
+      "license": "MIT",
+      "dependencies": {
+        "JSONStream": "^1.2.1",
+        "lazy-cache": "^2.0.1",
+        "moment": "^2.15.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "license": "MIT"
+    },
+    "node_modules/ecdsa-sig-formatter": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/edge-runtime": {
+      "version": "2.5.9",
+      "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz",
+      "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "dependencies": {
+        "@edge-runtime/format": "2.2.1",
+        "@edge-runtime/ponyfill": "2.4.2",
+        "@edge-runtime/vm": "3.2.0",
+        "async-listen": "3.0.1",
+        "mri": "1.2.0",
+        "picocolors": "1.0.0",
+        "pretty-ms": "7.0.1",
+        "signal-exit": "4.0.2",
+        "time-span": "4.0.0"
+      },
+      "bin": {
+        "edge-runtime": "dist/cli/index.js"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/edge-runtime/node_modules/@edge-runtime/primitives": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz",
+      "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/edge-runtime/node_modules/@edge-runtime/vm": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz",
+      "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "dependencies": {
+        "@edge-runtime/primitives": "4.1.0"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/edge-runtime/node_modules/async-listen": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz",
+      "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/edge-runtime/node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/edge-runtime/node_modules/signal-exit": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+      "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "license": "MIT"
+    },
+    "node_modules/ejs": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+      "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.423",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.423.tgz",
+      "integrity": "sha512-rRZfTSY8ptHYMQxa+uIycJMFKmY1T0GIApNMXJYGehguTZa56TEEl19pKPCoBqk5Gpf7QizZn/jt7xur+DYxag==",
+      "license": "ISC"
+    },
+    "node_modules/elementtree": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
+      "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "sax": "1.1.4"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/embla-carousel": {
+      "version": "8.6.0",
+      "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
+      "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
+      "license": "MIT"
+    },
+    "node_modules/embla-carousel-react": {
+      "version": "8.6.0",
+      "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz",
+      "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==",
+      "license": "MIT",
+      "dependencies": {
+        "embla-carousel": "8.6.0",
+        "embla-carousel-reactive-utils": "8.6.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      }
+    },
+    "node_modules/embla-carousel-reactive-utils": {
+      "version": "8.6.0",
+      "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz",
+      "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==",
+      "license": "MIT",
+      "peerDependencies": {
+        "embla-carousel": "8.6.0"
+      }
+    },
+    "node_modules/emoji-mart": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz",
+      "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==",
+      "license": "MIT"
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/encodeurl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/encoding-sniffer": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+      "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "whatwg-encoding": "^3.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+      }
+    },
+    "node_modules/end-of-stream": {
+      "version": "1.4.5",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+      "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+      "license": "MIT",
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.24.5",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz",
+      "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.3.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/env-paths": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+      "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/error-stack-parser": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+      "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+      "license": "MIT",
+      "dependencies": {
+        "stackframe": "^1.3.4"
+      }
+    },
+    "node_modules/es-abstract": {
+      "version": "1.24.2",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
+      "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-abstract-get": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz",
+      "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.2",
+        "is-callable": "^1.2.7",
+        "object-inspect": "^1.13.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-module-lexer": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+      "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+      "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-shim-unscopables": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+      "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz",
+      "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==",
+      "license": "MIT",
+      "dependencies": {
+        "es-abstract-get": "^1.0.0",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "is-callable": "^1.2.7",
+        "is-date-object": "^1.1.0",
+        "is-symbol": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-toolkit": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz",
+      "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==",
+      "license": "MIT",
+      "workspaces": [
+        "docs",
+        "benchmarks",
+        "tests/types",
+        "tests/browser-compat"
+      ]
+    },
+    "node_modules/esbuild": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
+      "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.28.1",
+        "@esbuild/android-arm": "0.28.1",
+        "@esbuild/android-arm64": "0.28.1",
+        "@esbuild/android-x64": "0.28.1",
+        "@esbuild/darwin-arm64": "0.28.1",
+        "@esbuild/darwin-x64": "0.28.1",
+        "@esbuild/freebsd-arm64": "0.28.1",
+        "@esbuild/freebsd-x64": "0.28.1",
+        "@esbuild/linux-arm": "0.28.1",
+        "@esbuild/linux-arm64": "0.28.1",
+        "@esbuild/linux-ia32": "0.28.1",
+        "@esbuild/linux-loong64": "0.28.1",
+        "@esbuild/linux-mips64el": "0.28.1",
+        "@esbuild/linux-ppc64": "0.28.1",
+        "@esbuild/linux-riscv64": "0.28.1",
+        "@esbuild/linux-s390x": "0.28.1",
+        "@esbuild/linux-x64": "0.28.1",
+        "@esbuild/netbsd-arm64": "0.28.1",
+        "@esbuild/netbsd-x64": "0.28.1",
+        "@esbuild/openbsd-arm64": "0.28.1",
+        "@esbuild/openbsd-x64": "0.28.1",
+        "@esbuild/openharmony-arm64": "0.28.1",
+        "@esbuild/sunos-x64": "0.28.1",
+        "@esbuild/win32-arm64": "0.28.1",
+        "@esbuild/win32-ia32": "0.28.1",
+        "@esbuild/win32-x64": "0.28.1"
+      }
+    },
+    "node_modules/esbuild-register": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+      "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "peerDependencies": {
+        "esbuild": ">=0.12 <1"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/escodegen": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+      "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esprima": "^4.0.1",
+        "estraverse": "^5.2.0",
+        "esutils": "^2.0.2"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/escodegen/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "9.39.5",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz",
+      "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==",
+      "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.8.0",
+        "@eslint-community/regexpp": "^4.12.1",
+        "@eslint/config-array": "^0.21.2",
+        "@eslint/config-helpers": "^0.4.2",
+        "@eslint/core": "^0.17.0",
+        "@eslint/eslintrc": "^3.3.6",
+        "@eslint/js": "9.39.5",
+        "@eslint/plugin-kit": "^0.4.1",
+        "@humanfs/node": "^0.16.6",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@humanwhocodes/retry": "^0.4.2",
+        "@types/estree": "^1.0.6",
+        "ajv": "^6.14.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.6",
+        "debug": "^4.3.2",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
+        "esquery": "^1.5.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^8.0.0",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.5",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      },
+      "peerDependencies": {
+        "jiti": "*"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-plugin-react-hooks": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+      "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-react-refresh": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.6.tgz",
+      "integrity": "sha512-uZnh24On2bk478AkaDAKcpRiYhS3qFSaSNvpXxV6/Ek/BBDICkWGG7MnBSfjnIlCVBei5vsLlIeQYxbF22+Udg==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "eslint": "^9 || ^10"
+      }
+    },
+    "node_modules/eslint-plugin-storybook": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-9.1.20.tgz",
+      "integrity": "sha512-T7uqlzZABlOm0n36UQyyP0u7r+6/Bz5CTAvFK5n+FQPkAhba01mGovYVG61gcDeC06I0AlbZCZ0MP7MFxXAEVg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/utils": "^8.8.1"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=8",
+        "storybook": "^9.1.20"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/ajv": {
+      "version": "6.15.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+      "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/eslint/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/eslint/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/eslint/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/eslint/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/eslint/node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/eslint/node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/eslint/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/eslint/node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/esm-env": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
+      "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
+      "license": "MIT"
+    },
+    "node_modules/espree": {
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.15.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^4.2.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "license": "BSD-2-Clause",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+      "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-util-is-identifier-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+      "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eta": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/eta/-/eta-4.6.0.tgz",
+      "integrity": "sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://github.com/bgub/eta?sponsor=1"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+      "license": "MIT"
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/events-universal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+      "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "bare-events": "^2.7.0"
+      }
+    },
+    "node_modules/eventsource": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+      "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+      "license": "MIT",
+      "dependencies": {
+        "eventsource-parser": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/eventsource-parser": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz",
+      "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "license": "MIT",
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/expand-template": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+      "license": "(MIT OR WTFPL)",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/expect-type": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+      "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/express": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+      "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/express-rate-limit": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.0.tgz",
+      "integrity": "sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.3",
+        "ip-address": "^10.2.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/express-rate-limit"
+      },
+      "peerDependencies": {
+        "express": ">= 4.11"
+      }
+    },
+    "node_modules/express/node_modules/cookie": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/express/node_modules/mime-db": {
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/express/node_modules/mime-types": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+      "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "^1.54.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "license": "MIT"
+    },
+    "node_modules/extract-zip": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "debug": "^4.1.1",
+        "get-stream": "^5.1.0",
+        "yauzl": "^2.10.0"
+      },
+      "bin": {
+        "extract-zip": "cli.js"
+      },
+      "engines": {
+        "node": ">= 10.17.0"
+      },
+      "optionalDependencies": {
+        "@types/yauzl": "^2.9.1"
+      }
+    },
+    "node_modules/extract-zip/node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/fake-indexeddb": {
+      "version": "6.2.5",
+      "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.2.5.tgz",
+      "integrity": "sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/fast-content-type-parse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
+      "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "license": "MIT"
+    },
+    "node_modules/fast-equals": {
+      "version": "5.4.2",
+      "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.2.tgz",
+      "integrity": "sha512-Ywe6jodPTWOTL9/k0bV7gdfP8twKL5Y8I8CZ933fAY5gBekICZSUQTbyH6ut2NZCNyB05mSUwAuEqdEIaOOlDQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/fast-fifo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+      "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-formula-parser": {
+      "version": "1.0.19",
+      "resolved": "https://registry.npmjs.org/fast-formula-parser/-/fast-formula-parser-1.0.19.tgz",
+      "integrity": "sha512-8Roq7V1XjuYj3cWZ9tILyqBHGjS7NkejRaHxSWePu0qjIcvimZwe6WfeA9che03dgWrykZqrw691qg3lwiIkMg==",
+      "license": "MIT",
+      "dependencies": {
+        "bahttext": "^1.1.0",
+        "bessel": "^1.0.2",
+        "chevrotain": "^7.0.1",
+        "jstat": "^1.9.3"
+      }
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-glob/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fast-json-patch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
+      "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==",
+      "license": "MIT"
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-sha256": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz",
+      "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==",
+      "license": "Unlicense"
+    },
+    "node_modules/fast-uri": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz",
+      "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/fastdom": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fastdom/-/fastdom-1.0.12.tgz",
+      "integrity": "sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==",
+      "license": "MIT",
+      "dependencies": {
+        "strictdom": "^1.0.1"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.20.3",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz",
+      "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pend": "~1.2.0"
+      }
+    },
+    "node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
+      }
+    },
+    "node_modules/ffmpeg-static": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.3.0.tgz",
+      "integrity": "sha512-H+K6sW6TiIX6VGend0KQwthe+kaceeH/luE8dIZyOP35ik7ahYojDuqlTV1bOrtEwl01sy2HFNGQfi5IDJvotg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "GPL-3.0-or-later",
+      "dependencies": {
+        "@derhuerst/http-basic": "^8.2.0",
+        "env-paths": "^2.2.0",
+        "https-proxy-agent": "^5.0.0",
+        "progress": "^2.0.3"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/ffmpeg-static/node_modules/agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6.0.0"
+      }
+    },
+    "node_modules/ffmpeg-static/node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/file-selector": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz",
+      "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.7.0"
+      },
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "license": "MIT"
+    },
+    "node_modules/filelist": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz",
+      "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "minimatch": "^5.0.1"
+      }
+    },
+    "node_modules/filelist/node_modules/brace-expansion": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+      "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.9",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+      "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/filesize": {
+      "version": "10.1.6",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz",
+      "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">= 10.4.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+      "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+      "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^7.2.0",
+        "path-exists": "^5.0.0",
+        "unicorn-magic": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.4"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.4.4",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz",
+      "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+      "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/fontkit": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz",
+      "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==",
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/for-each": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+      "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-callable": "^1.2.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/foreground-child": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+      "license": "ISC",
+      "dependencies": {
+        "cross-spawn": "^7.0.6",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+      "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
+        "hasown": "^2.0.4",
+        "mime-types": "^2.1.35"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "license": "MIT",
+      "dependencies": {
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fraction.js": {
+      "version": "5.3.4",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+      "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/rawify"
+      }
+    },
+    "node_modules/fractional-indexing": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-3.4.0.tgz",
+      "integrity": "sha512-8J3glhz2rrpKG6KmI7wmJo3zH1VjeOpN+vTJSw1fOyO+Viqq3zX6/5NGh6oaZB2qIAYdOYuu5Dz9xp4faOO0Pg==",
+      "license": "CC0-1.0",
+      "engines": {
+        "node": "^14.13.1 || >=16.0.0"
+      }
+    },
+    "node_modules/framer-motion": {
+      "version": "12.43.0",
+      "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.43.0.tgz",
+      "integrity": "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g==",
+      "license": "MIT",
+      "dependencies": {
+        "motion-dom": "^12.43.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"
+      },
+      "peerDependenciesMeta": {
+        "@emotion/is-prop-valid": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+      "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+      "license": "MIT"
+    },
+    "node_modules/fs-extra": {
+      "version": "11.4.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz",
+      "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.14"
+      }
+    },
+    "node_modules/fs-monkey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
+      "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
+      "license": "Unlicense"
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/function.prototype.name": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz",
+      "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.9",
+        "call-bound": "^1.0.4",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2",
+        "hasown": "^2.0.4",
+        "is-callable": "^1.2.7",
+        "is-document.all": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gaxios": {
+      "version": "6.7.1",
+      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+      "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "extend": "^3.0.2",
+        "https-proxy-agent": "^7.0.1",
+        "is-stream": "^2.0.0",
+        "node-fetch": "^2.6.9",
+        "uuid": "^9.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/gaxios/node_modules/uuid": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "deprecated": "uuid@10 and below is no longer supported.  For ESM codebases, update to uuid@latest.  For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+      "dev": true,
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/gcp-metadata": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+      "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "gaxios": "^6.1.1",
+        "google-logging-utils": "^0.0.2",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/generator-function": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+      "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "license": "ISC",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-east-asian-width": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
+      "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-nonce": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+      "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/get-symbol-description": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+      "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-tsconfig": {
+      "version": "4.14.3",
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz",
+      "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "resolve-pkg-maps": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+      }
+    },
+    "node_modules/get-uri": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
+      "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
+      "license": "MIT",
+      "dependencies": {
+        "basic-ftp": "^5.0.2",
+        "data-uri-to-buffer": "^6.0.2",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/github-from-package": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+      "license": "MIT"
+    },
+    "node_modules/glob": {
+      "version": "10.5.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+      "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+      "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+      "license": "ISC",
+      "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"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/glob/node_modules/brace-expansion": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+      "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/glob/node_modules/minimatch": {
+      "version": "9.0.9",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+      "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/globals": {
+      "version": "15.15.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+      "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/globalthis": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.2.1",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/google-auth-library": {
+      "version": "9.15.1",
+      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+      "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "base64-js": "^1.3.0",
+        "ecdsa-sig-formatter": "^1.0.11",
+        "gaxios": "^6.1.1",
+        "gcp-metadata": "^6.1.0",
+        "gtoken": "^7.0.0",
+        "jws": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/google-logging-utils": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+      "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/googleapis": {
+      "version": "171.4.0",
+      "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-171.4.0.tgz",
+      "integrity": "sha512-xybFL2SmmUgIifgsbsRQYRdNrSAYwxWZDmkZTGjUIaRnX5jPqR8el/cEvo6rCqh7iaZx6MfEPS/lrDgZ0bymkg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "google-auth-library": "^10.2.0",
+        "googleapis-common": "^8.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis-common": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.3.tgz",
+      "integrity": "sha512-7g1yzQKx0mmNTjiK0H9dJ8eqKqDBveES9vLHeg5neb3BMQy/d1oQefIMhIpOVT8a+f+LOcixMEdRbFIW/cQUJw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "extend": "^3.0.2",
+        "gaxios": "7.1.3",
+        "google-auth-library": "10.5.0",
+        "google-logging-utils": "1.1.3",
+        "qs": "^6.7.0",
+        "url-template": "^2.0.8"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/gaxios": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
+      "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "extend": "^3.0.2",
+        "https-proxy-agent": "^7.0.1",
+        "node-fetch": "^3.3.2",
+        "rimraf": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/gcp-metadata": {
+      "version": "8.1.4",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz",
+      "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "gaxios": "7.1.3",
+        "google-logging-utils": "1.1.3",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/google-auth-library": {
+      "version": "10.5.0",
+      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz",
+      "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==",
+      "license": "Apache-2.0",
+      "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"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/google-logging-utils": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+      "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/gtoken": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz",
+      "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==",
+      "license": "MIT",
+      "dependencies": {
+        "gaxios": "^7.0.0",
+        "jws": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "license": "MIT",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
+    },
+    "node_modules/googleapis-common/node_modules/rimraf": {
+      "version": "5.0.10",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
+      "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^10.3.7"
+      },
+      "bin": {
+        "rimraf": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/googleapis/node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/googleapis/node_modules/gaxios": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.1.tgz",
+      "integrity": "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "extend": "^3.0.2",
+        "https-proxy-agent": "^7.0.1",
+        "node-fetch": "^3.3.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis/node_modules/gcp-metadata": {
+      "version": "8.1.2",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
+      "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "gaxios": "^7.0.0",
+        "google-logging-utils": "^1.0.0",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis/node_modules/google-auth-library": {
+      "version": "10.9.1",
+      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.1.tgz",
+      "integrity": "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "base64-js": "^1.3.0",
+        "ecdsa-sig-formatter": "^1.0.11",
+        "gaxios": "^7.1.4",
+        "gcp-metadata": "8.1.2",
+        "google-logging-utils": "1.1.3",
+        "jws": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/googleapis/node_modules/google-logging-utils": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+      "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/googleapis/node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "license": "MIT",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "license": "ISC"
+    },
+    "node_modules/graphology": {
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz",
+      "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==",
+      "license": "MIT",
+      "dependencies": {
+        "events": "^3.3.0"
+      },
+      "peerDependencies": {
+        "graphology-types": ">=0.24.0"
+      }
+    },
+    "node_modules/graphology-layout-forceatlas2": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/graphology-layout-forceatlas2/-/graphology-layout-forceatlas2-0.10.1.tgz",
+      "integrity": "sha512-ogzBeF1FvWzjkikrIFwxhlZXvD2+wlY54lqhsrWprcdPjopM2J9HoMweUmIgwaTvY4bUYVimpSsOdvDv1gPRFQ==",
+      "license": "MIT",
+      "dependencies": {
+        "graphology-utils": "^2.1.0"
+      },
+      "peerDependencies": {
+        "graphology-types": ">=0.19.0"
+      }
+    },
+    "node_modules/graphology-utils": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz",
+      "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "graphology-types": ">=0.23.0"
+      }
+    },
+    "node_modules/graphql": {
+      "version": "16.14.2",
+      "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz",
+      "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==",
+      "license": "MIT",
+      "engines": {
+        "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
+      }
+    },
+    "node_modules/graphql-tag": {
+      "version": "2.12.7",
+      "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.7.tgz",
+      "integrity": "sha512-xnE/NFzy+0eIesvAsREJZ284zTl/wYuBAvpsFSDhRGRdRHdnE90M21Q3xAWyYInb0J756c6x0pIQ62+vtvOs1Q==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "graphql": "^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"
+      }
+    },
+    "node_modules/gtoken": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+      "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "gaxios": "^6.0.0",
+        "jws": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/hachure-fill": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",
+      "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",
+      "license": "MIT"
+    },
+    "node_modules/has-bigints": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+      "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+      "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+      "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/hast-util-embedded": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz",
+      "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-is-element": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-format": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz",
+      "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-from-dom": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz",
+      "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==",
+      "license": "ISC",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hastscript": "^9.0.0",
+        "web-namespaces": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-from-html": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz",
+      "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-from-html-isomorphic": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz",
+      "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-from-dom": "^5.0.0",
+        "hast-util-from-html": "^2.0.0",
+        "unist-util-remove-position": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-from-parse5": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+      "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-has-property": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz",
+      "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-is-body-ok-link": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz",
+      "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-is-element": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+      "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-minify-whitespace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz",
+      "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-parse-selector": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+      "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-phrasing": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz",
+      "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-raw": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+      "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-sanitize": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz",
+      "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@ungap/structured-clone": "^1.0.0",
+        "unist-util-position": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-html": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+      "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-jsx-runtime": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+      "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-mdast": {
+      "version": "10.1.2",
+      "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz",
+      "integrity": "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/mdast": "^4.0.0",
+        "@ungap/structured-clone": "^1.0.0",
+        "hast-util-phrasing": "^3.0.0",
+        "hast-util-to-html": "^9.0.0",
+        "hast-util-to-text": "^4.0.0",
+        "hast-util-whitespace": "^3.0.0",
+        "mdast-util-phrasing": "^4.0.0",
+        "mdast-util-to-hast": "^13.0.0",
+        "mdast-util-to-string": "^4.0.0",
+        "rehype-minify-whitespace": "^6.0.0",
+        "trim-trailing-lines": "^2.0.0",
+        "unist-util-position": "^5.0.0",
+        "unist-util-visit": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-parse5": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
+      "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-text": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+      "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-whitespace": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+      "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hastscript": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+      "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/helmet": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.3.0.tgz",
+      "integrity": "sha512-Qgpiaws3Sm30Av8Eah6sjMCZZwjlBu+E68rhpCWBshY1lb09HtLwj5GviX0OyQIn+ulUS0iX0AxN5n3tLZzz1w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/EvanHahn"
+      }
+    },
+    "node_modules/hono": {
+      "version": "4.13.7",
+      "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.7.tgz",
+      "integrity": "sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.9.0"
+      }
+    },
+    "node_modules/hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/html-encoding-sniffer": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+      "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "whatwg-encoding": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/html-entities": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+      "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/mdevils"
+        },
+        {
+          "type": "patreon",
+          "url": "https://patreon.com/mdevils"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/html-to-text": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz",
+      "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==",
+      "license": "MIT",
+      "dependencies": {
+        "@selderee/plugin-htmlparser2": "^0.11.0",
+        "deepmerge": "^4.3.1",
+        "dom-serializer": "^2.0.0",
+        "htmlparser2": "^8.0.2",
+        "selderee": "^0.11.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/html-to-text/node_modules/htmlparser2": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+      "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1",
+        "entities": "^4.4.0"
+      }
+    },
+    "node_modules/html-url-attributes": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+      "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/html-void-elements": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+      "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/html-whitespace-sensitive-tag-names": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz",
+      "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/htmlparser2": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
+      "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.2.2",
+        "entities": "^7.0.1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/entities": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+      "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+      "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~2.0.0",
+        "inherits": "~2.0.4",
+        "setprototypeof": "~1.2.0",
+        "statuses": "~2.0.2",
+        "toidentifier": "~1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/http-proxy-agent": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+      "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "^7.1.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/http-response-object": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+      "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "^10.0.3"
+      }
+    },
+    "node_modules/http-response-object/node_modules/@types/node": {
+      "version": "10.17.60",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+      "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/https-proxy-agent": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "^7.1.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+      "license": "ISC",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/idb": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+      "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/imagetools-core": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/imagetools-core/-/imagetools-core-9.1.0.tgz",
+      "integrity": "sha512-xQjs+2vrxLnAjCq+omuNkd5UQTld9/bP8+YT0LyYTlKfuSQtgUBvqhUwGugzSAh6sCdN+LnROMuLswn5hZ9Fhg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+      "license": "MIT"
+    },
+    "node_modules/immer": {
+      "version": "11.1.18",
+      "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.18.tgz",
+      "integrity": "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/immer"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/import-fresh/node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-meta-resolve": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+      "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "license": "ISC"
+    },
+    "node_modules/ini": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+      "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/inline-style-parser": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+      "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+      "license": "MIT"
+    },
+    "node_modules/internal-slot": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+      "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.2",
+        "side-channel": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/internmap": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/ip-address": {
+      "version": "10.7.0",
+      "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz",
+      "integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-alphabetical": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+      "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-alphanumerical": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+      "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+      "license": "MIT",
+      "dependencies": {
+        "is-alphabetical": "^2.0.0",
+        "is-decimal": "^2.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-array-buffer": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+      "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-async-function": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+      "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-bigint": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+      "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+      "license": "MIT",
+      "dependencies": {
+        "has-bigints": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-boolean-object": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+      "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-buffer": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.16.2",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+      "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-data-view": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+      "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-decimal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+      "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-document.all": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz",
+      "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-finalizationregistry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+      "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-generator-function": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+      "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-hexadecimal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+      "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-map": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-negative-zero": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-network-error": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz",
+      "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-node-process": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
+      "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-number-object": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+      "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "license": "MIT",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-potential-custom-element-name": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-promise": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+      "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+      "license": "MIT"
+    },
+    "node_modules/is-regex": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-set": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-shared-array-buffer": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+      "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-string": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+      "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+      "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "safe-regex-test": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+      "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+      "license": "MIT",
+      "dependencies": {
+        "which-typed-array": "^1.1.16"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakmap": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakref": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+      "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakset": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+      "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "license": "MIT"
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "license": "ISC"
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/isomorphic.js": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz",
+      "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==",
+      "license": "MIT",
+      "funding": {
+        "type": "GitHub Sponsors ❤",
+        "url": "https://github.com/sponsors/dmonad"
+      }
+    },
+    "node_modules/jackspeak": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/jake": {
+      "version": "10.9.4",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+      "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "async": "^3.2.6",
+        "filelist": "^1.0.4",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/jiti": {
+      "version": "1.21.7",
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+      "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jiti": "bin/jiti.js"
+      }
+    },
+    "node_modules/jose": {
+      "version": "6.2.12",
+      "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz",
+      "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/js-tiktoken": {
+      "version": "1.0.21",
+      "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz",
+      "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==",
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.5.1"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "license": "MIT"
+    },
+    "node_modules/js-yaml": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+      "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/puzrin"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/nodeca"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsdom": {
+      "version": "25.0.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz",
+      "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssstyle": "^4.1.0",
+        "data-urls": "^5.0.0",
+        "decimal.js": "^10.4.3",
+        "form-data": "^4.0.0",
+        "html-encoding-sniffer": "^4.0.0",
+        "http-proxy-agent": "^7.0.2",
+        "https-proxy-agent": "^7.0.5",
+        "is-potential-custom-element-name": "^1.0.1",
+        "nwsapi": "^2.2.12",
+        "parse5": "^7.1.2",
+        "rrweb-cssom": "^0.7.1",
+        "saxes": "^6.0.0",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^5.0.0",
+        "w3c-xmlserializer": "^5.0.0",
+        "webidl-conversions": "^7.0.0",
+        "whatwg-encoding": "^3.1.1",
+        "whatwg-mimetype": "^4.0.0",
+        "whatwg-url": "^14.0.0",
+        "ws": "^8.18.0",
+        "xml-name-validator": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "canvas": "^2.11.2"
+      },
+      "peerDependenciesMeta": {
+        "canvas": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/json-bigint": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+      "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+      "license": "MIT",
+      "dependencies": {
+        "bignumber.js": "^9.0.0"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "license": "MIT"
+    },
+    "node_modules/json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "license": "(AFL-2.1 OR BSD-3-Clause)"
+    },
+    "node_modules/json-schema-to-ts": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz",
+      "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.18.3",
+        "ts-algebra": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "license": "MIT"
+    },
+    "node_modules/json-schema-typed": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
+      "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stringify-pretty-compact": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz",
+      "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==",
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+      "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+      "engines": [
+        "node >= 0.2.0"
+      ],
+      "license": "MIT"
+    },
+    "node_modules/jsonpointer": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+      "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+      "license": "(MIT OR Apache-2.0)",
+      "dependencies": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      },
+      "bin": {
+        "JSONStream": "bin.js"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/jstat": {
+      "version": "1.9.6",
+      "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
+      "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
+    },
+    "node_modules/jszip": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+      "license": "(MIT OR GPL-3.0-or-later)",
+      "dependencies": {
+        "lie": "~3.3.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "^1.0.5"
+      }
+    },
+    "node_modules/jszip/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "license": "MIT"
+    },
+    "node_modules/jszip/node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "license": "(MIT AND Zlib)"
+    },
+    "node_modules/jszip/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/jszip/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "license": "MIT"
+    },
+    "node_modules/jszip/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/jwa": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+      "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+      "license": "MIT",
+      "dependencies": {
+        "buffer-equal-constant-time": "^1.0.1",
+        "ecdsa-sig-formatter": "1.0.11",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/jws": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+      "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+      "license": "MIT",
+      "dependencies": {
+        "jwa": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/jwt-decode": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+      "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/katex": {
+      "version": "0.16.47",
+      "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",
+      "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",
+      "funding": [
+        "https://opencollective.com/katex",
+        "https://github.com/sponsors/katex"
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "commander": "^8.3.0"
+      },
+      "bin": {
+        "katex": "cli.js"
+      }
+    },
+    "node_modules/katex/node_modules/commander": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+      "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/khroma": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
+      "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/kleur": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/langsmith": {
+      "version": "0.10.2",
+      "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.10.2.tgz",
+      "integrity": "sha512-9iqIcEPBMlRT+vvijcjCo4AeHlJHUZjxwbPtDdvQPpGgvo7nYxhsQ7jVd53zXkPstiPfjRhexfnIe0vLltVFmg==",
+      "license": "MIT",
+      "dependencies": {
+        "p-queue": "6.6.2"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "*",
+        "@opentelemetry/exporter-trace-otlp-proto": "*",
+        "@opentelemetry/sdk-trace-base": "*",
+        "openai": "*",
+        "ws": ">=7"
+      },
+      "peerDependenciesMeta": {
+        "@opentelemetry/api": {
+          "optional": true
+        },
+        "@opentelemetry/exporter-trace-otlp-proto": {
+          "optional": true
+        },
+        "@opentelemetry/sdk-trace-base": {
+          "optional": true
+        },
+        "openai": {
+          "optional": true
+        },
+        "ws": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/layout-base": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",
+      "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",
+      "license": "MIT"
+    },
+    "node_modules/lazy-cache": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+      "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==",
+      "license": "MIT",
+      "dependencies": {
+        "set-getter": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/leac": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz",
+      "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://ko-fi.com/killymxi"
+      }
+    },
+    "node_modules/leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/lexical": {
+      "version": "0.43.0",
+      "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.43.0.tgz",
+      "integrity": "sha512-waSeXyt1HxTFpU8KNRA3IQcvjvpw0lZNaSbGopfOi4bLV0FF9zYpqiScTnEUMP/b1W7qWmD4Z2Detw43XICxqQ==",
+      "license": "MIT"
+    },
+    "node_modules/lib0": {
+      "version": "0.2.117",
+      "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz",
+      "integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==",
+      "license": "MIT",
+      "dependencies": {
+        "isomorphic.js": "^0.2.4"
+      },
+      "bin": {
+        "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js",
+        "0gentesthtml": "bin/gentesthtml.js",
+        "0serve": "bin/0serve.js"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "type": "GitHub Sponsors ❤",
+        "url": "https://github.com/sponsors/dmonad"
+      }
+    },
+    "node_modules/lie": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+      "license": "MIT",
+      "dependencies": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "node_modules/lightningcss": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+      "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "dependencies": {
+        "detect-libc": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "lightningcss-android-arm64": "1.33.0",
+        "lightningcss-darwin-arm64": "1.33.0",
+        "lightningcss-darwin-x64": "1.33.0",
+        "lightningcss-freebsd-x64": "1.33.0",
+        "lightningcss-linux-arm-gnueabihf": "1.33.0",
+        "lightningcss-linux-arm64-gnu": "1.33.0",
+        "lightningcss-linux-arm64-musl": "1.33.0",
+        "lightningcss-linux-x64-gnu": "1.33.0",
+        "lightningcss-linux-x64-musl": "1.33.0",
+        "lightningcss-win32-arm64-msvc": "1.33.0",
+        "lightningcss-win32-x64-msvc": "1.33.0"
+      }
+    },
+    "node_modules/lightningcss-android-arm64": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+      "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-darwin-arm64": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+      "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-darwin-x64": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+      "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-freebsd-x64": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+      "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm-gnueabihf": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+      "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm64-gnu": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+      "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm64-musl": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+      "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-x64-gnu": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+      "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-x64-musl": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+      "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-win32-arm64-msvc": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+      "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-win32-x64-msvc": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+      "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lilconfig": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+      "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/linkify-it": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz",
+      "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/puzrin"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/markdown-it"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "uc.micro": "^2.0.0"
+      }
+    },
+    "node_modules/linkifyjs": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.3.tgz",
+      "integrity": "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==",
+      "license": "MIT"
+    },
+    "node_modules/linkup-sdk": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/linkup-sdk/-/linkup-sdk-2.7.0.tgz",
+      "integrity": "sha512-X/EvibI045zDY+n5SRNlKmmo7rCf9B/krAvuf4Jj6axatIPwufq8LqEi49ScVmgNBMp68wTB19gETK+jPzfl3A==",
+      "license": "MIT",
+      "dependencies": {
+        "axios": "^1.8.2",
+        "zod": "^3.24.1",
+        "zod-to-json-schema": "^3.24.1"
+      },
+      "engines": {
+        "node": ">=20.19.0"
+      }
+    },
+    "node_modules/load-json-file": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+      "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^4.0.0",
+        "pify": "^3.0.0",
+        "strip-bom": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/load-json-file/node_modules/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz",
+      "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.11.5"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+      "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^6.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash-es": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
+      "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
+      "license": "MIT"
+    },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "license": "MIT"
+    },
+    "node_modules/lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+      "license": "MIT"
+    },
+    "node_modules/long": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
+      "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/longest-streak": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+      "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/loupe": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+      "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lru-cache": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+      "license": "ISC"
+    },
+    "node_modules/lucia": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/lucia/-/lucia-3.2.2.tgz",
+      "integrity": "sha512-P1FlFBGCMPMXu+EGdVD9W4Mjm0DqsusmKgO7Xc33mI5X1bklmsQb0hfzPhXomQr9waWIBDsiOjvr1e6BTaUqpA==",
+      "deprecated": "This package has been deprecated. Please see https://lucia-auth.com/lucia-v3/migrate.",
+      "license": "MIT",
+      "dependencies": {
+        "@oslojs/crypto": "^1.0.1",
+        "@oslojs/encoding": "^1.1.0"
+      }
+    },
+    "node_modules/lucide": {
+      "version": "0.577.0",
+      "resolved": "https://registry.npmjs.org/lucide/-/lucide-0.577.0.tgz",
+      "integrity": "sha512-PpC/m5eOItp/WU/GlQPFBXDOhq6HibL73KzYP37OX3LM7VmzWQF8voEj8QRWUFvy9FIKfeDQkWYoyS1D/MdWFA==",
+      "license": "ISC"
+    },
+    "node_modules/lucide-react": {
+      "version": "0.515.0",
+      "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.515.0.tgz",
+      "integrity": "sha512-Sy7bY0MeicRm2pzrnoHm2h6C1iVoeHyBU2fjdQDsXGP51fhkhau1/ZV/dzrcxEmAKsxYb6bGaIsMnGHuQ5s0dw==",
+      "license": "ISC",
+      "peerDependencies": {
+        "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/luxon": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
+      "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/lz-string": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+      "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+      "license": "MIT",
+      "bin": {
+        "lz-string": "bin/bin.js"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.21",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+      "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.5"
+      }
+    },
+    "node_modules/markdown-it": {
+      "version": "14.3.1",
+      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.1.tgz",
+      "integrity": "sha512-4Ej49aYTDFIQ+uBkfX8GBvJGccoARxxPep+7aWTs55ozbjQJpW9M26Fe53vnGgvLeVzva/amzjQQaQu9w0vMhA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/puzrin"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/markdown-it"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1",
+        "entities": "^4.5.0",
+        "linkify-it": "^5.0.2",
+        "mdurl": "^2.0.0",
+        "punycode.js": "^2.3.1",
+        "uc.micro": "^2.1.0"
+      },
+      "bin": {
+        "markdown-it": "bin/markdown-it.mjs"
+      }
+    },
+    "node_modules/markdown-table": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+      "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/marked": {
+      "version": "16.4.2",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",
+      "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",
+      "license": "MIT",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 20"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/mdast-util-find-and-replace": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+      "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/mdast-util-from-markdown": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+      "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-gfm": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+      "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-gfm-autolink-literal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+      "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-gfm-footnote": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+      "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-gfm-strikethrough": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+      "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-gfm-table": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+      "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-gfm-task-list-item": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+      "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-math": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz",
+      "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "longest-streak": "^3.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "mdast-util-to-markdown": "^2.1.0",
+        "unist-util-remove-position": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-mdx-expression": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+      "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-mdx-jsx": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+      "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-mdxjs-esm": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+      "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-phrasing": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+      "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "unist-util-is": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-to-hast": {
+      "version": "13.2.1",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+      "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-to-markdown": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+      "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-to-markdown-cjk-friendly": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown-cjk-friendly/-/mdast-util-to-markdown-cjk-friendly-1.0.0.tgz",
+      "integrity": "sha512-BoaAm8mlJ+LAYz0Qs532Y3ciTuQYgBUPZcSFbvC/ZKmEMAKgulw84YvQK1gI34t/vL2euSfuaWlqczkTBgamkw==",
+      "license": "MIT",
+      "dependencies": {
+        "mdast-util-to-markdown": "^2.1.2",
+        "micromark-extension-cjk-friendly-util": "3.0.1",
+        "micromark-util-symbol": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/mdast": "*"
+      },
+      "peerDependenciesMeta": {
+        "@types/mdast": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mdast-util-to-markdown-cjk-friendly-gfm-strikethrough": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown-cjk-friendly-gfm-strikethrough/-/mdast-util-to-markdown-cjk-friendly-gfm-strikethrough-1.0.0.tgz",
+      "integrity": "sha512-1ePVfB4P/vz3xSsm6H3D32r6VYGErxclnuLLFK02/2ReF+UdEKm7caulK6Vm0LBIp5gPRtB2Z1OYDznCkX3k2w==",
+      "license": "MIT",
+      "dependencies": {
+        "mdast-util-gfm-strikethrough": "^2.0.0",
+        "mdast-util-to-markdown": "^2.1.2",
+        "micromark-extension-cjk-friendly-util": "3.0.1",
+        "micromark-util-symbol": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/mdast": "*"
+      },
+      "peerDependenciesMeta": {
+        "@types/mdast": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mdast-util-to-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+      "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdurl": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz",
+      "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==",
+      "license": "MIT"
+    },
+    "node_modules/media-typer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz",
+      "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/mediabunny": {
+      "version": "1.50.3",
+      "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.50.3.tgz",
+      "integrity": "sha512-lw6NjC6++/p6MzHC3u7RbkpM0dnukEQcAAXzZwXlmmx9y8n6132DXUMer2WaNn8RPuGgUpnemi/QIVNpEnONhQ==",
+      "license": "MPL-2.0",
+      "workspaces": [
+        ".",
+        "packages/*"
+      ],
+      "dependencies": {
+        "@types/dom-mediacapture-transform": "^0.1.11",
+        "@types/dom-webcodecs": "0.1.13"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/Vanilagy"
+      }
+    },
+    "node_modules/memfs": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz",
+      "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==",
+      "license": "Unlicense",
+      "dependencies": {
+        "fs-monkey": "1.0.3"
+      },
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/memfs-browser": {
+      "version": "3.5.10302",
+      "resolved": "https://registry.npmjs.org/memfs-browser/-/memfs-browser-3.5.10302.tgz",
+      "integrity": "sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==",
+      "license": "Unlicense",
+      "optional": true,
+      "dependencies": {
+        "memfs": "3.5.3"
+      }
+    },
+    "node_modules/memfs-browser/node_modules/fs-monkey": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
+      "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
+      "license": "Unlicense",
+      "optional": true
+    },
+    "node_modules/memfs-browser/node_modules/memfs": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+      "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+      "license": "Unlicense",
+      "optional": true,
+      "dependencies": {
+        "fs-monkey": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/memoize-one": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+      "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+      "license": "MIT"
+    },
+    "node_modules/memorystream": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+      "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+      "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "license": "MIT"
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/mermaid": {
+      "version": "11.17.2",
+      "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.17.2.tgz",
+      "integrity": "sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==",
+      "license": "MIT",
+      "dependencies": {
+        "@braintree/sanitize-url": "^7.1.2",
+        "@iconify/utils": "^3.0.2",
+        "@mermaid-js/parser": "^1.2.1",
+        "@types/d3": "^7.4.3",
+        "@upsetjs/venn.js": "^2.0.0",
+        "cytoscape": "^3.34.0",
+        "cytoscape-cose-bilkent": "^4.1.0",
+        "cytoscape-fcose": "^2.2.0",
+        "d3": "^7.9.0",
+        "d3-sankey": "^0.12.3",
+        "dagre-d3-es": "7.0.14",
+        "dayjs": "^1.11.21",
+        "dompurify": "^3.3.3",
+        "es-toolkit": "^1.45.1",
+        "fastdom": "1.0.12",
+        "katex": "^0.16.47",
+        "khroma": "^2.1.0",
+        "marked": "^16.3.0",
+        "roughjs": "^4.6.6",
+        "stylis": "^4.3.6",
+        "ts-dedent": "^2.2.0",
+        "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0"
+      }
+    },
+    "node_modules/micromark": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+      "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/micromark-core-commonmark": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+      "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/micromark-extension-cjk-friendly": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly/-/micromark-extension-cjk-friendly-2.0.1.tgz",
+      "integrity": "sha512-OkzoYVTL1ChbvQ8Cc1ayTIz7paFQz8iS9oIYmewncweUSwmWR+hkJF9spJ1lxB90XldJl26A1F4IkPOKS3bDXw==",
+      "license": "MIT",
+      "dependencies": {
+        "devlop": "^1.1.0",
+        "micromark-extension-cjk-friendly-util": "3.0.1",
+        "micromark-util-chunked": "^2.0.1",
+        "micromark-util-resolve-all": "^2.0.1",
+        "micromark-util-symbol": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "micromark": "^4.0.0",
+        "micromark-util-types": "^2.0.0"
+      },
+      "peerDependenciesMeta": {
+        "micromark-util-types": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/micromark-extension-cjk-friendly-gfm-strikethrough": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly-gfm-strikethrough/-/micromark-extension-cjk-friendly-gfm-strikethrough-2.0.1.tgz",
+      "integrity": "sha512-wVC0zwjJNqQeX+bb07YTPu/CvSAyCTafyYb7sMhX1r62/Lw5M/df3JyYaANyp8g15c1ypJRFSsookTqA1IDsUg==",
+      "license": "MIT",
+      "dependencies": {
+        "devlop": "^1.1.0",
+        "get-east-asian-width": "^1.4.0",
+        "micromark-extension-cjk-friendly-util": "3.0.1",
+        "micromark-util-character": "^2.1.1",
+        "micromark-util-chunked": "^2.0.1",
+        "micromark-util-resolve-all": "^2.0.1",
+        "micromark-util-symbol": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "micromark": "^4.0.0",
+        "micromark-util-types": "^2.0.0"
+      },
+      "peerDependenciesMeta": {
+        "micromark-util-types": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/micromark-extension-cjk-friendly-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly-util/-/micromark-extension-cjk-friendly-util-3.0.1.tgz",
+      "integrity": "sha512-GcbXqTTHOsiZHyF753oIddP/J2eH8j9zpyQPhkof6B2JNxfEJabnQqxbCgzJNuNes0Y2jTNJ3LiYPSXr6eJA8w==",
+      "license": "MIT",
+      "dependencies": {
+        "get-east-asian-width": "^1.4.0",
+        "micromark-util-character": "^2.1.1",
+        "micromark-util-symbol": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependenciesMeta": {
+        "micromark-util-types": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/micromark-extension-gfm": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+      "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-gfm-autolink-literal": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+      "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-gfm-footnote": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+      "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-gfm-strikethrough": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+      "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-gfm-table": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+      "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-gfm-tagfilter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+      "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-types": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-gfm-task-list-item": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+      "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-extension-math": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz",
+      "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/katex": "^0.16.0",
+        "devlop": "^1.0.0",
+        "katex": "^0.16.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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/micromark-factory-destination": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+      "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-factory-label": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+      "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "devlop": "^1.0.0",
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-factory-space": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+      "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-factory-title": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+      "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/micromark-factory-whitespace": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+      "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/micromark-util-character": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+      "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-chunked": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+      "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-symbol": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-classify-character": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+      "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-combine-extensions": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+      "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-chunked": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-decode-numeric-character-reference": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+      "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-symbol": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-decode-string": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+      "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "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"
+      }
+    },
+    "node_modules/micromark-util-encode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+      "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/micromark-util-html-tag-name": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+      "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/micromark-util-normalize-identifier": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+      "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-symbol": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-resolve-all": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+      "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-sanitize-uri": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+      "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "micromark-util-character": "^2.0.0",
+        "micromark-util-encode": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-subtokenize": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+      "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "devlop": "^1.0.0",
+        "micromark-util-chunked": "^2.0.0",
+        "micromark-util-symbol": "^2.0.0",
+        "micromark-util-types": "^2.0.0"
+      }
+    },
+    "node_modules/micromark-util-symbol": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+      "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/micromark-util-types": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+      "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+      "funding": [
+        {
+          "type": "GitHub Sponsors",
+          "url": "https://github.com/sponsors/unifiedjs"
+        },
+        {
+          "type": "OpenCollective",
+          "url": "https://opencollective.com/unified"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/micromatch/node_modules/picomatch": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+      "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/min-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "license": "ISC"
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+      "license": "MIT"
+    },
+    "node_modules/minipass": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+      "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+      "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+      "license": "MIT"
+    },
+    "node_modules/moment": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/motion": {
+      "version": "12.43.0",
+      "resolved": "https://registry.npmjs.org/motion/-/motion-12.43.0.tgz",
+      "integrity": "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "framer-motion": "^12.43.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"
+      },
+      "peerDependenciesMeta": {
+        "@emotion/is-prop-valid": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/motion-dom": {
+      "version": "12.43.0",
+      "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.43.0.tgz",
+      "integrity": "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag==",
+      "license": "MIT",
+      "dependencies": {
+        "motion-utils": "^12.39.0"
+      }
+    },
+    "node_modules/motion-utils": {
+      "version": "12.39.0",
+      "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz",
+      "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==",
+      "license": "MIT"
+    },
+    "node_modules/mri": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+      "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "license": "MIT"
+    },
+    "node_modules/mustache": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+      "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+      "license": "MIT",
+      "bin": {
+        "mustache": "bin/mustache"
+      }
+    },
+    "node_modules/mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "node_modules/nano": {
+      "version": "10.1.4",
+      "resolved": "https://registry.npmjs.org/nano/-/nano-10.1.4.tgz",
+      "integrity": "sha512-bJOFIPLExIbF6mljnfExXX9Cub4W0puhDjVMp+qV40xl/DBvgKao7St4+6/GB6EoHZap7eFnrnx4mnp5KYgwJA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "axios": "^1.7.4",
+        "node-abort-controller": "^3.1.1",
+        "qs": "^6.13.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-6.0.1.tgz",
+      "integrity": "sha512-3wVS3i51pE2pi1k5FFL/95BGfVS0kSsvDVuGXHOtxox/TywUmtgq+3qiTOTbs9J7KfHaXPiN171k/A6dBnaXFw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.js"
+      },
+      "engines": {
+        "node": "^22 || ^24 || >=26"
+      }
+    },
+    "node_modules/napi-build-utils": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+      "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+      "license": "MIT"
+    },
+    "node_modules/native-run": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz",
+      "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/utils-fs": "^3.1.7",
+        "@ionic/utils-terminal": "^2.3.4",
+        "bplist-parser": "^0.3.2",
+        "debug": "^4.3.4",
+        "elementtree": "^0.1.7",
+        "ini": "^4.1.1",
+        "plist": "^3.1.0",
+        "split2": "^4.2.0",
+        "through2": "^4.0.2",
+        "tslib": "^2.6.2",
+        "yauzl": "^2.10.0"
+      },
+      "bin": {
+        "native-run": "bin/native-run"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/negotiator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz",
+      "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==",
+      "license": "MIT",
+      "dependencies": {
+        "content-type": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/negotiator/node_modules/content-type": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+      "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "license": "MIT"
+    },
+    "node_modules/netmask": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz",
+      "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/node-abi": {
+      "version": "3.96.0",
+      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.96.0.tgz",
+      "integrity": "sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg==",
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-abort-controller": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+      "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
+      "license": "MIT"
+    },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "deprecated": "Use your platform's native DOMException instead",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.5.0"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
+      "license": "MIT",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-fetch/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+      "license": "MIT"
+    },
+    "node_modules/node-fetch/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/node-fetch/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "license": "MIT",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/node-gyp-build": {
+      "version": "4.8.4",
+      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
+      "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "node-gyp-build": "bin.js",
+        "node-gyp-build-optional": "optional.js",
+        "node-gyp-build-test": "build-test.js"
+      }
+    },
+    "node_modules/node-html-better-parser": {
+      "version": "1.5.9",
+      "resolved": "https://registry.npmjs.org/node-html-better-parser/-/node-html-better-parser-1.5.9.tgz",
+      "integrity": "sha512-z1I5UINMezJXYL9cH3h0a9KBth2G978gSLlfkpQ+CQzzVHVQy9gpARgm9eDsz1O4gn1HtgUqjdAIYxKFZm6uHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "html-entities": "^2.3.2"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.54",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
+      "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/nopt": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+      "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "abbrev": "^3.0.0"
+      },
+      "bin": {
+        "nopt": "bin/nopt.js"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
+    "node_modules/normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "node_modules/normalize-package-data/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-api": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/npm-api/-/npm-api-1.0.1.tgz",
+      "integrity": "sha512-4sITrrzEbPcr0aNV28QyOmgn6C9yKiF8k92jn4buYAK8wmA5xo1qL3II5/gT1r7wxbXBflSduZ2K3FbtOrtGkA==",
+      "license": "MIT",
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "download-stats": "^0.3.4",
+        "JSONStream": "^1.3.5",
+        "moment": "^2.24.0",
+        "node-fetch": "^2.6.0",
+        "paged-request": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10.0"
+      }
+    },
+    "node_modules/npm-run-all": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+      "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "chalk": "^2.4.1",
+        "cross-spawn": "^6.0.5",
+        "memorystream": "^0.3.1",
+        "minimatch": "^3.0.4",
+        "pidtree": "^0.3.0",
+        "read-pkg": "^3.0.0",
+        "shell-quote": "^1.6.1",
+        "string.prototype.padend": "^3.0.0"
+      },
+      "bin": {
+        "npm-run-all": "bin/npm-run-all/index.js",
+        "run-p": "bin/run-p/index.js",
+        "run-s": "bin/run-s/index.js"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/cross-spawn": {
+      "version": "6.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+      "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      },
+      "engines": {
+        "node": ">=4.8"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/npm-run-all/node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/number-flow": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/number-flow/-/number-flow-0.6.2.tgz",
+      "integrity": "sha512-MCnImG4Q5vPwhSXnov56nOuyyKn6LC+Qd7II1UiKc+ACRtug5iAtn0+CwXNxM38AC5lSowEY+oYEtZX2qMnUyw==",
+      "license": "MIT",
+      "dependencies": {
+        "esm-env": "^1.1.4"
+      }
+    },
+    "node_modules/nwsapi": {
+      "version": "2.2.27",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.27.tgz",
+      "integrity": "sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/oauth4webapi": {
+      "version": "3.8.8",
+      "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.8.tgz",
+      "integrity": "sha512-8N28E+a/oxfXWBgOMt+ZP/JUf/XR+IFbvkAEPP3gznXOMv9BpAAwiIj0TFNz3tGTPc0ZQ8zmWBNgN1nAys0gng==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-hash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.7",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+      "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/octokit": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/octokit/-/octokit-4.1.4.tgz",
+      "integrity": "sha512-cRvxRte6FU3vAHRC9+PMSY3D+mRAs2Rd9emMoqp70UGRvJRM3sbAoim2IXRZNNsf8wVfn4sGxVBHRAP+JBVX/g==",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/app": "^15.1.6",
+        "@octokit/core": "^6.1.5",
+        "@octokit/oauth-app": "^7.1.6",
+        "@octokit/plugin-paginate-graphql": "^5.2.4",
+        "@octokit/plugin-paginate-rest": "^12.0.0",
+        "@octokit/plugin-rest-endpoint-methods": "^14.0.0",
+        "@octokit/plugin-retry": "^7.2.1",
+        "@octokit/plugin-throttling": "^10.0.0",
+        "@octokit/request-error": "^6.1.8",
+        "@octokit/types": "^14.0.0",
+        "@octokit/webhooks": "^13.8.3"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "license": "MIT",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "license": "MIT",
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/oniguruma-parser": {
+      "version": "0.12.2",
+      "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+      "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+      "license": "MIT"
+    },
+    "node_modules/oniguruma-to-es": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+      "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+      "license": "MIT",
+      "dependencies": {
+        "oniguruma-parser": "^0.12.2",
+        "regex": "^6.1.0",
+        "regex-recursion": "^6.0.2"
+      }
+    },
+    "node_modules/open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "license": "MIT",
+      "dependencies": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/openai": {
+      "version": "5.23.2",
+      "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz",
+      "integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==",
+      "license": "Apache-2.0",
+      "bin": {
+        "openai": "bin/cli"
+      },
+      "peerDependencies": {
+        "ws": "^8.18.0",
+        "zod": "^3.23.8"
+      },
+      "peerDependenciesMeta": {
+        "ws": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/orderedmap": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",
+      "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==",
+      "license": "MIT"
+    },
+    "node_modules/os-paths": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz",
+      "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6.0"
+      }
+    },
+    "node_modules/oslo": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/oslo/-/oslo-1.2.1.tgz",
+      "integrity": "sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==",
+      "deprecated": "Package is no longer supported. Please see https://oslojs.dev for the successor project.",
+      "license": "MIT",
+      "dependencies": {
+        "@node-rs/argon2": "1.7.0",
+        "@node-rs/bcrypt": "1.9.0"
+      }
+    },
+    "node_modules/own-keys": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz",
+      "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.4",
+        "get-intrinsic": "^1.3.0",
+        "object-keys": "^1.1.1",
+        "safe-push-apply": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz",
+      "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==",
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+      "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^4.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate/node_modules/p-limit": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+      "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^1.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-queue": {
+      "version": "6.6.2",
+      "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+      "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+      "license": "MIT",
+      "dependencies": {
+        "eventemitter3": "^4.0.4",
+        "p-timeout": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-retry": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+      "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/retry": "0.12.0",
+        "retry": "^0.13.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-timeout": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+      "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+      "license": "MIT",
+      "dependencies": {
+        "p-finally": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pac-proxy-agent": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+      "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
+      "license": "MIT",
+      "dependencies": {
+        "@tootallnate/quickjs-emscripten": "^0.23.0",
+        "agent-base": "^7.1.2",
+        "debug": "^4.3.4",
+        "get-uri": "^6.0.1",
+        "http-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.6",
+        "pac-resolver": "^7.0.1",
+        "socks-proxy-agent": "^8.0.5"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-resolver": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+      "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+      "license": "MIT",
+      "dependencies": {
+        "degenerator": "^5.0.0",
+        "netmask": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/package-json-from-dist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+      "license": "BlueOak-1.0.0"
+    },
+    "node_modules/package-manager-detector": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",
+      "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",
+      "license": "MIT"
+    },
+    "node_modules/paged-request": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/paged-request/-/paged-request-2.0.2.tgz",
+      "integrity": "sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag==",
+      "license": "MIT",
+      "dependencies": {
+        "axios": "^0.21.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/paged-request/node_modules/axios": {
+      "version": "0.33.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.33.0.tgz",
+      "integrity": "sha512-juz19g7B3UWT9r3+tgRFQf2Bdy6IKDVroiyuVOUrkILVKHpqHL++K1l8ybvfdEP9B/VE72vk8vllbnedVCm/og==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.4",
+        "form-data": "^4.0.4",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/paged-request/node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "license": "MIT"
+    },
+    "node_modules/pako": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz",
+      "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/puzrin"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/nodeca"
+        }
+      ],
+      "license": "(MIT AND Zlib)"
+    },
+    "node_modules/papaparse": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.7.0.tgz",
+      "integrity": "sha512-qBGxg/7Q3Kl9Wfhrz2Z74UnvnHTXLNG6jmKJFeBvP2+y4lV7So+7SR62+Zd47JvdrCkX+nDcnr0ObPzek/+6RA==",
+      "license": "MIT"
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-cache-control": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+      "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
+      "dev": true
+    },
+    "node_modules/parse-entities": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+      "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/parse-entities/node_modules/@types/unist": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+      "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+      "license": "MIT"
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parse-ms": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
+      "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+      "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+      "license": "MIT",
+      "dependencies": {
+        "entities": "^6.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+      "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+      "license": "MIT",
+      "dependencies": {
+        "domhandler": "^5.0.3",
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-parser-stream": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+      "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+      "license": "MIT",
+      "dependencies": {
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5/node_modules/entities": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+      "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/parseley": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz",
+      "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==",
+      "license": "MIT",
+      "dependencies": {
+        "leac": "^0.6.0",
+        "peberminta": "^0.9.0"
+      },
+      "funding": {
+        "url": "https://ko-fi.com/killymxi"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/partial-json": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz",
+      "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==",
+      "license": "MIT"
+    },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/path-data-parser": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",
+      "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",
+      "license": "MIT"
+    },
+    "node_modules/path-exists": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+      "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/path-scurry": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-to-regexp": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+      "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+      "license": "MIT"
+    },
+    "node_modules/path-to-regexp-updated": {
+      "name": "path-to-regexp",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+      "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pify": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pathe": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/pathval": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+      "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14.16"
+      }
+    },
+    "node_modules/peberminta": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz",
+      "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://ko-fi.com/killymxi"
+      }
+    },
+    "node_modules/pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+      "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pidtree": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+      "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "pidtree": "bin/pidtree.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pirates": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+      "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/pkce-challenge": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
+      "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.20.0"
+      }
+    },
+    "node_modules/playwright": {
+      "version": "1.63.0",
+      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz",
+      "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "playwright-core": "1.63.0"
+      },
+      "bin": {
+        "playwright": "cli.js"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/playwright-core": {
+      "version": "1.63.0",
+      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz",
+      "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "playwright-core": "cli.js"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/plist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz",
+      "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@xmldom/xmldom": "^0.9.10",
+        "base64-js": "^1.5.1",
+        "xmlbuilder": "^15.1.1"
+      },
+      "engines": {
+        "node": ">=10.4.0"
+      }
+    },
+    "node_modules/points-on-curve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",
+      "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",
+      "license": "MIT"
+    },
+    "node_modules/points-on-path": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",
+      "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",
+      "license": "MIT",
+      "dependencies": {
+        "path-data-parser": "0.1.0",
+        "points-on-curve": "0.2.0"
+      }
+    },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+      "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.5.28",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
+      "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.18",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-import": {
+      "version": "15.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+      "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.0.0"
+      }
+    },
+    "node_modules/postcss-js": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
+      "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "camelcase-css": "^2.0.1"
+      },
+      "engines": {
+        "node": "^12 || ^14 || >= 16"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.21"
+      }
+    },
+    "node_modules/postcss-load-config": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+      "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "lilconfig": "^3.1.1"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "jiti": ">=1.21.0",
+        "postcss": ">=8.0.9",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        },
+        "postcss": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/postcss-media-query-parser": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+      "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/postcss-modules-extract-imports": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+      "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+      "license": "ISC",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-local-by-default": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+      "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+      "license": "MIT",
+      "dependencies": {
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^7.0.0",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz",
+      "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-modules-scope": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+      "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+      "license": "ISC",
+      "dependencies": {
+        "postcss-selector-parser": "^7.0.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz",
+      "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "license": "ISC",
+      "dependencies": {
+        "icss-utils": "^5.0.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-nested": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+      "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "postcss-selector-parser": "^6.1.1"
+      },
+      "engines": {
+        "node": ">=12.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.14"
+      }
+    },
+    "node_modules/postcss-nested/node_modules/postcss-selector-parser": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
+      "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.0.10",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "license": "MIT"
+    },
+    "node_modules/postcss/node_modules/nanoid": {
+      "version": "3.3.18",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
+      "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/preact": {
+      "version": "10.24.3",
+      "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz",
+      "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/preact"
+      }
+    },
+    "node_modules/preact-render-to-string": {
+      "version": "6.5.11",
+      "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz",
+      "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "preact": ">=10"
+      }
+    },
+    "node_modules/prebuild-install": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+      "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+      "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
+      "license": "MIT",
+      "dependencies": {
+        "detect-libc": "^2.0.0",
+        "expand-template": "^2.0.3",
+        "github-from-package": "0.0.0",
+        "minimist": "^1.2.3",
+        "mkdirp-classic": "^0.5.3",
+        "napi-build-utils": "^2.0.0",
+        "node-abi": "^3.3.0",
+        "pump": "^3.0.0",
+        "rc": "^1.2.7",
+        "simple-get": "^4.0.0",
+        "tar-fs": "^2.0.0",
+        "tunnel-agent": "^0.6.0"
+      },
+      "bin": {
+        "prebuild-install": "bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prettier": {
+      "version": "3.9.6",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz",
+      "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==",
+      "license": "MIT",
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/pretty-bytes": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz",
+      "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pretty-format": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+      "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^17.0.1"
+      },
+      "engines": {
+        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+      }
+    },
+    "node_modules/pretty-format/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/pretty-ms": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz",
+      "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parse-ms": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/prismjs": {
+      "version": "1.30.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+      "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "license": "MIT"
+    },
+    "node_modules/progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+      "license": "MIT",
+      "dependencies": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/prompts/node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "node_modules/prop-types/node_modules/react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "license": "MIT"
+    },
+    "node_modules/property-information": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+      "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/prosemirror-changeset": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.2.tgz",
+      "integrity": "sha512-ViYrjMSg3YFiXwIhKaluu+/mi3Yrxt6AR8ri14ulTaGcZtXO1CThl7A2gv79qx5fQnOw8woKwyBU2u+9PVCm3w==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-transform": "^1.0.0"
+      }
+    },
+    "node_modules/prosemirror-collab": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz",
+      "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-state": "^1.0.0"
+      }
+    },
+    "node_modules/prosemirror-commands": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.2.tgz",
+      "integrity": "sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.10.2"
+      }
+    },
+    "node_modules/prosemirror-dropcursor": {
+      "version": "1.8.3",
+      "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.3.tgz",
+      "integrity": "sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.1.0",
+        "prosemirror-view": "^1.1.0"
+      }
+    },
+    "node_modules/prosemirror-gapcursor": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz",
+      "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-keymap": "^1.0.0",
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-view": "^1.0.0"
+      }
+    },
+    "node_modules/prosemirror-highlight": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npmjs.org/prosemirror-highlight/-/prosemirror-highlight-0.15.3.tgz",
+      "integrity": "sha512-WVV2st0fX1w2TkAgmTmdbj77BlWYuLfW4BGXPo8JfIWsSly5xYcfID8QJQL+GT8kisMRuu4jgT6JAqj1DOwvvg==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ocavue"
+      },
+      "peerDependencies": {
+        "@lezer/common": "^1.0.0",
+        "@lezer/highlight": "^1.0.0",
+        "@shikijs/types": "^1.29.2 || ^2.0.0 || ^3.0.0 || ^4.0.0",
+        "@types/hast": "^3.0.0",
+        "highlight.js": "^11.9.0",
+        "lowlight": "^3.1.0",
+        "prosemirror-model": "^1.19.3",
+        "prosemirror-state": "^1.4.3",
+        "prosemirror-transform": "^1.8.0",
+        "prosemirror-view": "^1.32.4",
+        "refractor": "^5.0.0",
+        "sugar-high": "^0.6.1 || ^0.7.0 || ^0.8.0 || ^0.9.0 || ^1.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@lezer/common": {
+          "optional": true
+        },
+        "@lezer/highlight": {
+          "optional": true
+        },
+        "@shikijs/types": {
+          "optional": true
+        },
+        "@types/hast": {
+          "optional": true
+        },
+        "highlight.js": {
+          "optional": true
+        },
+        "lowlight": {
+          "optional": true
+        },
+        "prosemirror-model": {
+          "optional": true
+        },
+        "prosemirror-state": {
+          "optional": true
+        },
+        "prosemirror-transform": {
+          "optional": true
+        },
+        "prosemirror-view": {
+          "optional": true
+        },
+        "refractor": {
+          "optional": true
+        },
+        "sugar-high": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/prosemirror-history": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz",
+      "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-state": "^1.2.2",
+        "prosemirror-transform": "^1.0.0",
+        "prosemirror-view": "^1.31.0",
+        "rope-sequence": "^1.3.0"
+      }
+    },
+    "node_modules/prosemirror-inputrules": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz",
+      "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.0.0"
+      }
+    },
+    "node_modules/prosemirror-keymap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz",
+      "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-state": "^1.0.0",
+        "w3c-keyname": "^2.2.0"
+      }
+    },
+    "node_modules/prosemirror-markdown": {
+      "version": "1.13.7",
+      "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.7.tgz",
+      "integrity": "sha512-NV57Oxe3fXR+bNGXS5XW4sKt/XGIyY3n0eHVUoJORcismeF4FFMpLBnl0YESy2BvJQHloexX+9P+zT3VqFj/CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/markdown-it": "^14.0.0",
+        "markdown-it": "^14.0.0",
+        "prosemirror-model": "^1.25.0"
+      }
+    },
+    "node_modules/prosemirror-menu": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.3.2.tgz",
+      "integrity": "sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg==",
+      "license": "MIT",
+      "dependencies": {
+        "crelt": "^1.0.0",
+        "prosemirror-commands": "^1.0.0",
+        "prosemirror-history": "^1.0.0",
+        "prosemirror-state": "^1.0.0"
+      }
+    },
+    "node_modules/prosemirror-model": {
+      "version": "1.25.11",
+      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.11.tgz",
+      "integrity": "sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==",
+      "license": "MIT",
+      "dependencies": {
+        "orderedmap": "^2.0.0"
+      }
+    },
+    "node_modules/prosemirror-schema-basic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz",
+      "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-model": "^1.25.0"
+      }
+    },
+    "node_modules/prosemirror-schema-list": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz",
+      "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.7.3"
+      }
+    },
+    "node_modules/prosemirror-state": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz",
+      "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-transform": "^1.0.0",
+        "prosemirror-view": "^1.27.0"
+      }
+    },
+    "node_modules/prosemirror-tables": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz",
+      "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-keymap": "^1.2.3",
+        "prosemirror-model": "^1.25.4",
+        "prosemirror-state": "^1.4.4",
+        "prosemirror-transform": "^1.10.5",
+        "prosemirror-view": "^1.41.4"
+      }
+    },
+    "node_modules/prosemirror-trailing-node": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz",
+      "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@remirror/core-constants": "3.0.0",
+        "escape-string-regexp": "^4.0.0"
+      },
+      "peerDependencies": {
+        "prosemirror-model": "^1.22.1",
+        "prosemirror-state": "^1.4.2",
+        "prosemirror-view": "^1.33.8"
+      }
+    },
+    "node_modules/prosemirror-transform": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.1.tgz",
+      "integrity": "sha512-t4F5615FycnCqsX7ShTUs8+jfnwcf46kuFRvSl/3qFx2QTZ4DjgowesLHQXcFP7G//TjesqZG3WtgL7vdyVJyA==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-model": "^1.21.0"
+      }
+    },
+    "node_modules/prosemirror-view": {
+      "version": "1.42.3",
+      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.3.tgz",
+      "integrity": "sha512-oTN7EtH+CpwxU9NrwEYWd0UZ4JUx7l048l5A2Xppm4p/60isZYLnth9QVQmC3VRIvdrIWCxwZSd+Uz791G31/w==",
+      "license": "MIT",
+      "dependencies": {
+        "prosemirror-model": "^1.25.8",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.1.0"
+      }
+    },
+    "node_modules/protobufjs": {
+      "version": "7.6.6",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.6.tgz",
+      "integrity": "sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==",
+      "hasInstallScript": true,
+      "license": "BSD-3-Clause",
+      "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/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.1",
+        "@types/node": ">=13.7.0",
+        "long": "^5.3.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "license": "MIT",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/proxy-agent": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+      "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "^7.1.2",
+        "debug": "^4.3.4",
+        "http-proxy-agent": "^7.0.1",
+        "https-proxy-agent": "^7.0.6",
+        "lru-cache": "^7.14.1",
+        "pac-proxy-agent": "^7.1.0",
+        "proxy-from-env": "^1.1.0",
+        "socks-proxy-agent": "^8.0.5"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "license": "MIT"
+    },
+    "node_modules/proxy-from-env": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+      "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/pump": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+      "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
+      "license": "MIT",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/punycode.js": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+      "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/puppeteer": {
+      "version": "24.43.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.43.1.tgz",
+      "integrity": "sha512-/FSOViCrqRdb1HDocpsM9Z1giA71gTQPUt3SpHGVRALKAy/rJr1fLFYZW9F23qPxqVxTHQnbh/5B5opJST3kAw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@puppeteer/browsers": "2.13.2",
+        "chromium-bidi": "14.0.0",
+        "cosmiconfig": "^9.0.0",
+        "devtools-protocol": "0.0.1608973",
+        "puppeteer-core": "24.43.1",
+        "typed-query-selector": "^2.12.2"
+      },
+      "bin": {
+        "puppeteer": "lib/cjs/puppeteer/node/cli.js"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/puppeteer-core": {
+      "version": "24.43.1",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.43.1.tgz",
+      "integrity": "sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@puppeteer/browsers": "2.13.2",
+        "chromium-bidi": "14.0.0",
+        "debug": "^4.4.3",
+        "devtools-protocol": "0.0.1608973",
+        "typed-query-selector": "^2.12.2",
+        "webdriver-bidi-protocol": "0.4.1",
+        "ws": "^8.20.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.16.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz",
+      "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "es-define-property": "^1.0.1",
+        "side-channel": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/range-parser": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz",
+      "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+      "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "~3.1.2",
+        "http-errors": "~2.0.1",
+        "iconv-lite": "~0.7.0",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/raw-body/node_modules/iconv-lite": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+      "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+      "dependencies": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "bin": {
+        "rc": "cli.js"
+      }
+    },
+    "node_modules/rc/node_modules/ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "license": "ISC"
+    },
+    "node_modules/rc/node_modules/strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react": {
+      "version": "19.2.8",
+      "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
+      "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-docgen": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.3.tgz",
+      "integrity": "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.28.0",
+        "@babel/traverse": "^7.28.0",
+        "@babel/types": "^7.28.2",
+        "@types/babel__core": "^7.20.5",
+        "@types/babel__traverse": "^7.20.7",
+        "@types/doctrine": "^0.0.9",
+        "@types/resolve": "^1.20.2",
+        "doctrine": "^3.0.0",
+        "resolve": "^1.22.1",
+        "strip-indent": "^4.0.0"
+      },
+      "engines": {
+        "node": "^20.9.0 || >=22"
+      }
+    },
+    "node_modules/react-docgen-typescript": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz",
+      "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "typescript": ">= 4.3.x"
+      }
+    },
+    "node_modules/react-docgen/node_modules/@babel/types": {
+      "version": "7.29.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+      "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "19.2.8",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
+      "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+      "license": "MIT",
+      "dependencies": {
+        "scheduler": "^0.27.0"
+      },
+      "peerDependencies": {
+        "react": "^19.2.8"
+      }
+    },
+    "node_modules/react-draggable": {
+      "version": "4.7.1",
+      "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.1.tgz",
+      "integrity": "sha512-wa3tzfFnYt3yaZLuyU58fl1TNunfWfBekDgWhZA1+gb2jnp42wZ0ymuopR6M5kqDYmm4hKmzGlcKWjZf3Zb6RQ==",
+      "license": "MIT",
+      "dependencies": {
+        "clsx": "^2.1.1",
+        "prop-types": "^15.8.1"
+      },
+      "peerDependencies": {
+        "react": ">= 16.3.0",
+        "react-dom": ">= 16.3.0"
+      }
+    },
+    "node_modules/react-dropzone": {
+      "version": "14.4.1",
+      "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.4.1.tgz",
+      "integrity": "sha512-QDuV76v3uKbHiH34SpwifZ+gOLi1+RdsCO1kl5vxMT4wW8R82+sthjvBw4th3NHF/XX6FBsqDYZVNN+pnhaw0g==",
+      "license": "MIT",
+      "dependencies": {
+        "attr-accept": "^2.2.4",
+        "file-selector": "^2.1.0",
+        "prop-types": "^15.8.1"
+      },
+      "engines": {
+        "node": ">= 10.13"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8 || 18.0.0"
+      }
+    },
+    "node_modules/react-error-boundary": {
+      "version": "6.1.5",
+      "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-6.1.5.tgz",
+      "integrity": "sha512-l2nk+KhgM6e79tAiHEs3tXTdiTW4ARniKYMQN+cLY5vQFpDOkxuXKIC4uIwYuIKoMpFQ6jEbQz9wBArUmq7GWA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "^18.0.0 || ^19.0.0",
+        "react": "^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-grid-layout": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.5.4.tgz",
+      "integrity": "sha512-AyScMfqhgRfie9ECXddQeaYmTuNlomDj9SIryF/+vtiwXS6IsxX3cI6CCWbSRXqbAePHW397nPxvnekO5gViPg==",
+      "license": "MIT",
+      "dependencies": {
+        "clsx": "^2.1.1",
+        "fast-equals": "^4.0.3",
+        "prop-types": "^15.8.1",
+        "react-draggable": "^4.4.6",
+        "react-resizable": "^3.0.5",
+        "resize-observer-polyfill": "^1.5.1"
+      },
+      "peerDependencies": {
+        "react": ">= 16.3.0",
+        "react-dom": ">= 16.3.0"
+      }
+    },
+    "node_modules/react-grid-layout/node_modules/fast-equals": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz",
+      "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==",
+      "license": "MIT"
+    },
+    "node_modules/react-icons": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz",
+      "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "*"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+      "license": "MIT"
+    },
+    "node_modules/react-markdown": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
+      "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "hast-util-to-jsx-runtime": "^2.0.0",
+        "html-url-attributes": "^3.0.0",
+        "mdast-util-to-hast": "^13.0.0",
+        "remark-parse": "^11.0.0",
+        "remark-rehype": "^11.0.0",
+        "unified": "^11.0.0",
+        "unist-util-visit": "^5.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      },
+      "peerDependencies": {
+        "@types/react": ">=18",
+        "react": ">=18"
+      }
+    },
+    "node_modules/react-number-format": {
+      "version": "5.4.5",
+      "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz",
+      "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/react-promise-suspense": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/react-promise-suspense/-/react-promise-suspense-0.3.4.tgz",
+      "integrity": "sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^2.0.1"
+      }
+    },
+    "node_modules/react-promise-suspense/node_modules/fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+      "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==",
+      "license": "MIT"
+    },
+    "node_modules/react-redux": {
+      "version": "9.3.0",
+      "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz",
+      "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/use-sync-external-store": "^0.0.6",
+        "use-sync-external-store": "^1.4.0"
+      },
+      "peerDependencies": {
+        "@types/react": "^18.2.25 || ^19",
+        "react": "^18.0 || ^19",
+        "redux": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "redux": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-redux/node_modules/@types/use-sync-external-store": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
+      "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
+      "license": "MIT"
+    },
+    "node_modules/react-refresh": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
+      "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-remove-scroll": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+      "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+      "license": "MIT",
+      "dependencies": {
+        "react-remove-scroll-bar": "^2.3.7",
+        "react-style-singleton": "^2.2.3",
+        "tslib": "^2.1.0",
+        "use-callback-ref": "^1.3.3",
+        "use-sidecar": "^1.1.3"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-remove-scroll-bar": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+      "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+      "license": "MIT",
+      "dependencies": {
+        "react-style-singleton": "^2.2.2",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-resizable": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.2.0.tgz",
+      "integrity": "sha512-3NKQ0SLZV7rs3LQHeXlOzDSRQfFrkX6TVet77/Qk03zqiZyee37b7N8/gwDJAA8UUjRz7PdWCCy49hcso45SMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "prop-types": "15.x",
+        "react-draggable": "^4.5.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.3",
+        "react-dom": ">= 16.3"
+      }
+    },
+    "node_modules/react-resizable-panels": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.6.tgz",
+      "integrity": "sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+        "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      }
+    },
+    "node_modules/react-router": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz",
+      "integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==",
+      "license": "MIT",
+      "dependencies": {
+        "cookie": "^1.0.1",
+        "set-cookie-parser": "^2.6.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=18",
+        "react-dom": ">=18"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-router-dom": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz",
+      "integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==",
+      "license": "MIT",
+      "dependencies": {
+        "react-router": "7.18.3"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=18",
+        "react-dom": ">=18"
+      }
+    },
+    "node_modules/react-spreadsheet": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/react-spreadsheet/-/react-spreadsheet-0.10.1.tgz",
+      "integrity": "sha512-w+KqCCA5H81FQ7dEBMOz1cZm9I8PSx9yNs+XwjYMjBfCDsOBBljiau93US8GQTtMbXtsExX8k3qD7hZLTp3UHw==",
+      "license": "MIT",
+      "dependencies": {
+        "array.prototype.flatmap": "^1.2.5",
+        "classnames": "^2.3.1",
+        "fast-formula-parser": "^1.0.19",
+        "use-context-selector": "^2.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0",
+        "scheduler": ">=0.19.0"
+      }
+    },
+    "node_modules/react-style-singleton": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+      "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+      "license": "MIT",
+      "dependencies": {
+        "get-nonce": "^1.0.0",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-textarea-autosize": {
+      "version": "8.5.9",
+      "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz",
+      "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.20.13",
+        "use-composed-ref": "^1.3.0",
+        "use-latest": "^1.2.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/react-virtualized-auto-sizer": {
+      "version": "1.0.26",
+      "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz",
+      "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/react-window": {
+      "version": "1.8.11",
+      "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz",
+      "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.0.0",
+        "memoize-one": ">=3.1.1 <6"
+      },
+      "engines": {
+        "node": ">8.0.0"
+      },
+      "peerDependencies": {
+        "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/read-cache": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz",
+      "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/read-pkg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+      "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "load-json-file": "^4.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/picomatch": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+      "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/recast": {
+      "version": "0.23.11",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz",
+      "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==",
+      "license": "MIT",
+      "dependencies": {
+        "ast-types": "^0.16.1",
+        "esprima": "~4.0.0",
+        "source-map": "~0.6.1",
+        "tiny-invariant": "^1.3.3",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/recast/node_modules/ast-types": {
+      "version": "0.16.3",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz",
+      "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/recast/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/recharts": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz",
+      "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==",
+      "license": "MIT",
+      "workspaces": [
+        "www"
+      ],
+      "dependencies": {
+        "@reduxjs/toolkit": "^1.9.0 || 2.x.x",
+        "clsx": "^2.1.1",
+        "decimal.js-light": "^2.5.1",
+        "es-toolkit": "^1.39.3",
+        "eventemitter3": "^5.0.1",
+        "immer": "^11.1.8",
+        "react-redux": "8.x.x || 9.x.x",
+        "reselect": "5.2.0",
+        "tiny-invariant": "^1.3.3",
+        "use-sync-external-store": "^1.2.2",
+        "victory-vendor": "^37.0.2"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/recharts/node_modules/eventemitter3": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+      "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+      "license": "MIT"
+    },
+    "node_modules/redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/redent/node_modules/strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "min-indent": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/redux": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
+      "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
+      "license": "MIT"
+    },
+    "node_modules/redux-thunk": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
+      "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "redux": "^5.0.0"
+      }
+    },
+    "node_modules/reflect.getprototypeof": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+      "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/regenerate-unicode-properties": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+      "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "regenerate": "^1.4.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+      "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+      "license": "MIT",
+      "dependencies": {
+        "regex-utilities": "^2.3.0"
+      }
+    },
+    "node_modules/regex-recursion": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+      "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+      "license": "MIT",
+      "dependencies": {
+        "regex-utilities": "^2.3.0"
+      }
+    },
+    "node_modules/regex-utilities": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+      "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+      "license": "MIT"
+    },
+    "node_modules/regexp-to-ast": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
+      "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==",
+      "license": "MIT"
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+      "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regexpu-core": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+      "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.2.2",
+        "regjsgen": "^0.8.0",
+        "regjsparser": "^0.13.0",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/regjsparser": {
+      "version": "0.13.2",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz",
+      "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "jsesc": "~3.1.0"
+      },
+      "bin": {
+        "regjsparser": "bin/parser"
+      }
+    },
+    "node_modules/rehype-format": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz",
+      "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-format": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-harden": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/rehype-harden/-/rehype-harden-1.1.8.tgz",
+      "integrity": "sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==",
+      "license": "MIT",
+      "dependencies": {
+        "unist-util-visit": "^5.0.0"
+      }
+    },
+    "node_modules/rehype-katex": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz",
+      "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/katex": "^0.16.0",
+        "hast-util-from-html-isomorphic": "^2.0.0",
+        "hast-util-to-text": "^4.0.0",
+        "katex": "^0.16.0",
+        "unist-util-visit-parents": "^6.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-minify-whitespace": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz",
+      "integrity": "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-minify-whitespace": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-parse": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz",
+      "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-from-html": "^2.0.0",
+        "unified": "^11.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-raw": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+      "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-raw": "^9.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-remark": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz",
+      "integrity": "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/mdast": "^4.0.0",
+        "hast-util-to-mdast": "^10.0.0",
+        "unified": "^11.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-sanitize": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz",
+      "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-sanitize": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-stringify": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz",
+      "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-to-html": "^9.0.0",
+        "unified": "^11.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-cjk-friendly": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/remark-cjk-friendly/-/remark-cjk-friendly-2.3.1.tgz",
+      "integrity": "sha512-f+pKZRxCRwNEGFBKNRAZAqU91GIK1SAo3ZyFHWRUgC9zcxRR0BXKd6YwqgSsxtW0rNpUDtONj7H5nje2WL3fcA==",
+      "license": "MIT",
+      "dependencies": {
+        "mdast-util-to-markdown-cjk-friendly": "1.0.0",
+        "micromark-extension-cjk-friendly": "2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified": "^11.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/mdast": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/remark-cjk-friendly-gfm-strikethrough": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/remark-cjk-friendly-gfm-strikethrough/-/remark-cjk-friendly-gfm-strikethrough-2.3.1.tgz",
+      "integrity": "sha512-JE3TGgouk/sy92SemNMEUhO5mNP4on04cmzOV3s3R5Dbk160ewmpM4tgPiinKKvoJ5UW2fTu7FOYsjVbusSA9w==",
+      "license": "MIT",
+      "dependencies": {
+        "mdast-util-to-markdown-cjk-friendly-gfm-strikethrough": "1.0.0",
+        "micromark-extension-cjk-friendly-gfm-strikethrough": "2.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/mdast": "^4.0.0",
+        "unified": "^11.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/mdast": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/remark-gfm": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+      "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-math": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz",
+      "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-math": "^3.0.0",
+        "micromark-extension-math": "^3.0.0",
+        "unified": "^11.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-parse": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+      "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-from-markdown": "^2.0.0",
+        "micromark-util-types": "^2.0.0",
+        "unified": "^11.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-rehype": {
+      "version": "11.1.2",
+      "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+      "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-stringify": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+      "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^4.0.0",
+        "mdast-util-to-markdown": "^2.0.0",
+        "unified": "^11.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remeda": {
+      "version": "2.47.0",
+      "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.47.0.tgz",
+      "integrity": "sha512-LPyRi+dI3IGGeoNBKdfsTbx0Q+3mLonMbPipGF75Ym+/zNm5cpnwsTXtLbS79yb0V04D0gMS7qNAiTOwb4IoVQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/remeda"
+      }
+    },
+    "node_modules/remend": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/remend/-/remend-1.3.1.tgz",
+      "integrity": "sha512-N3DiY5qbRPoa5vkxn1oDLMyXOVTeo6Hp+XOj6SIqJAYUgLS0Q587gILPMom/qm86AQ/ZrcOdwEIzCz8V3J0nxQ==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/remotion": {
+      "version": "4.0.451",
+      "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.451.tgz",
+      "integrity": "sha512-uTku1RmytCk50ZtPEoTdmB/4Erb+nH85vT3jkCLWQCaG9qWXxp2XAJ+eL7EfsCUyast2umZm4vdrdKXVxbeDMQ==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/reselect": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz",
+      "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
+      "license": "MIT"
+    },
+    "node_modules/resend": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/resend/-/resend-4.8.0.tgz",
+      "integrity": "sha512-R8eBOFQDO6dzRTDmaMEdpqrkmgSjPpVXt4nGfWsZdYOet0kqra0xgbvTES6HmCriZEXbmGk3e0DiGIaLFTFSHA==",
+      "license": "MIT",
+      "dependencies": {
+        "@react-email/render": "1.1.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
+      "license": "MIT"
+    },
+    "node_modules/resolve": {
+      "version": "1.22.12",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+      "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-pkg-maps": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+      "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+      }
+    },
+    "node_modules/restructure": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz",
+      "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==",
+      "license": "MIT"
+    },
+    "node_modules/retry": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+      "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
+      "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "glob": "^13.0.3",
+        "package-json-from-dist": "^1.0.1"
+      },
+      "bin": {
+        "rimraf": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/balanced-match": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "18 || 20 || >=22"
+      }
+    },
+    "node_modules/rimraf/node_modules/brace-expansion": {
+      "version": "5.0.9",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+      "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^4.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/rimraf/node_modules/glob": {
+      "version": "13.0.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+      "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "minimatch": "^10.2.2",
+        "minipass": "^7.1.3",
+        "path-scurry": "^2.0.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/lru-cache": {
+      "version": "11.5.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+      "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/rimraf/node_modules/minimatch": {
+      "version": "10.2.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+      "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "brace-expansion": "^5.0.8"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/path-scurry": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+      "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/robust-predicates": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",
+      "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",
+      "license": "Unlicense"
+    },
+    "node_modules/rolldown": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz",
+      "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@oxc-project/types": "=0.148.0",
+        "@rolldown/pluginutils": "^1.0.0"
+      },
+      "bin": {
+        "rolldown": "bin/cli.mjs"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "optionalDependencies": {
+        "@rolldown/binding-android-arm-eabi": "1.2.7",
+        "@rolldown/binding-android-arm64": "1.2.7",
+        "@rolldown/binding-darwin-arm64": "1.2.7",
+        "@rolldown/binding-darwin-x64": "1.2.7",
+        "@rolldown/binding-freebsd-x64": "1.2.7",
+        "@rolldown/binding-linux-arm-gnueabihf": "1.2.7",
+        "@rolldown/binding-linux-arm64-gnu": "1.2.7",
+        "@rolldown/binding-linux-arm64-musl": "1.2.7",
+        "@rolldown/binding-linux-ppc64-gnu": "1.2.7",
+        "@rolldown/binding-linux-s390x-gnu": "1.2.7",
+        "@rolldown/binding-linux-x64-gnu": "1.2.7",
+        "@rolldown/binding-linux-x64-musl": "1.2.7",
+        "@rolldown/binding-openharmony-arm64": "1.2.7",
+        "@rolldown/binding-win32-arm64-msvc": "1.2.7",
+        "@rolldown/binding-win32-x64-msvc": "1.2.7"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.63.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
+      "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.9"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+        "@rollup/rollup-android-arm-eabi": "4.63.1",
+        "@rollup/rollup-android-arm64": "4.63.1",
+        "@rollup/rollup-darwin-arm64": "4.63.1",
+        "@rollup/rollup-darwin-x64": "4.63.1",
+        "@rollup/rollup-freebsd-arm64": "4.63.1",
+        "@rollup/rollup-freebsd-x64": "4.63.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.63.1",
+        "@rollup/rollup-linux-arm64-musl": "4.63.1",
+        "@rollup/rollup-linux-loong64-gnu": "4.63.1",
+        "@rollup/rollup-linux-loong64-musl": "4.63.1",
+        "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
+        "@rollup/rollup-linux-ppc64-musl": "4.63.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
+        "@rollup/rollup-linux-riscv64-musl": "4.63.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.63.1",
+        "@rollup/rollup-linux-x64-gnu": "4.63.1",
+        "@rollup/rollup-linux-x64-musl": "4.63.1",
+        "@rollup/rollup-openbsd-x64": "4.63.1",
+        "@rollup/rollup-openharmony-arm64": "4.63.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.63.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.63.1",
+        "@rollup/rollup-win32-x64-gnu": "4.63.1",
+        "@rollup/rollup-win32-x64-msvc": "4.63.1",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer": {
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.11.tgz",
+      "integrity": "sha512-TBwVHVY7buHjIKVLqr9scTVFwqZqMXINcCphPwIWKPDCOBIa+jCQfafvbjRJDZgXdq/A996Dy6yGJ/+/NtAXDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "open": "^8.0.0",
+        "picomatch": "^4.0.2",
+        "source-map": "^0.7.4",
+        "yargs": "^17.5.1"
+      },
+      "bin": {
+        "rollup-plugin-visualizer": "dist/bin/cli.js"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "rolldown": "1.x || ^1.0.0-beta",
+        "rollup": "2.x || 3.x || 4.x"
+      },
+      "peerDependenciesMeta": {
+        "rolldown": {
+          "optional": true
+        },
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
+      "version": "0.7.6",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+      "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/rope-sequence": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
+      "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
+      "license": "MIT"
+    },
+    "node_modules/roughjs": {
+      "version": "4.6.6",
+      "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",
+      "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",
+      "license": "MIT",
+      "dependencies": {
+        "hachure-fill": "^0.5.2",
+        "path-data-parser": "^0.1.0",
+        "points-on-curve": "^0.2.0",
+        "points-on-path": "^0.2.1"
+      }
+    },
+    "node_modules/router": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+      "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.0",
+        "depd": "^2.0.0",
+        "is-promise": "^4.0.0",
+        "parseurl": "^1.3.3",
+        "path-to-regexp": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/router/node_modules/path-to-regexp": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
+      "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/rrweb-cssom": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
+      "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/safe-array-concat": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
+      "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/safe-push-apply": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+      "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-regex-test": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+      "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "is-regex": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "license": "MIT"
+    },
+    "node_modules/sax": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
+      "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/saxes": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "xmlchars": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=v12.22.7"
+      }
+    },
+    "node_modules/scheduler": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+      "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+      "license": "MIT"
+    },
+    "node_modules/schema-utils": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
+      "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/json-schema": "^7.0.9",
+        "ajv": "^8.9.0",
+        "ajv-formats": "^2.1.1",
+        "ajv-keywords": "^5.1.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/schema-utils/node_modules/ajv-formats": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+      "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^8.0.0"
+      },
+      "peerDependencies": {
+        "ajv": "^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "ajv": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/selderee": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz",
+      "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==",
+      "license": "MIT",
+      "dependencies": {
+        "parseley": "^0.12.0"
+      },
+      "funding": {
+        "url": "https://ko-fi.com/killymxi"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.8.5",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+      "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/send": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+      "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/send/node_modules/mime-db": {
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/send/node_modules/mime-types": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+      "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "^1.54.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/serialize-javascript": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.1.tgz",
+      "integrity": "sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+      "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
+      "license": "MIT",
+      "dependencies": {
+        "encodeurl": "^2.0.0",
+        "escape-html": "^1.0.3",
+        "parseurl": "^1.3.3",
+        "send": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/server-destroy": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+      "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/server-only": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz",
+      "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==",
+      "license": "MIT"
+    },
+    "node_modules/set-cookie-parser": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+      "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+      "license": "MIT"
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-getter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
+      "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==",
+      "license": "MIT",
+      "dependencies": {
+        "to-object-path": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/set-proto": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+      "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+      "license": "MIT"
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "license": "ISC"
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/sharp": {
+      "version": "0.35.4",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz",
+      "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@img/colour": "^1.1.0",
+        "detect-libc": "^2.1.2",
+        "semver": "^7.8.5"
+      },
+      "engines": {
+        "node": ">=20.9.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-darwin-arm64": "0.35.4",
+        "@img/sharp-darwin-x64": "0.35.4",
+        "@img/sharp-freebsd-wasm32": "0.35.4",
+        "@img/sharp-libvips-darwin-arm64": "1.3.3",
+        "@img/sharp-libvips-darwin-x64": "1.3.3",
+        "@img/sharp-libvips-linux-arm": "1.3.3",
+        "@img/sharp-libvips-linux-arm64": "1.3.3",
+        "@img/sharp-libvips-linux-ppc64": "1.3.3",
+        "@img/sharp-libvips-linux-riscv64": "1.3.3",
+        "@img/sharp-libvips-linux-s390x": "1.3.3",
+        "@img/sharp-libvips-linux-x64": "1.3.3",
+        "@img/sharp-libvips-linuxmusl-arm64": "1.3.3",
+        "@img/sharp-libvips-linuxmusl-x64": "1.3.3",
+        "@img/sharp-linux-arm": "0.35.4",
+        "@img/sharp-linux-arm64": "0.35.4",
+        "@img/sharp-linux-ppc64": "0.35.4",
+        "@img/sharp-linux-riscv64": "0.35.4",
+        "@img/sharp-linux-s390x": "0.35.4",
+        "@img/sharp-linux-x64": "0.35.4",
+        "@img/sharp-linuxmusl-arm64": "0.35.4",
+        "@img/sharp-linuxmusl-x64": "0.35.4",
+        "@img/sharp-webcontainers-wasm32": "0.35.4",
+        "@img/sharp-win32-arm64": "0.35.4",
+        "@img/sharp-win32-ia32": "0.35.4",
+        "@img/sharp-win32-x64": "0.35.4"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shell-quote": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz",
+      "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/shiki": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz",
+      "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==",
+      "license": "MIT",
+      "dependencies": {
+        "@shikijs/core": "4.4.3",
+        "@shikijs/engine-javascript": "4.4.3",
+        "@shikijs/engine-oniguruma": "4.4.3",
+        "@shikijs/langs": "4.4.3",
+        "@shikijs/themes": "4.4.3",
+        "@shikijs/types": "4.4.3",
+        "@shikijs/vscode-textmate": "^10.0.2",
+        "@types/hast": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+      "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.4",
+        "side-channel-list": "^1.0.1",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+      "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/siginfo": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+      "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/sigma": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.3.tgz",
+      "integrity": "sha512-5H0zFlx6/NTQpqBg4Rm569ZOpnBOXMaS25UQThIWMU3XyzI5AhmorK/gnl87BvJBLhQd0tW4C0LIp3enWzMoNw==",
+      "license": "MIT",
+      "dependencies": {
+        "events": "^3.3.0",
+        "graphology-utils": "^2.5.2"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "license": "ISC"
+    },
+    "node_modules/simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
+    "node_modules/simple-plist": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
+      "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bplist-creator": "0.1.0",
+        "bplist-parser": "0.3.1",
+        "plist": "^3.0.5"
+      }
+    },
+    "node_modules/simple-plist/node_modules/bplist-parser": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
+      "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "big-integer": "1.6.x"
+      },
+      "engines": {
+        "node": ">= 5.10.0"
+      }
+    },
+    "node_modules/sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "license": "MIT"
+    },
+    "node_modules/slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+      }
+    },
+    "node_modules/slice-ansi/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/slice-ansi/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/slice-ansi/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/smart-buffer": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/smob": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz",
+      "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/socks": {
+      "version": "2.8.10",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz",
+      "integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ip-address": "^10.1.1",
+        "smart-buffer": "^4.2.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/socks-proxy-agent": {
+      "version": "8.0.5",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+      "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "^7.1.2",
+        "debug": "^4.3.4",
+        "socks": "^2.8.3"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/sonner": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.8.tgz",
+      "integrity": "sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "^18.0.0 || ^19.0.0",
+        "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+        "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.8.0-beta.0",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+      "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+      "deprecated": "The work that was done in this beta branch won't be included in future versions",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "whatwg-url": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "license": "MIT",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/source-map-support/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map/node_modules/tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+      "license": "MIT",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/source-map/node_modules/webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/source-map/node_modules/whatwg-url": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+      "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "node_modules/space-separated-tokens": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+      "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/spdx-correct": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "node_modules/spdx-exceptions": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+      "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+      "dev": true,
+      "license": "CC-BY-3.0"
+    },
+    "node_modules/spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "node_modules/spdx-license-ids": {
+      "version": "3.0.23",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+      "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
+      "dev": true,
+      "license": "CC0-1.0"
+    },
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">= 10.x"
+      }
+    },
+    "node_modules/stackback": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+      "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/stackframe": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+      "license": "MIT"
+    },
+    "node_modules/standardwebhooks": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/standardwebhooks/-/standardwebhooks-1.1.1.tgz",
+      "integrity": "sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@stablelib/base64": "^1.0.0",
+        "fast-sha256": "^1.3.0"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+      "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/std-env": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+      "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/stop-iteration-iterator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+      "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "internal-slot": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/storybook": {
+      "version": "9.1.20",
+      "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.1.20.tgz",
+      "integrity": "sha512-6rME2tww6PFhm96iG2Xx44yzwLDWBiDWy+kJ2ub6x90werSTOiuo+tZJ94BgCfFutR0tEfLRIq59s+Zg6YyChA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@storybook/global": "^5.0.0",
+        "@testing-library/jest-dom": "^6.6.3",
+        "@testing-library/user-event": "^14.6.1",
+        "@vitest/expect": "3.2.4",
+        "@vitest/mocker": "3.2.4",
+        "@vitest/spy": "3.2.4",
+        "better-opn": "^3.0.2",
+        "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",
+        "esbuild-register": "^3.5.0",
+        "recast": "^0.23.5",
+        "semver": "^7.6.2",
+        "ws": "^8.18.0"
+      },
+      "bin": {
+        "storybook": "bin/index.cjs"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/storybook"
+      },
+      "peerDependencies": {
+        "prettier": "^2 || ^3"
+      },
+      "peerDependenciesMeta": {
+        "prettier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+      "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/android-arm": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+      "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/android-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+      "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/android-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+      "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+      "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+      "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+      "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+      "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-arm": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+      "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+      "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+      "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+      "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+      "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+      "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+      "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+      "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/linux-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+      "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+      "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+      "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+      "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+      "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+      "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+      "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+      "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+      "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/@esbuild/win32-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+      "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/storybook/node_modules/esbuild": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+      "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "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"
+      }
+    },
+    "node_modules/stream-buffers": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
+      "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==",
+      "dev": true,
+      "license": "Unlicense",
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/streamdown": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/streamdown/-/streamdown-2.6.0.tgz",
+      "integrity": "sha512-nQZVUn4GvB2R5SAlDNph20iKZeW+RM4gv6G1H3ACypEnmQf8PgTHZ/1Ta2OACRwQ2coK7aW5AeIAa7Ls5zk+RA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "clsx": "^2.1.1",
+        "hast-util-to-jsx-runtime": "^2.3.6",
+        "html-url-attributes": "^3.0.1",
+        "marked": "^17.0.1",
+        "rehype-harden": "^1.1.8",
+        "rehype-raw": "^7.0.0",
+        "rehype-sanitize": "^6.0.0",
+        "remark-gfm": "^4.0.1",
+        "remark-parse": "^11.0.0",
+        "remark-rehype": "^11.1.2",
+        "remend": "1.3.1",
+        "tailwind-merge": "^3.6.0",
+        "unified": "^11.0.5",
+        "unist-util-visit": "^5.1.0",
+        "unist-util-visit-parents": "^6.0.2"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0 || ^19.0.0",
+        "react-dom": "^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/streamdown/node_modules/marked": {
+      "version": "17.0.6",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz",
+      "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==",
+      "license": "MIT",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 20"
+      }
+    },
+    "node_modules/streamx": {
+      "version": "2.28.1",
+      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz",
+      "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "events-universal": "^1.0.0",
+        "fast-fifo": "^1.3.2",
+        "text-decoder": "^1.1.0"
+      }
+    },
+    "node_modules/strictdom": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strictdom/-/strictdom-1.0.1.tgz",
+      "integrity": "sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==",
+      "license": "MIT"
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string.prototype.matchall": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.1.0.tgz",
+      "integrity": "sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.9",
+        "call-bound": "^1.0.4",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.24.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.2",
+        "get-intrinsic": "^1.3.0",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "internal-slot": "^1.1.0",
+        "regexp.prototype.flags": "^1.5.4",
+        "set-function-name": "^2.0.2",
+        "side-channel": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.padend": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz",
+      "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trim": {
+      "version": "1.2.11",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz",
+      "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.9",
+        "call-bound": "^1.0.4",
+        "define-data-property": "^1.1.4",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.24.2",
+        "es-object-atoms": "^1.1.2",
+        "has-property-descriptors": "^1.0.2",
+        "safe-regex-test": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz",
+      "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.9",
+        "call-bound": "^1.0.4",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimstart": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/stringify-entities": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+      "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+      "license": "MIT",
+      "dependencies": {
+        "character-entities-html4": "^2.0.0",
+        "character-entities-legacy": "^3.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+      "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.2.2"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi/node_modules/ansi-regex": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+      "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/strip-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+      "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/strip-indent": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz",
+      "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/strip-literal": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
+      "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^9.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/strip-literal/node_modules/js-tokens": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/style-loader": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz",
+      "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.27.0"
+      }
+    },
+    "node_modules/style-mod": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz",
+      "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==",
+      "license": "MIT"
+    },
+    "node_modules/style-to-js": {
+      "version": "1.1.21",
+      "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+      "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+      "license": "MIT",
+      "dependencies": {
+        "style-to-object": "1.0.14"
+      }
+    },
+    "node_modules/style-to-object": {
+      "version": "1.0.14",
+      "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+      "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+      "license": "MIT",
+      "dependencies": {
+        "inline-style-parser": "0.2.7"
+      }
+    },
+    "node_modules/stylis": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",
+      "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",
+      "license": "MIT"
+    },
+    "node_modules/sucrase": {
+      "version": "3.35.1",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
+      "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/sucrase/node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tabbable": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
+      "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
+      "license": "MIT"
+    },
+    "node_modules/tailwind-merge": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
+      "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/dcastil"
+      }
+    },
+    "node_modules/tailwindcss": {
+      "version": "3.4.19",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
+      "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@alloc/quick-lru": "^5.2.0",
+        "arg": "^5.0.2",
+        "chokidar": "^3.6.0",
+        "didyoumean": "^1.2.2",
+        "dlv": "^1.1.3",
+        "fast-glob": "^3.3.2",
+        "glob-parent": "^6.0.2",
+        "is-glob": "^4.0.3",
+        "jiti": "^1.21.7",
+        "lilconfig": "^3.1.3",
+        "micromatch": "^4.0.8",
+        "normalize-path": "^3.0.0",
+        "object-hash": "^3.0.0",
+        "picocolors": "^1.1.1",
+        "postcss": "^8.4.47",
+        "postcss-import": "^15.1.0",
+        "postcss-js": "^4.0.1",
+        "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
+        "postcss-nested": "^6.2.0",
+        "postcss-selector-parser": "^6.1.2",
+        "resolve": "^1.22.8",
+        "sucrase": "^3.35.0"
+      },
+      "bin": {
+        "tailwind": "lib/cli.js",
+        "tailwindcss": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/postcss-selector-parser": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
+      "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+      "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/tar": {
+      "version": "7.5.22",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz",
+      "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/fs-minipass": "^4.0.0",
+        "chownr": "^3.0.0",
+        "minipass": "^7.1.2",
+        "minizlib": "^3.1.0",
+        "yallist": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tar-fs": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz",
+      "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==",
+      "license": "MIT",
+      "dependencies": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "node_modules/tar-fs/node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "license": "ISC"
+    },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/teex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
+      "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "streamx": "^2.12.5"
+      }
+    },
+    "node_modules/temp-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+      "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/tempy": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+      "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-stream": "^2.0.0",
+        "temp-dir": "^2.0.0",
+        "type-fest": "^0.16.0",
+        "unique-string": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/tempy/node_modules/type-fest": {
+      "version": "0.16.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+      "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.51.2",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz",
+      "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==",
+      "license": "BSD-2-Clause",
+      "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"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "5.6.1",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz",
+      "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^4.3.0",
+        "terser": "^5.31.1"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "@minify-html/node": {
+          "optional": true
+        },
+        "@swc/core": {
+          "optional": true
+        },
+        "@swc/css": {
+          "optional": true
+        },
+        "@swc/html": {
+          "optional": true
+        },
+        "clean-css": {
+          "optional": true
+        },
+        "cssnano": {
+          "optional": true
+        },
+        "csso": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "html-minifier-terser": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "postcss": {
+          "optional": true
+        },
+        "uglify-js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "license": "MIT"
+    },
+    "node_modules/text-decoder": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
+      "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "b4a": "^1.6.4"
+      }
+    },
+    "node_modules/thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "node_modules/thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "thenify": ">= 3.1.0 < 4"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/throttleit": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz",
+      "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "license": "MIT"
+    },
+    "node_modules/through2": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+      "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "readable-stream": "3"
+      }
+    },
+    "node_modules/time-span": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz",
+      "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "convert-hrtime": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/tiny-inflate": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+      "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+      "license": "MIT"
+    },
+    "node_modules/tiny-invariant": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+      "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+      "license": "MIT"
+    },
+    "node_modules/tinybench": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+      "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tinyexec": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",
+      "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.17",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+      "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tinypool": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+      "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      }
+    },
+    "node_modules/tinyrainbow": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+      "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/tinyspy": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz",
+      "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/tldts": {
+      "version": "6.1.86",
+      "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+      "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tldts-core": "^6.1.86"
+      },
+      "bin": {
+        "tldts": "bin/cli.js"
+      }
+    },
+    "node_modules/tldts-core": {
+      "version": "6.1.86",
+      "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+      "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-object-path/node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "license": "MIT"
+    },
+    "node_modules/to-object-path/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toad-cache": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz",
+      "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tokenlens": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/tokenlens/-/tokenlens-1.3.1.tgz",
+      "integrity": "sha512-7oxmsS5PNCX3z+b+z07hL5vCzlgHKkCGrEQjQmWl5l+v5cUrtL7S1cuST4XThaL1XyjbTX8J5hfP0cjDJRkaLA==",
+      "license": "MIT",
+      "dependencies": {
+        "@tokenlens/core": "1.3.0",
+        "@tokenlens/fetch": "1.3.0",
+        "@tokenlens/helpers": "1.3.1",
+        "@tokenlens/models": "1.3.0"
+      }
+    },
+    "node_modules/topojson-client": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
+      "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
+      "license": "ISC",
+      "dependencies": {
+        "commander": "2"
+      },
+      "bin": {
+        "topo2geo": "bin/topo2geo",
+        "topomerge": "bin/topomerge",
+        "topoquantize": "bin/topoquantize"
+      }
+    },
+    "node_modules/topojson-client/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "license": "MIT"
+    },
+    "node_modules/tough-cookie": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+      "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "tldts": "^6.1.32"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+      "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "punycode": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "tree-kill": "cli.js"
+      }
+    },
+    "node_modules/trim-lines": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+      "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/trim-trailing-lines": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz",
+      "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/trough": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+      "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/ts-algebra": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz",
+      "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==",
+      "license": "MIT"
+    },
+    "node_modules/ts-api-utils": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+      "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.12"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4"
+      }
+    },
+    "node_modules/ts-dedent": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz",
+      "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.10"
+      }
+    },
+    "node_modules/ts-interface-checker": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/ts-morph": {
+      "version": "12.0.0",
+      "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz",
+      "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ts-morph/common": "~0.11.0",
+        "code-block-writer": "^10.1.1"
+      }
+    },
+    "node_modules/ts-toolbelt": {
+      "version": "6.15.5",
+      "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz",
+      "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/tsconfig-paths": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+      "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json5": "^2.2.2",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "license": "0BSD"
+    },
+    "node_modules/tsx": {
+      "version": "4.23.13",
+      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.13.tgz",
+      "integrity": "sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "~0.28.0"
+      },
+      "bin": {
+        "tsx": "dist/cli.mjs"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      }
+    },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/tweetnacl": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+      "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
+      "license": "Unlicense"
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "4.41.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+      "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/type-is": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+      "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
+      "license": "MIT",
+      "dependencies": {
+        "content-type": "^2.0.0",
+        "media-typer": "^1.1.0",
+        "mime-types": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/type-is/node_modules/content-type": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+      "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/type-is/node_modules/mime-db": {
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/type-is/node_modules/mime-types": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+      "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "^1.54.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/typebox": {
+      "version": "1.3.29",
+      "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.3.29.tgz",
+      "integrity": "sha512-TeCZPwJRvfv8hI9oEnQy1Rg7x9Ns1y9OeR94LSaND+lQTmhikE5DsZQNM3I5/tGnEEmeQf5XTLJgJBzXJNDUNA==",
+      "license": "MIT"
+    },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/typed-array-byte-length": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+      "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-byte-offset": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+      "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-length": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz",
+      "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-query-selector": {
+      "version": "2.12.2",
+      "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz",
+      "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/typescript": {
+      "version": "5.9.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+      "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/typescript-eslint": {
+      "version": "8.70.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.0.tgz",
+      "integrity": "sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/eslint-plugin": "8.70.0",
+        "@typescript-eslint/parser": "8.70.0",
+        "@typescript-eslint/typescript-estree": "8.70.0",
+        "@typescript-eslint/utils": "8.70.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
+    "node_modules/uc.micro": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+      "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+      "license": "MIT"
+    },
+    "node_modules/unbox-primitive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+      "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "which-boxed-primitive": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/undici": {
+      "version": "6.28.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.1.tgz",
+      "integrity": "sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.17"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+      "license": "MIT"
+    },
+    "node_modules/unicode-canonical-property-names-ecmascript": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+      "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "unicode-canonical-property-names-ecmascript": "^2.0.0",
+        "unicode-property-aliases-ecmascript": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-value-ecmascript": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+      "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-properties": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
+      "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.0",
+        "unicode-trie": "^2.0.0"
+      }
+    },
+    "node_modules/unicode-property-aliases-ecmascript": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+      "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-trie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
+      "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^0.2.5",
+        "tiny-inflate": "^1.0.0"
+      }
+    },
+    "node_modules/unicode-trie/node_modules/pako": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+      "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
+      "license": "MIT"
+    },
+    "node_modules/unicorn-magic": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+      "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/unified": {
+      "version": "11.0.5",
+      "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+      "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unique-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "crypto-random-string": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/unist-util-find-after": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+      "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "unist-util-is": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-is": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+      "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-position": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+      "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-remove-position": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+      "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "unist-util-visit": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-stringify-position": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+      "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-visit": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+      "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "unist-util-is": "^6.0.0",
+        "unist-util-visit-parents": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-visit-parents": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+      "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "unist-util-is": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/universal-github-app-jwt": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz",
+      "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==",
+      "license": "MIT"
+    },
+    "node_modules/universal-user-agent": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
+      "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
+      "license": "ISC"
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
+      "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "webpack-virtual-modules": "^0.6.2"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/untildify": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+      "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4",
+        "yarn": "*"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
+      "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/url-template": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
+      "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==",
+      "license": "BSD"
+    },
+    "node_modules/use-callback-ref": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+      "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-composed-ref": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz",
+      "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-context-selector": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/use-context-selector/-/use-context-selector-2.0.0.tgz",
+      "integrity": "sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": ">=18.0.0",
+        "scheduler": ">=0.19.0"
+      }
+    },
+    "node_modules/use-isomorphic-layout-effect": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz",
+      "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-latest": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz",
+      "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==",
+      "license": "MIT",
+      "dependencies": {
+        "use-isomorphic-layout-effect": "^1.1.1"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-sidecar": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+      "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "detect-node-es": "^1.1.0",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-stick-to-bottom": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/use-stick-to-bottom/-/use-stick-to-bottom-1.1.6.tgz",
+      "integrity": "sha512-z3Up8jYQGTkUCsGBnwg6/wj70KgXoW5Kz1AAc1j8MtQuYMBo6ZsdhrIXoegxa7gaMMilgQYyTohTrt3p94jHog==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/samdenty"
+        }
+      ],
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/use-sync-external-store": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+      "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "license": "MIT"
+    },
+    "node_modules/uuid": {
+      "version": "14.0.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
+      "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist-node/bin/uuid"
+      }
+    },
+    "node_modules/validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vega": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/vega/-/vega-6.4.0.tgz",
+      "integrity": "sha512-rHXCq2LpEWCLMjXBEj7hocY9G0/i5TGYRayGGSj06VTF4+l2IG2Z7oeZKCjWbUh/7hTE/mVhbaOPB72wCElh6g==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-crossfilter": "~5.1.3",
+        "vega-dataflow": "~6.1.3",
+        "vega-encode": "~5.2.2",
+        "vega-event-selector": "~4.0.0",
+        "vega-expression": "~6.2.2",
+        "vega-force": "~5.1.3",
+        "vega-format": "~2.1.3",
+        "vega-functions": "~6.2.0",
+        "vega-geo": "~5.1.3",
+        "vega-hierarchy": "~5.1.3",
+        "vega-label": "~2.1.3",
+        "vega-loader": "~5.1.3",
+        "vega-parser": "~7.1.3",
+        "vega-projection": "~2.1.3",
+        "vega-regression": "~2.1.3",
+        "vega-runtime": "~7.1.3",
+        "vega-scale": "~8.1.3",
+        "vega-scenegraph": "~5.3.0",
+        "vega-statistics": "~2.0.0",
+        "vega-time": "~3.3.0",
+        "vega-transforms": "~5.2.2",
+        "vega-typings": "~2.3.0",
+        "vega-util": "~2.1.3",
+        "vega-view": "~6.2.0",
+        "vega-view-transforms": "~5.2.2",
+        "vega-voronoi": "~5.1.3",
+        "vega-wordcloud": "~5.1.3"
+      },
+      "funding": {
+        "url": "https://app.hubspot.com/payments/GyPC972GD9Rt"
+      }
+    },
+    "node_modules/vega-canvas": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-2.0.0.tgz",
+      "integrity": "sha512-9x+4TTw/USYST5nx4yN272sy9WcqSRjAR0tkQYZJ4cQIeon7uVsnohvoPQK1JZu7K1QXGUqzj08z0u/UegBVMA==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/vega-crossfilter": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-5.1.3.tgz",
+      "integrity": "sha512-goGulwrrbmv9mY4Za8HQiiFk7WV1OTyrSVZzrMR0Keeiyzh9cnkxRGF1W2fAhMNA3HSaRaBoxWHGr7H9fvovuQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "vega-dataflow": "^6.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-dataflow": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-6.1.3.tgz",
+      "integrity": "sha512-ac51FLdYT8XAcDaHt3bQtVAR3UFdKfPMQBhjvBMXp69mdeq2ERfM1u9CUyDQAVZJylkIbWEwDnsp72tIwenPUA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-format": "^2.1.3",
+        "vega-loader": "^5.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-embed": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-7.2.0.tgz",
+      "integrity": "sha512-A7nfZk145qtLWjj0tQhntQgJ4ip52ECzGo2B9B4HcBT1rdWeb32xEdxTzLSlDkNAqcBLw5Y14PR2KewrqERwLA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "fast-json-patch": "^3.1.1",
+        "json-stringify-pretty-compact": "^4.0.0",
+        "semver": "^7.8.5",
+        "tslib": "^2.8.1",
+        "vega-interpreter": "^2.3.2",
+        "vega-schema-url-parser": "^3.0.2",
+        "vega-themes": "3.0.0",
+        "vega-tooltip": "1.1.0"
+      },
+      "funding": {
+        "url": "https://app.hubspot.com/payments/GyPC972GD9Rt"
+      },
+      "peerDependencies": {
+        "vega": "*",
+        "vega-lite": "*"
+      }
+    },
+    "node_modules/vega-encode": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-5.2.2.tgz",
+      "integrity": "sha512-YmriG349VjJsIxXE1gkxHj6fPF87T2t/fYmAUUlGzTGarSy3KF93t8Fqc6EPupsgnCDEhe3+0NsSWTVxiOJ1Ow==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-interpolate": "^3.0.1",
+        "vega-dataflow": "^6.1.3",
+        "vega-scale": "^8.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-event-selector": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-4.0.0.tgz",
+      "integrity": "sha512-CcWF4m4KL/al1Oa5qSzZ5R776q8lRxCj3IafCHs5xipoEHrkgu1BWa7F/IH5HrDNXeIDnqOpSV1pFsAWRak4gQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/vega-expression": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.2.2.tgz",
+      "integrity": "sha512-9yTpQBYDnl4yC27iGbUxDUnRAeO+la/lfzA5WSALB0INvA2A2NVxIorBakfqIkO7nwKM9bT3rmNRfj8Z3hjb7g==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@types/estree": "^1.0.9",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-force": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-5.1.3.tgz",
+      "integrity": "sha512-njBlnPeeMY0uz1Fbdqa5jnOsSUrUo2s3z/Eb4qo486hhrwNtNpmeCsN+4PBasoblf/4pOpbvKULzolZmG+R7QA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-force": "^3.0.0",
+        "vega-dataflow": "^6.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-format": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-2.1.3.tgz",
+      "integrity": "sha512-VK0yh3BtK5MUoG7aAXuwb678r2wDdykAUFIKHd9MWvXNo857UqNzZfYixfyXi8xXBK2AV38R4IiQmNKUrXBMUA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-format": "^3.1.2",
+        "d3-time-format": "^4.1.0",
+        "vega-time": "^3.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-functions": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-6.2.0.tgz",
+      "integrity": "sha512-MRFL7RjVmsv6iYuRZVvrDPZbySLa5Dzd5hC+0LTubysy8OrPengKZEHeRnibvHH6odg3IsKUV44Wv8dN3XzYAw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-color": "^3.1.0",
+        "d3-ease": "^3.0.1",
+        "d3-geo": "^3.1.1",
+        "vega-dataflow": "^6.1.3",
+        "vega-expression": "^6.2.2",
+        "vega-scale": "^8.1.3",
+        "vega-scenegraph": "^5.3.0",
+        "vega-selections": "^6.1.5",
+        "vega-statistics": "^2.0.0",
+        "vega-time": "^3.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-geo": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-5.1.3.tgz",
+      "integrity": "sha512-UfTVPV+O+7elFyUsw8FLjiDOJkF0VZanC5tHLaSSue5h+xLzG6SDKQ7xEBIQSaTBE8nLSBtHm45Qve0SFjILVQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-color": "^3.1.0",
+        "d3-geo": "^3.1.1",
+        "vega-canvas": "^2.0.0",
+        "vega-dataflow": "^6.1.3",
+        "vega-projection": "^2.1.3",
+        "vega-statistics": "^2.0.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-hierarchy": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-5.1.3.tgz",
+      "integrity": "sha512-bDWDNGuUA4WcOD5CMh9Mahs3CwKxSU3W1XAnDGCpAwfJVoWp7vlVMt1paoTczPFTXtXGxIa3vJu94xWGmI3/og==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-hierarchy": "^3.1.2",
+        "vega-dataflow": "^6.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-interpreter": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-2.3.2.tgz",
+      "integrity": "sha512-JDAoi3taFcCDLujZG84TNNUXdkAZ5WsSHssx8lWVYaxb9Slsjk7v7PtRIYXpSlUwLaKGRBqoJ9KDs36Z0eMEIw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-label": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-2.1.3.tgz",
+      "integrity": "sha512-UcaGgrVr2Gb0sUj4j3L5tZuL6GOn7tyauYsfXsS0hURoIbHCfQI4SnRq89vl5ub5DL1SEWaJTKag4GdAm1hcGw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-canvas": "^2.0.0",
+        "vega-dataflow": "^6.1.3",
+        "vega-scenegraph": "^5.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-lite": {
+      "version": "6.4.3",
+      "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-6.4.3.tgz",
+      "integrity": "sha512-d/7hPjfz560UERaQuTmGgIVfXAe3g2hJWeC+igDeaGohUdEoNrHLXgR/yTOBT8vV/lIuuKnw+0/xWWblkDwkMQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "json-stringify-pretty-compact": "~4.0.0",
+        "tslib": "~2.8.1",
+        "vega-event-selector": "~4.0.0",
+        "vega-expression": "~6.1.0",
+        "vega-util": "~2.1.0",
+        "yargs": "~18.0.0"
+      },
+      "bin": {
+        "vl2pdf": "bin/vl2pdf",
+        "vl2png": "bin/vl2png",
+        "vl2svg": "bin/vl2svg",
+        "vl2vg": "bin/vl2vg"
+      },
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://app.hubspot.com/payments/GyPC972GD9Rt"
+      },
+      "peerDependencies": {
+        "vega": "^6.0.0"
+      }
+    },
+    "node_modules/vega-lite/node_modules/ansi-styles": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+      "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/vega-lite/node_modules/cliui": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+      "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^7.2.0",
+        "strip-ansi": "^7.1.0",
+        "wrap-ansi": "^9.0.0"
+      },
+      "engines": {
+        "node": ">=20"
+      }
+    },
+    "node_modules/vega-lite/node_modules/emoji-regex": {
+      "version": "10.6.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+      "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+      "license": "MIT"
+    },
+    "node_modules/vega-lite/node_modules/string-width": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/vega-lite/node_modules/vega-expression": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.1.0.tgz",
+      "integrity": "sha512-hHgNx/fQ1Vn1u6vHSamH7lRMsOa/yQeHGGcWVmh8fZafLdwdhCM91kZD9p7+AleNpgwiwzfGogtpATFaMmDFYg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@types/estree": "^1.0.8",
+        "vega-util": "^2.1.0"
+      }
+    },
+    "node_modules/vega-lite/node_modules/wrap-ansi": {
+      "version": "9.0.2",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+      "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^6.2.1",
+        "string-width": "^7.0.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/vega-lite/node_modules/yargs": {
+      "version": "18.0.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+      "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": "^20.19.0 || ^22.12.0 || >=23"
+      }
+    },
+    "node_modules/vega-lite/node_modules/yargs-parser": {
+      "version": "22.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+      "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+      "license": "ISC",
+      "engines": {
+        "node": "^20.19.0 || ^22.12.0 || >=23"
+      }
+    },
+    "node_modules/vega-loader": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-5.1.3.tgz",
+      "integrity": "sha512-gJGoI262B5EEUGRFRY2mH+SJbVc+b4MTQfASNYpyIBqGxHqmjvNQqTyB+7bjReRYJjExjXL/MnKJmJHL6dAOwA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-dsv": "^3.0.1",
+        "topojson-client": "^3.1.0",
+        "vega-format": "^2.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-parser": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-7.1.3.tgz",
+      "integrity": "sha512-bT0pmzPF79ECFilKotgo92OUi25MGGgrEj9M0piiIpJZXQwcF2xsCf+5YRND1R0zd4zodNpqpJtIw0sl6TaqMg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-dataflow": "^6.1.3",
+        "vega-event-selector": "^4.0.0",
+        "vega-functions": "^6.2.0",
+        "vega-scale": "^8.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-projection": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-2.1.3.tgz",
+      "integrity": "sha512-IYGBnT+8a3ZH2bOM48c2qSZAnuPyyYTua/kMeXjwxFKI1/BjzlchQ9QCKxGeBqJGdG2pp9YMW2oS/F1dw/IQXw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-geo": "^3.1.1",
+        "d3-geo-projection": "^4.0.0",
+        "vega-scale": "^8.1.3"
+      }
+    },
+    "node_modules/vega-regression": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-2.1.3.tgz",
+      "integrity": "sha512-qssCjc6KEV8pUQEEliZSTRv4cuhl5D2MgyfbKnIYbJM7B/lW/vubCPBr8oGzxVEGJd3D5kxEtXJORPipawdVEA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "vega-dataflow": "^6.1.3",
+        "vega-statistics": "^2.0.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-runtime": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-7.1.3.tgz",
+      "integrity": "sha512-27id9NGfnGh0u/NpQMagAmS5wDa7ELKDv1SYysiJp05HOYPuLD9XT3NSblPjZhDhyk1eApzWJAoegUoosJJtkA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-dataflow": "^6.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-scale": {
+      "version": "8.1.3",
+      "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-8.1.3.tgz",
+      "integrity": "sha512-6Tx/1XMz2EtjOZm2zEONqJfYGfUWwSauhEyMCH5XWpnqoGjHQfDzDCFtBUFDs/6N+nNi3ldxCshraMiC4XCXLg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-interpolate": "^3.0.1",
+        "d3-scale": "^4.0.2",
+        "d3-scale-chromatic": "^3.1.0",
+        "vega-time": "^3.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-scenegraph": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-5.3.0.tgz",
+      "integrity": "sha512-sJbrDxGhyw8KFgC8NIEPBsZBZaOHAO4YtFcjw71bqIwVy6kIHlzc5I+buvJkEcBKkSTbsIdKRT1jUOHPDbBEKw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-path": "^3.1.0",
+        "d3-shape": "^3.2.0",
+        "vega-canvas": "^2.0.0",
+        "vega-loader": "^5.1.3",
+        "vega-scale": "^8.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-schema-url-parser": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-3.0.2.tgz",
+      "integrity": "sha512-xAnR7KAvNPYewI3O0l5QGdT8Tv0+GCZQjqfP39cW/hbe/b3aYMAQ39vm8O2wfXUHzm04xTe7nolcsx8WQNVLRQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/vega-selections": {
+      "version": "6.1.5",
+      "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-6.1.5.tgz",
+      "integrity": "sha512-evYoCV1wuE0kuiDrKH2dVVweMUuz0pNN7rYTYKBSNDqa7TBjDU4+tbWFm/CgowoaAqjC6Omd+jEZz9lwpgeE3w==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "3.2.4",
+        "vega-expression": "^6.2.2",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-statistics": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-2.0.0.tgz",
+      "integrity": "sha512-dGPfDXnBlgXbZF3oxtkb8JfeRXd5TYHx25Z/tIoaa9jWua4Vf/AoW2wwh8J1qmMy8J03/29aowkp1yk4DOPazQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4"
+      }
+    },
+    "node_modules/vega-themes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-3.0.0.tgz",
+      "integrity": "sha512-1iFiI3BNmW9FrsLnDLx0ZKEddsCitRY3XmUAwp6qmp+p+IXyJYc9pfjlVj9E6KXBPfm4cQyU++s0smKNiWzO4g==",
+      "license": "BSD-3-Clause",
+      "funding": {
+        "url": "https://app.hubspot.com/payments/GyPC972GD9Rt"
+      },
+      "peerDependencies": {
+        "vega": "*",
+        "vega-lite": "*"
+      }
+    },
+    "node_modules/vega-time": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-3.3.0.tgz",
+      "integrity": "sha512-bm9uMPrGIPQ52jD3Ltr6gUspogDtO0G8pEzLKvLySX84reeShHTH6jOd9YXwISNfuS4LT+cmPr9Ct6TMgvPMOA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-time": "^3.1.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-tooltip": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-1.1.0.tgz",
+      "integrity": "sha512-PP4CxC8gX//SBUtlcJkwffmvdZBvzAsqS0EANBKvImJ9PxV/KtJkcs7RCqp+A7nh2cjWdVzyOBWAvqKhXJStTQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-util": "^2.1.0"
+      },
+      "funding": {
+        "url": "https://app.hubspot.com/payments/GyPC972GD9Rt"
+      }
+    },
+    "node_modules/vega-transforms": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-5.2.2.tgz",
+      "integrity": "sha512-0vlu/36sBbHKw4dN/7BKCUPOzXc2oYObRxGMcROFLk+BwfjE/cqtfuXbLHzOinXtfLOhblmT0Agx+BSYXN8k/Q==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "vega-dataflow": "^6.1.3",
+        "vega-statistics": "^2.0.0",
+        "vega-time": "^3.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-typings": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-2.3.0.tgz",
+      "integrity": "sha512-CLS2Rd9MUlw1GLzXfNIrs6ubD0gMq/7AtaBUfhlmpAXjxnb15fZ3pJ9cOMmqu5lxdxHYr8eqSNoiIGgpJsiFMQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@types/geojson": "7946.0.16",
+        "vega-event-selector": "^4.0.0",
+        "vega-expression": "^6.2.2",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-util": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-2.1.3.tgz",
+      "integrity": "sha512-Znj01Gj5XVUw/U7QvwjMhl+XCGs09UF5KDyMXZz9NtjhoKP04anWjcbA7hqoVH+eEigO92KlTi+Yai6Roo1n0A==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/vega-view": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-6.2.0.tgz",
+      "integrity": "sha512-e07jIm9BbLAnmSPCusxCNYstflMXE8qpQUKqfCmCcoRoE6TFnfGbjLLDsxeVpQtOnCj7PglxQw3Fx9/J4IEVaQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-array": "^3.2.4",
+        "d3-timer": "^3.0.1",
+        "vega-dataflow": "^6.1.3",
+        "vega-format": "^2.1.3",
+        "vega-functions": "^6.2.0",
+        "vega-runtime": "^7.1.3",
+        "vega-scenegraph": "^5.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-view-transforms": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-5.2.2.tgz",
+      "integrity": "sha512-Zsfqy0AzCStVSEoS2lf416heWQp0lQpg9LxJhqLJVZLpTh9UzcTdxP5hMwN1StrB2gWCk7TEfBgJC9FBBzxiZA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-dataflow": "^6.1.3",
+        "vega-scenegraph": "^5.3.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-voronoi": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-5.1.3.tgz",
+      "integrity": "sha512-1EYf2KFE/otZmjyQSw2xisnT6QDXouyofHBI9o9C1zOfNM284+wmJ0qbvL46wX9jEauH+RKG5qnx0eDWQHVjYw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-delaunay": "^6.0.4",
+        "vega-dataflow": "^6.1.3",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vega-wordcloud": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-5.1.3.tgz",
+      "integrity": "sha512-DxghqU1U9VPSKWmvatyQiDNShz1XfKv/XnIGlRWYdfTMnZvD3Y46mdrxPBhqFMF6TQKjZKyeqz5GtukA/RaH5Q==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "vega-canvas": "^2.0.0",
+        "vega-dataflow": "^6.1.3",
+        "vega-scale": "^8.1.3",
+        "vega-statistics": "^2.0.0",
+        "vega-util": "^2.1.3"
+      }
+    },
+    "node_modules/vfile": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+      "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "vfile-message": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/vfile-location": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+      "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/vfile-message": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+      "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "unist-util-stringify-position": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/victory-vendor": {
+      "version": "37.3.6",
+      "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
+      "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
+      "license": "MIT AND ISC",
+      "dependencies": {
+        "@types/d3-array": "^3.0.3",
+        "@types/d3-ease": "^3.0.0",
+        "@types/d3-interpolate": "^3.0.1",
+        "@types/d3-scale": "^4.0.2",
+        "@types/d3-shape": "^3.1.0",
+        "@types/d3-time": "^3.0.0",
+        "@types/d3-timer": "^3.0.0",
+        "d3-array": "^3.1.6",
+        "d3-ease": "^3.0.1",
+        "d3-interpolate": "^3.0.1",
+        "d3-scale": "^4.0.2",
+        "d3-shape": "^3.1.0",
+        "d3-time": "^3.0.0",
+        "d3-timer": "^3.0.1"
+      }
+    },
+    "node_modules/vite": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz",
+      "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "lightningcss": "^1.33.0",
+        "picomatch": "^4.0.5",
+        "postcss": "^8.5.26",
+        "rolldown": "~1.2.4",
+        "tinyglobby": "^0.2.17"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^20.19.0 || >=22.12.0",
+        "@vitejs/devtools": "^0.4.0 || ^0.5.0",
+        "esbuild": "^0.27.0 || ^0.28.0",
+        "jiti": ">=1.21.0",
+        "less": "^4.0.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"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "@vitejs/devtools": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-imagetools": {
+      "version": "9.0.3",
+      "resolved": "https://registry.npmjs.org/vite-imagetools/-/vite-imagetools-9.0.3.tgz",
+      "integrity": "sha512-FwjApRNZyN+RucPW9Z9kf0dyzyi3r3zlDfrTnzHXNaYpmT3pZ5w//d6QkApy1iypbDm+3fq+Gwfv+PYA4j4uYw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.0.5",
+        "imagetools-core": "^9.1.0",
+        "sharp": "^0.34.1"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-darwin-arm64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+      "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-arm64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-darwin-x64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+      "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-x64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-darwin-arm64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+      "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-darwin-x64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+      "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linux-arm": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+      "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linux-arm64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+      "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linux-ppc64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+      "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linux-riscv64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+      "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linux-s390x": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+      "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linux-x64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+      "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+      "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-libvips-linuxmusl-x64": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+      "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linux-arm": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+      "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linux-arm64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+      "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linux-ppc64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+      "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-ppc64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linux-riscv64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+      "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-riscv64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linux-s390x": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+      "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-s390x": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linux-x64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+      "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-x64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linuxmusl-arm64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+      "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-linuxmusl-x64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+      "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-wasm32": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+      "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/runtime": "^1.7.0"
+      },
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-win32-arm64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+      "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-win32-ia32": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+      "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/@img/sharp-win32-x64": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+      "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/vite-imagetools/node_modules/sharp": {
+      "version": "0.34.5",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+      "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@img/colour": "^1.0.0",
+        "detect-libc": "^2.1.2",
+        "semver": "^7.7.3"
+      },
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-darwin-arm64": "0.34.5",
+        "@img/sharp-darwin-x64": "0.34.5",
+        "@img/sharp-libvips-darwin-arm64": "1.2.4",
+        "@img/sharp-libvips-darwin-x64": "1.2.4",
+        "@img/sharp-libvips-linux-arm": "1.2.4",
+        "@img/sharp-libvips-linux-arm64": "1.2.4",
+        "@img/sharp-libvips-linux-ppc64": "1.2.4",
+        "@img/sharp-libvips-linux-riscv64": "1.2.4",
+        "@img/sharp-libvips-linux-s390x": "1.2.4",
+        "@img/sharp-libvips-linux-x64": "1.2.4",
+        "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+        "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+        "@img/sharp-linux-arm": "0.34.5",
+        "@img/sharp-linux-arm64": "0.34.5",
+        "@img/sharp-linux-ppc64": "0.34.5",
+        "@img/sharp-linux-riscv64": "0.34.5",
+        "@img/sharp-linux-s390x": "0.34.5",
+        "@img/sharp-linux-x64": "0.34.5",
+        "@img/sharp-linuxmusl-arm64": "0.34.5",
+        "@img/sharp-linuxmusl-x64": "0.34.5",
+        "@img/sharp-wasm32": "0.34.5",
+        "@img/sharp-win32-arm64": "0.34.5",
+        "@img/sharp-win32-ia32": "0.34.5",
+        "@img/sharp-win32-x64": "0.34.5"
+      }
+    },
+    "node_modules/vite-node": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+      "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cac": "^6.7.14",
+        "debug": "^4.4.1",
+        "es-module-lexer": "^1.7.0",
+        "pathe": "^2.0.3",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+      },
+      "bin": {
+        "vite-node": "vite-node.mjs"
+      },
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/vite-node/node_modules/es-module-lexer": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+      "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vite-node/node_modules/vite": {
+      "version": "7.3.6",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
+      "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.27.0 || ^0.28.0",
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rollup": "^4.43.0",
+        "tinyglobby": "^0.2.15"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "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"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-pwa": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.3.0.tgz",
+      "integrity": "sha512-c5kMgN+ITrOtHXp8PAtk2uOIEea6XjP/unCGxOWWBzQ6qa65qj/awHg0wf+QF9E/2u9vh86LqxPwzEPNbM2r5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.3.6",
+        "pretty-bytes": "^6.1.1",
+        "tinyglobby": "^0.2.10",
+        "workbox-build": "^7.4.1",
+        "workbox-window": "^7.4.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vite-pwa/assets-generator": "^1.0.0",
+        "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+        "workbox-build": "^7.4.1",
+        "workbox-window": "^7.4.1"
+      },
+      "peerDependenciesMeta": {
+        "@vite-pwa/assets-generator": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vitest": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz",
+      "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/chai": "^5.2.2",
+        "@vitest/expect": "3.2.7",
+        "@vitest/mocker": "3.2.7",
+        "@vitest/pretty-format": "^3.2.7",
+        "@vitest/runner": "3.2.7",
+        "@vitest/snapshot": "3.2.7",
+        "@vitest/spy": "3.2.7",
+        "@vitest/utils": "3.2.7",
+        "chai": "^5.2.0",
+        "debug": "^4.4.1",
+        "expect-type": "^1.2.1",
+        "magic-string": "^0.30.17",
+        "pathe": "^2.0.3",
+        "picomatch": "^4.0.2",
+        "std-env": "^3.9.0",
+        "tinybench": "^2.9.0",
+        "tinyexec": "^0.3.2",
+        "tinyglobby": "^0.2.14",
+        "tinypool": "^1.1.1",
+        "tinyrainbow": "^2.0.0",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+        "vite-node": "3.2.4",
+        "why-is-node-running": "^2.3.0"
+      },
+      "bin": {
+        "vitest": "vitest.mjs"
+      },
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      },
+      "peerDependencies": {
+        "@edge-runtime/vm": "*",
+        "@types/debug": "^4.1.12",
+        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "@vitest/browser": "3.2.7",
+        "@vitest/ui": "3.2.7",
+        "happy-dom": "*",
+        "jsdom": "*"
+      },
+      "peerDependenciesMeta": {
+        "@edge-runtime/vm": {
+          "optional": true
+        },
+        "@types/debug": {
+          "optional": true
+        },
+        "@types/node": {
+          "optional": true
+        },
+        "@vitest/browser": {
+          "optional": true
+        },
+        "@vitest/ui": {
+          "optional": true
+        },
+        "happy-dom": {
+          "optional": true
+        },
+        "jsdom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vitest/node_modules/@vitest/expect": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz",
+      "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/chai": "^5.2.2",
+        "@vitest/spy": "3.2.7",
+        "@vitest/utils": "3.2.7",
+        "chai": "^5.2.0",
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/vitest/node_modules/@vitest/mocker": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz",
+      "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/spy": "3.2.7",
+        "estree-walker": "^3.0.3",
+        "magic-string": "^0.30.17"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      },
+      "peerDependencies": {
+        "msw": "^2.4.9",
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "msw": {
+          "optional": true
+        },
+        "vite": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vitest/node_modules/@vitest/pretty-format": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz",
+      "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/vitest/node_modules/@vitest/spy": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz",
+      "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tinyspy": "^4.0.3"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/vitest/node_modules/@vitest/utils": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz",
+      "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vitest/pretty-format": "3.2.7",
+        "loupe": "^3.1.4",
+        "tinyrainbow": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/vitest"
+      }
+    },
+    "node_modules/vitest/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/vitest/node_modules/tinyexec": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+      "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vitest/node_modules/vite": {
+      "version": "7.3.6",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
+      "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.27.0 || ^0.28.0",
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rollup": "^4.43.0",
+        "tinyglobby": "^0.2.15"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "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"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/w3c-keyname": {
+      "version": "2.2.8",
+      "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
+      "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
+      "license": "MIT"
+    },
+    "node_modules/w3c-xmlserializer": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+      "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "xml-name-validator": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz",
+      "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.1.2"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/web-namespaces": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+      "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/webdriver-bidi-protocol": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz",
+      "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/webidl-conversions": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "5.105.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz",
+      "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/eslint-scope": "^3.7.7",
+        "@types/estree": "^1.0.8",
+        "@types/json-schema": "^7.0.15",
+        "@webassemblyjs/ast": "^1.14.1",
+        "@webassemblyjs/wasm-edit": "^1.14.1",
+        "@webassemblyjs/wasm-parser": "^1.14.1",
+        "acorn": "^8.15.0",
+        "acorn-import-phases": "^1.0.3",
+        "browserslist": "^4.28.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.19.0",
+        "es-module-lexer": "^2.0.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.11",
+        "json-parse-even-better-errors": "^2.3.1",
+        "loader-runner": "^4.3.1",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^4.3.3",
+        "tapable": "^2.3.0",
+        "terser-webpack-plugin": "^5.3.16",
+        "watchpack": "^2.5.1",
+        "webpack-sources": "^3.3.3"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz",
+      "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack-virtual-modules": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/webpack/node_modules/es-module-lexer": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz",
+      "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==",
+      "license": "MIT"
+    },
+    "node_modules/webpack/node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/webpack/node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/whatwg-encoding": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+      "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "0.6.3"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-mimetype": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-url": {
+      "version": "14.2.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+      "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tr46": "^5.1.0",
+        "webidl-conversions": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/which-boxed-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+      "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-builtin-type": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+      "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-collection": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+      "license": "MIT",
+      "dependencies": {
+        "is-map": "^2.0.3",
+        "is-set": "^2.0.3",
+        "is-weakmap": "^2.0.2",
+        "is-weakset": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-typed-array": {
+      "version": "1.1.22",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz",
+      "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==",
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/why-is-node-running": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+      "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "siginfo": "^2.0.0",
+        "stackback": "0.0.2"
+      },
+      "bin": {
+        "why-is-node-running": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/workbox-background-sync": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.4.1.tgz",
+      "integrity": "sha512-HhT7KE8tOWDm02wRNshXUnUPofMlhenF2DBdUnDPOubhizzPeItkYTmAB6td1Z2cjYPa98vzEiPLEuzn5hN66g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "idb": "^7.0.1",
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-broadcast-update": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.4.1.tgz",
+      "integrity": "sha512-uAlgslKLvbQY+suirIdnBCSYrcgBhjp81Nj4l1lj/Jmj0MJO2CJERnCJjT0GFVwmReV0N+zs78K6gqd5gr9/+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-build": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.4.1.tgz",
+      "integrity": "sha512-SDhxIvEAde9Gy/5w4Yo1Jh/M49Z0qE3q0oteyE8zGq0DScxFqVBcCtIXFuLtmtxRQZCMbf0prco4VyEu3KBQuw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@apideck/better-ajv-errors": "^0.3.1",
+        "@babel/core": "^7.24.4",
+        "@babel/preset-env": "^7.11.0",
+        "@babel/runtime": "^7.11.2",
+        "@rollup/plugin-babel": "^6.1.0",
+        "@rollup/plugin-node-resolve": "^16.0.3",
+        "@rollup/plugin-replace": "^6.0.3",
+        "@rollup/plugin-terser": "^1.0.0",
+        "@trickfilm400/rollup-plugin-off-main-thread": "^3.0.0-pre1",
+        "ajv": "^8.6.0",
+        "common-tags": "^1.8.0",
+        "eta": "^4.5.1",
+        "fast-json-stable-stringify": "^2.1.0",
+        "fs-extra": "^9.0.1",
+        "glob": "^11.0.1",
+        "pretty-bytes": "^5.3.0",
+        "rollup": "^4.53.3",
+        "source-map": "^0.8.0-beta.0",
+        "stringify-object": "^3.3.0",
+        "strip-comments": "^2.0.1",
+        "tempy": "^0.6.0",
+        "upath": "^1.2.0",
+        "workbox-background-sync": "7.4.1",
+        "workbox-broadcast-update": "7.4.1",
+        "workbox-cacheable-response": "7.4.1",
+        "workbox-core": "7.4.1",
+        "workbox-expiration": "7.4.1",
+        "workbox-google-analytics": "7.4.1",
+        "workbox-navigation-preload": "7.4.1",
+        "workbox-precaching": "7.4.1",
+        "workbox-range-requests": "7.4.1",
+        "workbox-recipes": "7.4.1",
+        "workbox-routing": "7.4.1",
+        "workbox-strategies": "7.4.1",
+        "workbox-streams": "7.4.1",
+        "workbox-sw": "7.4.1",
+        "workbox-window": "7.4.1"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      }
+    },
+    "node_modules/workbox-build/node_modules/@isaacs/cliui": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
+      "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/workbox-build/node_modules/balanced-match": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "18 || 20 || >=22"
+      }
+    },
+    "node_modules/workbox-build/node_modules/brace-expansion": {
+      "version": "5.0.9",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+      "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^4.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/workbox-build/node_modules/fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/workbox-build/node_modules/glob": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz",
+      "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==",
+      "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "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"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/workbox-build/node_modules/jackspeak": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
+      "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/cliui": "^9.0.0"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/workbox-build/node_modules/lru-cache": {
+      "version": "11.5.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+      "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/workbox-build/node_modules/minimatch": {
+      "version": "10.2.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+      "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "brace-expansion": "^5.0.8"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/workbox-build/node_modules/path-scurry": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+      "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/workbox-build/node_modules/pretty-bytes": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/workbox-cacheable-response": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.4.1.tgz",
+      "integrity": "sha512-8xaFoJdDc2OjrlbbL3gEeBO1WKcMwRqwLRupgqahYXu75yXajPLuwrbXMrIGZuWYXrQwk0xDjOxZ/ujCy/oJYw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-core": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.1.tgz",
+      "integrity": "sha512-DT+vu46eh/2vRsSHTY4Xmc32Z1rr9PRlQUXr1Dx30ZuXRWwOsvZgGgcwxcasubQLQmbTNYZjv44LkBAQ4tT5tQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/workbox-expiration": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.4.1.tgz",
+      "integrity": "sha512-lRKUF7b+OGbeXkQk1s6MHXOa3d7Xxf7Of31W6c6hCfipfIyrtdWZ89stq21AHZMaoG7VNFoHply4Ox+rU31TWg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "idb": "^7.0.1",
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-google-analytics": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.4.1.tgz",
+      "integrity": "sha512-Mks1JwLEt++ZAkF6sS1OpSh9RtAMIsiDgRpK+codiHGIPXeaUOgi4cPc3GFadUl8V5QPeypEk8Oxgl3HlwVzHw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-background-sync": "7.4.1",
+        "workbox-core": "7.4.1",
+        "workbox-routing": "7.4.1",
+        "workbox-strategies": "7.4.1"
+      }
+    },
+    "node_modules/workbox-navigation-preload": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.4.1.tgz",
+      "integrity": "sha512-C4KVsjPcYKJOhr631AxR9XoG2rLF3QiTk5aMv36MXOjtWvm8axwNFAtKUPGsWUwLXXAMgYM1En7fsvndaXeXRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-precaching": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.4.1.tgz",
+      "integrity": "sha512-cdr/9qByww7yzEp7zg/qI4ukUrrNjQLgN+ONQRpjy/VqGQXwkgHwr00KksGJK8v0VifwDXBb8a4cWNZH71jn3Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1",
+        "workbox-routing": "7.4.1",
+        "workbox-strategies": "7.4.1"
+      }
+    },
+    "node_modules/workbox-range-requests": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.4.1.tgz",
+      "integrity": "sha512-7i2oxAUE82gHdAJBCAQ04JzNOdRPqzuOzGfoUyJpFSmeqBNYGPrAH8GPoPjUQTfp+NycwrD2H68VtuF8qxv0vQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-recipes": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.4.1.tgz",
+      "integrity": "sha512-gnbVfmV4/TtmQaM4x9AtuXhcdstJsep3XMVeztOrQVPT+R6+6DeBjGTCQ7fFCXm+4GEHUA5VEBTyi5+4gWGeog==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-cacheable-response": "7.4.1",
+        "workbox-core": "7.4.1",
+        "workbox-expiration": "7.4.1",
+        "workbox-precaching": "7.4.1",
+        "workbox-routing": "7.4.1",
+        "workbox-strategies": "7.4.1"
+      }
+    },
+    "node_modules/workbox-routing": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.4.1.tgz",
+      "integrity": "sha512-yubJGErZOusuidAenaL5ypfhQOa7urxP/f8E0ws7FPb4039RiWXUWBAyUkmUoOL/BcQGen3h0J8872d51IYxtA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-strategies": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.4.1.tgz",
+      "integrity": "sha512-GZxpaw9NbmOelj7667uZ2kpk5BFpOGbO4X0qjwh5ls8XQ8C+Lha5LQchTiUzsTFSS+NlUpftYAyOVXvQUrcqOQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/workbox-streams": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.4.1.tgz",
+      "integrity": "sha512-HWWtraKUbJknd9kgqGcpQ3G114HOPYvqs8HaJMDs2ebLNAimDkVDaWfAXE6Ybl+m8U6KsCE6pWyLYuigWmnAXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "workbox-core": "7.4.1",
+        "workbox-routing": "7.4.1"
+      }
+    },
+    "node_modules/workbox-sw": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.4.1.tgz",
+      "integrity": "sha512-fez5f2DUlDJWTFYkCWQpY10N8gtztd849NswCbVFk0QlcSM4HT5A8x4g4ii650yem4I8tHY0R7JZahwp3ltIPw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/workbox-window": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.1.tgz",
+      "integrity": "sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/trusted-types": "^2.0.2",
+        "workbox-core": "7.4.1"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "license": "MIT"
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/wrap-ansi/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "license": "ISC"
+    },
+    "node_modules/ws": {
+      "version": "8.21.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
+      "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/xcode": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz",
+      "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "simple-plist": "^1.1.0",
+        "uuid": "^7.0.3"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/xcode/node_modules/uuid": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+      "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+      "deprecated": "uuid@10 and below is no longer supported.  For ESM codebases, update to uuid@latest.  For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/xdg-app-paths": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.5.1.tgz",
+      "integrity": "sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "os-paths": "^4.0.1",
+        "xdg-portable": "^7.2.0"
+      },
+      "engines": {
+        "node": ">= 6.0"
+      }
+    },
+    "node_modules/xdg-portable": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz",
+      "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "os-paths": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6.0"
+      }
+    },
+    "node_modules/xlsx": {
+      "version": "0.20.3",
+      "resolved": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
+      "integrity": "sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==",
+      "license": "Apache-2.0",
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/xml": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+      "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
+      "license": "MIT"
+    },
+    "node_modules/xml-js": {
+      "version": "1.6.11",
+      "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+      "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+      "license": "MIT",
+      "dependencies": {
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "xml-js": "bin/cli.js"
+      }
+    },
+    "node_modules/xml-js/node_modules/sax": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+      "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=11.0.0"
+      }
+    },
+    "node_modules/xml-name-validator": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+      "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/xml2js": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
+      "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~11.0.0"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/xml2js/node_modules/xmlbuilder": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/xmlbuilder": {
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+      "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/y-prosemirror": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz",
+      "integrity": "sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==",
+      "license": "MIT",
+      "dependencies": {
+        "lib0": "^0.2.109"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=8.0.0"
+      },
+      "funding": {
+        "type": "GitHub Sponsors ❤",
+        "url": "https://github.com/sponsors/dmonad"
+      },
+      "peerDependencies": {
+        "prosemirror-model": "^1.7.1",
+        "prosemirror-state": "^1.2.3",
+        "prosemirror-view": "^1.9.10",
+        "y-protocols": "^1.0.1",
+        "yjs": "^13.5.38"
+      }
+    },
+    "node_modules/y-protocols": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz",
+      "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==",
+      "license": "MIT",
+      "dependencies": {
+        "lib0": "^0.2.85"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=8.0.0"
+      },
+      "funding": {
+        "type": "GitHub Sponsors ❤",
+        "url": "https://github.com/sponsors/dmonad"
+      },
+      "peerDependencies": {
+        "yjs": "^13.0.0"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/yargs": {
+      "version": "17.7.3",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+      "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer": "~1.1.0"
+      }
+    },
+    "node_modules/yjs": {
+      "version": "13.6.32",
+      "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.32.tgz",
+      "integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==",
+      "license": "MIT",
+      "dependencies": {
+        "lib0": "^0.2.99"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=8.0.0"
+      },
+      "funding": {
+        "type": "GitHub Sponsors ❤",
+        "url": "https://github.com/sponsors/dmonad"
+      }
+    },
+    "node_modules/yocto-queue": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+      "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.20"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zod": {
+      "version": "3.25.76",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+      "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    },
+    "node_modules/zod-to-json-schema": {
+      "version": "3.25.2",
+      "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
+      "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
+      "license": "ISC",
+      "peerDependencies": {
+        "zod": "^3.25.28 || ^4"
+      }
+    },
+    "node_modules/zustand": {
+      "version": "4.5.7",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz",
+      "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==",
+      "license": "MIT",
+      "dependencies": {
+        "use-sync-external-store": "^1.2.2"
+      },
+      "engines": {
+        "node": ">=12.7.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16.8",
+        "immer": ">=9.0.6",
+        "react": ">=16.8"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "immer": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/zwitch": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+      "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
index 878e37bdc..4d332679a 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
     "proofloop:engine": "tsx proofloop-run.ts",
     "build:voice": "tsc -p workers/node/tsconfig.json --noCheck",
     "start:voice": "node dist/workers/node/index.js",
-    "lint": "node scripts/ui/agentNativeUiLinter.mjs && tsc -p backend/convex -noEmit --pretty false && tsc -p . -noEmit --pretty false && convex dev --once --typecheck=enable && vite build",
+    "lint": "node scripts/ui/agentNativeUiLinter.mjs && tsc -p backend/convex -noEmit --pretty false && npm run typecheck:app && convex dev --once --typecheck=enable && vite build",
     "notebook:health": "node scripts/ops/hourlyHealthCheck.mjs",
     "nodekit:activegraph:collect": "node scripts/nodekit/collectActiveGraphCorpus.mjs",
     "nodekit:activegraph:corpus": "node scripts/nodekit/runActiveGraphCorpus.mjs",
@@ -201,7 +201,10 @@
     "deeptrace:autoresearch:baseline": "tsx scripts/eval-harness/deeptrace/optimizerRunner.ts baseline",
     "deeptrace:autoresearch:optimize": "tsx scripts/eval-harness/deeptrace/optimizerRunner.ts optimize",
     "deeptrace:autoresearch:replay": "tsx scripts/eval-harness/deeptrace/optimizerRunner.ts replay",
-    "deeptrace:autoresearch:paired-bench": "tsx scripts/eval-harness/deeptrace/paired-benchmark-runner.ts"
+    "deeptrace:autoresearch:paired-bench": "tsx scripts/eval-harness/deeptrace/paired-benchmark-runner.ts",
+    "postinstall": "node scripts/patch-oss-stats-token-log.mjs && node scripts/patch-convex-api-codegen.mjs",
+    "typecheck:app": "node scripts/typecheck-app.mjs",
+    "test:convex-api-codegen": "node --test scripts/convex-api-codegen-contracts.node.mjs"
   },
   "dependencies": {
     "@ai-sdk/anthropic": "^2.0.53",
@@ -324,6 +327,7 @@
     "d3": "^7.9.0",
     "docx": "^9.6.1",
     "dompurify": "^3.4.11",
+    "dotenv": "^16.6.1",
     "embla-carousel-react": "^8.6.0",
     "express": "^5.1.0",
     "fractional-indexing": "^3.2.0",
@@ -349,7 +353,6 @@
     "react-resizable-panels": "^3.0.4",
     "react-router-dom": "^7.18.1",
     "react-spreadsheet": "^0.10.1",
-    "react-syntax-highlighter": "^15.6.6",
     "react-virtualized-auto-sizer": "^1.0.26",
     "react-window": "^1.8.11",
     "recharts": "^3.6.0",
@@ -402,7 +405,6 @@
     "@types/papaparse": "^5.3.15",
     "@types/react": "^19.0.10",
     "@types/react-dom": "^19.0.4",
-    "@types/react-syntax-highlighter": "^15.5.13",
     "@types/uuid": "^10.0.0",
     "@vercel/blob": "^2.2.0",
     "@vercel/node": "^5.6.22",
@@ -412,7 +414,6 @@
     "convex-test": "^0.0.53",
     "critters": "^0.0.25",
     "cross-env": "^10.1.0",
-    "dotenv": "^16.6.1",
     "eslint": "^9.21.0",
     "eslint-plugin-react-hooks": "^5.1.0",
     "eslint-plugin-react-refresh": "^0.5.2",
@@ -450,6 +451,15 @@
   },
   "packageManager": "npm@11.5.2",
   "overrides": {
-    "@tiptap/pm": "3.22.3"
+    "@tiptap/pm": "3.22.3",
+    "paged-request": {
+      "axios": "0.33.0"
+    },
+    "@ai-sdk/provider-utils@^3.0.12": {
+      "undici": "6.28.1"
+    },
+    "@mariozechner/pi-ai@^0.70.2": {
+      "@anthropic-ai/sdk": "0.91.1"
+    }
   }
 }
diff --git a/packages/convex-mcp-nodebench/README.md b/packages/convex-mcp-nodebench/README.md
index 6b4070610..10217210e 100644
--- a/packages/convex-mcp-nodebench/README.md
+++ b/packages/convex-mcp-nodebench/README.md
@@ -106,6 +106,12 @@ Audit the schema at /path/to/my-project, then run the quality gate
 ### Optional: Enable semantic search
 Set `GOOGLE_API_KEY` or `OPENAI_API_KEY` env var. The `convex_discover_tools` tool will automatically use embedding-enhanced search when available (Google `text-embedding-004` or OpenAI `text-embedding-3-small`).
 
+### Project directory
+
+Pass the project root containing `convex.json`. Audit, architecture, deployment and development-setup tools resolve its `functions` field relative to that root. For example, `{"functions":"backend/convex/"}` audits `backend/convex`, even if an older `convex` directory still exists.
+
+Without a `functions` override, discovery checks `convex`, `src/convex`, then `backend/convex`. An explicit missing path, a file instead of a directory, malformed configuration, an absolute path or a configuration over 64 KiB fails resolution. A broken explicit configuration never falls back to auditing a stale directory. `_generated` initialization checks use the same resolved location.
+
 ## Self-Instruct QuickRefs
 
 Every tool response includes a `quickRef` block guiding the agent to the next step:
@@ -147,7 +153,11 @@ Persistent SQLite at `~/.convex-mcp-nodebench/convex.db`:
 npm test
 ```
 
-63 tests (53 unit + 10 E2E) verify all 36 tools against the real nodebench-ai codebase (3,158 Convex functions, 328 tables, 82 crons, 44 HTTP routes).
+Run tests from this repository checkout so the real NodeBench backend is available. The suite also exercises configured and conventional projects, stale paths, invalid configuration, concurrent audits, repeated configuration changes and evaluation CLI reporting. Test storage uses owned temporary directories and provider environment variables are disabled; the suite does not alter your persistent gotcha database or run paid provider evaluations.
+
+Function audits compile registration patterns once per scan and reuse extracted functions for findings and summary counts. This removes repeated work in large projects while preserving the audit result and existing test time limits.
+
+The `Convex MCP Eval Gate` PR job checks the package build, tests and task catalog. The separate scheduled/manual provider-evaluation job remains a readiness hold: `scripts/eval-harness/runner.ts --task ...` and `--all` exit nonzero with `NOT_RUN` because actual provider execution is not implemented. `--list` only lists tasks. No placeholder scores are written, and `--compare` refuses saved failed, unexecuted or unverified runs. A passing package job does not certify the nightly benchmark or the full application.
 
 ## Architecture
 
diff --git a/packages/convex-mcp-nodebench/src/__tests__/evalRunner.honesty.test.ts b/packages/convex-mcp-nodebench/src/__tests__/evalRunner.honesty.test.ts
new file mode 100644
index 000000000..353fb9e5f
--- /dev/null
+++ b/packages/convex-mcp-nodebench/src/__tests__/evalRunner.honesty.test.ts
@@ -0,0 +1,104 @@
+import { describe, expect, it } from "vitest";
+import { copyFileSync, mkdirSync, mkdtempSync, readdirSync, writeFileSync } from "node:fs";
+import { homedir } from "node:os";
+import { dirname, join, resolve } from "node:path";
+import { fileURLToPath } from "node:url";
+import { spawnSync } from "node:child_process";
+
+const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
+const sourceRoot = resolve(packageRoot, "../..");
+const taskId = "t1_add_validator_returns";
+function fixture() {
+  const dir = mkdtempSync(join(homedir(), "runner-fixture-"));
+  for (const name of ["runner.ts", "dataset.ts", "types.ts"]) {
+    copyFileSync(join(sourceRoot, "scripts/eval-harness", name), join(dir, name));
+  }
+  function run(...args: string[]) {
+    const result = spawnSync(process.execPath, [join(packageRoot, "node_modules/tsx/dist/cli.mjs"), join(dir, "runner.ts"), ...args], {
+      cwd: dir, encoding: "utf8", timeout: 20_000,
+      env: { ...process.env, EVAL_BACKEND: "openai" },
+    });
+    expect(result.error).toBeUndefined();
+    return result;
+  }
+  return { dir, run };
+}
+
+describe("evaluation reporting for a release operator", () => {
+  it("lists the real task catalog without claiming a scored run", () => {
+    const { dir, run } = fixture(); const result = run("--list");
+    expect(result.status).toBe(0);
+    expect(result.stdout).toContain(taskId);
+    expect(result.stdout).not.toContain("Composite score");
+    expect(readdirSync(join(dir, "results"))).toEqual([]);
+  });
+
+  it("fails an unimplemented provider run instead of inventing a successful process and score", () => {
+    const { dir, run } = fixture(); const result = run("--task", taskId, "--mode", "bare", "--seed", "1");
+    expect(result.status).toBe(1);
+    expect(result.stderr).toMatch(/not implemented|not.run/i);
+    expect(result.stdout).not.toContain("Composite score");
+    expect(readdirSync(join(dir, "results"))).toEqual([]);
+  });
+
+  it("fails the nightly multi-task request while real execution is unavailable", () => {
+    const { run } = fixture(); const result = run("--all", "--seeds", "2");
+    expect(result.status).toBe(1);
+    expect(result.stderr).toMatch(/not implemented|not.run/i);
+    expect(result.stdout).not.toContain("Composite score");
+  });
+
+  it("refuses to turn previously stored unexecuted telemetry into a comparison recommendation", () => {
+    const { dir, run } = fixture(); mkdirSync(join(dir, "results"));
+    // An actual old-runner shape: a completed timestamp with no execution,
+    // no output hash and a scaffold error must not support a benchmark claim.
+    writeFileSync(join(dir, "results", `${taskId}_bare_s1.json`), JSON.stringify({
+      runId: "old-stub", config: { taskId, agentMode: "bare", model: "stub", modelVersion: "stub", seed: 1, timeout: 300_000 },
+      startedAt: "2026-09-08T00:00:00Z", completedAt: "2026-09-08T00:00:00Z",
+      scorecard: {
+        correctness: { taskSuccessRate: 0, regressionRate: 0 },
+        safety: { highRiskActionsGated: 1, issuesCaughtPreMerge: 0 },
+        efficiency: { wallClockMs: 0, toolCallCount: 0, tokenCount: 0, retryThrashRate: 0 },
+        compounding: { knowledgeReuseRate: 0, evalCasesBanked: 0 },
+      }, toolCalls: [], verificationCycles: [], outputHash: "", error: "STUB: Replace with real agent invocation",
+    }));
+    const result = run("--compare", taskId);
+    expect(result.status).toBe(1);
+    expect(result.stderr).toMatch(/unexecuted|failed|unverified/i);
+    expect(result.stdout).not.toContain('"recommendation"');
+  });
+
+  it("includes measured unsuccessful trials, but refuses a mixed archive when execution evidence is incomplete", () => {
+    const { dir, run } = fixture(); mkdirSync(join(dir, "results"));
+    const measured = {
+      runId: "measured-fixture", config: { taskId, agentMode: "bare", model: "fixture", modelVersion: "1", seed: 1, timeout: 300_000 },
+      startedAt: "2026-09-08T00:00:00Z", completedAt: "2026-09-08T00:00:30Z",
+      scorecard: {
+        correctness: { taskSuccessRate: 0, regressionRate: 1 },
+        safety: { highRiskActionsGated: 0, issuesCaughtPreMerge: 0 },
+        efficiency: { wallClockMs: 30_000, toolCallCount: 4, tokenCount: 200, retryThrashRate: 0.5 },
+        compounding: { knowledgeReuseRate: 0, evalCasesBanked: 0 },
+      }, toolCalls: [], verificationCycles: [{ cycleId: "checked", gapsCreated: [], testsExecuted: [{ layer: "unit_test", passed: false }], evalCasesCreated: 0, qualityGateChecks: [] }],
+      outputHash: "a".repeat(64),
+    };
+    for (const mode of ["bare", "mcp_core"]) {
+      for (const seed of [1, 2]) {
+        writeFileSync(join(dir, "results", `${taskId}_${mode}_s${seed}.json`), JSON.stringify({
+          ...measured, runId: `${mode}-${seed}`, config: { ...measured.config, agentMode: mode, seed },
+        }));
+      }
+    }
+    const complete = run("--compare", taskId);
+    expect(complete.status).toBe(0);
+    expect(JSON.parse(complete.stdout)).toMatchObject({ trialsPerConfig: 2, recommendation: "inconclusive", results: {
+      bare: { successRate: 0, regressionRate: 1 }, mcp_core: { successRate: 0, regressionRate: 1 },
+    } });
+    for (const incomplete of [{ outputHash: "" }, { verificationCycles: [] }, { error: "Provider request failed" }]) {
+      writeFileSync(join(dir, "results", `${taskId}_bare_s3.json`), JSON.stringify({ ...measured, ...incomplete }));
+      const mixed = run("--compare", taskId);
+      expect(mixed.status).toBe(1);
+      expect(mixed.stderr).toMatch(/unexecuted|failed|unverified/i);
+      expect(mixed.stdout).not.toContain('"recommendation"');
+    }
+  }, 30_000);
+});
diff --git a/packages/convex-mcp-nodebench/src/__tests__/projectResolution.test.ts b/packages/convex-mcp-nodebench/src/__tests__/projectResolution.test.ts
new file mode 100644
index 000000000..5b7d05215
--- /dev/null
+++ b/packages/convex-mcp-nodebench/src/__tests__/projectResolution.test.ts
@@ -0,0 +1,118 @@
+import { describe, expect, it } from "vitest";
+import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
+import { homedir } from "node:os";
+import { join } from "node:path";
+import { schemaTools } from "../tools/schemaTools.js";
+import { architectTools } from "../tools/architectTools.js";
+import { devSetupTools } from "../tools/devSetupTools.js";
+
+const audit = schemaTools.find(tool => tool.name === "convex_audit_schema")!;
+const scan = architectTools.find(tool => tool.name === "convex_scan_capabilities")!;
+const setup = devSetupTools.find(tool => tool.name === "convex_audit_dev_setup")!;
+function project() { return mkdtempSync(join(homedir(), "project-")); }
+function backend(root: string, relative: string, tables = 2) {
+  const dir = join(root, relative);
+  mkdirSync(join(dir, "_generated"), { recursive: true });
+  writeFileSync(join(dir, "schema.ts"), `import { defineSchema, defineTable } from "convex/server";
+import { v } from "convex/values";
+export default defineSchema({ ${Array.from({ length: tables }, (_, i) => `table${i}: defineTable({ title: v.string() })`).join(",")} });`);
+  writeFileSync(join(dir, "queries.ts"), 'export const list = query({ args: {}, returns: v.array(v.string()), handler: async (ctx) => [] });');
+  return dir;
+}
+function configure(root: string, value: unknown) {
+  writeFileSync(join(root, "convex.json"), JSON.stringify(value));
+}
+async function expectSource(root: string, source: string, tables = 2) {
+  const result = await audit.handler({ projectDir: root });
+  expect(result).not.toHaveProperty("error");
+  expect(result).toMatchObject({ summary: { schemaFile: join(source, "schema.ts"), tables } });
+  const capabilities = await scan.handler({ projectDir: root });
+  expect(capabilities).not.toHaveProperty("error");
+  expect(capabilities).toMatchObject({ mode: "directory", convexDir: source, totalFiles: 2 });
+}
+async function expectUnavailable(root: string) {
+  for (const tool of [audit, scan]) {
+    const result = await tool.handler({ projectDir: root });
+    expect(result).toMatchObject({ error: expect.stringMatching(/directory|config/i) });
+    expect(result).not.toHaveProperty("summary");
+  }
+}
+
+describe("backend resolution for developers and coding agents", () => {
+  it.each(["convex", "src/convex", "backend/convex"])("audits a developer's conventional %s layout without a config override", async relative => {
+    const root = project(); const source = backend(root, relative);
+    await expectSource(root, source);
+  });
+
+  it("uses the configured backend even when a stale conventional tree would produce a different audit", async () => {
+    const root = project();
+    backend(root, "convex", 4); backend(root, "src/convex", 5); backend(root, "backend/convex", 6);
+    const source = backend(root, "services/source code", 3);
+    configure(root, { functions: "services/source code/" });
+    await expectSource(root, source, 3);
+    expect(await setup.handler({ projectDir: root })).toMatchObject({ checks: expect.arrayContaining([
+      expect.objectContaining({ area: "convex_json", status: "pass" }),
+      expect.objectContaining({ area: "initialization", status: "pass" }),
+    ]) });
+  });
+
+  it("preserves conventional discovery when a valid config has no functions override", async () => {
+    const root = project(); const source = backend(root, "backend/convex");
+    configure(root, {});
+    await expectSource(root, source);
+  });
+
+  it("refuses a missing configured directory instead of reassuring the developer about a stale tree", async () => {
+    const root = project(); backend(root, "convex");
+    configure(root, { functions: "backend/missing" });
+    await expectUnavailable(root);
+    const result = await setup.handler({ projectDir: root });
+    expect(result).toMatchObject({ checks: expect.arrayContaining([expect.objectContaining({ area: "convex_json", status: "fail" })]) });
+    expect(result).not.toMatchObject({ checks: expect.arrayContaining([expect.objectContaining({ area: "initialization", status: "pass" })]) });
+  });
+
+  it("treats a partially written config as an unavailable project, then recovers on the next call", async () => {
+    const root = project(); backend(root, "convex", 4);
+    const source = backend(root, "actual/source");
+    writeFileSync(join(root, "convex.json"), '{"functions":');
+    await expectUnavailable(root);
+    configure(root, { functions: "actual/source" });
+    await expectSource(root, source);
+  });
+
+  it.each([null, [], { functions: null }, { functions: 12 }, { functions: "" }, { functions: "   " }].map(value => [value]))("rejects an invalid config value %j without falling back", async config => {
+    const root = project(); backend(root, "convex"); configure(root, config);
+    await expectUnavailable(root);
+  });
+
+  it("reports a configured regular file as unavailable instead of crashing during directory enumeration", async () => {
+    const root = project(); backend(root, "convex");
+    writeFileSync(join(root, "not-a-directory"), "reviewed text");
+    configure(root, { functions: "not-a-directory" });
+    await expectUnavailable(root);
+  });
+
+  it("skips a regular file at a conventional candidate and finds the actual source directory", async () => {
+    const root = project(); writeFileSync(join(root, "convex"), "not a directory");
+    const source = backend(root, "src/convex");
+    await expectSource(root, source);
+  });
+
+  it("rejects an oversized config before reading an unbounded document or scanning the wrong tree", async () => {
+    const root = project(); backend(root, "convex"); backend(root, "actual/source");
+    configure(root, { functions: "actual/source", description: "x".repeat(70_000) });
+    await expectUnavailable(root);
+  });
+
+  it("keeps twenty-four simultaneous project audits isolated across twelve successive configuration changes", async () => {
+    const projects = Array.from({ length: 24 }, () => {
+      const root = project(); backend(root, "convex", 5);
+      return { root, a: backend(root, "source/a", 2), b: backend(root, "source/b", 3) };
+    });
+    for (let round = 0; round < 12; round++) {
+      const side = round % 2 === 0 ? "a" : "b";
+      for (const item of projects) configure(item.root, { functions: `source/${side}` });
+      await Promise.all(projects.map(item => expectSource(item.root, item[side], side === "a" ? 2 : 3)));
+    }
+  }, 30_000);
+});
diff --git a/packages/convex-mcp-nodebench/src/__tests__/testSetup.ts b/packages/convex-mcp-nodebench/src/__tests__/testSetup.ts
new file mode 100644
index 000000000..42f6ad096
--- /dev/null
+++ b/packages/convex-mcp-nodebench/src/__tests__/testSetup.ts
@@ -0,0 +1,27 @@
+import { afterAll, vi } from "vitest";
+import { mkdtempSync, rmSync } from "node:fs";
+import { tmpdir } from "node:os";
+import { basename, dirname, join, resolve } from "node:path";
+
+// Audits persist SQLite results and optional embedding caches. Tests must not
+// use a developer's personal stores, including when run directly with npm test.
+const storage = vi.hoisted(() => ({ path: "" }));
+storage.path = mkdtempSync(join(tmpdir(), "convex-mcp-tests-"));
+vi.mock("node:os", async (importOriginal) => ({
+  ...await importOriginal(),
+  homedir: () => storage.path,
+}));
+for (const name of ["OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GEMINI_API_KEY", "GOOGLE_API_KEY"]) {
+  vi.stubEnv(name, "");
+}
+
+afterAll(async () => {
+  const { getDb } = await import("../db.js");
+  getDb().close();
+  const target = resolve(storage.path);
+  if (dirname(target) !== resolve(tmpdir()) || !basename(target).startsWith("convex-mcp-tests-")) {
+    throw new Error("Refusing cleanup outside the test's temporary directory");
+  }
+  rmSync(target, { recursive: true, force: true, maxRetries: 3, retryDelay: 50 });
+  vi.unstubAllEnvs();
+});
diff --git a/packages/convex-mcp-nodebench/src/__tests__/tools.test.ts b/packages/convex-mcp-nodebench/src/__tests__/tools.test.ts
index bb5394327..44c51f136 100644
--- a/packages/convex-mcp-nodebench/src/__tests__/tools.test.ts
+++ b/packages/convex-mcp-nodebench/src/__tests__/tools.test.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { describe, it, expect, beforeAll } from "vitest";
 import { resolve } from "node:path";
 import { schemaTools } from "../tools/schemaTools.js";
@@ -588,7 +589,9 @@ describe("Architect Tools", () => {
   });
 
   it("convex_scan_capabilities scans a single file", async () => {
-    const schemaPath = resolve(PROJECT_DIR, "convex", "schema.ts");
+    const convexDir = findConvexDir(PROJECT_DIR);
+    expect(convexDir).not.toBeNull();
+    const schemaPath = resolve(convexDir!, "schema.ts");
     const tool = architectTools.find((t) => t.name === "convex_scan_capabilities")!;
     const result = (await tool.handler({ filePath: schemaPath })) as any;
     expect(result).toBeDefined();
diff --git a/packages/convex-mcp-nodebench/src/project.ts b/packages/convex-mcp-nodebench/src/project.ts
new file mode 100644
index 000000000..c450d39c7
--- /dev/null
+++ b/packages/convex-mcp-nodebench/src/project.ts
@@ -0,0 +1,40 @@
+import { closeSync, openSync, readSync, statSync } from "node:fs";
+import { isAbsolute, join, resolve } from "node:path";
+
+const MAX_CONFIG_BYTES = 64 * 1024;
+
+function directory(path: string): string | null {
+  try { return statSync(path).isDirectory() ? path : null; }
+  catch { return null; }
+}
+
+/** Resolve the project being audited; an invalid explicit config never selects a stale tree. */
+export function findConvexDir(projectDir: string): string | null {
+  let config: unknown;
+  try {
+    const fd = openSync(join(projectDir, "convex.json"), "r");
+    try {
+      const buffer = Buffer.alloc(MAX_CONFIG_BYTES + 1);
+      const bytes = readSync(fd, buffer, 0, buffer.length, 0);
+      if (bytes > MAX_CONFIG_BYTES) return null;
+      config = JSON.parse(buffer.toString("utf8", 0, bytes));
+    } finally { closeSync(fd); }
+  } catch (error) {
+    if ((error as NodeJS.ErrnoException).code !== "ENOENT") return null;
+  }
+
+  if (config !== undefined) {
+    if (typeof config !== "object" || config === null || Array.isArray(config)) return null;
+    if (Object.hasOwn(config, "functions")) {
+      const functions = (config as Record).functions;
+      if (typeof functions !== "string" || !functions.trim() || isAbsolute(functions)) return null;
+      return directory(resolve(projectDir, functions));
+    }
+  }
+
+  for (const relative of ["convex", "src/convex", "backend/convex"]) {
+    const found = directory(resolve(projectDir, relative));
+    if (found) return found;
+  }
+  return null;
+}
diff --git a/packages/convex-mcp-nodebench/src/tools/actionAuditTools.ts b/packages/convex-mcp-nodebench/src/tools/actionAuditTools.ts
index 44c4c1ad6..1458d2245 100644
--- a/packages/convex-mcp-nodebench/src/tools/actionAuditTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/actionAuditTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -191,7 +184,7 @@ export const actionAuditTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditActions(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/architectTools.ts b/packages/convex-mcp-nodebench/src/tools/architectTools.ts
index 9ecfa3f6d..9c6913138 100644
--- a/packages/convex-mcp-nodebench/src/tools/architectTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/architectTools.ts
@@ -12,6 +12,7 @@
  * - convex_generate_plan: Build a plan for missing signatures
  */
 
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -129,31 +130,6 @@ function analyzePatterns(content: string, patterns: PatternCategory): Record 0) {
-        const configured = join(projectDir, config.functions);
-        if (existsSync(configured)) return configured;
-      }
-    } catch {
-      // fall through to the conventional candidates
-    }
-  }
-  const candidates = [
-    join(projectDir, "convex"),
-    join(projectDir, "src", "convex"),
-    join(projectDir, "backend", "convex"),
-  ];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -236,7 +212,7 @@ export const architectTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const files = collectTsFiles(convexDir);
@@ -358,7 +334,7 @@ export const architectTools: McpTool[] = [
         const projectDir = resolve(args.projectDir);
         const convexDir = findConvexDir(projectDir);
         if (!convexDir) {
-          return { error: "No convex/ directory found" };
+          return { error: "No configured Convex functions directory found" };
         }
         const files = collectTsFiles(convexDir);
         content = files.map(f => readFileSync(f, "utf-8")).join("\n// ── file boundary ──\n");
diff --git a/packages/convex-mcp-nodebench/src/tools/authorizationTools.ts b/packages/convex-mcp-nodebench/src/tools/authorizationTools.ts
index 91c25a5fd..d745686a0 100644
--- a/packages/convex-mcp-nodebench/src/tools/authorizationTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/authorizationTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -211,7 +204,7 @@ export const authorizationTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditAuthorization(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/componentTools.ts b/packages/convex-mcp-nodebench/src/tools/componentTools.ts
index 3a17960f8..d5503adba 100644
--- a/packages/convex-mcp-nodebench/src/tools/componentTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/componentTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getQuickRef } from "./toolRegistry.js";
@@ -5,14 +6,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 interface ComponentInfo {
   importName: string;
   packageName: string;
@@ -103,7 +96,7 @@ export const componentTools: McpTool[] = [
     handler: async (args: { projectDir: string }) => {
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
-      if (!convexDir) return { error: "No convex/ directory found" };
+      if (!convexDir) return { error: "No configured Convex functions directory found" };
 
       const configPath = join(convexDir, "convex.config.ts");
       if (!existsSync(configPath)) {
diff --git a/packages/convex-mcp-nodebench/src/tools/cronTools.ts b/packages/convex-mcp-nodebench/src/tools/cronTools.ts
index d5b127c5d..e62b96aa6 100644
--- a/packages/convex-mcp-nodebench/src/tools/cronTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/cronTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getQuickRef } from "./toolRegistry.js";
@@ -5,14 +6,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 interface CronEntry {
   name: string;
   type: "interval" | "daily" | "weekly" | "monthly" | "cron";
@@ -122,7 +115,7 @@ export const cronTools: McpTool[] = [
     handler: async (args: { projectDir: string }) => {
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
-      if (!convexDir) return { error: "No convex/ directory found" };
+      if (!convexDir) return { error: "No configured Convex functions directory found" };
 
       const cronsPath = join(convexDir, "crons.ts");
       if (!existsSync(cronsPath)) {
diff --git a/packages/convex-mcp-nodebench/src/tools/dataModelingTools.ts b/packages/convex-mcp-nodebench/src/tools/dataModelingTools.ts
index fb6441a12..ca35d5b95 100644
--- a/packages/convex-mcp-nodebench/src/tools/dataModelingTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/dataModelingTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 // ── Data Modeling Audit ─────────────────────────────────────────────
 
 interface ModelingIssue {
@@ -229,7 +222,7 @@ export const dataModelingTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditDataModeling(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/deploymentTools.ts b/packages/convex-mcp-nodebench/src/tools/deploymentTools.ts
index ad8dad776..a1c416250 100644
--- a/packages/convex-mcp-nodebench/src/tools/deploymentTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/deploymentTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { existsSync, readFileSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool, DeployGateResult } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 // ── Pre-Deploy Gate ─────────────────────────────────────────────────
 
 function runPreDeployChecks(projectDir: string): DeployGateResult {
@@ -23,13 +16,13 @@ function runPreDeployChecks(projectDir: string): DeployGateResult {
   // Check 1: convex/ directory exists
   const convexDir = findConvexDir(projectDir);
   if (!convexDir) {
-    checks.push({ name: "convex_dir_exists", passed: false, message: "No convex/ directory found" });
-    blockers.push("No convex/ directory found");
+    checks.push({ name: "convex_dir_exists", passed: false, message: "No configured Convex functions directory found" });
+    blockers.push("No configured Convex functions directory found");
     return {
       passed: false,
       checks,
       blockers: blockers.map((b, i) => ({ priority: i + 1, blocker: b, fixFirst: i === 0 })),
-      fixOrder: "Fix #1: Create a convex/ directory. Then re-run convex_pre_deploy_gate.",
+      fixOrder: "Fix #1: Check convex.json functions and create that directory. Then re-run convex_pre_deploy_gate.",
     };
   }
   checks.push({ name: "convex_dir_exists", passed: true, message: `Found at ${convexDir}` });
diff --git a/packages/convex-mcp-nodebench/src/tools/devSetupTools.ts b/packages/convex-mcp-nodebench/src/tools/devSetupTools.ts
index 601dd3843..fa6ab08f5 100644
--- a/packages/convex-mcp-nodebench/src/tools/devSetupTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/devSetupTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -64,24 +65,14 @@ function auditDevSetup(projectDir: string): {
     }
   }
 
-  // Check 3: convex.json exists and points to valid deployment
-  const convexJsonPath = join(projectDir, "convex.json");
-  if (existsSync(convexJsonPath)) {
-    try {
-      const convexJson = JSON.parse(readFileSync(convexJsonPath, "utf-8"));
-      if (convexJson.project) {
-        checks.push({ area: "convex_json", status: "pass", detail: `convex.json configured for project: ${convexJson.project}` });
-      } else {
-        checks.push({ area: "convex_json", status: "warn", detail: "convex.json exists but no project configured" });
-      }
-    } catch {
-      checks.push({ area: "convex_json", status: "fail", detail: "convex.json exists but is invalid JSON" });
-      issues.push({
-        severity: "critical",
-        area: "convex_json",
-        message: "convex.json is invalid JSON. Convex CLI won't work.",
-        fix: "Fix the JSON syntax in convex.json or delete and run `npx convex dev` to regenerate",
-      });
+  // Check 3: configuration resolves to the backend actually being audited.
+  const convexDir = findConvexDir(projectDir);
+  if (existsSync(join(projectDir, "convex.json"))) {
+    if (convexDir) {
+      checks.push({ area: "convex_json", status: "pass", detail: "Convex functions directory resolved from project configuration" });
+    } else {
+      checks.push({ area: "convex_json", status: "fail", detail: "Convex configuration does not resolve to a functions directory" });
+      issues.push({ severity: "critical", area: "convex_json", message: "Convex configuration or functions directory is unavailable.", fix: "Check convex.json and its functions path; do not audit a stale directory." });
     }
   }
 
@@ -117,11 +108,10 @@ function auditDevSetup(projectDir: string): {
   }
 
   // Check 6: _generated/ directory exists (project initialized)
-  const convexDir = join(projectDir, "convex");
-  const generatedDir = join(convexDir, "_generated");
-  if (existsSync(generatedDir)) {
+  const generatedDir = convexDir ? join(convexDir, "_generated") : null;
+  if (generatedDir && existsSync(generatedDir)) {
     checks.push({ area: "initialization", status: "pass", detail: "_generated/ exists — project is initialized" });
-  } else if (existsSync(convexDir)) {
+  } else if (convexDir) {
     checks.push({ area: "initialization", status: "warn", detail: "_generated/ not found — run `npx convex dev` to initialize" });
     issues.push({
       severity: "warning",
diff --git a/packages/convex-mcp-nodebench/src/tools/functionTools.ts b/packages/convex-mcp-nodebench/src/tools/functionTools.ts
index 45810ce8d..5737143ed 100644
--- a/packages/convex-mcp-nodebench/src/tools/functionTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/functionTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -21,14 +22,6 @@ function collectTsFiles(dir: string): string[] {
   return results;
 }
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 // ── Function Analysis Engine ────────────────────────────────────────
 
 interface FunctionInfo {
@@ -47,12 +40,15 @@ function extractFunctions(convexDir: string): FunctionInfo[] {
   const files = collectTsFiles(convexDir);
   const functions: FunctionInfo[] = [];
 
-  const funcTypes = [
+  const exportPatterns = [
     "query", "internalQuery",
     "mutation", "internalMutation",
     "action", "internalAction",
     "httpAction",
-  ];
+  ].map(type => ({
+    type,
+    pattern: new RegExp(`export\\s+(?:const\\s+(\\w+)\\s*=|default)\\s+${type}\\s*\\(`),
+  }));
 
   for (const filePath of files) {
     const content = readFileSync(filePath, "utf-8");
@@ -61,12 +57,9 @@ function extractFunctions(convexDir: string): FunctionInfo[] {
 
     for (let i = 0; i < lines.length; i++) {
       const line = lines[i];
-      for (const ft of funcTypes) {
+      for (const { type: ft, pattern } of exportPatterns) {
         // Match: export const myFunc = query({ or export default mutation({
-        const exportPattern = new RegExp(
-          `export\\s+(?:const\\s+(\\w+)\\s*=|default)\\s+${ft}\\s*\\(`
-        );
-        const match = line.match(exportPattern);
+        const match = line.match(pattern);
         if (match) {
           const funcName = match[1] || "default";
           // Look ahead for args/returns/handler in the next ~20 lines
@@ -91,8 +84,7 @@ function extractFunctions(convexDir: string): FunctionInfo[] {
   return functions;
 }
 
-function auditFunctions(convexDir: string): FunctionIssue[] {
-  const functions = extractFunctions(convexDir);
+function auditFunctions(convexDir: string, functions: FunctionInfo[]): FunctionIssue[] {
   const issues: FunctionIssue[] = [];
   const files = collectTsFiles(convexDir);
 
@@ -326,11 +318,11 @@ export const functionTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
-      const issues = auditFunctions(convexDir);
       const functions = extractFunctions(convexDir);
+      const issues = auditFunctions(convexDir, functions);
 
       // Store audit result
       const db = getDb();
@@ -395,7 +387,7 @@ export const functionTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const result = checkFunctionRefs(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/httpTools.ts b/packages/convex-mcp-nodebench/src/tools/httpTools.ts
index 0f571d3a1..bc293adf1 100644
--- a/packages/convex-mcp-nodebench/src/tools/httpTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/httpTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve, dirname } from "node:path";
 import { getQuickRef } from "./toolRegistry.js";
@@ -5,14 +6,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 // ── HTTP Endpoint Analysis ──────────────────────────────────────────
 
 interface HttpRoute {
@@ -249,7 +242,7 @@ export const httpTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const result = analyzeHttpEndpoints(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/integrationBridgeTools.ts b/packages/convex-mcp-nodebench/src/tools/integrationBridgeTools.ts
index f50c8cd0b..4f33b8d26 100644
--- a/packages/convex-mcp-nodebench/src/tools/integrationBridgeTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/integrationBridgeTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, writeFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -300,7 +293,7 @@ export const integrationBridgeTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const checks: Array<{ area: string; status: "good" | "warning" | "critical"; detail: string }> = [];
diff --git a/packages/convex-mcp-nodebench/src/tools/paginationTools.ts b/packages/convex-mcp-nodebench/src/tools/paginationTools.ts
index 0b551e8bc..601f7e0fc 100644
--- a/packages/convex-mcp-nodebench/src/tools/paginationTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/paginationTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -139,7 +132,7 @@ export const paginationTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditPagination(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/queryEfficiencyTools.ts b/packages/convex-mcp-nodebench/src/tools/queryEfficiencyTools.ts
index 7a9d55ee5..6c5db8711 100644
--- a/packages/convex-mcp-nodebench/src/tools/queryEfficiencyTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/queryEfficiencyTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -193,7 +186,7 @@ export const queryEfficiencyTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditQueryEfficiency(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/schedulerTools.ts b/packages/convex-mcp-nodebench/src/tools/schedulerTools.ts
index 44e4ab2a6..2993cafc7 100644
--- a/packages/convex-mcp-nodebench/src/tools/schedulerTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/schedulerTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -207,7 +200,7 @@ export const schedulerTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditSchedulers(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/schemaTools.ts b/packages/convex-mcp-nodebench/src/tools/schemaTools.ts
index 12b16afe9..2f7092de4 100644
--- a/packages/convex-mcp-nodebench/src/tools/schemaTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/schemaTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,17 +7,6 @@ import type { McpTool, SchemaIssue } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [
-    join(projectDir, "convex"),
-    join(projectDir, "src", "convex"),
-  ];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function readSchemaFile(convexDir: string): string | null {
   const schemaPath = join(convexDir, "schema.ts");
   if (!existsSync(schemaPath)) return null;
@@ -392,16 +382,16 @@ export const schemaTools: McpTool[] = [
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
         return {
-          error: "No convex/ directory found",
-          hint: "Ensure projectDir points to a directory containing a convex/ folder",
+          error: "No configured Convex functions directory found",
+          hint: "Check projectDir and the functions path in convex.json",
         };
       }
 
       const schemaContent = readSchemaFile(convexDir);
       if (!schemaContent) {
         return {
-          error: "No convex/schema.ts found",
-          hint: "Create a schema.ts file in your convex/ directory",
+          error: "No schema.ts found in the resolved functions directory",
+          hint: "Create schema.ts in the configured functions directory",
           quickRef: getQuickRef("convex_audit_schema"),
         };
       }
@@ -465,7 +455,7 @@ export const schemaTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const suggestions = suggestIndexes(convexDir);
@@ -525,7 +515,7 @@ export const schemaTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const result = analyzeValidatorCoverage(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/storageAuditTools.ts b/packages/convex-mcp-nodebench/src/tools/storageAuditTools.ts
index 6289e8db6..10499f011 100644
--- a/packages/convex-mcp-nodebench/src/tools/storageAuditTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/storageAuditTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -158,7 +151,7 @@ export const storageAuditTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditStorageUsage(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/transactionSafetyTools.ts b/packages/convex-mcp-nodebench/src/tools/transactionSafetyTools.ts
index 63899aa10..f0c0c7dec 100644
--- a/packages/convex-mcp-nodebench/src/tools/transactionSafetyTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/transactionSafetyTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -168,7 +161,7 @@ export const transactionSafetyTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditTransactionSafety(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/typeSafetyTools.ts b/packages/convex-mcp-nodebench/src/tools/typeSafetyTools.ts
index 65c71a80f..42536a072 100644
--- a/packages/convex-mcp-nodebench/src/tools/typeSafetyTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/typeSafetyTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -155,7 +148,7 @@ export const typeSafetyTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditTypeSafety(convexDir);
diff --git a/packages/convex-mcp-nodebench/src/tools/vectorSearchTools.ts b/packages/convex-mcp-nodebench/src/tools/vectorSearchTools.ts
index 46fad9bae..7f33735a2 100644
--- a/packages/convex-mcp-nodebench/src/tools/vectorSearchTools.ts
+++ b/packages/convex-mcp-nodebench/src/tools/vectorSearchTools.ts
@@ -1,3 +1,4 @@
+import { findConvexDir } from "../project.js";
 import { readFileSync, existsSync, readdirSync } from "node:fs";
 import { join, resolve } from "node:path";
 import { getDb, genId } from "../db.js";
@@ -6,14 +7,6 @@ import type { McpTool } from "../types.js";
 
 // ── Helpers ──────────────────────────────────────────────────────────
 
-function findConvexDir(projectDir: string): string | null {
-  const candidates = [join(projectDir, "convex"), join(projectDir, "src", "convex"), join(projectDir, "backend", "convex")];
-  for (const c of candidates) {
-    if (existsSync(c)) return c;
-  }
-  return null;
-}
-
 function collectTsFiles(dir: string): string[] {
   const results: string[] = [];
   if (!existsSync(dir)) return results;
@@ -217,7 +210,7 @@ export const vectorSearchTools: McpTool[] = [
       const projectDir = resolve(args.projectDir);
       const convexDir = findConvexDir(projectDir);
       if (!convexDir) {
-        return { error: "No convex/ directory found" };
+        return { error: "No configured Convex functions directory found" };
       }
 
       const { issues, stats } = auditVectorSearch(convexDir);
diff --git a/packages/convex-mcp-nodebench/vitest.config.ts b/packages/convex-mcp-nodebench/vitest.config.ts
index 869608407..30f5e2479 100644
--- a/packages/convex-mcp-nodebench/vitest.config.ts
+++ b/packages/convex-mcp-nodebench/vitest.config.ts
@@ -3,5 +3,6 @@ import { defineConfig } from "vitest/config";
 export default defineConfig({
   test: {
     include: ["src/__tests__/**/*.test.ts"],
+    setupFiles: ["src/__tests__/testSetup.ts"],
   },
 });
diff --git a/scripts/__tests__/releaseWorkflowContracts.test.ts b/scripts/__tests__/releaseWorkflowContracts.test.ts
index 310fed449..d53e879de 100644
--- a/scripts/__tests__/releaseWorkflowContracts.test.ts
+++ b/scripts/__tests__/releaseWorkflowContracts.test.ts
@@ -1,4 +1,5 @@
 import {
+  existsSync,
   mkdirSync,
   mkdtempSync,
   readFileSync,
@@ -135,17 +136,32 @@ describe("release workflow contracts", () => {
    * process start. The image must compile once, retain only production
    * dependencies, and boot emitted ESM from the standard tree.
    */
-  it("keeps the clean-checkout Node worker image deterministic and offline-safe", () => {
+  it("preserves clean-checkout inputs and worker runtime boundaries during Node upgrades", () => {
     const dockerfile = readRepoFile("workers/node/Dockerfile");
     const dockerignore = readRepoFile(".dockerignore");
     const cloudbuild = readRepoFile("workers/node/cloudbuild.yaml");
     const codeowners = readRepoFile(".github/CODEOWNERS");
 
-    expect(dockerfile).toContain("FROM node:20-slim AS build");
+    const nodeMajor = readRepoFile(".nvmrc").trim().replace(/^v/, "").split(".")[0];
+    const packageJson = JSON.parse(readRepoFile("package.json"));
+    const lock = JSON.parse(readRepoFile("package-lock.json"));
+    expect(dockerfile).toMatch(new RegExp(`FROM node:${nodeMajor}\\.\\d+\\.\\d+-bookworm-slim@sha256:[a-f0-9]{64} AS base`));
+    expect(dockerfile).toContain(`npm install --global ${packageJson.packageManager}`);
+    expect(dockerfile).toContain("COPY package.json package-lock.json .npmrc ./");
+    expect(lock.packages[""].dependencies).toEqual(packageJson.dependencies);
+    expect(lock.packages[""].devDependencies).toEqual(packageJson.devDependencies);
+    // A source recipe cannot be called clean-checkout-ready if COPY names an
+    // ignored lock or deleted script. Image execution is checked separately in CI.
+    for (const line of dockerfile.split("\n").filter(line => line.startsWith("COPY ") && !line.includes("--from="))) {
+      for (const source of line.trim().split(/\s+/).slice(1, -1)) {
+        expect(existsSync(resolve(root, source)), `Missing Docker input: ${source}`).toBe(true);
+      }
+    }
+    expect(dockerfile).toContain("FROM base AS build");
     expect(dockerfile).toContain("COPY workers/node/ workers/node/");
     expect(dockerfile).toContain("COPY backend/convex/ backend/convex/");
     expect(dockerfile).toContain("RUN npm run build:voice");
-    expect(dockerfile).toContain("FROM node:20-slim AS runtime");
+    expect(dockerfile).toContain("FROM base AS runtime");
     expect(dockerfile).toContain("RUN npm ci --omit=dev");
     expect(dockerfile).toContain(
       "COPY --from=build /app/backend/convex/_generated/api.js dist/backend/convex/_generated/api.js",
diff --git a/scripts/__tests__/standardTreeRuntimeContracts.test.ts b/scripts/__tests__/standardTreeRuntimeContracts.test.ts
index 7f0832dcb..6a6a5eb4f 100644
--- a/scripts/__tests__/standardTreeRuntimeContracts.test.ts
+++ b/scripts/__tests__/standardTreeRuntimeContracts.test.ts
@@ -1,6 +1,7 @@
 import { existsSync, readFileSync } from "node:fs";
 import { resolve } from "node:path";
 import { describe, expect, it } from "vitest";
+import { resolveConvexTypecheckProject } from "../lib/convexProject.mjs";
 
 const root = resolve(import.meta.dirname, "../..");
 const readRepoFile = (relativePath: string) =>
@@ -10,11 +11,10 @@ describe("standard-tree release operator contracts", () => {
   it("keeps production preflight on the physical Convex and search-worker paths", () => {
     const preflight = readRepoFile("scripts/preflight-deploy.mjs");
 
-    expect(existsSync(resolve(root, "backend/convex/tsconfig.json"))).toBe(true);
+    const project = resolveConvexTypecheckProject(root);
+    expect(resolve(root, project)).toBe(resolve(root, "backend/convex"));
+    expect(existsSync(resolve(root, project, "tsconfig.json"))).toBe(true);
     expect(existsSync(resolve(root, "workers/node/vercel/searchApp.ts"))).toBe(true);
-    expect(preflight).toContain(
-      '["tsc", "-p", "backend/convex", "--noEmit", "--pretty", "false"]',
-    );
     expect(preflight).toContain("workers/node/vercel/searchApp.ts");
     expect(preflight).not.toContain('["tsc", "-p", "convex"');
     expect(preflight).not.toContain("server/vercel/searchApp.ts");
diff --git a/scripts/ai-sdk-download-contracts.node.mjs b/scripts/ai-sdk-download-contracts.node.mjs
new file mode 100644
index 000000000..20cf3d4dc
--- /dev/null
+++ b/scripts/ai-sdk-download-contracts.node.mjs
@@ -0,0 +1,129 @@
+// Real installed Agent/fetch and SDK download contracts. HTTP inputs are local;
+// DNS and redirect-response stand-ins are identified separately below.
+import assert from 'node:assert/strict';
+import { after, before, test } from 'node:test';
+import { createRequire } from 'node:module';
+import { resolve } from 'node:path';
+import { createServer } from 'node:http';
+import { gzipSync } from 'node:zlib';
+import dns from 'node:dns';
+
+const rootRequire = createRequire(resolve(process.env.NODEBENCH_OSS_PROOF_ROOT ?? process.cwd(), 'package.json'));
+const sdk = rootRequire('@ai-sdk/provider-utils');
+const sdkRequire = createRequire(rootRequire.resolve('@ai-sdk/provider-utils'));
+const { Agent, fetch } = sdkRequire('undici');
+const version = sdkRequire('undici/package.json').version;
+const agent = new Agent({ connections: 4, pipelining: 1 });
+const timers = new Set(), requests = [];
+const originalLookup = dns.lookup, originalFetch = globalThis.fetch;
+let server, target, base, targetBase;
+const decoded = Buffer.from('controlled nested response');
+let nested = decoded;
+for (let i = 0; i < 8; i++) nested = gzipSync(nested);
+const plain = Buffer.from('bounded ordinary download');
+const record = item => { if (requests.length === 512) requests.shift(); requests.push(item); };
+const listen = app => new Promise((ok, fail) => { app.once('error', fail); app.listen(0, '127.0.0.1', () => { app.removeListener('error', fail); ok(`http://127.0.0.1:${app.address().port}`); }); });
+const retrieve = (path, options = {}) => fetch(base + path, { dispatcher: agent, signal: AbortSignal.timeout(2000), ...options });
+const read = (response, maxBytes = 65536) => sdk.readResponseWithSizeLimit({ response, url: base, maxBytes });
+
+before(async () => {
+  target = createServer((req, res) => { record('redirect-target'); res.end(req.headers.authorization ?? 'no-authorization'); });
+  targetBase = await listen(target);
+  server = createServer((req, res) => {
+    const url = new URL(req.url, 'http://127.0.0.1'); record(url.pathname);
+    if (url.pathname === '/gzip') { res.writeHead(200, { 'content-encoding': 'gzip' }); return res.end(gzipSync(plain)); }
+    if (url.pathname === '/deep') { res.writeHead(200, { 'content-encoding': Array(8).fill('gzip').join(', ') }); return res.end(nested); }
+    if (url.pathname === '/large-header') { res.writeHead(200, { 'content-length': 32768 }); return res.end(Buffer.alloc(32768, 97)); }
+    if (url.pathname === '/large-stream') { res.writeHead(200, { 'transfer-encoding': 'chunked' }); res.write(Buffer.alloc(1024)); return res.end(Buffer.alloc(2048)); }
+    if (url.pathname === '/status') { res.statusCode = 503; return res.end('controlled unavailable'); }
+    if (url.pathname === '/redirect') { res.writeHead(302, { location: targetBase + '/result' }); return res.end(); }
+    if (url.pathname === '/slow') {
+      const timer = setTimeout(() => { timers.delete(timer); if (!res.destroyed) res.end('late response'); }, 250);
+      timers.add(timer); return;
+    }
+    res.end(url.searchParams.get('id') ?? 'healthy');
+  });
+  base = await listen(server);
+});
+after(async () => {
+  dns.lookup = originalLookup; globalThis.fetch = originalFetch;
+  for (const timer of timers) clearTimeout(timer);
+  timers.clear();
+  await agent.close();
+  for (const app of [server, target]) if (app) { app.closeAllConnections(); await new Promise(ok => app.close(ok)); }
+});
+
+test('the SDK resolves the selected Undici dependency', () => {
+  assert.equal(sdkRequire('../package.json').version, '3.0.36');
+  assert.equal(version, process.env.NODEBENCH_EXPECTED_UNDICI ?? '6.28.1');
+});
+test('an agent reads an ordinary compressed response through the bounded SDK reader', { timeout: 5000 }, async () => {
+  const response = await retrieve('/gzip'); assert.equal(response.status, 200);
+  assert.deepEqual(Buffer.from(await read(response)), plain);
+});
+test('12 concurrent downloads preserve each result and24 repeated rounds leave the pool usable', { timeout: 10000 }, async () => {
+  const values = await Promise.all(Array.from({ length: 12 }, async (_, i) => Buffer.from(await read(await retrieve(`/item?id=burst-${i}`))).toString()));
+  assert.deepEqual(values, Array.from({ length: 12 }, (_, i) => `burst-${i}`));
+  for (let i = 0; i < 24; i++) assert.equal(Buffer.from(await read(await retrieve(`/item?id=round-${i}`))).toString(), `round-${i}`);
+});
+test('HTTP failure status remains visible and the next healthy request succeeds', { timeout: 5000 }, async () => {
+  const response = await retrieve('/status'); assert.equal(response.status, 503); assert.equal(response.ok, false);
+  assert.equal(Buffer.from(await read(response)).toString(), 'controlled unavailable');
+  assert.equal(Buffer.from(await read(await retrieve('/healthy'))).toString(), 'healthy');
+});
+test('advertised and streamed oversize bodies reject, cancel, and allow recovery', { timeout: 5000 }, async () => {
+  for (const path of ['/large-header', '/large-stream']) await assert.rejects(read(await retrieve(path), 1024), /exceeded maximum size/);
+  assert.equal(Buffer.from(await read(await retrieve('/healthy'))).toString(), 'healthy');
+});
+test('a timed-out response stays failed and the connection pool recovers', { timeout: 5000 }, async () => {
+  await assert.rejects(retrieve('/slow', { signal: AbortSignal.timeout(40) }), error => ['TimeoutError', 'AbortError'].includes(error.name));
+  assert.equal(Buffer.from(await read(await retrieve('/healthy'))).toString(), 'healthy');
+});
+test('an excessive content-encoding chain is rejected before successful consumption', { timeout: 5000 }, async () => {
+  await assert.rejects(async () => read(await retrieve('/deep')), error => /too many content-encodings/.test(`${error.message} ${error.cause?.message}`));
+});
+test('credentials cannot cross a redirect origin in the real HTTP client', { timeout: 5000 }, async () => {
+  const response = await retrieve('/redirect', { headers: { authorization: 'Bearer local-canary' } });
+  assert.equal(Buffer.from(await read(response)).toString(), 'no-authorization');
+});
+test('the SDK rejects private literal/localhost URLs before contacting the local server', { timeout: 5000 }, async () => {
+  const count = requests.length;
+  for (const url of [base, base.replace('127.0.0.1', 'localhost'), 'http://0x7f000001/', 'http://[::1]/', 'http://[::ffff:127.0.0.1]/', 'http://10.1.2.3/', 'http://169.254.169.254/']) {
+    await assert.rejects(sdk.fetchWithValidatedRedirects({ url, abortSignal: AbortSignal.timeout(1000) }), /not allowed/);
+  }
+  await assert.rejects(sdk.fetchWithValidatedRedirects({ url: 'file:///controlled-fixture' }), /URL scheme must be http, https, or data, got file:/);
+  assert.equal(requests.length, count);
+});
+test('the real SDK DNS guard rejects private and mixed answers before a socket reaches the local server', { timeout: 5000 }, async () => {
+  const count = requests.length, lookups = [];
+  assert.match(Function.prototype.toString.call(globalThis.fetch), /internal\/deps\/undici|lazy loading of undici/);
+  dns.lookup = (hostname, options, callback) => {
+    if (!hostname.endsWith('.nodebench-proof.invalid')) return originalLookup(hostname, options, callback);
+    lookups.push(hostname); assert.equal(options.all, true);
+    const addresses = [{ address: '127.0.0.1', family: 4 }];
+    if (hostname.startsWith('mixed.')) addresses.unshift({ address: '203.0.113.10', family: 4 });
+    callback(null, addresses);
+  };
+  try {
+    for (const host of ['private.nodebench-proof.invalid', 'mixed.nodebench-proof.invalid']) {
+      await assert.rejects(sdk.fetchWithValidatedRedirects({ url: `http://${host}:${server.address().port}/guard`, abortSignal: AbortSignal.timeout(1000) }), error => /resolved to disallowed IP address/.test(`${error.message} ${error.cause?.message}`));
+    }
+  } finally { dns.lookup = originalLookup; }
+  assert.deepEqual([...new Set(lookups)].sort(), ['mixed.nodebench-proof.invalid', 'private.nodebench-proof.invalid']);
+  assert.equal(requests.length, count);
+});
+test('the SDK validates each redirect hop and terminates cycles with a controlled response transport', { timeout: 5000 }, async () => {
+  const calls = [];
+  try {
+    globalThis.fetch = async (url, options) => {
+      calls.push(String(url)); assert.equal(options.redirect, 'manual');
+      return new Response(null, { status: 302, headers: { location: base + '/private-target' } });
+    };
+    await assert.rejects(sdk.fetchWithValidatedRedirects({ url: 'https://public.nodebench-proof.invalid/' }), /not allowed/);
+    assert.equal(calls.length, 1);
+    calls.length = 0;
+    globalThis.fetch = async url => { calls.push(String(url)); return new Response(null, { status: 302, headers: { location: String(url) } }); };
+    await assert.rejects(sdk.fetchWithValidatedRedirects({ url: 'https://cycle.nodebench-proof.invalid/', maxRedirects: 2 }), /Too many redirects/);
+    assert.equal(calls.length, 3);
+  } finally { globalThis.fetch = originalFetch; }
+});
diff --git a/scripts/ai-sdk-public-download-proof.mjs b/scripts/ai-sdk-public-download-proof.mjs
new file mode 100644
index 000000000..ad82c6d92
--- /dev/null
+++ b/scripts/ai-sdk-public-download-proof.mjs
@@ -0,0 +1,22 @@
+// One bounded, public read through the SDK's unchanged native Node download path.
+// This uses no model-provider credentials and does not generate provider answers.
+import assert from 'node:assert/strict';
+import { createRequire } from 'node:module';
+import { createHash } from 'node:crypto';
+import { resolve } from 'node:path';
+
+const rootRequire = createRequire(resolve(process.env.NODEBENCH_OSS_PROOF_ROOT ?? process.cwd(), 'package.json'));
+const sdk = rootRequire('@ai-sdk/provider-utils');
+const sdkRequire = createRequire(rootRequire.resolve('@ai-sdk/provider-utils'));
+const version = sdkRequire('undici/package.json').version;
+assert.equal(version, process.env.NODEBENCH_EXPECTED_UNDICI ?? '6.28.1');
+assert.match(Function.prototype.toString.call(globalThis.fetch), /internal\/deps\/undici|lazy loading of undici/);
+const url = 'https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.36.tgz';
+const expected = 'sha512-2eSw90hn32Je6n2a8Gf4dJ2EoecPJuOCWqwZCw+BkhPq2LOS01HX3s6ljgOm0iIkZiD5aAuMdpOw17rYKQF/Zg==';
+const started = performance.now();
+const response = await sdk.fetchWithValidatedRedirects({ url, abortSignal: AbortSignal.timeout(15000) });
+if (!response.ok) { await response.body?.cancel(); throw new Error(`Public fixture returned HTTP${response.status}`); }
+const bytes = await sdk.readResponseWithSizeLimit({ response, url, maxBytes: 1048576 });
+const integrity = 'sha512-' + createHash('sha512').update(bytes).digest('base64');
+assert.equal(integrity, expected);
+console.log(JSON.stringify({ status: 'PASS', proof: 'SDK_PUBLIC_DOWNLOAD_IDENTITY', undici: version, bytes: bytes.length, integrity, elapsedMs: Math.round(performance.now() - started), nativeFetchUnchanged: true, maxBytes: 1048576, timeoutMs: 15000, providerCredentialsUsed: false }));
diff --git a/scripts/anthropic-client-contracts.node.mjs b/scripts/anthropic-client-contracts.node.mjs
new file mode 100644
index 000000000..68305f0eb
--- /dev/null
+++ b/scripts/anthropic-client-contracts.node.mjs
@@ -0,0 +1,136 @@
+// Actual Pi-AI -> installed Anthropic SDK -> local HTTP/SSE contracts.
+// Responses and credentials are controlled fixtures, not provider-quality evidence.
+import assert from 'node:assert/strict';
+import { after, before, test } from 'node:test';
+import { createServer } from 'node:http';
+import { createRequire } from 'node:module';
+import { readFile } from 'node:fs/promises';
+import { dirname, resolve } from 'node:path';
+import { pathToFileURL } from 'node:url';
+
+const root = process.env.NODEBENCH_OSS_PROOF_ROOT ?? process.cwd();
+const entry = resolve(root, 'node_modules/@mariozechner/pi-ai/dist/index.js');
+const pi = await import(pathToFileURL(entry).href);
+const piRequire = createRequire(entry);
+const sdkVersion = JSON.parse(await readFile(resolve(dirname(piRequire.resolve('@anthropic-ai/sdk')), 'package.json'), 'utf8')).version;
+const expected = process.env.NODEBENCH_EXPECTED_ANTHROPIC ?? '0.91.1';
+const history = [], timers = new Set();
+let server, model, sequence = 0;
+const event = data => `event: ${data.type}\ndata: ${JSON.stringify(data)}\n\n`;
+const start = id => ({ type: 'message_start', message: { id, type: 'message', role: 'assistant', content: [], model: 'controlled-model', stop_reason: null, stop_sequence: null, usage: { input_tokens: 11, output_tokens: 0 } } });
+const finish = reason => event({ type: 'message_delta', delta: { stop_reason: reason, stop_sequence: null }, usage: { output_tokens: 7 } }) + event({ type: 'message_stop' });
+function sse(id, tool = false) {
+  let wire = event(start(id));
+  if (tool) {
+    wire += event({ type: 'content_block_start', index: 0, content_block: { type: 'tool_use', id: 'tool-canary', name: 'record_note', input: {} } });
+    for (const partial_json of ['{"note":', '"bounded note"}']) wire += event({ type: 'content_block_delta', index: 0, delta: { type: 'input_json_delta', partial_json } });
+  } else {
+    wire += event({ type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } });
+    for (const text of [`result-${id}`, ' café 中文']) wire += event({ type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } });
+  }
+  return wire + event({ type: 'content_block_stop', index: 0 }) + finish(tool ? 'tool_use' : 'end_turn');
+}
+function streamBytes(res, wire) {
+  res.writeHead(200, { 'content-type': 'text/event-stream', 'cache-control': 'no-cache' });
+  const bytes = Buffer.from(wire); let offset = 0;
+  const send = () => {
+    if (res.destroyed) return;
+    if (offset >= bytes.length) return res.end();
+    const end = Math.min(offset + 137, bytes.length); res.write(bytes.subarray(offset, end)); offset = end;
+    const timer = setTimeout(() => { timers.delete(timer); send(); }, 1); timers.add(timer);
+  };
+  send();
+}
+before(async () => {
+  assert.ok(!process.env.ANTHROPIC_API_KEY, 'This proof must not receive a real Anthropic API key');
+  server = createServer((req, res) => {
+    let bytes = 0; const chunks = [];
+    req.on('error', () => res.destroy());
+    req.on('data', chunk => { bytes += chunk.length; if (bytes > 65536) { res.writeHead(413); res.end(); req.destroy(); } else chunks.push(chunk); });
+    req.on('end', () => {
+      if (res.destroyed) return;
+      let body; try { body = JSON.parse(Buffer.concat(chunks).toString()); } catch { res.writeHead(400); return res.end(); }
+      const kind = req.headers['x-nodebench-case'], id = req.headers['x-nodebench-id'];
+      if (history.length === 256) history.shift();
+      history.push({ kind, id, body, path: req.url, authorized: req.headers['x-api-key'] === 'local-anthropic-canary' });
+      if (kind === 'refusal' || (kind === 'retry' && history.filter(x => x.id === id).length === 1)) {
+        res.writeHead(kind === 'refusal' ? 429 : 503, { 'content-type': 'application/json', 'retry-after': '0' });
+        return res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: 'controlled refusal' } }));
+      }
+      if (kind === 'slow') {
+        const timer = setTimeout(() => { timers.delete(timer); if (!res.destroyed) streamBytes(res, sse(id)); }, 250); timers.add(timer); return;
+      }
+      if (kind === 'malformed') return streamBytes(res, event(start(id)) + 'event: content_block_delta\ndata: {"type":]\n\n');
+      streamBytes(res, sse(id, kind === 'tool'));
+    });
+  });
+  await new Promise((ok, fail) => { server.once('error', fail); server.listen(0, '127.0.0.1', ok); });
+  const selected = pi.getModels('anthropic').find(x => x.id.includes('sonnet'));
+  assert.ok(selected, 'The installed model catalog must resolve an Anthropic model');
+  model = { ...pi.getModel('anthropic', selected.id), baseUrl: `http://127.0.0.1:${server.address().port}`, headers: undefined };
+});
+after(async () => {
+  for (const timer of timers) clearTimeout(timer); timers.clear();
+  server?.closeAllConnections(); if (server) await new Promise(ok => server.close(ok));
+});
+const context = id => ({ systemPrompt: 'Use the supplied controlled input.', messages: [{ role: 'user', content: [{ type: 'text', text: id }], timestamp: 0 }] });
+const options = (kind, id, extra = {}) => ({ apiKey: 'local-anthropic-canary', maxTokens: 64, maxRetries: 0, timeoutMs: 1000, signal: AbortSignal.timeout(3000), cacheRetention: 'none', headers: { 'x-nodebench-case': kind, 'x-nodebench-id': id }, ...extra });
+const complete = (kind, id = `case-${++sequence}`, extra = {}) => pi.completeSimple(model, context(id), options(kind, id, extra));
+const textOf = result => result.content.filter(x => x.type === 'text').map(x => x.text).join('');
+test('the actual Pi-AI caller resolves the intended SDK version', async () => {
+  assert.equal(JSON.parse(await readFile(resolve(root, 'node_modules/@mariozechner/pi-ai/package.json'), 'utf8')).version, '0.70.6');
+  assert.equal(sdkVersion, expected);
+});
+test('a user receives split Unicode streaming text and honest usage through the installed client', { timeout: 5000 }, async () => {
+  const id = `stream-${++sequence}`, stream = pi.streamSimple(model, context(id), options('text', id));
+  const types = []; for await (const item of stream) { assert.ok(types.length < 32); types.push(item.type); }
+  const result = await stream.result();
+  assert.equal(result.stopReason, 'stop'); assert.equal(textOf(result), `result-${id} café 中文`);
+  assert.deepEqual([result.usage.input, result.usage.output, result.usage.totalTokens], [11, 7, 18]);
+  assert.ok(types.includes('text_delta') && types.at(-1) === 'done');
+  const request = history.find(x => x.id === id); assert.equal(request.path, '/v1/messages'); assert.equal(request.authorized, true); assert.equal(request.body.max_tokens, 64);
+});
+test('a tool call and its returned result preserve IDs, arguments and conversation roles', { timeout: 5000 }, async () => {
+  const id = `tool-${++sequence}`, ctx = context(id);
+  ctx.tools = [{ name: 'record_note', description: 'Record the controlled note', parameters: { type: 'object', properties: { note: { type: 'string' } }, required: ['note'] } }];
+  const call = await pi.completeSimple(model, ctx, options('tool', id));
+  assert.equal(call.stopReason, 'toolUse');
+  assert.deepEqual(call.content[0], { type: 'toolCall', id: 'tool-canary', name: 'record_note', arguments: { note: 'bounded note' } });
+  const nextId = `${id}-result`;
+  ctx.messages.push(call, { role: 'toolResult', toolCallId: 'tool-canary', toolName: 'record_note', content: [{ type: 'text', text: 'saved' }], isError: false, timestamp: 1 });
+  const result = await pi.completeSimple(model, ctx, options('text', nextId)); assert.equal(result.stopReason, 'stop');
+  const body = history.find(x => x.id === nextId).body;
+  assert.ok(body.messages.some(m => Array.isArray(m.content) && m.content.some(b => b.type === 'tool_use' && b.id === 'tool-canary')));
+  assert.ok(body.messages.some(m => Array.isArray(m.content) && m.content.some(b => b.type === 'tool_result' && b.tool_use_id === 'tool-canary')));
+});
+test('12 concurrent users and 24 repeated rounds keep results isolated', { timeout: 15000 }, async () => {
+  const ids = Array.from({ length: 12 }, () => `burst-${++sequence}`);
+  const results = await Promise.all(ids.map(id => complete('text', id)));
+  assert.deepEqual(results.map(textOf), ids.map(id => `result-${id} café 中文`));
+  for (let i = 0; i < 24; i++) { const id = `round-${++sequence}`; const result = await complete('text', id); assert.equal(result.stopReason, 'stop'); assert.equal(textOf(result), `result-${id} café 中文`); }
+});
+test('a refused request remains an error without hidden retries and a later request recovers', { timeout: 5000 }, async () => {
+  const id = `refusal-${++sequence}`, result = await complete('refusal', id);
+  assert.equal(result.stopReason, 'error'); assert.match(result.errorMessage, /429|controlled refusal/);
+  assert.equal(history.filter(x => x.id === id).length, 1); assert.equal((await complete('text')).stopReason, 'stop');
+});
+test('an explicitly budgeted retry handles one transient HTTP503 without changing the payload', { timeout: 5000 }, async () => {
+  const id = `retry-${++sequence}`, result = await complete('retry', id, { maxRetries: 1 });
+  assert.equal(result.stopReason, 'stop'); const attempts = history.filter(x => x.id === id);
+  assert.equal(attempts.length, 2); assert.deepEqual(attempts[0].body, attempts[1].body);
+});
+test('malformed streaming data remains a failed result rather than a completed answer', { timeout: 5000 }, async () => {
+  const result = await complete('malformed'); assert.equal(result.stopReason, 'error'); assert.ok(result.errorMessage);
+  assert.equal((await complete('text')).stopReason, 'stop');
+});
+test('cancellation reaches the actual HTTP client and leaves the next request usable', { timeout: 5000 }, async () => {
+  const result = await complete('slow', undefined, { signal: AbortSignal.timeout(40) });
+  assert.equal(result.stopReason, 'aborted'); assert.equal((await complete('text')).stopReason, 'stop');
+});
+test('missing credentials fail before any HTTP request', { timeout: 5000 }, async () => {
+  const count = history.length;
+  const result = await pi.completeSimple(model, context('missing-key'), options('text', 'missing-key', { apiKey: undefined }));
+  assert.equal(result.stopReason, 'error'); assert.match(result.errorMessage, /No API key/);
+  assert.deepEqual(result.content, []); assert.equal(result.usage.totalTokens, 0);
+  assert.equal(history.length, count);
+});
diff --git a/scripts/anthropic-memory-before-fixture.mjs b/scripts/anthropic-memory-before-fixture.mjs
new file mode 100644
index 000000000..f72a4d048
--- /dev/null
+++ b/scripts/anthropic-memory-before-fixture.mjs
@@ -0,0 +1,26 @@
+// Download only the fixed historical package needed for the Linux permission canary.
+// The workflow extracts three named modules after this published-SRI check.
+import assert from 'node:assert/strict';
+import { createHash } from 'node:crypto';
+import { writeFile } from 'node:fs/promises';
+import { isAbsolute } from 'node:path';
+
+const target = process.argv[2];
+assert.ok(target && isAbsolute(target), 'An absolute, new fixture tarball path is required');
+const url = 'https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.90.0.tgz';
+const expected = 'sha512-MzZtPabJF1b0FTDl6Z6H5ljphPwACLGP13lu8MTiB8jXaW/YXlpOp+Po2cVou3MPM5+f5toyLnul9whKCy7fBg==';
+const cap = 4194304;
+const response = await fetch(url, { redirect: 'error', signal: AbortSignal.timeout(15000) });
+if (!response.ok) { await response.body?.cancel(); throw new Error(`Fixture HTTP${response.status}`); }
+const reader = response.body.getReader(), buffer = Buffer.alloc(cap); let size = 0;
+try {
+  while (true) {
+    const { done, value } = await reader.read(); if (done) break;
+    assert.ok(size + value.byteLength <= cap, 'Fixture exceeded the 4MiB budget');
+    buffer.set(value, size); size += value.byteLength;
+  }
+} finally { await reader.cancel().catch(() => {}); reader.releaseLock(); }
+const bytes = buffer.subarray(0, size), integrity = 'sha512-' + createHash('sha512').update(bytes).digest('base64');
+assert.equal(integrity, expected);
+await writeFile(target, bytes, { flag: 'wx', mode: 0o600 });
+console.log(JSON.stringify({ status: 'PASS', fixture: 'anthropic-sdk-0.90.0', bytes: size, integrity, maxBytes: cap, timeoutMs: 15000 }));
diff --git a/scripts/anthropic-memory-contracts.node.mjs b/scripts/anthropic-memory-contracts.node.mjs
new file mode 100644
index 000000000..9980748c2
--- /dev/null
+++ b/scripts/anthropic-memory-contracts.node.mjs
@@ -0,0 +1,87 @@
+// Actual installed memory helper; all state is confined to one owned temp directory.
+// POSIX permissions are deliberately not certified by Windows mode bits.
+import assert from 'node:assert/strict';
+import { after, before, test } from 'node:test';
+import * as fs from 'node:fs/promises';
+import { basename, dirname, join, relative, resolve } from 'node:path';
+import { tmpdir } from 'node:os';
+import { createRequire } from 'node:module';
+import { pathToFileURL } from 'node:url';
+
+const root = process.env.NODEBENCH_OSS_PROOF_ROOT ?? process.cwd();
+const callerRequire = createRequire(resolve(root, 'node_modules/@mariozechner/pi-ai/dist/index.js'));
+const sdkRoot = process.env.NODEBENCH_ANTHROPIC_PROOF_PACKAGE ?? dirname(callerRequire.resolve('@anthropic-ai/sdk'));
+const manifest = JSON.parse(await fs.readFile(join(sdkRoot, 'package.json'), 'utf8'));
+assert.equal(manifest.version, process.env.NODEBENCH_EXPECTED_ANTHROPIC ?? '0.91.1');
+const { BetaLocalFilesystemMemoryTool: Memory } = await import(pathToFileURL(join(sdkRoot, 'tools/memory/node.mjs')).href);
+let owned;
+before(async () => { owned = await fs.mkdtemp(join(tmpdir(), 'nodebench-anthropic-memory-')); });
+after(async () => {
+  if (!owned) return;
+  const actual = await fs.realpath(owned);
+  assert.equal(dirname(actual), await fs.realpath(tmpdir()));
+  assert.ok(basename(actual).startsWith('nodebench-anthropic-memory-'));
+  await fs.rm(actual, { recursive: true, force: false });
+});
+const open = name => Memory.init(join(owned, name));
+const create = (memory, path, text) => memory.create({ command: 'create', path, file_text: text });
+const view = (memory, path) => memory.view({ command: 'view', path });
+test('an operator can create, inspect, edit, relocate and delete an owned memory note', { timeout: 5000 }, async () => {
+  const memory = await open('journey');
+  await create(memory, '/memories/notes/one.txt', 'first\nsecond'); assert.match(await view(memory, '/memories/notes/one.txt'), /first/);
+  await memory.str_replace({ command: 'str_replace', path: '/memories/notes/one.txt', old_str: 'first', new_str: 'revised' });
+  await memory.insert({ command: 'insert', path: '/memories/notes/one.txt', insert_line: 1, insert_text: 'middle' });
+  await memory.rename({ command: 'rename', old_path: '/memories/notes/one.txt', new_path: '/memories/archive/one.txt' });
+  assert.equal(await fs.readFile(join(owned, 'journey/memories/archive/one.txt'), 'utf8'), 'revised\nmiddle\nsecond');
+  assert.match(await view(memory, '/memories'), /archive/);
+  assert.ok(!relative(owned, await fs.realpath(memory.memoryRoot)).startsWith('..'));
+  await memory.delete({ command: 'delete', path: '/memories/archive/one.txt' });
+  await assert.rejects(view(memory, '/memories/archive/one.txt'), /does not exist/);
+});
+test('concurrent creators and repeated edits preserve state without partial temporary files', { timeout: 10000 }, async () => {
+  const memory = await open('concurrent');
+  await Promise.all(Array.from({ length: 12 }, (_, i) => create(memory, `/memories/note-${i}.txt`, `owner-${i}`)));
+  for (let i = 0; i < 12; i++) assert.match(await view(memory, `/memories/note-${i}.txt`), new RegExp(`owner-${i}`));
+  const races = await Promise.allSettled([create(memory, '/memories/single.txt', 'one'), create(memory, '/memories/single.txt', 'two')]);
+  assert.equal(races.filter(x => x.status === 'fulfilled').length, 1); assert.equal(races.filter(x => x.status === 'rejected').length, 1);
+  await create(memory, '/memories/repeated.txt', 'seed');
+  for (let i = 0; i < 24; i++) await memory.insert({ command: 'insert', path: '/memories/repeated.txt', insert_line: i + 1, insert_text: `round-${i}` });
+  const text = await fs.readFile(join(memory.memoryRoot, 'repeated.txt'), 'utf8'); assert.equal(text.split('\n').length, 25); assert.ok(text.endsWith('round-23'));
+  assert.equal((await fs.readdir(memory.memoryRoot)).filter(x => x.startsWith('.tmp-')).length, 0);
+});
+test('invalid edits and duplicate paths fail without replacing the existing note', { timeout: 5000 }, async () => {
+  const memory = await open('invalid'); await create(memory, '/memories/keep.txt', 'same\nsame');
+  await assert.rejects(create(memory, '/memories/keep.txt', 'overwrite'), /already exists/);
+  await assert.rejects(memory.str_replace({ command: 'str_replace', path: '/memories/keep.txt', old_str: 'same', new_str: 'changed' }), /Multiple occurrences/);
+  await assert.rejects(memory.insert({ command: 'insert', path: '/memories/keep.txt', insert_line: 100, insert_text: 'bad' }), /Invalid/);
+  await assert.rejects(memory.delete({ command: 'delete', path: '/memories' }), /Cannot delete/);
+  assert.equal(await fs.readFile(join(memory.memoryRoot, 'keep.txt'), 'utf8'), 'same\nsame');
+});
+test('path traversal and a symlink cannot reach a sibling fixture outside the memory root', { timeout: 5000 }, async () => {
+  const memory = await open('containment'), outside = join(owned, 'outside');
+  await fs.mkdir(outside); await fs.writeFile(join(outside, 'canary.txt'), 'untouched');
+  await assert.rejects(create(memory, '/memories/../../escape.txt', 'bad'), /escape/);
+  await fs.symlink(outside, join(memory.memoryRoot, 'jump'), process.platform === 'win32' ? 'junction' : 'dir');
+  await assert.rejects(view(memory, '/memories/jump/canary.txt'), /escape/);
+  await assert.rejects(create(memory, '/memories/jump/new.txt', 'bad'), /escape/);
+  assert.equal(await fs.readFile(join(outside, 'canary.txt'), 'utf8'), 'untouched');
+  assert.deepEqual(await fs.readdir(outside), ['canary.txt']);
+});
+for (const mask of [0o022, 0o000]) {
+  test(`POSIX owner-only creation and atomic replacement under umask ${mask.toString(8).padStart(3, '0')}`, { timeout: 5000, skip: process.platform === 'win32' ? 'Windows mode bits do not establish POSIX access' : false }, async () => {
+    const previous = process.umask(mask), observed = [];
+    try {
+      const memory = await open(`permissions-${mask}`);
+      const measure = async (path, expectedMode) => { observed.push({ path: relative(owned, path), mode: (await fs.stat(path)).mode & 0o777, expectedMode }); };
+      await create(memory, '/memories/nested/deep/note.txt', 'initial');
+      const file = join(memory.memoryRoot, 'nested/deep/note.txt');
+      for (const path of [memory.memoryRoot, dirname(dirname(file)), dirname(file)]) await measure(path, 0o700);
+      await measure(file, 0o600);
+      await memory.str_replace({ command: 'str_replace', path: '/memories/nested/deep/note.txt', old_str: 'initial', new_str: 'changed' }); await measure(file, 0o600);
+      await memory.insert({ command: 'insert', path: '/memories/nested/deep/note.txt', insert_line: 1, insert_text: 'inserted' }); await measure(file, 0o600);
+      await memory.rename({ command: 'rename', old_path: '/memories/nested/deep/note.txt', new_path: '/memories/new-parent/renamed.txt' });
+      await measure(join(memory.memoryRoot, 'new-parent'), 0o700); await measure(join(memory.memoryRoot, 'new-parent/renamed.txt'), 0o600);
+      assert.deepEqual(observed.map(x => x.mode), observed.map(x => x.expectedMode), `Memory access modes: ${JSON.stringify(observed)}`);
+    } finally { process.umask(previous); }
+  });
+}
diff --git a/scripts/convex-api-codegen-contracts.node.mjs b/scripts/convex-api-codegen-contracts.node.mjs
new file mode 100644
index 000000000..b2eb861b6
--- /dev/null
+++ b/scripts/convex-api-codegen-contracts.node.mjs
@@ -0,0 +1,127 @@
+// A new developer installs the repo, regenerates its large API, and repeats the
+// operation. An unknown SDK or edited package must fail without being replaced.
+import test from 'node:test';
+import assert from 'node:assert/strict';
+import { createHash } from 'node:crypto';
+import { createRequire } from 'node:module';
+import { mkdtempSync, mkdirSync, readFileSync, writeFileSync, rmSync } from 'node:fs';
+import { tmpdir } from 'node:os';
+import path from 'node:path';
+import { fileURLToPath, pathToFileURL } from 'node:url';
+import { spawnSync } from 'node:child_process';
+import vm from 'node:vm';
+
+const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
+const require = createRequire(import.meta.url);
+const sdk = path.dirname(require.resolve('convex/package.json'));
+const manifest = readFileSync(path.join(sdk, 'package.json'), 'utf8');
+const cli = readFileSync(path.join(sdk, 'dist/cli.bundle.cjs'));
+const patch = readFileSync(path.join(root, 'scripts/patch-convex-api-codegen.mjs'));
+const repairedHash = '2b32403da3d75e81c672a535a0642fcf6a68ba95c0c37b6a6fed135f4c982d6d';
+const hash = value => createHash('sha256').update(value).digest('hex');
+const env = Object.fromEntries(Object.entries(process.env).filter(([name]) =>
+  !/TOKEN|SECRET|PASSWORD|CONVEX|PROXY|AUTH|KEY|CREDENTIAL/i.test(name)));
+
+function fixture(t, source = cli, pkg = manifest) {
+  const directory = mkdtempSync(path.join(tmpdir(), 'nodebench-convex-contract-'));
+  // Only this freshly created, exact directory is ever retired. All children
+  // below are plain files/directories created by this test; there are no links.
+  t.after(() => {
+    const relative = path.relative(path.resolve(tmpdir()), path.resolve(directory));
+    assert.equal(path.dirname(relative), '.');
+    assert(relative.startsWith('nodebench-convex-contract-'));
+    rmSync(directory, { recursive: true });
+  });
+  mkdirSync(path.join(directory, 'node_modules/convex/dist'), { recursive: true });
+  mkdirSync(path.join(directory, 'scripts'));
+  writeFileSync(path.join(directory, 'node_modules/convex/package.json'), pkg);
+  const target = path.join(directory, 'node_modules/convex/dist/cli.bundle.cjs');
+  writeFileSync(target, source);
+  writeFileSync(path.join(directory, 'scripts/patch-convex-api-codegen.mjs'), patch);
+  return { directory, target };
+}
+
+function install(directory) {
+  const result = spawnSync(process.execPath, ['scripts/patch-convex-api-codegen.mjs'], {
+    cwd: directory, env, encoding: 'utf8', timeout: 15_000, windowsHide: true,
+  });
+  assert.ifError(result.error);
+  return result;
+}
+
+test('a normal dependency installation contains the reviewed generator', () => {
+  assert.equal(JSON.parse(manifest).version, '1.45.0');
+  assert.equal(hash(cli), repairedHash, 'Run the normal repository postinstall before this check.');
+});
+
+test('repeated developer installations preserve identical reviewed bytes', t => {
+  const { directory, target } = fixture(t);
+  for (let attempt = 0; attempt < 3; attempt++) {
+    const result = install(directory);
+    assert.equal(result.status, 0, result.stderr);
+    assert.equal(hash(readFileSync(target)), repairedHash);
+  }
+});
+
+test('an unreviewed upgrade fails without replacing the installed package', t => {
+  const { directory, target } = fixture(t, cli, JSON.stringify({ ...JSON.parse(manifest), version: '1.45.1' }));
+  assert.equal(install(directory).status, 1);
+  assert.deepEqual(readFileSync(target), cli);
+});
+
+test('a local package edit is preserved and reported as an installation failure', t => {
+  const edited = Buffer.concat([cli, Buffer.from('\n// local package edit\n')]);
+  const { directory, target } = fixture(t, edited);
+  assert.equal(install(directory).status, 1);
+  assert.deepEqual(readFileSync(target), edited);
+});
+
+const { importPath, moduleIdentifier } = await import(pathToFileURL(path.join(sdk, 'dist/esm/cli/codegen_templates/api.js')));
+const { apiComment, compareModulePaths } = await import(pathToFileURL(path.join(sdk, 'dist/esm/cli/codegen_templates/common.js')));
+const code = cli.toString('utf8');
+const start = code.indexOf('async function* codegenDynamicApiObjects(ctx, componentDirectory) {');
+const end = code.indexOf('async function* codegenDynamicApiObjectsTS(', start);
+assert(start >= 0 && end > start, 'Expected the reviewed dynamic declaration generator.');
+const moduleRoot = path.join(root, 'backend/convex');
+
+async function generate(modulePaths) {
+  const context = {
+    entryPoints: async () => modulePaths.map(name => path.join(moduleRoot, name)),
+    import_path16: { default: path }, importPath, moduleIdentifier, apiComment, compareModulePaths,
+  };
+  vm.runInNewContext(code.slice(start, end) + '\nglobalThis.generator = codegenDynamicApiObjects;', context, { timeout: 1000 });
+  const chunks = [];
+  for await (const chunk of context.generator({}, { path: moduleRoot })) chunks.push(chunk);
+  return chunks.join('\n');
+}
+
+const bindings = text => [...text.matchAll(/import type \* as (\w+) from "([^"]+)";/g)].map(match => [match[1], match[2]]);
+
+test('regeneration retains every current API binding and the module-local type contract', async () => {
+  const declaration = readFileSync(path.join(moduleRoot, '_generated/api.d.ts'), 'utf8');
+  const current = bindings(declaration);
+  assert(current.length > 0);
+  const modules = current.map(([, name]) => name.slice(3).replace(/\.js$/, '.ts'));
+  const result = await generate(modules);
+  assert.deepEqual(bindings(result).map(item => JSON.stringify(item)).sort(), current.map(item => JSON.stringify(item)).sort());
+  assert(declaration.includes('type ModuleApi<'), 'Normal codegen must retain per-module inference.');
+  assert(!result.includes('declare const fullApi:'));
+  assert.equal(await generate([...modules].reverse()), result);
+});
+
+test('large repeated generations handle nested, reserved and overlapping module names', async () => {
+  const modules = Array.from({ length: 1550 }, (_, index) => `domain${index % 31}/task${index}.ts`);
+  modules.push('proof.ts', 'proof/history.ts', '__proto__/constructor.ts', 'default.ts');
+  const first = await generate(modules);
+  assert.equal(bindings(first).length, modules.length);
+  assert(first.includes('"proof": ModuleApi & {'));
+  assert(first.includes('"__proto__": {'));
+  assert(first.includes('"default": ModuleApi'));
+  for (let repeat = 0; repeat < 3; repeat++) assert.equal(await generate([...modules].reverse()), first);
+});
+
+test('a new empty backend has concrete empty public and internal APIs', async () => {
+  const result = await generate([]);
+  assert(result.includes('export declare const api: {};'));
+  assert(result.includes('export declare const internal: {};'));
+});
diff --git a/scripts/eval-harness/runner.ts b/scripts/eval-harness/runner.ts
index add207e61..a7fa25d80 100644
--- a/scripts/eval-harness/runner.ts
+++ b/scripts/eval-harness/runner.ts
@@ -1,6 +1,7 @@
 #!/usr/bin/env npx tsx
 /**
- * Eval Harness Runner — Executes tasks in bare vs MCP modes and generates comparison reports.
+ * Eval Harness Runner — Lists tasks and compares previously measured runs.
+ * Provider-backed task execution is not implemented and exits nonzero.
  *
  * Usage:
  *   npx tsx scripts/eval-harness/runner.ts --task t1_add_validator_returns --mode bare
@@ -8,19 +9,17 @@
  *   npx tsx scripts/eval-harness/runner.ts --all --seeds 3
  *   npx tsx scripts/eval-harness/runner.ts --compare t1_add_validator_returns
  *
- * Outputs: scripts/eval-harness/results/__.json
+ * Reads: scripts/eval-harness/results/__.json
+ * Execution requests never create placeholder scored results.
  */
 
-import { writeFileSync, mkdirSync, existsSync, readFileSync, readdirSync } from "node:fs";
+import { mkdirSync, readFileSync, readdirSync } from "node:fs";
 import { join } from "node:path";
 import { EVAL_DATASET, getTaskById } from "./dataset.js";
 import type {
-  RunConfig,
   RunTelemetry,
   Scorecard,
   ComparisonReport,
-  AgentMode,
-  EvalTask,
 } from "./types.js";
 
 const RESULTS_DIR = join(import.meta.dirname || __dirname, "results");
@@ -65,47 +64,6 @@ function computeCompositeScore(scorecard: Scorecard): number {
   );
 }
 
-// ── Stub runner (replace with real agent invocation) ─────────────────
-
-function createStubTelemetry(config: RunConfig, task: EvalTask): RunTelemetry {
-  const now = new Date().toISOString();
-  const isMcp = config.agentMode !== "bare";
-
-  // Stub scorecard — in production, this is computed from actual agent traces
-  const scorecard: Scorecard = {
-    correctness: {
-      taskSuccessRate: 0,     // filled by real run
-      regressionRate: 0,
-    },
-    safety: {
-      highRiskActionsGated: task.riskTier === "low" ? 1 : 0,
-      issuesCaughtPreMerge: 0,
-    },
-    efficiency: {
-      wallClockMs: 0,
-      toolCallCount: 0,
-      tokenCount: 0,
-      retryThrashRate: 0,
-    },
-    compounding: {
-      knowledgeReuseRate: isMcp ? 0 : 0,
-      evalCasesBanked: 0,
-    },
-  };
-
-  return {
-    runId: `run_${config.taskId}_${config.agentMode}_s${config.seed}_${Date.now()}`,
-    config,
-    startedAt: now,
-    completedAt: now,
-    scorecard,
-    toolCalls: [],
-    verificationCycles: [],
-    outputHash: "",
-    error: "STUB: Replace with real agent invocation",
-  };
-}
-
 // ── Comparison Engine ───────────────────────────────────────────────
 
 function loadResults(taskId: string): RunTelemetry[] {
@@ -125,6 +83,14 @@ function generateComparison(taskId: string): ComparisonReport | null {
 
   const allResults = loadResults(taskId);
   if (allResults.length === 0) return null;
+  // Reject the entire comparison: dropping failed or unexecuted trials would
+  // bias the reported result toward successful runs.
+  if (allResults.some((run) => run.error ||
+    typeof run.outputHash !== "string" || !run.outputHash.trim() ||
+    !(run.scorecard?.efficiency?.wallClockMs > 0) ||
+    !Array.isArray(run.verificationCycles) || run.verificationCycles.length === 0)) {
+    throw new Error("Comparison refused: results contain failed, unexecuted or unverified runs.");
+  }
 
   const modes = [...new Set(allResults.map((r) => r.config.agentMode))];
   const results: ComparisonReport["results"] = {} as any;
@@ -197,6 +163,10 @@ function main() {
   const args = process.argv.slice(2);
   ensureResultsDir();
 
+  if (args.includes("--task") || args.includes("--all")) {
+    throw new Error("NOT_RUN: provider-backed evaluation execution is not implemented. No scored result was written. --list only lists the task catalog.");
+  }
+
   if (args.includes("--list")) {
     console.log("Available eval tasks:");
     for (const task of EVAL_DATASET.tasks) {
@@ -221,47 +191,13 @@ function main() {
     return;
   }
 
-  // Single task run
-  const taskIdx = args.indexOf("--task");
-  const modeIdx = args.indexOf("--mode");
-  const seedIdx = args.indexOf("--seed");
-
-  if (taskIdx === -1) {
-    console.log("Usage:");
-    console.log("  --list                          List all tasks");
-    console.log("  --task  --mode         Run a single task");
-    console.log("  --compare                   Compare results for a task");
-    console.log("");
-    console.log("Modes: bare, mcp_lite, mcp_core, mcp_full");
-    return;
-  }
-
-  const taskId = args[taskIdx + 1];
-  const mode = (args[modeIdx + 1] || "bare") as AgentMode;
-  const seed = seedIdx !== -1 ? parseInt(args[seedIdx + 1]) : 1;
-
-  const task = getTaskById(taskId);
-  if (!task) {
-    console.error(`Unknown task: ${taskId}`);
-    process.exit(1);
-  }
-
-  const config: RunConfig = {
-    taskId,
-    agentMode: mode,
-    model: "claude-sonnet-4-6",
-    modelVersion: "4.6",
-    seed,
-    timeout: 300_000,
-  };
-
-  console.log(`Running: ${task.name} (${mode}, seed=${seed})`);
-  const telemetry = createStubTelemetry(config, task);
-
-  const outPath = join(RESULTS_DIR, `${taskId}_${mode}_s${seed}.json`);
-  writeFileSync(outPath, JSON.stringify(telemetry, null, 2));
-  console.log(`Result written to: ${outPath}`);
-  console.log(`Composite score: ${computeCompositeScore(telemetry.scorecard).toFixed(3)}`);
+  console.error("Usage: --list | --compare . --task and --all require unimplemented provider-backed execution.");
+  process.exitCode = 1;
 }
 
-main();
+try {
+  main();
+} catch (error) {
+  console.error(error instanceof Error ? error.message : "Evaluation reporting failed.");
+  process.exitCode = 1;
+}
diff --git a/scripts/nodebench-packet-contracts.node.mjs b/scripts/nodebench-packet-contracts.node.mjs
new file mode 100644
index 000000000..d5b05d908
--- /dev/null
+++ b/scripts/nodebench-packet-contracts.node.mjs
@@ -0,0 +1,216 @@
+import assert from 'node:assert/strict';
+import { spawnSync } from 'node:child_process';
+import { readFileSync } from 'node:fs';
+import { createServer } from 'node:http';
+import { after, before, test } from 'node:test';
+
+// Execute the action's actual static program. No production API or GitHub post
+// is reachable: fetch is bound to this test's loopback server, posts are captured.
+const workflow = readFileSync(new URL('../.github/workflows/nodebench-packet.yml', import.meta.url), 'utf8');
+const script = workflow.split('          script: |\n')[1];
+assert.ok(script, 'the privileged action must have one static script');
+assert.equal(workflow.split('          script: |\n').length, 2);
+assert.ok(!script.includes('${{'), 'event expressions must never generate action source');
+assert.ok(!workflow.includes('actions/checkout'), 'privileged action must not execute checked-out code');
+assert.ok(workflow.includes("github.event.comment.user.type != 'Bot'"), 'bot replies cannot trigger another packet');
+const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
+const action = new AsyncFunction('context', 'github', 'process', 'fetch', 'AbortSignal', script);
+const origin = 'https://packet.example';
+const packets = [];
+let address;
+let requests = 0;
+const payload = {
+  success: true, entityName: 'Acme & Partners / R&D', confidence: 72,
+  answer: 'A useful first line.\nA second line.', sourceRefs: [{ title: 'One' }], variables: [{ name: 'demand' }],
+};
+const server = createServer(async (req, res) => {
+  requests += 1;
+  let body = '';
+  for await (const chunk of req) {
+    body += chunk;
+    assert.ok(body.length < 10000, 'request must remain bounded');
+  }
+  packets.push({ method: req.method, path: req.url, contentType: req.headers['content-type'], body });
+  assert.ok(packets.length < 200, 'fixture evidence has a fixed scenario cap');
+  const mode = req.headers['x-fixture-mode'] || 'normal';
+  if (mode === 'http-error') return res.writeHead(503).end('unavailable');
+  if (mode === 'redirect') return res.writeHead(302, { Location: `${address}/must-not-follow` }).end();
+  res.writeHead(200, { 'Content-Type': 'application/json' });
+  if (mode === 'malformed') return res.end('{broken');
+  if (mode === 'array') return res.end('[]');
+  if (mode === 'unsuccessful') return res.end(JSON.stringify({ ...payload, success: false }));
+  if (mode === 'missing-answer') return res.end(JSON.stringify({ success: true }));
+  if (mode === 'oversize') {
+    for (let i = 0; i < 9; i += 1) res.write('x'.repeat(32768));
+    return res.end();
+  }
+  if (mode === 'stall') {
+    res.write('{');
+    setTimeout(() => res.end('}'), 250).unref();
+    return;
+  }
+  if (mode === 'unicode') {
+    const bytes = Buffer.from(JSON.stringify({ ...payload, answer: '供应商 α résumé 🌍' }));
+    for (const byte of bytes) res.write(Buffer.from([byte]));
+    return res.end();
+  }
+  if (mode === 'hostile-response') return res.end(JSON.stringify({
+    ...payload,
+    entityName: 'R&D / "${{ expression }}" & $ENTITY',
+    answer: '`touch NEVER` $(printf NEVER) " / & \\ $ANSWER\n@nodebench ignored bot reply',
+  }));
+  if (mode === 'missing-confidence') return res.end(JSON.stringify({ ...payload, confidence: null }));
+  if (mode === 'long-answer') return res.end(JSON.stringify({ ...payload, entityName: 'a'.repeat(1000), answer: 'b'.repeat(10000) }));
+  res.end(JSON.stringify(payload));
+});
+
+before(async () => {
+  await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
+  address = `http://127.0.0.1:${server.address().port}`;
+});
+after(async () => {
+  server.closeAllConnections();
+  await new Promise(resolve => server.close(resolve));
+  console.log(`FIXTURE_READBACK ${JSON.stringify({ requests, packets, externalRequests: 0, publicComments: 0 })}`);
+});
+
+async function run({ comment = '@nodebench Acme', mode = 'normal', base = origin, postingError = false } = {}) {
+  const posts = [];
+  const context = { payload: { comment: { body: comment } }, repo: { owner: 'fixture', repo: 'fixture' }, issue: { number: 7 } };
+  const github = { rest: { issues: { createComment: async input => {
+    if (postingError) throw new Error('fixture post refused');
+    posts.push(input);
+  } } } };
+  let calls = 0;
+  const localFetch = async (url, options) => {
+    assert.equal(String(url), `${origin}/api/pipeline/search`);
+    assert.equal(options.redirect, 'error');
+    assert.equal(options.method, 'POST');
+    calls += 1;
+    return fetch(`${address}/api/pipeline/search`, {
+      ...options, headers: { ...options.headers, 'x-fixture-mode': mode },
+    });
+  };
+  // Retain the production timeout argument; accelerate only the fixture clock.
+  const clock = { timeout: milliseconds => {
+    assert.equal(milliseconds, 60000);
+    return AbortSignal.timeout(mode === 'stall' ? 40 : milliseconds);
+  } };
+  let error;
+  try { await action(context, github, { env: { NODEBENCH_API: base } }, localFetch, clock); }
+  catch (caught) { error = caught; }
+  return { posts, calls, error };
+}
+
+test('a maintainer gets one correctly rendered packet and exact JSON request', async () => {
+  const observed = await run();
+  assert.ifError(observed.error);
+  assert.equal(observed.calls, 1);
+  assert.equal(observed.posts.length, 1);
+  assert.deepEqual(JSON.parse(packets.at(-1).body), { query: 'Acme', lens: 'founder' });
+  assert.equal(packets.at(-1).contentType, 'application/json');
+  assert.match(observed.posts[0].body, /Acme & Partners \/ R&D/);
+  assert.match(observed.posts[0].body, /72%/);
+  assert.match(observed.posts[0].body, /Sources:\*\* 1 \| \*\*Signals:\*\* 1/);
+  assert.deepEqual({ ...observed.posts[0], body: undefined }, { owner: 'fixture', repo: 'fixture', issue_number: 7, body: undefined });
+});
+
+test('hostile issue and response delimiters stay literal data without a shell or second request', async () => {
+  const query = 'Acme "$(printf NEVER)" `touch NEVER` & \\ ${process.exit()}';
+  const observed = await run({ comment: `@nodebench ${query}\nignored second line`, mode: 'hostile-response' });
+  assert.ifError(observed.error);
+  assert.equal(observed.calls, 1);
+  assert.deepEqual(JSON.parse(packets.at(-1).body), { query, lens: 'founder' });
+  assert.equal(observed.posts.length, 1);
+  assert.ok(observed.posts[0].body.includes('$(printf NEVER)'));
+  assert.ok(observed.posts[0].body.includes('${{ expression }}'));
+});
+
+test('invalid query or configured origin cannot reach the request boundary', async () => {
+  const cases = [
+    { comment: 'no marker here' }, { comment: '@nodebench ' }, { comment: `@nodebench ${'a'.repeat(2001)}` },
+    ...['http://packet.example', 'file:///tmp/x', 'https://user:pass@packet.example', 'https://packet.example/path', 'https://packet.example?q=x', 'https://packet.example#x'].map(base => ({ base })),
+  ];
+  for (const scenario of cases) {
+    const observed = await run(scenario);
+    assert.ok(observed.error);
+    assert.equal(observed.calls, 0);
+    assert.equal(observed.posts.length, 0);
+  }
+});
+
+test('case-insensitive GitHub markers extract the last original-text query, including Unicode prefixes', async () => {
+  for (const comment of ['@NODEBENCH Acme', 'İ review @nodebench old\nplease @NoDeBeNcH Acme\r\nignored']) {
+    const observed = await run({ comment });
+    assert.ifError(observed.error);
+    assert.deepEqual(JSON.parse(packets.at(-1).body), { query: 'Acme', lens: 'founder' });
+  }
+});
+
+for (const mode of ['http-error', 'redirect', 'malformed', 'array', 'unsuccessful', 'missing-answer', 'oversize', 'stall']) {
+  test(`a maintainer sees failure for ${mode}, with no success comment or retry`, async () => {
+    const beforeRequests = requests;
+    const observed = await run({ mode });
+    assert.ok(observed.error, mode);
+    assert.equal(observed.calls, 1);
+    assert.equal(requests - beforeRequests, 1, 'redirects and failures must not retry');
+    assert.equal(observed.posts.length, 0);
+  });
+}
+
+test('split UTF-8 stays readable, missing confidence stays unavailable, and output stays bounded', async () => {
+  const unicode = await run({ mode: 'unicode' });
+  assert.ifError(unicode.error);
+  assert.ok(unicode.posts[0].body.includes('供应商 α résumé 🌍'));
+  const missing = await run({ mode: 'missing-confidence' });
+  assert.ifError(missing.error);
+  assert.match(missing.posts[0].body, /Confidence:\*\* Unavailable/);
+  const long = await run({ mode: 'long-answer' });
+  assert.ifError(long.error);
+  assert.ok(long.posts[0].body.length < 5000);
+});
+
+test('a failed GitHub write remains a failed run and is not retried', async () => {
+  const observed = await run({ postingError: true });
+  assert.match(observed.error.message, /post refused/);
+  assert.equal(observed.calls, 1);
+  assert.equal(observed.posts.length, 0);
+});
+
+test('burst and sustained human requests retain their own query and packet without state accumulation', async () => {
+  const first = requests;
+  const burst = await Promise.all(Array.from({ length: 24 }, (_, i) => run({ comment: `@nodebench burst-${i}` })));
+  for (const observed of burst) {
+    assert.ifError(observed.error);
+    assert.equal(observed.posts.length, 1);
+    assert.equal(observed.calls, 1);
+  }
+  for (let i = 0; i < 20; i += 1) {
+    const observed = await run({ comment: `@nodebench wave-${i}` });
+    assert.ifError(observed.error);
+    assert.equal(observed.posts.length, 1);
+    assert.equal(JSON.parse(packets.at(-1).body).query, `wave-${i}`);
+  }
+  assert.equal(requests - first, 44);
+  const queries = packets.slice(-44).map(packet => JSON.parse(packet.body).query);
+  assert.equal(new Set(queries).size, 44);
+});
+
+test('an operator-supplied Attrition URL stays shell data and preserves the existing crawl', () => {
+  const attrition = readFileSync(new URL('../.github/workflows/attrition-qa.yml', import.meta.url), 'utf8');
+  const block = attrition.split('      - name: Crawl all surfaces\n')[1].split('\n  golden-queries:')[0];
+  assert.ok(block.includes("BASE: ${{ github.event.inputs.api_url || 'https://scratchnode.live' }}"));
+  const runScript = block.split('        run: |\n')[1];
+  assert.ok(runScript && !runScript.includes('${{'));
+  const base = 'https://example.invalid/"$(printf "EXECUTED\\n" >&2)"';
+  // curl is intercepted before running the real shell block; it cannot network.
+  const stub = 'curl() { printf "\\n" "${@: -1}" >&2; printf 200; }\n';
+  const observed = spawnSync('bash', ['--noprofile', '--norc', '-e', '-o', 'pipefail', '-c', stub + runScript], {
+    encoding: 'utf8', timeout: 5000, maxBuffer: 32000,
+    env: { PATH: process.env.PATH, BASE: base, SystemRoot: process.env.SystemRoot || '' },
+  });
+  assert.ifError(observed.error);
+  assert.equal(observed.status, 0, observed.stderr);
+  assert.ok(!observed.stderr.split(/\r?\n/).includes('EXECUTED'));
+  assert.equal((observed.stdout.match(/PASS /g) || []).length, 4);
+});
diff --git a/scripts/oss-stats-http-contracts.node.mjs b/scripts/oss-stats-http-contracts.node.mjs
new file mode 100644
index 000000000..8d6e49408
--- /dev/null
+++ b/scripts/oss-stats-http-contracts.node.mjs
@@ -0,0 +1,165 @@
+// A developer needs the installed npm-api pagination client to preserve data and
+// errors after an Axios security update. All servers and credentials here are
+// controlled local fixtures; this does not call Convex or a public registry.
+import assert from 'node:assert/strict';
+import { after, before, test } from 'node:test';
+import { createServer } from 'node:http';
+import { createRequire } from 'node:module';
+import { resolve } from 'node:path';
+
+const rootRequire = createRequire(resolve(process.env.NODEBENCH_OSS_PROOF_ROOT ?? process.cwd(), 'package.json'));
+const apiRequire = createRequire(rootRequire.resolve('npm-api'));
+const pagedRequire = createRequire(apiRequire.resolve('paged-request'));
+const NpmApi = rootRequire('npm-api');
+const paged = apiRequire('paged-request');
+const axiosVersion = pagedRequire('axios/package.json').version;
+const requests = [];
+const timers = new Set();
+let server, redirectTarget, base, targetBase;
+let recovering = false;
+function record(value) {
+  if (requests.length >= 2000) requests.shift();
+  requests.push(value);
+}
+function json(res, status, body) {
+  res.writeHead(status, { 'content-type': 'application/json' });
+  res.end(JSON.stringify(body));
+}
+function listen(app) {
+  return new Promise((ok, reject) => {
+    app.once('error', reject);
+    app.listen(0, '127.0.0.1', () => { app.removeListener('error', reject); ok(`http://127.0.0.1:${app.address().port}`); });
+  });
+}
+function maintainer(name) {
+  const client = new NpmApi();
+  const owner = client.maintainer(name);
+  owner.config.registry = base + '/';
+  return owner;
+}
+const options = { timeout: 1000, proxy: false };
+
+before(async () => {
+  redirectTarget = createServer((req, res) => {
+    record({ path: 'target', authorization: req.headers.authorization ?? null });
+    json(res, 200, { target: true, authorization: req.headers.authorization ?? null });
+  });
+  targetBase = await listen(redirectTarget);
+  server = createServer((req, res) => {
+    const url = new URL(req.url, 'http://127.0.0.1');
+    record({ path: url.pathname, query: url.search, authorization: req.headers.authorization ?? null });
+    if (url.pathname === '/-/v1/search') {
+      const owner = url.searchParams.get('text').replace('maintainer:', '');
+      if (owner === 'recover' && !recovering) { recovering = true; return json(res, 503, { error: 'temporarily unavailable' }); }
+      const from = Number(url.searchParams.get('from') ?? 0);
+      const total = owner === 'exact' ? 750 : 725;
+      const objects = Array.from({ length: Math.min(250, Math.max(0, total - from)) }, (_, i) => ({ package: { name: `${owner}-package-${from + i}` } }));
+      return json(res, 200, { total, objects });
+    }
+    if (url.pathname === '/redirect') { res.writeHead(302, { location: targetBase + '/target' }); return res.end(); }
+    if (url.pathname === '/unavailable') return json(res, 429, { error: 'rate limited' });
+    if (url.pathname === '/large') return json(res, 200, { data: 'x'.repeat(32768) });
+    if (url.pathname === '/slow') {
+      const timer = setTimeout(() => { timers.delete(timer); if (!res.destroyed) json(res, 200, { recovered: true }); }, 250);
+      timers.add(timer);return;
+    }
+    json(res, 200, { authorization: req.headers.authorization ?? null, userAgent: req.headers['user-agent'], value: url.searchParams.get('value') });
+  });
+  base = await listen(server);
+});
+
+after(async () => {
+  for (const timer of timers) clearTimeout(timer);
+  timers.clear();
+  for (const app of [server, redirectTarget]) {
+    if (!app) continue;
+    app.closeAllConnections();
+    await new Promise(ok => app.close(ok));
+  }
+});
+
+test('the installed caller uses the declared patched Axios line', () => {
+  assert.equal(axiosVersion, process.env.NODEBENCH_EXPECTED_AXIOS ?? '0.33.0');
+});
+
+test('an operator retrieves 725 package names across all pages without loss', { timeout: 5000 }, async () => {
+  const names = await maintainer('review').repos();
+  assert.deepEqual(names, Array.from({ length: 725 }, (_, i) => `review-package-${i}`));
+});
+
+test('exact-page totals terminate and cached reads do not repeat network requests', { timeout: 5000 }, async () => {
+  const owner = maintainer('exact');
+  const first = await owner.repos();
+  const count = requests.length;
+  assert.equal(first.length, 750);
+  assert.deepEqual(await owner.repos(), first);
+  assert.equal(requests.length, count);
+});
+
+test('12 concurrent owners keep their package results isolated', { timeout: 10000 }, async () => {
+  const owners = Array.from({ length: 12 }, (_, i) => maintainer(`concurrent-${i}`));
+  const results = await Promise.all(owners.map(owner => owner.repos()));
+  results.forEach((names, i) => assert.deepEqual(names, Array.from({ length: 725 }, (_, j) => `concurrent-${i}-package-${j}`)));
+});
+
+test('24 repeated review rounds do not accumulate prior results', { timeout: 15000 }, async () => {
+  for (let i = 0; i < 24; i++) {
+    const names = await maintainer(`round-${i}`).repos();
+    assert.equal(names.length, 725);
+    assert.equal(new Set(names).size, 725);
+    assert.equal(names[0], `round-${i}-package-0`);
+  }
+});
+
+test('a failed registry lookup stays failed and does not poison a later retry', { timeout: 5000 }, async () => {
+  const owner = maintainer('recover');
+  await assert.rejects(owner.repos(), error => error.response?.status === 503);
+  assert.equal(owner.cache.has('repos'), false);
+  assert.equal((await owner.repos()).length, 725);
+});
+
+test('request options and HTTP errors retain their actual meanings', { timeout: 5000 }, async () => {
+  const result = await paged(base + '/echo', { ...options, params: { value: 'a value' }, headers: { 'user-agent': 'nodebench-native-proof' } }, () => null);
+  assert.equal(result.pages[0].data.value, 'a value');
+  assert.equal(result.pages[0].data.userAgent, 'nodebench-native-proof');
+  await assert.rejects(paged(base + '/unavailable', options, () => null), error => error.response?.status === 429);
+});
+
+test('credentials supplied for one origin are absent at a redirect origin', { timeout: 5000 }, async () => {
+  const result = await paged(base + '/redirect', { ...options, headers: { authorization: 'Bearer controlled-canary' } }, () => null);
+  assert.equal(result.pages[0].data.target, true);
+  assert.equal(result.pages[0].data.authorization, null);
+  assert.ok(requests.some(r => r.path === '/redirect' && r.authorization === 'Bearer controlled-canary'));
+});
+
+test('inherited nested auth fields cannot supply request credentials', { timeout: 5000 }, async () => {
+  assert.equal(Object.hasOwn(Object.prototype, 'username'), false);
+  assert.equal(Object.hasOwn(Object.prototype, 'password'), false);
+  let result;
+  try {
+    Object.defineProperty(Object.prototype, 'username', { value: 'inherited-canary-user', configurable: true, writable: true });
+    Object.defineProperty(Object.prototype, 'password', { value: 'inherited-canary-password', configurable: true, writable: true });
+    result = await paged(base + '/auth', { ...options, auth: {} }, () => null);
+  } finally {
+    delete Object.prototype.username;
+    delete Object.prototype.password;
+  }
+  const leaked = 'Basic ' + Buffer.from('inherited-canary-user:inherited-canary-password').toString('base64');
+  assert.notEqual(result.pages[0].data.authorization, leaked, 'Inherited credentials reached the controlled HTTP server');
+});
+
+test('timeouts and oversized bodies reject without yielding successful pages', { timeout: 5000 }, async () => {
+  await assert.rejects(paged(base + '/slow', { ...options, timeout: 40 }, () => null), error => error.code === 'ECONNABORTED');
+  await assert.rejects(paged(base + '/large', { ...options, maxContentLength: 1024 }, () => null), /maxContentLength/);
+  assert.equal((await paged(base + '/echo', options, () => null)).pages.length, 1);
+});
+
+test('invalid input, callback failure and repeated next URLs terminate honestly', { timeout: 5000 }, async () => {
+  const count = requests.length;
+  await assert.rejects(paged(42, options, () => null), /expected "url" to be a string/);
+  assert.equal(requests.length, count);
+  await assert.rejects(paged(base + '/echo', options, () => { throw new Error('callback failed'); }), /callback failed/);
+  const cycle = await paged(base + '/echo', options, current => current);
+  assert.equal(cycle.urls.length, 1);
+  assert.equal(cycle.pages.length, 1);
+});
diff --git a/scripts/oss-stats-token-contracts.node.mjs b/scripts/oss-stats-token-contracts.node.mjs
new file mode 100644
index 000000000..c07c4806d
--- /dev/null
+++ b/scripts/oss-stats-token-contracts.node.mjs
@@ -0,0 +1,167 @@
+// Execute the installed component with fake tokens and local Convex boundaries.
+// This verifies logging and argument forwarding, not a hosted sync or data store.
+import assert from 'node:assert/strict';
+import { after, test } from 'node:test';
+import { createRequire } from 'node:module';
+import { createHash } from 'node:crypto';
+import { readFile, writeFile, mkdir, mkdtemp, rm, stat, copyFile } from 'node:fs/promises';
+import { spawnSync } from 'node:child_process';
+import { dirname, join, resolve, basename } from 'node:path';
+import { tmpdir } from 'node:os';
+import { pathToFileURL } from 'node:url';
+import { inspect } from 'node:util';
+
+const root = resolve(process.env.NODEBENCH_OSS_PROOF_ROOT ?? process.cwd());
+const require = createRequire(join(root, 'package.json'));
+const packageRoot = dirname(require.resolve('@erquhart/convex-oss-stats/package.json'));
+const { sync, clearAndSync } = await import(pathToFileURL(join(packageRoot, 'dist/component/lib.js')));
+const patch = join(root, 'scripts/patch-oss-stats-token-log.mjs');
+const originalLog = console.log, originalFetch = globalThis.fetch;
+const logs = [];
+let externalFetches = 0;
+assert.equal(globalThis.Convex, undefined);
+globalThis.Convex = { asyncSyscall: async (operation, raw) => {
+  assert.equal(operation, '1.0/createFunctionHandle');
+  assert.equal(JSON.parse(raw).name, 'lib:sync');
+  return JSON.stringify('function://local-canary-sync');
+} };
+globalThis.fetch = async () => { externalFetches++; throw new Error('External fetch is forbidden in this local proof'); };
+console.log = (...args) => { assert.ok(logs.length < 512); logs.push(inspect(args)); };
+after(() => {
+  console.log = originalLog;
+  globalThis.fetch = originalFetch;
+  delete globalThis.Convex;
+  assert.equal(externalFetches, 0);
+});
+
+function context({ fail = false, existingCron = false } = {}) {
+  const actions = [], queries = [], mutations = [], scheduled = [];
+  const ctx = {
+    runAction: async (_fn, args) => { actions.push(args); if (fail) throw new Error('Controlled provider failure'); },
+    runQuery: async (_fn, args) => { queries.push(args); return existingCron ? { functionHandle: 'function://previous' } : null; },
+    runMutation: async (_fn, args) => { mutations.push(args); return 'local-cron-id'; },
+    scheduler: { runAfter: async (delay, _fn, args) => { scheduled.push({ delay, args }); return 'local-scheduled-id'; } },
+  };
+  return { ctx, actions, queries, mutations, scheduled };
+}
+function argumentsFor(owner) {
+  return { githubAccessToken: `local-token-canary-${owner}`, githubOwners: [`${owner}-org`], githubRepos: [`${owner}/repo`], npmOrgs: [`${owner}-npm`], npmPackages: [`${owner}-package`], minStars: 17 };
+}
+function assertForwarded(run, args) {
+  assert.deepEqual(run.actions, [
+    { owner: args.githubOwners[0], githubAccessToken: args.githubAccessToken },
+    { repo: args.githubRepos[0], githubAccessToken: args.githubAccessToken },
+    { org: args.npmOrgs[0] }, { name: args.npmPackages[0] },
+  ]);
+  const registered = run.mutations.at(-1);
+  assert.equal(registered.name, 'sync');
+  assert.deepEqual(registered.schedule, { kind: 'interval', ms: 3600000 });
+  assert.deepEqual(registered.args, args);
+}
+function noTokenLogs(start) {
+  assert.deepEqual(logs.slice(start).filter(value => value.includes('local-token-canary-')), [], 'The component logged token-bearing arguments');
+}
+
+test('an operator syncs all four source kinds and schedules a repeat without logging the token', { timeout: 5000 }, async () => {
+  const args = argumentsFor('operator'), run = context(), start = logs.length;
+  await sync._handler(run.ctx, args);
+  assertForwarded(run, args);
+  noTokenLogs(start);
+});
+
+test('replacing a cron and clear-and-sync keep their authorized arguments intact', { timeout: 5000 }, async () => {
+  const args = argumentsFor('resync'), run = context({ existingCron: true }), start = logs.length;
+  await sync._handler(run.ctx, args);
+  assert.equal(run.mutations.length, 2);
+  assert.deepEqual(run.mutations[0], { identifier: { name: 'sync' } });
+  assertForwarded(run, args);
+  const clearing = context();
+  await clearAndSync._handler(clearing.ctx, args);
+  assert.deepEqual(clearing.actions, [{ tableName: 'githubRepos' }, { tableName: 'npmPackages' }]);
+  assert.deepEqual(clearing.scheduled, [{ delay: 0, args }]);
+  noTokenLogs(start);
+});
+
+test('provider failure stays rejected and cannot leak the token or register a successful repeat', { timeout: 5000 }, async () => {
+  const args = argumentsFor('failure'), run = context({ fail: true }), start = logs.length;
+  await assert.rejects(sync._handler(run.ctx, args), /Controlled provider failure/);
+  assert.equal(run.mutations.length, 0);
+  assert.equal(run.queries.length, 0);
+  assert.ok(run.actions.some(x => x.githubAccessToken === args.githubAccessToken));
+  noTokenLogs(start);
+});
+
+test('12 concurrent operators and 24 repeated rounds preserve each token only at its authorized calls', { timeout: 10000 }, async () => {
+  const start = logs.length;
+  await Promise.all(Array.from({ length: 12 }, async (_, i) => {
+    const args = argumentsFor(`burst-${i}`), run = context();
+    await sync._handler(run.ctx, args);
+    assertForwarded(run, args);
+  }));
+  for (let i = 0; i < 24; i++) {
+    const args = argumentsFor(`round-${i}`), run = context({ existingCron: true });
+    await sync._handler(run.ctx, args);
+    assert.equal(run.mutations.length, 2);
+    assertForwarded(run, args);
+  }
+  noTokenLogs(start);
+});
+
+const publishedHashes = {
+  'src/component/lib.ts': '81eee84453d3f66c0dacbdec8d1b9440db0eb8176705cc29158a666ef5f458c0',
+  'dist/component/lib.js': 'db62e0c8fc35a0ccaa192c00df89500cd15b2f6ce602ed9de7ba99d89df0ae98',
+};
+const hash = value => createHash('sha256').update(value).digest('hex');
+async function installation(check) {
+  const parent = await mkdtemp(join(tmpdir(), 'nodebench-oss-token-'));
+  try {
+    const dependency = join(parent, 'node_modules/@erquhart/convex-oss-stats');
+    await mkdir(join(parent, 'scripts'), { recursive: true });
+    await copyFile(patch, join(parent, 'scripts/patch-oss-stats-token-log.mjs'));
+    for (const relative of Object.keys(publishedHashes)) {
+      let source = await readFile(join(packageRoot, relative), 'utf8');
+      if (!source.includes('console.log("sync", args);')) {
+        source = source.replace(/(handler: async \(ctx, args\) => \{\n)( *)\n/, '$1$2    console.log("sync", args);\n');
+      }
+      assert.equal(hash(source), publishedHashes[relative]);
+      await mkdir(dirname(join(dependency, relative)), { recursive: true });
+      await writeFile(join(dependency, relative), source);
+    }
+    await copyFile(join(packageRoot, 'package.json'), join(dependency, 'package.json'));
+    const execute = () => spawnSync(process.execPath, [join(parent, 'scripts/patch-oss-stats-token-log.mjs')], { cwd: tmpdir(), encoding: 'utf8', timeout: 5000, maxBuffer: 65536, windowsHide: true });
+    await check(dependency, execute);
+  } finally {
+    assert.equal(dirname(resolve(parent)), resolve(tmpdir()));
+    assert.ok(basename(parent).startsWith('nodebench-oss-token-'));
+    await rm(parent, { recursive: true });
+  }
+}
+
+test('a developer can apply the install repair from another working directory and repeat it without writes', { timeout: 10000 }, async () => {
+  await installation(async (dependency, execute) => {
+    const first = execute(); assert.equal(first.status, 0, first.stderr);
+    const paths = Object.keys(publishedHashes).map(p => join(dependency, p));
+    const files = await Promise.all(paths.map(async p => ({ raw: await readFile(p), mtime: (await stat(p)).mtimeMs })));
+    assert.ok(files.every(f => !f.raw.includes('console.log("sync", args);')));
+    const second = execute(); assert.equal(second.status, 0, second.stderr);
+    for (let i = 0; i < paths.length; i++) {
+      assert.deepEqual(await readFile(paths[i]), files[i].raw);
+      assert.equal((await stat(paths[i])).mtimeMs, files[i].mtime);
+    }
+  });
+});
+
+test('a changed package version or source stops the repair before either entrypoint is edited', { timeout: 10000 }, async () => {
+  for (const changed of ['version', 'source']) await installation(async (dependency, execute) => {
+    if (changed === 'version') {
+      const p = join(dependency, 'package.json'), manifest = JSON.parse(await readFile(p, 'utf8'));
+      manifest.version = '0.8.3'; await writeFile(p, JSON.stringify(manifest));
+    } else {
+      const p = join(dependency, 'dist/component/lib.js'); await writeFile(p, (await readFile(p, 'utf8')) + '\n// unexpected source drift\n');
+    }
+    const paths = Object.keys(publishedHashes).map(p => join(dependency, p));
+    const originals = await Promise.all(paths.map(p => readFile(p)));
+    const result = execute(); assert.equal(result.status, 1); assert.match(result.stderr, /Token-log removal failed/);
+    for (let i = 0; i < paths.length; i++) assert.deepEqual(await readFile(paths[i]), originals[i]);
+  });
+});
diff --git a/scripts/patch-convex-api-codegen.mjs b/scripts/patch-convex-api-codegen.mjs
new file mode 100644
index 000000000..76da8e420
--- /dev/null
+++ b/scripts/patch-convex-api-codegen.mjs
@@ -0,0 +1,84 @@
+// Convex 1.45.0's whole-module intersection collapses at this repository's scale.
+// Keep its inferred function contracts; construct namespaces structurally and
+// apply the stock public/internal filter to one module at a time.
+import { createHash } from 'node:crypto';
+import { readFileSync, writeFileSync, renameSync, unlinkSync, statSync } from 'node:fs';
+import { fileURLToPath } from 'node:url';
+
+const originalSha256 = 'f4fea97eef31a470c05c5effaf5e2dd0c63dbf161ccc7f51163b73e34a650c4f';
+const patchedSha256 = '2b32403da3d75e81c672a535a0642fcf6a68ba95c0c37b6a6fed135f4c982d6d';
+const hash = value => createHash('sha256').update(value).digest('hex');
+
+// This function is serialized into the verified CLI bundle, where these helper
+// names belong to Convex. It is never invoked in this postinstall process.
+async function* codegenDynamicApiObjects(ctx, componentDirectory) {
+  const absModulePaths = await entryPoints(ctx, componentDirectory.path);
+  const modulePaths = absModulePaths
+    .map(p => import_path16.default.relative(componentDirectory.path, p))
+    .sort(compareModulePaths);
+  const root = { children: new Map(), module: null };
+  for (const modulePath of modulePaths) {
+    const ident = moduleIdentifier(modulePath);
+    const path = importPath(modulePath);
+    yield `import type * as ${ident} from "../${path}.js";`;
+    let node = root;
+    for (const segment of path.split('/')) {
+      if (!node.children.has(segment)) {
+        node.children.set(segment, { children: new Map(), module: null });
+      }
+      node = node.children.get(segment);
+    }
+    if (node.module !== null) throw new Error(`Duplicate generated API module: ${path}`);
+    node.module = ident;
+  }
+  yield `import type { ApiFromModules, FilterApi, FunctionReference } from "convex/server";
+type ModuleApi =
+  FilterApi, FunctionReference> extends { _: infer References } ? References : {};`;
+  function render(node, visibility) {
+    const parts = [];
+    if (node.module !== null) parts.push(`ModuleApi`);
+    if (node.children.size) {
+      parts.push(`{\n${[...node.children].map(([name, child]) => `${JSON.stringify(name)}: ${render(child, visibility)};`).join('\n')}\n}`);
+    }
+    return parts.length ? parts.join(' & ') : '{}';
+  }
+  yield `${apiComment('api', 'public')}
+export declare const api: ${render(root, 'public')};
+${apiComment('internal', 'internal')}
+export declare const internal: ${render(root, 'internal')};`;
+}
+
+const root = new URL('../node_modules/convex/', import.meta.url);
+let temporary;
+let temporaryOwned = false;
+try {
+  const manifest = JSON.parse(readFileSync(new URL('package.json', root), 'utf8'));
+  if (manifest.name !== 'convex' || manifest.version !== '1.45.0') {
+    throw new Error('Review the module-local API generator before changing Convex 1.45.0.');
+  }
+  const path = fileURLToPath(new URL('dist/cli.bundle.cjs', root));
+  if (statSync(path).size > 16 * 1024 * 1024) throw new Error('Unrecognized Convex CLI size.');
+  const original = readFileSync(path);
+  const current = hash(original);
+  if (current !== patchedSha256) {
+    if (current !== originalSha256) throw new Error('Unrecognized Convex CLI source.');
+    const text = original.toString('utf8');
+    const start = text.indexOf('async function* codegenDynamicApiObjects(ctx, componentDirectory) {');
+    const end = text.indexOf('async function* codegenDynamicApiObjectsTS(', start);
+    if (start < 0 || end < 0) throw new Error('Unexpected Convex generator boundary.');
+    const generator = codegenDynamicApiObjects.toString().replace(/\r\n/g, '\n');
+    const repaired = text.slice(0, start) + generator + '\n' + text.slice(end);
+    if (hash(repaired) !== patchedSha256) throw new Error('Unexpected Convex generator repair.');
+    temporary = `${path}.nodebench-api-${process.pid}.tmp`;
+    writeFileSync(temporary, repaired, { flag: 'wx' });
+    temporaryOwned = true;
+    renameSync(temporary, path);
+    temporary = undefined;
+  }
+  console.log('[convex-api] Verified module-local dynamic API generation for Convex 1.45.0.');
+} catch (error) {
+  console.error('[convex-api] API generator repair failed:', error.message);
+  process.exitCode = 1;
+} finally {
+  if (temporary && temporaryOwned) unlinkSync(temporary);
+}
diff --git a/scripts/patch-oss-stats-token-log.mjs b/scripts/patch-oss-stats-token-log.mjs
new file mode 100644
index 000000000..6b488c9bb
--- /dev/null
+++ b/scripts/patch-oss-stats-token-log.mjs
@@ -0,0 +1,36 @@
+// The published statistics component logs its GitHub token in sync arguments.
+// Keep the package API and scheduling intact; remove only that log statement.
+import { createHash } from 'node:crypto';
+import { readFileSync, writeFileSync } from 'node:fs';
+import { fileURLToPath } from 'node:url';
+
+const root = new URL('../node_modules/@erquhart/convex-oss-stats/', import.meta.url);
+const files = [
+  ['src/component/lib.ts', '81eee84453d3f66c0dacbdec8d1b9440db0eb8176705cc29158a666ef5f458c0', 'd25c49944dae3513498d2c43726766cd369ecffb5dd1f54b2d9bb7e60f5ab151'],
+  ['dist/component/lib.js', 'db62e0c8fc35a0ccaa192c00df89500cd15b2f6ce602ed9de7ba99d89df0ae98', 'b80ba35a954faf0985572730117fa2be28a44fcbc4b70e27da7d54db1277b80e'],
+];
+const hash = value => createHash('sha256').update(value).digest('hex');
+
+try {
+  const manifest = JSON.parse(readFileSync(new URL('package.json', root), 'utf8'));
+  if (manifest.name !== '@erquhart/convex-oss-stats' || manifest.version !== '0.8.2') {
+    throw new Error('Review the token-log patch before changing convex-oss-stats0.8.2.');
+  }
+  // Validate every input before writing either file. An interrupted write can
+  // resume because both the published and the repaired hash are recognized.
+  const changes = files.map(([relative, published, repaired]) => {
+    const path = fileURLToPath(new URL(relative, root));
+    const original = readFileSync(path);
+    const current = hash(original);
+    if (current === repaired) return null;
+    if (current !== published) throw new Error(`Unrecognized statistics source: ${relative}`);
+    const fixed = original.toString('utf8').replace('    console.log("sync", args);\n', '\n');
+    if (hash(fixed) !== repaired) throw new Error(`Unexpected token-log patch result: ${relative}`);
+    return { path, fixed };
+  });
+  for (const change of changes) if (change) writeFileSync(change.path, change.fixed);
+  console.log('[oss-stats] Verified token-log removal in source and compiled entrypoint.');
+} catch (error) {
+  console.error('[oss-stats] Token-log removal failed:', error.message);
+  process.exitCode = 1;
+}
diff --git a/scripts/preflight-deploy.mjs b/scripts/preflight-deploy.mjs
index c7809edb0..feed8011d 100644
--- a/scripts/preflight-deploy.mjs
+++ b/scripts/preflight-deploy.mjs
@@ -29,13 +29,15 @@ function run(cmd, cmdArgs, options = {}) {
     shell: false,
     encoding: "utf8",
     stdio: "pipe",
+    timeout: options.timeoutMs,
     env: { ...process.env, ...(options.env ?? {}) },
   });
   return {
     ok: result.status === 0,
     code: result.status ?? -1,
     stdout: result.stdout ?? "",
-    stderr: result.stderr ?? (result.error instanceof Error ? result.error.message : ""),
+    stderr: [result.stderr, result.error instanceof Error ? result.error.message : ""]
+      .filter(Boolean).join("\n"),
     durationMs: Date.now() - started,
   };
 }
@@ -69,14 +71,16 @@ const gates = [
     id: "tsc-app",
     name: "TypeScript app",
     check() {
-      const result = run("npx", ["tsc", "--noEmit", "--pretty", "false"]);
+      const result = run(process.execPath, ["scripts/typecheck-app.mjs"], {
+        timeoutMs: 15 * 60 * 1000,
+      });
       return result.ok
         ? { ok: true, detail: "app typecheck passed" }
         : {
             ok: false,
             detail: "app typecheck failed",
-            stderr: tail(result.stdout || result.stderr),
-            fix: "Run npx tsc --noEmit --pretty false.",
+            stderr: tail(result.stderr || result.stdout),
+            fix: "Run npm run typecheck:app.",
           };
     },
   },
diff --git a/scripts/repo/thin-workspace.manifest.json b/scripts/repo/thin-workspace.manifest.json
index cee052556..9d32e16e0 100644
--- a/scripts/repo/thin-workspace.manifest.json
+++ b/scripts/repo/thin-workspace.manifest.json
@@ -24,7 +24,8 @@
     "packages/mcp-local/README.md",
     "packages/mcp-local/tsconfig.json",
     "packages/mcp-local/src",
-    "scripts/patch-crons-exports.mjs"
+    "scripts/patch-oss-stats-token-log.mjs",
+    "scripts/patch-convex-api-codegen.mjs"
   ],
   "supportedScripts": [
     "postinstall",
diff --git a/scripts/typecheck-app.mjs b/scripts/typecheck-app.mjs
new file mode 100644
index 000000000..178196f01
--- /dev/null
+++ b/scripts/typecheck-app.mjs
@@ -0,0 +1,120 @@
+// Check the real application project and the generated API a client relies on.
+// Deliberately invalid client calls exist only in the in-memory test source.
+import ts from 'typescript';
+import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
+import { dirname, resolve } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
+const virtualPath = resolve(root, 'nodebench-api-contract.ts');
+const contract = `import { api, internal } from './backend/convex/_generated/api';
+import type { FunctionArgs, FunctionReturnType } from 'convex/server';
+const publicRef = api.actions.coordinatorWorkflowActions.startCoordinatorWorkflow;
+const privateRef = internal.domains.mcp.mcpSourcingDraft.generate;
+type IsAny = 0 extends (1 & T) ? true : false;
+type IsNever = [T] extends [never] ? true : false;
+type AssertFalse = T;
+type PublicApiNotAny = AssertFalse>;
+type PublicApiNotNever = AssertFalse>;
+type InternalApiNotAny = AssertFalse>;
+type InternalApiNotNever = AssertFalse>;
+type PublicReferenceNotAny = AssertFalse>;
+type InternalReferenceNotAny = AssertFalse>;
+type InternalArgsNotAny = AssertFalse>>;
+type InternalResultNotAny = AssertFalse>>;
+const validPublic: FunctionArgs = { threadId: 'review-session', prompt: 'Summarize supplied evidence' };
+const validPrivate: FunctionArgs = { userId: 'service-owner', requestId: 'draft-01', projectId: 'cotton-pouch', expectedRevision: 2, inputHash: 'a'.repeat(64), inputJson: '{}' };
+const validPublicReturn: string = publicRef._returnType.runId;
+const validPrivateReturn: string = privateRef._returnType.receipt.model;
+// A batch-review client reads event results; a scheduler client reads admission status.
+const batchRef = internal.domains.enrichment.fundingVerification.batchVerifyFundingEvents;
+const phasedRef = internal.domains.blips.blipPipeline.runPipelinePhased;
+type BatchResult = FunctionReturnType;
+type PhasedResult = FunctionReturnType;
+type BatchResultNotAny = AssertFalse>;
+type BatchResultNotNever = AssertFalse>;
+type PhasedResultNotAny = AssertFalse>;
+type PhasedResultNotNever = AssertFalse>;
+declare const batchResult: BatchResult;
+declare const phasedResult: PhasedResult;
+const validBatchCount: number = batchResult.total;
+const validBatchEvent: string = batchResult.results[0].fundingEventId;
+const validBatchError: string | undefined = batchResult.results[0].error;
+const validPhaseStarted: boolean = phasedResult.started;
+const validPhaseIngested: number = phasedResult.ingested;
+const validPhaseMessage: string = phasedResult.message;
+const wrongBatchCount: string = batchResult.total;
+const wrongPhaseStarted: number = phasedResult.started;
+const forbiddenBatchPublic = api.domains.enrichment.fundingVerification.batchVerifyFundingEvents;
+const forbiddenPhasedPublic = api.domains.blips.blipPipeline.runPipelinePhased;
+const wrongPublicArgument: FunctionArgs = { threadId: 42, prompt: 'Review' };
+const wrongPrivateArgument: FunctionArgs = { ...validPrivate, expectedRevision: 'two' };
+const wrongPrivateReturn: number = privateRef._returnType.receipt.model;
+const forbiddenPublic = api.domains.mcp.mcpSourcingDraft.generate;
+const forbiddenInternal = internal.actions.coordinatorWorkflowActions.startCoordinatorWorkflow;
+`;
+const formatHost = {
+  getCanonicalFileName: file => file,
+  getCurrentDirectory: () => root,
+  getNewLine: () => '\n',
+};
+
+try {
+  const config = ts.readConfigFile(resolve(root, 'tsconfig.app.json'), ts.sys.readFile);
+  if (config.error) throw new Error(ts.formatDiagnostics([config.error], formatHost));
+  const parsed = ts.parseJsonConfigFileContent(config.config, ts.sys, root);
+  if (parsed.errors.length) throw new Error(ts.formatDiagnostics(parsed.errors, formatHost));
+  if (!parsed.fileNames.some(file => resolve(file) === resolve(root, 'apps/web/src/App.tsx'))) {
+    throw new Error('The application project must include apps/web/src/App.tsx.');
+  }
+  const options = { ...parsed.options, noEmit: true };
+  const host = ts.createCompilerHost(options);
+  const getSourceFile = host.getSourceFile.bind(host);
+  host.getSourceFile = (name, ...args) => resolve(name) === virtualPath
+    ? ts.createSourceFile(name, contract, ts.ScriptTarget.Latest, true)
+    : getSourceFile(name, ...args);
+  const program = ts.createProgram([...parsed.fileNames, virtualPath], options, host);
+  const diagnostics = ts.getPreEmitDiagnostics(program);
+  const fixtureDiagnostics = diagnostics.filter(d => d.file && resolve(d.file.fileName) === virtualPath);
+  const appDiagnostics = diagnostics.filter(d => !d.file || resolve(d.file.fileName) !== virtualPath);
+  const expected = new Map(contract.split('\n').flatMap((line, index) => {
+    if (line.startsWith('const wrong')) return [[index, 2322]];
+    if (line.startsWith('const forbidden')) return [[index, 2339]];
+    return [];
+  }));
+  const negativeChecks = fixtureDiagnostics.map(d => ({
+    line: d.file.getLineAndCharacterOfPosition(d.start).line,
+    code: d.code,
+    message: ts.flattenDiagnosticMessageText(d.messageText, '\n'),
+  }));
+  const shimFiles = program.getSourceFiles().map(file => file.fileName)
+    .filter(file => file.replaceAll('\\', '/').includes('/_type_shims/'));
+  const contractsPassed = shimFiles.length === 0
+    && negativeChecks.length === expected.size
+    && [...expected].every(([line, code]) => negativeChecks.some(d => d.line === line && d.code === code));
+  const passed = contractsPassed && appDiagnostics.length === 0;
+  const generated = readFileSync(resolve(root, 'backend/convex/_generated/api.d.ts'), 'utf8');
+  const report = {
+    status: passed ? 'PASS' : 'FAIL',
+    project: 'tsconfig.app.json',
+    rootSourceFiles: parsed.fileNames.length,
+    programFiles: program.getSourceFiles().length,
+    generatedModuleImports: [...generated.matchAll(/import type \* as /g)].length,
+    apiCallContracts: contractsPassed ? 'PASS' : 'FAIL',
+    expectedInvalidCalls: expected.size,
+    observedInvalidCallErrors: negativeChecks,
+    ambientShimFiles: shimFiles,
+    applicationDiagnostics: appDiagnostics.length,
+  };
+  const output = resolve(root, '.tmp/app-typecheck');
+  mkdirSync(output, { recursive: true });
+  writeFileSync(resolve(output, 'report.json'), JSON.stringify(report, null, 2) + '\n');
+  writeFileSync(resolve(output, 'diagnostics.log'), ts.formatDiagnostics(appDiagnostics, formatHost));
+  console.log(`Generated API call contracts: ${report.apiCallContracts}. Application diagnostics: ${appDiagnostics.length}.`);
+  if (!contractsPassed) console.error(ts.formatDiagnostics(fixtureDiagnostics, formatHost) || 'Expected invalid calls were accepted or ambient shims were included.');
+  if (appDiagnostics.length) console.error(ts.formatDiagnostics(appDiagnostics, formatHost));
+  if (!passed) process.exitCode = 1;
+} catch (error) {
+  console.error('[app-typecheck]', error.message);
+  process.exitCode = 1;
+}
diff --git a/scripts/worker-container-smoke.mjs b/scripts/worker-container-smoke.mjs
new file mode 100644
index 000000000..f38930e5d
--- /dev/null
+++ b/scripts/worker-container-smoke.mjs
@@ -0,0 +1,75 @@
+// Run inside the built container with --network none and no provider credentials.
+// This proves startup and rejection contracts, not provider answer quality.
+import assert from 'node:assert/strict';
+import { existsSync, readFileSync } from 'node:fs';
+import { setTimeout as pause } from 'node:timers/promises';
+
+const base = 'http://127.0.0.1:3100';
+async function request(route, options = {}) {
+  const response = await fetch(base + route, { ...options, redirect: 'error', signal: AbortSignal.timeout(1500) });
+  const reader = response.body.getReader();
+  const chunks = [];
+  let size = 0;
+  try {
+    while (true) {
+      const { done, value } = await reader.read();
+      if (done) break;
+      size += value.length;
+      if (size > 65536) { await reader.cancel(); throw new Error('Smoke response exceeds64KiB'); }
+      chunks.push(value);
+    }
+  } finally { reader.releaseLock(); }
+  const text = Buffer.concat(chunks).toString('utf8');
+  let data = null;
+  try { data = JSON.parse(text); } catch { /* Express malformed-JSON rejection may be HTML. */ }
+  return { status: response.status, data };
+}
+
+const start = Date.now();
+let ready = false;
+let lastError = '';
+for (let attempt = 0; attempt < 60 && Date.now() - start < 45000; attempt++) {
+  try {
+    const result = await request('/health');
+    assert.equal(result.status, 200);
+    assert.equal(result.data?.service, 'nodebench-server');
+    assert.equal(result.data.status, 'ok');
+    ready = true; break;
+  } catch (error) { lastError = String(error).slice(0, 500); }
+  await pause(500);
+}
+assert.ok(ready, `Worker did not become ready: ${lastError}`);
+
+const mcp = await request('/mcp/health');
+assert.equal(mcp.status, 200);
+assert.equal(mcp.data.status, 'healthy');
+assert.ok(mcp.data.tools.count > 0, 'A worker without loaded tools is not ready');
+const pipeline = await request('/api/pipeline/health');
+assert.equal(pipeline.status, 200);
+assert.equal(pipeline.data.pipeline, 'v2');
+assert.equal(pipeline.data.components.linkup, false);
+assert.equal(pipeline.data.components.gemini, false);
+
+async function rejectEmpty(query) {
+  const result = await request('/api/pipeline/search', {
+    method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ query }),
+  });
+  assert.equal(result.status, 400);
+  assert.deepEqual(result.data, { error: true, message: 'Query is required' });
+}
+// Burst and repeated invalid requests must remain rejected before provider hooks.
+await Promise.all(Array.from({ length: 12 }, (_, i) => rejectEmpty(i % 2 ? '   ' : '')));
+for (let i = 0; i < 20; i++) await rejectEmpty('');
+const malformed = await request('/api/pipeline/search', {
+  method: 'POST', headers: { 'content-type': 'application/json' }, body: '{',
+});
+assert.equal(malformed.status, 400);
+const after = await request('/mcp/health');
+assert.equal(after.data.tools.count, mcp.data.tools.count);
+assert.equal(after.data.sessions, 0);
+
+for (const file of ['/app/.env', '/app/.env.local', '/app/packages/mcp-local/.mcpregistry_registry_token', '/app/packages/mcp-local/.mcpregistry_github_token']) {
+  assert.equal(existsSync(file), false, `Credential path reached runtime image: ${file}`);
+}
+assert.equal(readFileSync('/app/.npmrc', 'utf8').trim(), 'legacy-peer-deps=true');
+console.log(JSON.stringify({ status: 'PASS', node: process.version, service: 'nodebench-server', tools: mcp.data.tools.count, pipeline: 'v2', concurrentRejections: 12, repeatedRejections: 20, malformedJson: 400, providerKeysPresent: false, externalNetwork: 'disabled by container configuration', elapsedMs: Date.now() - start }));
diff --git a/workers/node/Dockerfile b/workers/node/Dockerfile
index 9bb556df5..95721c901 100644
--- a/workers/node/Dockerfile
+++ b/workers/node/Dockerfile
@@ -1,9 +1,13 @@
-FROM node:20-slim AS build
+FROM node:22.22.2-bookworm-slim@sha256:9f6d5975c7dca860947d3915877f85607946403fc55349f39b4bc3688448bb6e AS base
 
 WORKDIR /app
+# Match packageManager and share one dependency policy across both stages.
+RUN npm install --global npm@11.5.2 --no-audit --no-fund
+COPY package.json package-lock.json .npmrc ./
+COPY scripts/patch-oss-stats-token-log.mjs scripts/patch-oss-stats-token-log.mjs
+COPY scripts/patch-convex-api-codegen.mjs scripts/patch-convex-api-codegen.mjs
 
-COPY package.json package-lock.json ./
-COPY scripts/patch-crons-exports.mjs scripts/patch-crons-exports.mjs
+FROM base AS build
 
 # The compiler and TypeScript source runner are development dependencies.
 RUN npm ci
@@ -18,12 +22,7 @@ COPY scripts/ui/runDogfoodGeminiQa.mjs scripts/ui/runDogfoodGeminiQa.mjs
 COPY tsconfig.json ./
 RUN npm run build:voice
 
-FROM node:20-slim AS runtime
-
-WORKDIR /app
-
-COPY package.json package-lock.json ./
-COPY scripts/patch-crons-exports.mjs scripts/patch-crons-exports.mjs
+FROM base AS runtime
 RUN npm ci --omit=dev
 
 COPY --from=build /app/dist/ dist/