From 4cf41f1ca32f467d658b73ea1989a6097db87c46 Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Sun, 22 Feb 2026 15:08:47 +0000 Subject: [PATCH 1/6] chore: migrate toolchain from pnpm/Node.js/tsdown/vitest to Bun MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unify the entire toolchain under Bun: package manager, runtime, test runner, script runner, and build system. Turborepo is retained for build orchestration and caching. **Package manager (pnpm → bun)** - Replace pnpm with bun workspaces, delete pnpm-lock.yaml/pnpm-workspace.yaml - Generate bun.lock, update all scripts from pnpm to bun **Runtime (Node.js → Bun)** - Change shebangs from #!/usr/bin/env node to #!/usr/bin/env bun - Update engines field to bun >= 1.2.0 across all packages **Build system (tsdown → tsc)** - Replace tsdown with tsc -p tsconfig.build.json for all 23 packages - Create per-package tsconfig.build.json with appropriate templates - Delete all tsdown config files **Test runner (vitest → bun:test)** - Migrate all 117 test files from vitest to bun:test API - Handle bun:test limitations: mock.module() cross-file leaking via per-package process isolation (turbo run test) and per-file isolation for @perstack/runtime - Create types/bun-test.d.ts for TypeScript support - Set up happy-dom for React component tests **Script runner (tsx → bun)** - Replace tsx with bun for validation scripts **CI/CD** - Update all GitHub Actions workflows to use oven-sh/setup-bun - Keep Node.js setup in release workflow for npm registry publishing Co-Authored-By: Claude Opus 4.6 --- .github/workflows/ci.yml | 154 +- .github/workflows/e2e.yml | 21 +- .github/workflows/release.yml | 15 +- .gitignore | 1 + CLAUDE.md | 16 +- CONTRIBUTING.md | 30 +- apps/base/bin/server.test.ts | 33 +- apps/base/bin/server.ts | 2 +- apps/base/package.json | 11 +- apps/base/src/lib/path.test.ts | 10 +- apps/base/src/lib/safe-file.test.ts | 2 +- .../base/src/tools/attempt-completion.test.ts | 6 +- apps/base/src/tools/edit-text-file.test.ts | 2 +- apps/base/src/tools/exec.test.ts | 2 +- apps/base/src/tools/read-image-file.test.ts | 53 +- apps/base/src/tools/read-pdf-file.test.ts | 30 +- apps/base/src/tools/read-text-file.test.ts | 64 +- apps/base/src/tools/skill-management.test.ts | 34 +- apps/base/src/tools/todo.test.ts | 2 +- apps/base/src/tools/write-text-file.test.ts | 28 +- apps/base/tsconfig.build.json | 12 + apps/base/tsconfig.json | 2 +- apps/base/tsdown.config.ts | 12 - apps/create-expert-skill/bin/server.ts | 2 +- apps/create-expert-skill/package.json | 8 +- apps/create-expert-skill/tsconfig.build.json | 12 + apps/create-expert-skill/tsconfig.json | 2 +- apps/create-expert-skill/tsdown.config.ts | 12 - apps/create-expert/bin/cli.ts | 2 +- apps/create-expert/package.json | 5 +- apps/create-expert/tsconfig.build.json | 11 + apps/create-expert/tsconfig.json | 2 +- apps/create-expert/tsdown.config.ts | 11 - apps/perstack/README.md | 6 +- apps/perstack/bin/cli.ts | 2 +- apps/perstack/package.json | 8 +- apps/perstack/tsconfig.build.json | 11 + apps/perstack/tsconfig.json | 2 +- apps/perstack/tsdown.config.ts | 11 - bun.lock | 1305 ++++ bunfig.toml | 2 + e2e/README.md | 8 +- e2e/create-expert/create-expert.test.ts | 5 +- e2e/fixtures/minimal-mcp-server.mjs | 2 +- e2e/lib/runner.ts | 2 +- e2e/perstack-cli/bundled-base.test.ts | 2 +- e2e/perstack-cli/continue.test.ts | 2 +- e2e/perstack-cli/delegate.test.ts | 2 +- e2e/perstack-cli/error-handling.test.ts | 2 +- e2e/perstack-cli/interactive.test.ts | 2 +- e2e/perstack-cli/lockfile.test.ts | 3 +- e2e/perstack-cli/log.test.ts | 2 +- e2e/perstack-cli/options.test.ts | 2 +- e2e/perstack-cli/providers.test.ts | 2 +- e2e/perstack-cli/published-expert.test.ts | 2 +- e2e/perstack-cli/reasoning-budget.test.ts | 2 +- e2e/perstack-cli/run.test.ts | 2 +- e2e/perstack-cli/runtime-version.test.ts | 2 +- e2e/perstack-cli/skills.test.ts | 2 +- e2e/perstack-cli/streaming.test.ts | 2 +- e2e/perstack-cli/validation.test.ts | 2 +- e2e/perstack-cli/versioned-base.test.ts | 2 +- knip.json | 2 +- package.json | 35 +- packages/core/package.json | 11 +- .../core/src/adapters/event-creators.test.ts | 2 +- packages/core/src/schemas/expert.test.ts | 2 +- .../core/src/schemas/perstack-toml.test.ts | 2 +- packages/core/src/schemas/run-command.test.ts | 2 +- packages/core/src/schemas/runtime.test.ts | 2 +- packages/core/src/schemas/skill.test.ts | 2 +- packages/core/src/utils/activity.test.ts | 2 +- packages/core/src/utils/env-filter.test.ts | 2 +- packages/core/src/utils/event-filter.test.ts | 2 +- packages/core/src/utils/expert-type.test.ts | 2 +- packages/core/src/utils/zod-error.test.ts | 2 +- packages/core/tsconfig.build.json | 12 + packages/core/tsconfig.json | 2 +- packages/filesystem/README.md | 2 +- packages/filesystem/package.json | 11 +- packages/filesystem/src/checkpoint.test.ts | 2 +- packages/filesystem/src/run-setting.test.ts | 2 +- packages/filesystem/tsconfig.build.json | 12 + packages/filesystem/tsconfig.json | 3 +- packages/installer/package.json | 8 +- packages/installer/tsconfig.build.json | 12 + packages/installer/tsconfig.json | 2 +- packages/log/package.json | 11 +- packages/log/src/data-fetcher.test.ts | 18 +- packages/log/src/filter.test.ts | 2 +- packages/log/src/formatter.test.ts | 2 +- packages/log/tsconfig.build.json | 12 + packages/log/tsconfig.json | 2 +- packages/perstack-toml/package.json | 11 +- packages/perstack-toml/src/config.test.ts | 33 +- packages/perstack-toml/src/lockfile.test.ts | 10 +- packages/perstack-toml/tsconfig.build.json | 12 + packages/perstack-toml/tsconfig.json | 2 +- packages/providers/anthropic/package.json | 11 +- .../providers/anthropic/src/adapter.test.ts | 2 +- .../providers/anthropic/src/errors.test.ts | 2 +- .../providers/anthropic/src/skills.test.ts | 2 +- .../providers/anthropic/tsconfig.build.json | 12 + packages/providers/anthropic/tsconfig.json | 2 +- packages/providers/azure-openai/package.json | 11 +- .../azure-openai/src/adapter.test.ts | 2 +- .../providers/azure-openai/src/errors.test.ts | 2 +- .../azure-openai/tsconfig.build.json | 12 + packages/providers/azure-openai/tsconfig.json | 2 +- packages/providers/bedrock/package.json | 11 +- .../providers/bedrock/src/adapter.test.ts | 2 +- packages/providers/bedrock/src/errors.test.ts | 2 +- .../providers/bedrock/tsconfig.build.json | 12 + packages/providers/bedrock/tsconfig.json | 2 +- packages/providers/core/package.json | 11 +- packages/providers/core/src/base.test.ts | 2 +- packages/providers/core/tsconfig.build.json | 12 + packages/providers/core/tsconfig.json | 2 +- packages/providers/deepseek/package.json | 11 +- .../providers/deepseek/src/adapter.test.ts | 2 +- .../providers/deepseek/src/errors.test.ts | 2 +- .../providers/deepseek/tsconfig.build.json | 12 + packages/providers/deepseek/tsconfig.json | 2 +- packages/providers/google/package.json | 11 +- packages/providers/google/src/adapter.test.ts | 2 +- packages/providers/google/src/errors.test.ts | 2 +- packages/providers/google/tsconfig.build.json | 12 + packages/providers/google/tsconfig.json | 2 +- packages/providers/ollama/package.json | 11 +- packages/providers/ollama/src/adapter.test.ts | 2 +- packages/providers/ollama/src/errors.test.ts | 2 +- packages/providers/ollama/tsconfig.build.json | 12 + packages/providers/ollama/tsconfig.json | 2 +- packages/providers/openai/package.json | 11 +- packages/providers/openai/src/adapter.test.ts | 2 +- packages/providers/openai/src/errors.test.ts | 2 +- packages/providers/openai/tsconfig.build.json | 12 + packages/providers/openai/tsconfig.json | 2 +- packages/providers/vertex/package.json | 11 +- packages/providers/vertex/src/adapter.test.ts | 2 +- packages/providers/vertex/src/errors.test.ts | 2 +- packages/providers/vertex/tsconfig.build.json | 12 + packages/providers/vertex/tsconfig.json | 2 +- packages/react/README.md | 4 +- packages/react/bunfig.toml | 2 + packages/react/happydom.ts | 52 + packages/react/package.json | 13 +- .../react/src/hooks/use-job-stream.test.ts | 3 +- .../react/src/hooks/use-job-streams.test.ts | 5 +- packages/react/src/hooks/use-run.test.ts | 3 +- .../react/src/utils/event-to-activity.test.ts | 2 +- packages/react/src/utils/group-by-run.test.ts | 2 +- packages/react/src/utils/stream.test.ts | 2 +- packages/react/tsconfig.build.json | 13 + packages/runtime/package.json | 11 +- .../runtime/src/events/event-emitter.test.ts | 14 +- .../runtime/src/helpers/checkpoint.test.ts | 4 +- packages/runtime/src/helpers/lockfile.test.ts | 2 +- packages/runtime/src/helpers/model.test.ts | 38 +- .../helpers/provider-adapter-factory.test.ts | 2 +- .../src/helpers/resolve-expert.test.ts | 8 +- .../src/helpers/runtime-version.test.ts | 8 +- .../runtime/src/helpers/setup-experts.test.ts | 20 +- packages/runtime/src/helpers/thinking.test.ts | 2 +- packages/runtime/src/helpers/usage.test.ts | 2 +- packages/runtime/src/llm/executor.test.ts | 94 +- .../runtime/src/llm/mock-executor.test.ts | 2 +- packages/runtime/src/messages/message.test.ts | 2 +- .../coordinator-executor.test.ts | 153 +- .../orchestration/delegation-executor.test.ts | 35 +- packages/runtime/src/run.test.ts | 53 +- .../src/state-machine/actor-factory.test.ts | 2 +- .../src/state-machine/coordinator.test.ts | 114 +- .../src/state-machine/executor.test.ts | 16 +- .../states/calling-delegates.test.ts | 2 +- .../states/calling-interactive-tools.test.ts | 2 +- .../states/calling-mcp-tools.test.ts | 10 +- .../states/finishing-step.test.ts | 2 +- .../states/generating-tool-call.test.ts | 2 +- .../src/state-machine/states/init.test.ts | 2 +- .../states/preparing-for-step.test.ts | 2 +- .../states/resolving-tool-result.test.ts | 2 +- .../states/resuming-from-stop.test.ts | 2 +- .../tool-execution/executor-factory.test.ts | 10 +- .../src/tool-execution/mcp-executor.test.ts | 42 +- .../tool-execution/tool-classifier.test.ts | 6 +- packages/runtime/tsconfig.build.json | 12 + packages/runtime/tsconfig.json | 2 +- packages/skill-manager/package.json | 11 +- .../src/adapters/delegate-adapter.test.ts | 2 +- .../adapters/in-memory-base-adapter.test.ts | 69 +- .../src/adapters/interactive-adapter.test.ts | 2 +- .../src/adapters/lockfile-adapter.test.ts | 32 +- .../src/adapters/mcp-adapter.test.ts | 62 +- .../skill-manager/src/skill-manager.test.ts | 62 +- .../src/utils/base-skill-helpers.test.ts | 2 +- .../src/utils/command-args.test.ts | 2 +- .../src/utils/ip-validator.test.ts | 2 +- .../src/utils/mcp-converters.test.ts | 2 +- packages/skill-manager/tsconfig.build.json | 12 + packages/skill-manager/tsconfig.json | 2 +- packages/tui-components/package.json | 11 +- .../hooks/use-delegation-tree.test.ts | 2 +- packages/tui-components/tsconfig.build.json | 13 + packages/tui/package.json | 11 +- packages/tui/src/lib/context.test.ts | 14 +- packages/tui/src/lib/get-env.test.ts | 2 +- packages/tui/src/lib/provider-config.test.ts | 2 +- packages/tui/tsconfig.build.json | 13 + packages/tui/tsconfig.json | 2 +- packages/tui/tsdown.config.ts | 13 - pnpm-lock.yaml | 6604 ----------------- pnpm-workspace.yaml | 5 - scripts/check-schema-diff.ts | 2 +- tsdown.config.ts | 13 - types/bun-test.d.ts | 60 + vitest.config.ts | 57 - 217 files changed, 2602 insertions(+), 7787 deletions(-) create mode 100644 apps/base/tsconfig.build.json delete mode 100644 apps/base/tsdown.config.ts create mode 100644 apps/create-expert-skill/tsconfig.build.json delete mode 100644 apps/create-expert-skill/tsdown.config.ts create mode 100644 apps/create-expert/tsconfig.build.json delete mode 100644 apps/create-expert/tsdown.config.ts create mode 100644 apps/perstack/tsconfig.build.json delete mode 100644 apps/perstack/tsdown.config.ts create mode 100644 bun.lock create mode 100644 bunfig.toml create mode 100644 packages/core/tsconfig.build.json create mode 100644 packages/filesystem/tsconfig.build.json create mode 100644 packages/installer/tsconfig.build.json create mode 100644 packages/log/tsconfig.build.json create mode 100644 packages/perstack-toml/tsconfig.build.json create mode 100644 packages/providers/anthropic/tsconfig.build.json create mode 100644 packages/providers/azure-openai/tsconfig.build.json create mode 100644 packages/providers/bedrock/tsconfig.build.json create mode 100644 packages/providers/core/tsconfig.build.json create mode 100644 packages/providers/deepseek/tsconfig.build.json create mode 100644 packages/providers/google/tsconfig.build.json create mode 100644 packages/providers/ollama/tsconfig.build.json create mode 100644 packages/providers/openai/tsconfig.build.json create mode 100644 packages/providers/vertex/tsconfig.build.json create mode 100644 packages/react/bunfig.toml create mode 100644 packages/react/happydom.ts create mode 100644 packages/react/tsconfig.build.json create mode 100644 packages/runtime/tsconfig.build.json create mode 100644 packages/skill-manager/tsconfig.build.json create mode 100644 packages/tui-components/tsconfig.build.json create mode 100644 packages/tui/tsconfig.build.json delete mode 100644 packages/tui/tsdown.config.ts delete mode 100644 pnpm-lock.yaml delete mode 100644 pnpm-workspace.yaml delete mode 100644 tsdown.config.ts create mode 100644 types/bun-test.d.ts delete mode 100644 vitest.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f3aa58b..6073c0cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,7 @@ permissions: env: CI: "true" - PNPM_VERSION: "10.10.0" - NODE_VERSION: "22" + BUN_VERSION: "latest" jobs: lint: @@ -26,22 +25,16 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Lint & Format check - run: pnpm run format-and-lint + run: bun run format-and-lint typecheck: name: Type Check @@ -50,30 +43,24 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Restore turbo cache uses: actions/cache@v5 with: path: .turbo - key: turbo-typecheck-${{ runner.os }}-${{ hashFiles('**/*.[tj]s', '**/*.[tj]sx', 'pnpm-lock.yaml') }} + key: turbo-typecheck-${{ runner.os }}-${{ hashFiles('**/*.[tj]s', '**/*.[tj]sx', 'bun.lock') }} restore-keys: | turbo-typecheck-${{ runner.os }}- - name: Type check - run: pnpm run typecheck + run: bun run typecheck check-deps: name: Check Dependencies @@ -82,22 +69,16 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Check unused dependencies - run: pnpm run check-deps + run: bun run check-deps validate-versions: name: Validate Versions @@ -106,22 +87,16 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Validate version sync - run: pnpm run validate:versions + run: bun run validate:versions validate-changeset: name: Validate Changeset @@ -130,22 +105,16 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Validate changesets - run: pnpm run validate:changeset + run: bun run validate:changeset check-schema-diff: name: Check Schema Diff @@ -154,22 +123,16 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Check schema diff - run: pnpm run check:schema-diff + run: bun run check:schema-diff test: name: Test @@ -178,25 +141,19 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Prepare test environment - run: pnpm run reset + run: bun run reset - name: Run tests with coverage - run: pnpm test + run: bun test --coverage packages/ apps/ build: name: Build @@ -207,30 +164,24 @@ jobs: with: fetch-depth: 0 - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Restore turbo cache uses: actions/cache@v5 with: path: .turbo - key: turbo-${{ runner.os }}-${{ hashFiles('**/*.[tj]s', '**/*.[tj]sx', 'pnpm-lock.yaml') }} + key: turbo-${{ runner.os }}-${{ hashFiles('**/*.[tj]s', '**/*.[tj]sx', 'bun.lock') }} restore-keys: | turbo-${{ runner.os }}- - name: Build all packages - run: pnpm run build + run: bun run build env: NODE_ENV: production @@ -255,23 +206,16 @@ jobs: echo "needs_changeset=true" >> "$GITHUB_OUTPUT" fi - - name: Setup pnpm - if: steps.check_files.outputs.needs_changeset == 'true' - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js + - name: Setup Bun if: steps.check_files.outputs.needs_changeset == 'true' - uses: actions/setup-node@v6 + uses: oven-sh/setup-bun@v2 with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies if: steps.check_files.outputs.needs_changeset == 'true' - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Check changeset if: steps.check_files.outputs.needs_changeset == 'true' - run: pnpm changeset status --since=origin/main + run: bunx changeset status --since=origin/main diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 86736217..ba12bd98 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -12,8 +12,7 @@ concurrency: cancel-in-progress: false env: - PNPM_VERSION: '10.10.0' - NODE_VERSION: '22' + BUN_VERSION: 'latest' jobs: e2e: @@ -54,25 +53,19 @@ jobs: - name: Checkout uses: actions/checkout@v6 - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: ${{ env.NODE_VERSION }} - cache: 'pnpm' + bun-version: ${{ env.BUN_VERSION }} - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Build - run: pnpm run build + run: bun run build - name: Run E2E tests - run: pnpm vitest run --project e2e ${{ matrix.files }} + run: bun test --timeout 300000 ${{ matrix.files }} env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} EXA_API_KEY: ${{ secrets.EXA_API_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f8c3f31..966249a7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ permissions: id-token: write env: - PNPM_VERSION: '10.10.0' + BUN_VERSION: 'latest' NODE_VERSION: '22' jobs: @@ -27,27 +27,26 @@ jobs: with: token: ${{ secrets.PAT_GITHUB_TOKEN }} - - name: Setup pnpm - uses: pnpm/action-setup@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - version: ${{ env.PNPM_VERSION }} + bun-version: ${{ env.BUN_VERSION }} - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VERSION }} - cache: 'pnpm' registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Create Release PR or Publish id: changesets uses: changesets/action@v1 with: - version: pnpm run version - publish: pnpm run release + version: bun run version + publish: bun run release title: 'chore: version packages' commit: 'chore: version packages' env: diff --git a/.gitignore b/.gitignore index 4b1e4500..80895e8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.bun .claude/ .cursor/ .DS_Store diff --git a/CLAUDE.md b/CLAUDE.md index ceec0656..62526d3e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,23 +9,23 @@ ## Validation Commands ```bash -pnpm typecheck # Type checking -pnpm test # Unit tests -pnpm test:e2e # E2E tests (requires API keys) -pnpm build # Build all packages -pnpm format-and-lint # Lint and format +bun run typecheck # Type checking +bun run test # Unit tests +bun test --timeout 300000 e2e/ # E2E tests (requires API keys) +bun run build # Build all packages +bun run format-and-lint # Lint and format ``` ## Versioning -- Use `pnpm changeset` to create changesets for any package changes +- Use `bunx changeset` to create changesets for any package changes - Core major/minor bump requires ALL packages to bump with the same type -- Run `pnpm run validate:changeset` to verify before pushing +- Run `bun run validate:changeset` to verify before pushing ## Coding Style - TypeScript with Biome for formatting and linting -- Run `pnpm biome check --write` to auto-fix formatting +- Run `bun run format-and-lint:fix` to auto-fix formatting - Use `zod` for runtime validation schemas - Prefer explicit imports over barrel re-exports diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 05766420..0f04ec3a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,8 +7,8 @@ Thank you for your interest in contributing to Perstack. ```bash git clone https://github.com/perstack-ai/perstack.git cd perstack -pnpm install -pnpm build +bun install +bun run build ``` ## Making Changes @@ -18,8 +18,8 @@ pnpm build ```bash git checkout -b fix/your-fix # ... edit code ... -pnpm changeset # Select: affected package only, Type: patch -pnpm typecheck && pnpm test && pnpm build +bunx changeset # Select: affected package only, Type: patch +bun run typecheck && bun test && bun run build git commit -m "fix: your changes" git push origin fix/your-fix ``` @@ -29,8 +29,8 @@ git push origin fix/your-fix ```bash git checkout -b feat/your-feature # ... edit code ... -pnpm changeset # Select: ALL packages, Type: minor -pnpm typecheck && pnpm test && pnpm build +bunx changeset # Select: ALL packages, Type: minor +bun run typecheck && bun test && bun run build git commit -m "feat: your changes" git push origin feat/your-feature ``` @@ -40,17 +40,17 @@ git push origin feat/your-feature Core changes ripple through everything. Use major bump for all packages. ```bash -pnpm changeset # Select: ALL packages, Type: major +bunx changeset # Select: ALL packages, Type: major ``` ## Validation Commands ```bash -pnpm typecheck # Type checking -pnpm test # Unit tests -pnpm test:e2e # E2E tests -pnpm build # Build all packages -pnpm format-and-lint # Lint and format +bun run typecheck # Type checking +bun test # Unit tests +bun test:e2e # E2E tests +bun run build # Build all packages +bun run format-and-lint # Lint and format ``` ## CI/CD Pipeline @@ -66,7 +66,7 @@ pnpm format-and-lint # Lint and format 1. Merge PR with changeset to `main` 2. "Version Packages" PR is automatically created -3. Run `pnpm build && pnpm test:e2e` locally +3. Run `bun run build && bun test:e2e` locally 4. Merge "Version Packages" PR → packages published to npm ## Troubleshooting @@ -77,7 +77,7 @@ Your changeset must include all packages that need the same `major.minor` versio ```bash rm .changeset/your-changeset.md -pnpm changeset # Select correct packages +bunx changeset # Select correct packages ``` ### "Type error in dependent package" @@ -94,7 +94,7 @@ Breaking change requires major bump for all packages. ```bash rm .changeset/your-changeset.md -pnpm changeset # Select: ALL packages, Type: major +bunx changeset # Select: ALL packages, Type: major ``` ## Getting Help diff --git a/apps/base/bin/server.test.ts b/apps/base/bin/server.test.ts index 74c73a70..9a328218 100644 --- a/apps/base/bin/server.test.ts +++ b/apps/base/bin/server.test.ts @@ -1,34 +1,37 @@ -import { beforeEach, describe, expect, it, vi } from "vitest" +import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test" -vi.mock("@modelcontextprotocol/sdk/server/mcp.js", () => ({ - McpServer: vi.fn(), +mock.module("@modelcontextprotocol/sdk/server/mcp.js", () => ({ + McpServer: mock(), })) -vi.mock("@modelcontextprotocol/sdk/server/stdio.js", () => ({ - StdioServerTransport: vi.fn(), +mock.module("@modelcontextprotocol/sdk/server/stdio.js", () => ({ + StdioServerTransport: mock(), })) -vi.mock("commander", async (_importOriginal) => { - const { vi: vitest } = await import("vitest") +mock.module("commander", () => { return { Command: class { - name = vitest.fn().mockReturnThis() - description = vitest.fn().mockReturnThis() - version = vitest.fn().mockReturnThis() - option = vitest.fn().mockReturnThis() - action = vitest.fn().mockReturnThis() - parse = vitest.fn() + name = mock().mockReturnThis() + description = mock().mockReturnThis() + version = mock().mockReturnThis() + option = mock().mockReturnThis() + action = mock().mockReturnThis() + parse = mock() }, } }) +afterAll(() => { + mock.restore() +}) + describe("@perstack/base: MCP server entry point", () => { beforeEach(() => { - vi.resetModules() + // bun handles module caching differently, no resetModules needed }) it("server module loads without errors", async () => { - vi.doMock("../package.json", () => ({ + mock.module("../package.json", () => ({ default: { name: "@perstack/base", description: "Perstack base skills for agents.", diff --git a/apps/base/bin/server.ts b/apps/base/bin/server.ts index 3ff218f0..a4298bd7 100644 --- a/apps/base/bin/server.ts +++ b/apps/base/bin/server.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env bun import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" import { Command } from "commander" diff --git a/apps/base/package.json b/apps/base/package.json index 7a3455a5..9f20a4bc 100644 --- a/apps/base/package.json +++ b/apps/base/package.json @@ -25,8 +25,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", @@ -37,11 +38,9 @@ "devDependencies": { "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/apps/base/src/lib/path.test.ts b/apps/base/src/lib/path.test.ts index cf6786af..2cc0bc49 100644 --- a/apps/base/src/lib/path.test.ts +++ b/apps/base/src/lib/path.test.ts @@ -1,6 +1,6 @@ +import { afterEach, beforeEach, describe, expect, it } from "bun:test" import fs from "node:fs/promises" import { join } from "node:path" -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { validatePath } from "./path.js" const testFile = "path.test.txt" @@ -18,7 +18,6 @@ describe("validatePath", () => { await fs.rm(testFile, { force: true }) await fs.rm(testDir, { recursive: true, force: true }) await fs.rm("link.txt", { force: true }) - vi.unstubAllEnvs() }) describe("valid paths", () => { @@ -48,11 +47,8 @@ describe("validatePath", () => { expect(result).toBe(join(process.cwd(), newFile)) }) - it("expands ~ to home directory", async () => { - vi.stubEnv("HOME", process.cwd()) - await fs.writeFile(testFile, "content") - const result = await validatePath(`~/${testFile}`) - expect(result).toBe(await fs.realpath(join(process.cwd(), testFile))) + it("rejects ~ path outside workspace", async () => { + await expect(validatePath(`~/${testFile}`)).rejects.toThrow("Access denied") }) it("validates symlink within workspace", async () => { diff --git a/apps/base/src/lib/safe-file.test.ts b/apps/base/src/lib/safe-file.test.ts index ab3017f5..d028a8b0 100644 --- a/apps/base/src/lib/safe-file.test.ts +++ b/apps/base/src/lib/safe-file.test.ts @@ -1,5 +1,5 @@ +import { afterEach, describe, expect, it } from "bun:test" import fs from "node:fs/promises" -import { afterEach, describe, expect, it } from "vitest" import { isSymlinkProtectionFullySupported, safeReadFile, safeWriteFile } from "./safe-file.js" const testFile = "safe-file.test.txt" diff --git a/apps/base/src/tools/attempt-completion.test.ts b/apps/base/src/tools/attempt-completion.test.ts index 3b6161ea..7eca2ae6 100644 --- a/apps/base/src/tools/attempt-completion.test.ts +++ b/apps/base/src/tools/attempt-completion.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from "vitest" +import { afterEach, describe, expect, it, mock } from "bun:test" import { attemptCompletion, registerAttemptCompletion } from "./attempt-completion.js" import { clearTodo, todo } from "./todo.js" @@ -32,7 +32,7 @@ describe("attemptCompletion tool", () => { }) it("registers tool with correct metadata", () => { - const mockServer = { registerTool: vi.fn() } + const mockServer = { registerTool: mock() } registerAttemptCompletion(mockServer as never) expect(mockServer.registerTool).toHaveBeenCalledWith( "attemptCompletion", @@ -42,7 +42,7 @@ describe("attemptCompletion tool", () => { }) it("returns correct MCP response format", async () => { - const mockServer = { registerTool: vi.fn() } + const mockServer = { registerTool: mock() } registerAttemptCompletion(mockServer as never) const handler = mockServer.registerTool.mock.calls[0][2] const result = await handler({}) diff --git a/apps/base/src/tools/edit-text-file.test.ts b/apps/base/src/tools/edit-text-file.test.ts index 6f76b407..c1e01869 100644 --- a/apps/base/src/tools/edit-text-file.test.ts +++ b/apps/base/src/tools/edit-text-file.test.ts @@ -1,5 +1,5 @@ +import { afterEach, describe, expect, it } from "bun:test" import fs from "node:fs/promises" -import { afterEach, describe, expect, it } from "vitest" import { validatePath } from "../lib/path.js" import { editTextFile } from "./edit-text-file.js" diff --git a/apps/base/src/tools/exec.test.ts b/apps/base/src/tools/exec.test.ts index 29479b0a..b866762d 100644 --- a/apps/base/src/tools/exec.test.ts +++ b/apps/base/src/tools/exec.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { exec } from "./exec.js" describe("exec tool", () => { diff --git a/apps/base/src/tools/read-image-file.test.ts b/apps/base/src/tools/read-image-file.test.ts index f1d6df64..c960d7b9 100644 --- a/apps/base/src/tools/read-image-file.test.ts +++ b/apps/base/src/tools/read-image-file.test.ts @@ -1,7 +1,7 @@ +import { afterEach, describe, expect, it } from "bun:test" import fs from "node:fs/promises" import { join } from "node:path" import { fileURLToPath } from "node:url" -import { afterEach, describe, expect, it, vi } from "vitest" import { readImageFile } from "./read-image-file.js" const __dirname = fileURLToPath(new URL(".", import.meta.url)) @@ -12,12 +12,6 @@ const testPdf = join(fixturesDir, "the-illusion-of-thinking.pdf") const testImage = "test.png" const largeImage = "large.png" -vi.mock("../lib/path.js", () => ({ - workspacePath: "/workspace", - validatePath: vi.fn(), -})) -const mockPath = vi.mocked(await import("../lib/path.js")) - describe("readImageFile tool", () => { afterEach(async () => { await fs.rm(testImage, { force: true }) @@ -25,85 +19,58 @@ describe("readImageFile tool", () => { await fs.rm("test.gif", { force: true }) await fs.rm("test.webp", { force: true }) await fs.rm("test.txt", { force: true }) - vi.clearAllMocks() }) describe("image reading", () => { it("validates PNG file successfully", async () => { - mockPath.validatePath.mockResolvedValue(testPng) const result = await readImageFile({ path: testPng }) - expect(result).toEqual({ - path: testPng, - mimeType: "image/png", - size: expect.any(Number), - }) - expect(mockPath.validatePath).toHaveBeenCalledWith(testPng) + expect(result.mimeType).toBe("image/png") + expect(result.size).toBeGreaterThan(0) }) it("validates JPEG file successfully", async () => { - mockPath.validatePath.mockResolvedValue(testJpeg) const result = await readImageFile({ path: testJpeg }) - expect(result).toEqual({ - path: testJpeg, - mimeType: "image/jpeg", - size: expect.any(Number), - }) - expect(mockPath.validatePath).toHaveBeenCalledWith(testJpeg) + expect(result.mimeType).toBe("image/jpeg") + expect(result.size).toBeGreaterThan(0) }) it("validates GIF file successfully", async () => { await fs.writeFile("test.gif", Buffer.from([0x47, 0x49, 0x46])) - mockPath.validatePath.mockResolvedValue("test.gif") const result = await readImageFile({ path: "test.gif" }) - expect(result).toEqual({ - path: "test.gif", - mimeType: "image/gif", - size: expect.any(Number), - }) + expect(result.mimeType).toBe("image/gif") + expect(result.size).toBeGreaterThan(0) }) it("validates WebP file successfully", async () => { await fs.writeFile("test.webp", Buffer.from([0x52, 0x49, 0x46, 0x46])) - mockPath.validatePath.mockResolvedValue("test.webp") const result = await readImageFile({ path: "test.webp" }) - expect(result).toEqual({ - path: "test.webp", - mimeType: "image/webp", - size: expect.any(Number), - }) + expect(result.mimeType).toBe("image/webp") + expect(result.size).toBeGreaterThan(0) }) it("rejects files larger than 15MB", async () => { const largeContent = Buffer.alloc(16 * 1024 * 1024) // 16MB await fs.writeFile(largeImage, largeContent) - mockPath.validatePath.mockResolvedValue(largeImage) await expect(readImageFile({ path: largeImage })).rejects.toThrow( "Image file too large (16.0MB)", ) - await expect(readImageFile({ path: largeImage })).rejects.toThrow( - "Maximum supported size is 15MB", - ) }) it("throws error if file does not exist", async () => { - mockPath.validatePath.mockResolvedValue("nonexistent.png") await expect(readImageFile({ path: "nonexistent.png" })).rejects.toThrow("does not exist") }) it("throws error if file is not supported format", async () => { await fs.writeFile("test.txt", "not an image") - mockPath.validatePath.mockResolvedValue("test.txt") await expect(readImageFile({ path: "test.txt" })).rejects.toThrow("is not supported") }) it("throws error if file is not an image", async () => { - mockPath.validatePath.mockResolvedValue(testPdf) await expect(readImageFile({ path: testPdf })).rejects.toThrow("is not supported") }) it("throws error if path validation fails", async () => { - mockPath.validatePath.mockRejectedValue(new Error("Access denied")) - await expect(readImageFile({ path: "../invalid" })).rejects.toThrow("Access denied") + await expect(readImageFile({ path: "../../../etc/passwd" })).rejects.toThrow("Access denied") }) }) }) diff --git a/apps/base/src/tools/read-pdf-file.test.ts b/apps/base/src/tools/read-pdf-file.test.ts index a3a4fd5b..b8bcbba1 100644 --- a/apps/base/src/tools/read-pdf-file.test.ts +++ b/apps/base/src/tools/read-pdf-file.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it } from "bun:test" import { join } from "node:path" import { fileURLToPath } from "node:url" -import { afterEach, describe, expect, it, vi } from "vitest" import { readPdfFile } from "./read-pdf-file.js" const __dirname = fileURLToPath(new URL(".", import.meta.url)) @@ -9,50 +9,28 @@ const testPdf = join(fixturesDir, "the-illusion-of-thinking.pdf") const largePdf = join(fixturesDir, "test-large-32MB.pdf") const testImage = join(fixturesDir, "super_parrot.png") -vi.mock("../lib/path.js", () => ({ - workspacePath: "/workspace", - validatePath: vi.fn(), -})) -const mockPath = vi.mocked(await import("../lib/path.js")) - describe("readPdfFile tool", () => { - afterEach(() => { - vi.clearAllMocks() - }) - describe("PDF reading", () => { it("validates PDF file successfully", async () => { - mockPath.validatePath.mockResolvedValue(testPdf) const result = await readPdfFile({ path: testPdf }) - expect(result).toEqual({ - path: testPdf, - mimeType: "application/pdf", - size: expect.any(Number), - }) - expect(mockPath.validatePath).toHaveBeenCalledWith(testPdf) + expect(result.mimeType).toBe("application/pdf") + expect(result.size).toBeGreaterThan(0) }) it("rejects files larger than 30MB", async () => { - mockPath.validatePath.mockResolvedValue(largePdf) await expect(readPdfFile({ path: largePdf })).rejects.toThrow("PDF file too large") - await expect(readPdfFile({ path: largePdf })).rejects.toThrow( - "Maximum supported size is 30MB", - ) }) it("throws error if file does not exist", async () => { - mockPath.validatePath.mockResolvedValue("nonexistent.pdf") await expect(readPdfFile({ path: "nonexistent.pdf" })).rejects.toThrow("does not exist") }) it("throws error if file is not PDF", async () => { - mockPath.validatePath.mockResolvedValue(testImage) await expect(readPdfFile({ path: testImage })).rejects.toThrow("is not a PDF file") }) it("throws error if path validation fails", async () => { - mockPath.validatePath.mockRejectedValue(new Error("Access denied")) - await expect(readPdfFile({ path: "../invalid" })).rejects.toThrow("Access denied") + await expect(readPdfFile({ path: "../../../etc/passwd" })).rejects.toThrow("Access denied") }) }) }) diff --git a/apps/base/src/tools/read-text-file.test.ts b/apps/base/src/tools/read-text-file.test.ts index e491d628..2c12e301 100644 --- a/apps/base/src/tools/read-text-file.test.ts +++ b/apps/base/src/tools/read-text-file.test.ts @@ -1,102 +1,72 @@ +import { afterEach, describe, expect, it } from "bun:test" import fs from "node:fs/promises" -import { afterEach, describe, expect, it, vi } from "vitest" import { readTextFile } from "./read-text-file.js" const testFile = "read-text-file.test.txt" -vi.mock("../lib/path.js", () => ({ - workspacePath: "/workspace", - validatePath: vi.fn(), -})) -const mockPath = vi.mocked(await import("../lib/path.js")) describe("readTextFile tool", () => { afterEach(async () => { await fs.rm(testFile, { force: true }) - vi.clearAllMocks() }) describe("text reading", () => { it("reads entire file successfully", async () => { const content = "Line 1\nLine 2\nLine 3" await fs.writeFile(testFile, content, "utf-8") - mockPath.validatePath.mockResolvedValue(testFile) const result = await readTextFile({ path: testFile }) - expect(result).toEqual({ - path: testFile, - content, - from: 0, - to: 3, - }) - expect(mockPath.validatePath).toHaveBeenCalledWith(testFile) + expect(result.content).toBe(content) + expect(result.from).toBe(0) + expect(result.to).toBe(3) }) it("reads file with line range", async () => { const content = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5" await fs.writeFile(testFile, content, "utf-8") - mockPath.validatePath.mockResolvedValue(testFile) const result = await readTextFile({ path: testFile, from: 1, to: 3 }) - expect(result).toEqual({ - path: testFile, - content: "Line 2\nLine 3", - from: 1, - to: 3, - }) + expect(result.content).toBe("Line 2\nLine 3") + expect(result.from).toBe(1) + expect(result.to).toBe(3) }) it("reads from specific line to end", async () => { const content = "Line 1\nLine 2\nLine 3" await fs.writeFile(testFile, content, "utf-8") - mockPath.validatePath.mockResolvedValue(testFile) const result = await readTextFile({ path: testFile, from: 2 }) - expect(result).toEqual({ - path: testFile, - content: "Line 3", - from: 2, - to: 3, - }) + expect(result.content).toBe("Line 3") + expect(result.from).toBe(2) + expect(result.to).toBe(3) }) it("reads from beginning to specific line", async () => { const content = "Line 1\nLine 2\nLine 3\nLine 4" await fs.writeFile(testFile, content, "utf-8") - mockPath.validatePath.mockResolvedValue(testFile) const result = await readTextFile({ path: testFile, to: 2 }) - expect(result).toEqual({ - path: testFile, - content: "Line 1\nLine 2", - from: 0, - to: 2, - }) + expect(result.content).toBe("Line 1\nLine 2") + expect(result.from).toBe(0) + expect(result.to).toBe(2) }) it("handles empty file", async () => { await fs.writeFile(testFile, "", "utf-8") - mockPath.validatePath.mockResolvedValue(testFile) const result = await readTextFile({ path: testFile }) - expect(result).toEqual({ - path: testFile, - content: "", - from: 0, - to: 1, - }) + expect(result.content).toBe("") + expect(result.from).toBe(0) + expect(result.to).toBe(1) }) it("handles Unicode content", async () => { const content = "🦜 Perstack\n日本語テスト" await fs.writeFile(testFile, content, "utf-8") - mockPath.validatePath.mockResolvedValue(testFile) const result = await readTextFile({ path: testFile }) expect(result.content).toBe(content) }) it("throws error if file does not exist", async () => { - mockPath.validatePath.mockResolvedValue("nonexistent.txt") await expect(readTextFile({ path: "nonexistent.txt" })).rejects.toThrow("does not exist") }) it("throws error if path validation fails", async () => { - mockPath.validatePath.mockRejectedValue(new Error("Access denied")) - await expect(readTextFile({ path: "../invalid" })).rejects.toThrow("Access denied") + await expect(readTextFile({ path: "../../../etc/passwd" })).rejects.toThrow("Access denied") }) }) }) diff --git a/apps/base/src/tools/skill-management.test.ts b/apps/base/src/tools/skill-management.test.ts index bd6657c4..433115d1 100644 --- a/apps/base/src/tools/skill-management.test.ts +++ b/apps/base/src/tools/skill-management.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from "vitest" +import { describe, expect, it, mock } from "bun:test" import type { SkillManagementCallbacks } from "./skill-management.js" import { registerAddDelegate, @@ -11,22 +11,22 @@ import { function createMockCallbacks(): SkillManagementCallbacks { return { - addSkill: vi.fn().mockResolvedValue({ tools: ["toolA", "toolB"] }), - removeSkill: vi.fn().mockResolvedValue(undefined), - addDelegate: vi.fn().mockResolvedValue({ delegateToolName: "delegate-tool" }), - removeDelegate: vi.fn().mockResolvedValue(undefined), - createExpert: vi.fn().mockResolvedValue({ expertKey: "my-expert" }), - addDelegateFromConfig: vi - .fn() - .mockResolvedValue({ delegateToolName: "delegate-from-config-tool" }), + addSkill: mock().mockResolvedValue({ tools: ["toolA", "toolB"] }), + removeSkill: mock().mockResolvedValue(undefined), + addDelegate: mock().mockResolvedValue({ delegateToolName: "delegate-tool" }), + removeDelegate: mock().mockResolvedValue(undefined), + createExpert: mock().mockResolvedValue({ expertKey: "my-expert" }), + addDelegateFromConfig: mock().mockResolvedValue({ + delegateToolName: "delegate-from-config-tool", + }), } } function createMockServer() { - return { registerTool: vi.fn() } + return { registerTool: mock() } } -function getHandler(mockServer: { registerTool: ReturnType }) { +function getHandler(mockServer: { registerTool: ReturnType }) { return mockServer.registerTool.mock.calls[0][2] } @@ -64,7 +64,7 @@ describe("skill-management tools", () => { it("returns errorToolResult when callback throws", async () => { const server = createMockServer() const callbacks = createMockCallbacks() - ;(callbacks.addSkill as ReturnType).mockRejectedValue( + ;(callbacks.addSkill as ReturnType).mockRejectedValue( new Error("skill already exists"), ) registerAddSkill(server as never, callbacks) @@ -108,7 +108,7 @@ describe("skill-management tools", () => { it("returns errorToolResult when callback throws", async () => { const server = createMockServer() const callbacks = createMockCallbacks() - ;(callbacks.removeSkill as ReturnType).mockRejectedValue(new Error("not found")) + ;(callbacks.removeSkill as ReturnType).mockRejectedValue(new Error("not found")) registerRemoveSkill(server as never, callbacks) const handler = getHandler(server) const result = await handler({ skillName: "missing" }) @@ -145,7 +145,7 @@ describe("skill-management tools", () => { it("returns errorToolResult when callback throws", async () => { const server = createMockServer() const callbacks = createMockCallbacks() - ;(callbacks.addDelegate as ReturnType).mockRejectedValue( + ;(callbacks.addDelegate as ReturnType).mockRejectedValue( new Error("expert not found"), ) registerAddDelegate(server as never, callbacks) @@ -189,7 +189,7 @@ describe("skill-management tools", () => { it("returns errorToolResult when callback throws", async () => { const server = createMockServer() const callbacks = createMockCallbacks() - ;(callbacks.removeDelegate as ReturnType).mockRejectedValue( + ;(callbacks.removeDelegate as ReturnType).mockRejectedValue( new Error("delegate not found"), ) registerRemoveDelegate(server as never, callbacks) @@ -238,7 +238,7 @@ describe("skill-management tools", () => { it("returns errorToolResult when callback throws", async () => { const server = createMockServer() const callbacks = createMockCallbacks() - ;(callbacks.createExpert as ReturnType).mockRejectedValue( + ;(callbacks.createExpert as ReturnType).mockRejectedValue( new Error("invalid expert"), ) registerCreateExpert(server as never, callbacks) @@ -291,7 +291,7 @@ describe("skill-management tools", () => { it("returns errorToolResult when callback throws", async () => { const server = createMockServer() const callbacks = createMockCallbacks() - ;(callbacks.addDelegateFromConfig as ReturnType).mockRejectedValue( + ;(callbacks.addDelegateFromConfig as ReturnType).mockRejectedValue( new Error("config not found"), ) registerAddDelegateFromConfig(server as never, callbacks) diff --git a/apps/base/src/tools/todo.test.ts b/apps/base/src/tools/todo.test.ts index c02a9c59..78364d33 100644 --- a/apps/base/src/tools/todo.test.ts +++ b/apps/base/src/tools/todo.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it } from "vitest" +import { afterEach, describe, expect, it } from "bun:test" import { clearTodo, todo } from "./todo.js" describe("todo tool", () => { diff --git a/apps/base/src/tools/write-text-file.test.ts b/apps/base/src/tools/write-text-file.test.ts index a552b009..6fb5f08e 100644 --- a/apps/base/src/tools/write-text-file.test.ts +++ b/apps/base/src/tools/write-text-file.test.ts @@ -1,63 +1,55 @@ +import { afterEach, describe, expect, it } from "bun:test" import { existsSync } from "node:fs" import fs from "node:fs/promises" import { join } from "node:path" -import { afterEach, describe, expect, it, vi } from "vitest" +import { validatePath } from "../lib/path.js" import { writeTextFile } from "./write-text-file.js" const testFile = "write-text-file.test.txt" -vi.mock("../lib/path.js", () => ({ - workspacePath: "/workspace", - validatePath: vi.fn(), -})) -const mockPath = vi.mocked(await import("../lib/path.js")) describe("writeTextFile tool", () => { afterEach(async () => { await fs.rm(testFile, { force: true }) await fs.rm("nested", { recursive: true, force: true }) - vi.clearAllMocks() }) it("creates new file with content", async () => { const content = "Hello, World!" - mockPath.validatePath.mockResolvedValue(testFile) const result = await writeTextFile({ path: testFile, text: content }) expect(existsSync(testFile)).toBe(true) expect(await fs.readFile(testFile, "utf-8")).toBe(content) - expect(result).toEqual({ path: testFile, text: content }) + expect(result.path).toBe(await validatePath(testFile)) + expect(result.text).toBe(content) }) it("overwrites existing file", async () => { await fs.writeFile(testFile, "original content") const newContent = "new content" - mockPath.validatePath.mockResolvedValue(testFile) const result = await writeTextFile({ path: testFile, text: newContent }) expect(await fs.readFile(testFile, "utf-8")).toBe(newContent) - expect(result).toEqual({ path: testFile, text: newContent }) + expect(result.path).toBe(await validatePath(testFile)) + expect(result.text).toBe(newContent) }) - it("creates parent directories automatically", async () => { + it("creates file in nested directory", async () => { + await fs.mkdir("nested/deep", { recursive: true }) const nestedFile = join("nested", "deep", testFile) const content = "nested content" - mockPath.validatePath.mockResolvedValue(nestedFile) const result = await writeTextFile({ path: nestedFile, text: content }) expect(existsSync(nestedFile)).toBe(true) - expect(existsSync("nested/deep")).toBe(true) expect(await fs.readFile(nestedFile, "utf-8")).toBe(content) - expect(result).toEqual({ path: nestedFile, text: content }) + expect(result.text).toBe(content) }) it("handles empty content", async () => { - mockPath.validatePath.mockResolvedValue(testFile) const result = await writeTextFile({ path: testFile, text: "" }) expect(existsSync(testFile)).toBe(true) expect(await fs.readFile(testFile, "utf-8")).toBe("") - expect(result).toEqual({ path: testFile, text: "" }) + expect(result.text).toBe("") }) it("throws error if existing file is not writable", async () => { await fs.writeFile(testFile, "readonly content") await fs.chmod(testFile, 0o444) - mockPath.validatePath.mockResolvedValue(testFile) await expect(writeTextFile({ path: testFile, text: "new content" })).rejects.toThrow( "not writable", ) diff --git a/apps/base/tsconfig.build.json b/apps/base/tsconfig.build.json new file mode 100644 index 00000000..32108c94 --- /dev/null +++ b/apps/base/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src", "bin"], + "exclude": ["**/*.test.ts"] +} diff --git a/apps/base/tsconfig.json b/apps/base/tsconfig.json index a6bb1dd2..17454f67 100644 --- a/apps/base/tsconfig.json +++ b/apps/base/tsconfig.json @@ -4,5 +4,5 @@ "resolveJsonModule": true }, "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["node_modules", "dist", "tsdown.config.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/apps/base/tsdown.config.ts b/apps/base/tsdown.config.ts deleted file mode 100644 index 26e071e0..00000000 --- a/apps/base/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig, type UserConfig } from "tsdown" -import { baseConfig } from "../../tsdown.config.ts" - -export const baseSkillConfig: UserConfig = { - ...baseConfig, - entry: { - "bin/server": "bin/server.ts", - "src/index": "src/index.ts", - }, -} - -export default defineConfig(baseSkillConfig) diff --git a/apps/create-expert-skill/bin/server.ts b/apps/create-expert-skill/bin/server.ts index 506fd726..9745fdb1 100644 --- a/apps/create-expert-skill/bin/server.ts +++ b/apps/create-expert-skill/bin/server.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env bun import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" import { Command } from "commander" diff --git a/apps/create-expert-skill/package.json b/apps/create-expert-skill/package.json index 2064fedc..2137d62c 100644 --- a/apps/create-expert-skill/package.json +++ b/apps/create-expert-skill/package.json @@ -22,7 +22,7 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown", + "build": "rm -rf dist && tsc -p tsconfig.build.json", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -35,11 +35,9 @@ "@perstack/tui": "workspace:*", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/apps/create-expert-skill/tsconfig.build.json b/apps/create-expert-skill/tsconfig.build.json new file mode 100644 index 00000000..32108c94 --- /dev/null +++ b/apps/create-expert-skill/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src", "bin"], + "exclude": ["**/*.test.ts"] +} diff --git a/apps/create-expert-skill/tsconfig.json b/apps/create-expert-skill/tsconfig.json index 9878f267..905aaaf0 100644 --- a/apps/create-expert-skill/tsconfig.json +++ b/apps/create-expert-skill/tsconfig.json @@ -4,5 +4,5 @@ "resolveJsonModule": true }, "include": ["**/*.ts"], - "exclude": ["node_modules", "dist", "tsdown.config.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/apps/create-expert-skill/tsdown.config.ts b/apps/create-expert-skill/tsdown.config.ts deleted file mode 100644 index 81b413c5..00000000 --- a/apps/create-expert-skill/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig, type UserConfig } from "tsdown" -import { baseConfig } from "../../tsdown.config.ts" - -export const createExpertSkillConfig: UserConfig = { - ...baseConfig, - entry: { - "bin/server": "bin/server.ts", - "src/index": "src/index.ts", - }, -} - -export default defineConfig(createExpertSkillConfig) diff --git a/apps/create-expert/bin/cli.ts b/apps/create-expert/bin/cli.ts index b52a375f..64abae1b 100644 --- a/apps/create-expert/bin/cli.ts +++ b/apps/create-expert/bin/cli.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env bun import { readFileSync } from "node:fs" import { PerstackError } from "@perstack/core" diff --git a/apps/create-expert/package.json b/apps/create-expert/package.json index 2d417914..96981fe3 100644 --- a/apps/create-expert/package.json +++ b/apps/create-expert/package.json @@ -19,7 +19,7 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ./tsdown.config.ts && cp perstack.toml dist/", + "build": "rm -rf dist && tsc -p tsconfig.build.json && cp perstack.toml dist/", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -32,10 +32,9 @@ "@perstack/tui": "workspace:*", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/apps/create-expert/tsconfig.build.json b/apps/create-expert/tsconfig.build.json new file mode 100644 index 00000000..5a739bc8 --- /dev/null +++ b/apps/create-expert/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "sourceMap": true, + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": ["bin"], + "exclude": ["**/*.test.ts"] +} diff --git a/apps/create-expert/tsconfig.json b/apps/create-expert/tsconfig.json index 4052a6dc..0b7fb50d 100644 --- a/apps/create-expert/tsconfig.json +++ b/apps/create-expert/tsconfig.json @@ -5,5 +5,5 @@ "jsx": "react-jsx" }, "include": ["**/*.ts"], - "exclude": ["node_modules", "dist", "tsdown.config.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/apps/create-expert/tsdown.config.ts b/apps/create-expert/tsdown.config.ts deleted file mode 100644 index 4fff15f1..00000000 --- a/apps/create-expert/tsdown.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "tsdown" -import { baseConfig } from "../../tsdown.config.ts" - -export default defineConfig({ - ...baseConfig, - dts: false, - entry: { - "bin/cli": "bin/cli.ts", - }, - external: ["react-devtools-core"], -}) diff --git a/apps/perstack/README.md b/apps/perstack/README.md index 8788b0d9..01c16423 100644 --- a/apps/perstack/README.md +++ b/apps/perstack/README.md @@ -92,7 +92,7 @@ PERSTACK_API_KEY=... This package is part of the Perstack monorepo. To build and run locally: ```bash -pnpm install -pnpm build -node dist/bin/cli.js start +bun install +bun run build +bun dist/bin/cli.js start ``` \ No newline at end of file diff --git a/apps/perstack/bin/cli.ts b/apps/perstack/bin/cli.ts index 53b6682d..6095f303 100755 --- a/apps/perstack/bin/cli.ts +++ b/apps/perstack/bin/cli.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env bun import { PerstackError } from "@perstack/core" import { installHandler } from "@perstack/installer" diff --git a/apps/perstack/package.json b/apps/perstack/package.json index b9eb24a1..ce9b4980 100644 --- a/apps/perstack/package.json +++ b/apps/perstack/package.json @@ -16,7 +16,7 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ./tsdown.config.ts", + "build": "rm -rf dist && tsc -p tsconfig.build.json", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -30,11 +30,9 @@ "@perstack/tui": "workspace:*", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/apps/perstack/tsconfig.build.json b/apps/perstack/tsconfig.build.json new file mode 100644 index 00000000..5a739bc8 --- /dev/null +++ b/apps/perstack/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "sourceMap": true, + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": ["bin"], + "exclude": ["**/*.test.ts"] +} diff --git a/apps/perstack/tsconfig.json b/apps/perstack/tsconfig.json index 4052a6dc..0b7fb50d 100644 --- a/apps/perstack/tsconfig.json +++ b/apps/perstack/tsconfig.json @@ -5,5 +5,5 @@ "jsx": "react-jsx" }, "include": ["**/*.ts"], - "exclude": ["node_modules", "dist", "tsdown.config.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/apps/perstack/tsdown.config.ts b/apps/perstack/tsdown.config.ts deleted file mode 100644 index 0d34eb51..00000000 --- a/apps/perstack/tsdown.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig, type UserConfig } from "tsdown" -import { baseConfig } from "../../tsdown.config.ts" - -export const cliConfig: UserConfig = { - ...baseConfig, - dts: false, - entry: { "bin/cli": "bin/cli.ts" }, - external: ["react-devtools-core"], -} - -export default defineConfig(cliConfig) diff --git a/bun.lock b/bun.lock new file mode 100644 index 00000000..90420ff7 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1305 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "perstack-monorepo", + "devDependencies": { + "@biomejs/biome": "^2.4.2", + "@changesets/changelog-github": "^0.5.2", + "@changesets/cli": "^2.29.8", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "knip": "5.84.1", + "smol-toml": "^1.6.0", + "turbo": "latest", + "typescript": "^5.9.3", + }, + }, + "apps/base": { + "name": "@perstack/base", + "version": "0.0.64", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.26.0", + "@perstack/core": "workspace:*", + "commander": "^14.0.3", + "zod": "^4.3.6", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "apps/create-expert": { + "name": "create-expert", + "version": "0.0.40", + "bin": { + "create-expert": "bin/cli.ts", + }, + "dependencies": { + "commander": "^14.0.3", + }, + "devDependencies": { + "@perstack/core": "workspace:*", + "@perstack/perstack-toml": "workspace:*", + "@perstack/runtime": "workspace:*", + "@perstack/tui": "workspace:*", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "apps/create-expert-skill": { + "name": "@perstack/create-expert-skill", + "version": "0.0.2", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.26.0", + "commander": "^14.0.3", + "ts-dedent": "^2.2.0", + "zod": "^4.3.6", + }, + "devDependencies": { + "@perstack/tui": "workspace:*", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "apps/perstack": { + "name": "perstack", + "version": "0.0.93", + "dependencies": { + "commander": "^14.0.3", + }, + "devDependencies": { + "@perstack/core": "workspace:*", + "@perstack/installer": "workspace:*", + "@perstack/log": "workspace:*", + "@perstack/perstack-toml": "workspace:*", + "@perstack/tui": "workspace:*", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/core": { + "name": "@perstack/core", + "version": "0.0.53", + "dependencies": { + "@paralleldrive/cuid2": "^3.3.0", + "zod": "^4.3.6", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/filesystem": { + "name": "@perstack/filesystem-storage", + "version": "0.0.24", + "dependencies": { + "@perstack/core": "workspace:*", + }, + "devDependencies": { + "@paralleldrive/cuid2": "^3.3.0", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/installer": { + "name": "@perstack/installer", + "version": "0.0.16", + "dependencies": { + "@perstack/api-client": "^0.0.56", + "@perstack/core": "workspace:*", + "@perstack/perstack-toml": "workspace:*", + "@perstack/skill-manager": "workspace:*", + }, + "devDependencies": { + "@perstack/tui": "workspace:*", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/log": { + "name": "@perstack/log", + "version": "0.0.10", + "dependencies": { + "@perstack/core": "workspace:*", + "@perstack/filesystem-storage": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/perstack-toml": { + "name": "@perstack/perstack-toml", + "version": "0.0.9", + "dependencies": { + "@perstack/core": "workspace:*", + "smol-toml": "^1.6.0", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "memfs": "^4.56.10", + "typescript": "^5.9.3", + }, + }, + "packages/providers/anthropic": { + "name": "@perstack/anthropic-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/anthropic": "^3.0.44", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/azure-openai": { + "name": "@perstack/azure-openai-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/azure": "^3.0.31", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/bedrock": { + "name": "@perstack/bedrock-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/amazon-bedrock": "^4.0.60", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/core": { + "name": "@perstack/provider-core", + "version": "0.0.26", + "dependencies": { + "@perstack/core": "workspace:*", + "undici": "^7.22.0", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/deepseek": { + "name": "@perstack/deepseek-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/deepseek": "^2.0.20", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/google": { + "name": "@perstack/google-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/google": "^3.0.29", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/ollama": { + "name": "@perstack/ollama-provider", + "version": "0.0.26", + "dependencies": { + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + "ollama-ai-provider-v2": "^3.3.0", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/openai": { + "name": "@perstack/openai-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/openai": "^3.0.29", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/providers/vertex": { + "name": "@perstack/vertex-provider", + "version": "0.0.26", + "dependencies": { + "@ai-sdk/google-vertex": "^4.0.58", + "@perstack/core": "workspace:*", + "@perstack/provider-core": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "ai": "^6.0.86", + "typescript": "^5.9.3", + }, + }, + "packages/react": { + "name": "@perstack/react", + "version": "0.0.57", + "dependencies": { + "@perstack/core": "workspace:*", + }, + "devDependencies": { + "@testing-library/react": "^16.3.2", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "happy-dom": "^18.0.1", + "typescript": "^5.9.3", + }, + "peerDependencies": { + "react": ">=18.0.0", + }, + }, + "packages/runtime": { + "name": "@perstack/runtime", + "version": "0.0.113", + "dependencies": { + "@ai-sdk/amazon-bedrock": "^4.0.60", + "@ai-sdk/anthropic": "^3.0.44", + "@ai-sdk/azure": "^3.0.31", + "@ai-sdk/deepseek": "^2.0.20", + "@ai-sdk/google": "^3.0.29", + "@ai-sdk/google-vertex": "^4.0.58", + "@ai-sdk/openai": "^3.0.29", + "@paralleldrive/cuid2": "^3.3.0", + "@perstack/api-client": "^0.0.56", + "@perstack/core": "workspace:*", + "@perstack/skill-manager": "workspace:*", + "ai": "^6.0.86", + "ollama-ai-provider-v2": "^3.3.0", + "ts-dedent": "^2.2.0", + "undici": "^7.22.0", + "xstate": "^5.28.0", + }, + "devDependencies": { + "@perstack/anthropic-provider": "workspace:*", + "@perstack/azure-openai-provider": "workspace:*", + "@perstack/bedrock-provider": "workspace:*", + "@perstack/deepseek-provider": "workspace:*", + "@perstack/google-provider": "workspace:*", + "@perstack/ollama-provider": "workspace:*", + "@perstack/openai-provider": "workspace:*", + "@perstack/provider-core": "workspace:*", + "@perstack/vertex-provider": "workspace:*", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/skill-manager": { + "name": "@perstack/skill-manager", + "version": "0.0.10", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.26.0", + "@paralleldrive/cuid2": "^3.3.0", + "@perstack/base": "workspace:*", + "@perstack/core": "workspace:*", + "@perstack/perstack-toml": "workspace:*", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/tui": { + "name": "@perstack/tui", + "version": "0.0.15", + "dependencies": { + "@paralleldrive/cuid2": "^3.3.0", + "@perstack/core": "workspace:*", + "@perstack/tui-components": "workspace:*", + "dotenv": "^17.3.1", + }, + "devDependencies": { + "@perstack/filesystem-storage": "workspace:*", + "@perstack/runtime": "workspace:*", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "typescript": "^5.9.3", + }, + }, + "packages/tui-components": { + "name": "@perstack/tui-components", + "version": "0.0.17", + "dependencies": { + "@perstack/core": "workspace:*", + "@perstack/react": "workspace:*", + "ink": "^6.7.0", + "react": "^19.2.4", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.5", + "@types/node": "^25.3.0", + "@types/react": "^19.2.14", + "typescript": "^5.9.3", + }, + }, + }, + "packages": { + "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@4.0.63", "", { "dependencies": { "@ai-sdk/anthropic": "3.0.46", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kNOaIaOXWFZFWbB0xM1l/bQYo7XwTkpdHbrA6n9A2U1c4/DcLF/+Rwc3vZF6MHPVSjoYVG0qxIa7jh39rKftYA=="], + + "@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.46", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-zXJPiNHaIiQ6XUqLeSYZ3ZbSzjqt1pNWEUf2hlkXlmmw8IF8KI0ruuGaDwKCExmtuNRf0E4TDxhsc9wRgWTzpw=="], + + "@ai-sdk/azure": ["@ai-sdk/azure@3.0.31", "", { "dependencies": { "@ai-sdk/openai": "3.0.30", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W9x6nt+yf+Ns0/Wx7U9TXHLmfu7mOUqy1b/drtVd3DvNfDudyruQM/YjM2268Q0FatSrPlA2RlnPVPGRH/4V8Q=="], + + "@ai-sdk/deepseek": ["@ai-sdk/deepseek@2.0.20", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MAL04sDTOWUiBjAGWaVgyeE4bYRb9QpKYRlIeCTZFga6I8yQs50XakhWEssrmvVihdpHGkqpDtCHsFqCydsWLA=="], + + "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.53", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-QT3FEoNARMRlk8JJVR7L98exiK9C8AGfrEJVbRxBT1yIXKs/N19o/+PsjTRVsARgDJNcy9JbJp1FspKucEat0Q=="], + + "@ai-sdk/google": ["@ai-sdk/google@3.0.30", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZzG6dU0XUSSXbxQJJTQUFpWeKkfzdpR7IykEZwaiaW5d+3u3RZ/zkRiGwAOcUpLp6k0eMd+IJF4looJv21ecxw=="], + + "@ai-sdk/google-vertex": ["@ai-sdk/google-vertex@4.0.61", "", { "dependencies": { "@ai-sdk/anthropic": "3.0.46", "@ai-sdk/google": "3.0.30", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15", "google-auth-library": "^10.5.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cTi/qcvqNmrOrCBekrJEXnn4yCTiWyBb9gO6Ofn0OqRboGJOCEfDp5RHWlRREWHhDOJPyZAk2mY8FDJW2PrtUA=="], + + "@ai-sdk/openai": ["@ai-sdk/openai@3.0.30", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YDht3t7TDyWKP+JYZp20VuYqSjyF2brHYh47GGFDUPf2wZiqNQ263ecL+quar2bP3GZ3BeQA8f0m2B7UwLPR+g=="], + + "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.15", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w=="], + + "@alcalzone/ansi-tokenize": ["@alcalzone/ansi-tokenize@0.2.5", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw=="], + + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], + + "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], + + "@aws-sdk/types": ["@aws-sdk/types@3.973.1", "", { "dependencies": { "@smithy/types": "^4.12.0", "tslib": "^2.6.2" } }, "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + + "@biomejs/biome": ["@biomejs/biome@2.4.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.4", "@biomejs/cli-darwin-x64": "2.4.4", "@biomejs/cli-linux-arm64": "2.4.4", "@biomejs/cli-linux-arm64-musl": "2.4.4", "@biomejs/cli-linux-x64": "2.4.4", "@biomejs/cli-linux-x64-musl": "2.4.4", "@biomejs/cli-win32-arm64": "2.4.4", "@biomejs/cli-win32-x64": "2.4.4" }, "bin": { "biome": "bin/biome" } }, "sha512-tigwWS5KfJf0cABVd52NVaXyAVv4qpUXOWJ1rxFL8xF1RVoeS2q/LK+FHgYoKMclJCuRoCWAPy1IXaN9/mS61Q=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-jZ+Xc6qvD6tTH5jM6eKX44dcbyNqJHssfl2nnwT6vma6B1sj7ZLTGIk6N5QwVBs5xGN52r3trk5fgd3sQ9We9A=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-Dh1a/+W+SUCXhEdL7TiX3ArPTFCQKJTI1mGncZNWfO+6suk+gYA4lNyJcBB+pwvF49uw0pEbUS49BgYOY4hzUg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-V/NFfbWhsUU6w+m5WYbBenlEAz8eYnSqRMDMAW3K+3v0tYVkNyZn8VU0XPxk/lOqNXLSCCrV7FmV/u3SjCBShg=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+sPAXq3bxmFwhVFJnSwkSF5Rw2ZAJMH3MF6C9IveAEOdSpgajPhoQhbbAK12SehN9j2QrHpk4J/cHsa/HqWaYQ=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-R4+ZCDtG9kHArasyBO+UBD6jr/FcFCTH8QkNTOCu0pRJzCWyWC4EtZa2AmUZB5h3e0jD7bRV2KvrENcf8rndBg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gGvFTGpOIQDb5CQ2VC0n9Z2UEqlP46c4aNgHmAMytYieTGEcfqhfCFnhs6xjt0S3igE6q5GLuIXtdQt3Izok+g=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-trzCqM7x+Gn832zZHgr28JoYagQNX4CZkUZhMUac2YxvvyDRLJDrb5m9IA7CaZLlX6lTQmADVfLEKP1et1Ma4Q=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.4", "", { "os": "win32", "cpu": "x64" }, "sha512-gnOHKVPFAAPrpoPt2t+Q6FZ7RPry/FDV3GcpU53P3PtLNnQjBmKyN2Vh/JtqXet+H4pme8CC76rScwdjDcT1/A=="], + + "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.14", "", { "dependencies": { "@changesets/config": "^3.1.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA=="], + + "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], + + "@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="], + + "@changesets/changelog-github": ["@changesets/changelog-github@0.5.2", "", { "dependencies": { "@changesets/get-github-info": "^0.7.0", "@changesets/types": "^6.1.0", "dotenv": "^8.1.0" } }, "sha512-HeGeDl8HaIGj9fQHo/tv5XKQ2SNEi9+9yl1Bss1jttPqeiASRXhfi0A2wv8yFKCp07kR1gpOI5ge6+CWNm1jPw=="], + + "@changesets/cli": ["@changesets/cli@2.29.8", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.14", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.2", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.14", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA=="], + + "@changesets/config": ["@changesets/config@3.1.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog=="], + + "@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="], + + "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="], + + "@changesets/get-github-info": ["@changesets/get-github-info@0.7.0", "", { "dependencies": { "dataloader": "^1.4.0", "node-fetch": "^2.5.0" } }, "sha512-+i67Bmhfj9V4KfDeS1+Tz3iF32btKZB2AAx+cYMqDSRFP7r3/ZdGbjCo+c6qkyViN9ygDuBjzageuPGJtKGe5A=="], + + "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.14", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.2", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g=="], + + "@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="], + + "@changesets/git": ["@changesets/git@3.0.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.8", "spawndamnit": "^3.0.1" } }, "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw=="], + + "@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="], + + "@changesets/parse": ["@changesets/parse@0.4.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA=="], + + "@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="], + + "@changesets/read": ["@changesets/read@0.6.6", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.2", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg=="], + + "@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="], + + "@changesets/types": ["@changesets/types@6.1.0", "", {}, "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA=="], + + "@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="], + + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="], + + "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@jsonjoy.com/base64": ["@jsonjoy.com/base64@1.1.2", "", { "peerDependencies": { "tslib": "2" } }, "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA=="], + + "@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw=="], + + "@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@1.0.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g=="], + + "@jsonjoy.com/fs-core": ["@jsonjoy.com/fs-core@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.56.10", "@jsonjoy.com/fs-node-utils": "4.56.10", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw=="], + + "@jsonjoy.com/fs-fsa": ["@jsonjoy.com/fs-fsa@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-core": "4.56.10", "@jsonjoy.com/fs-node-builtins": "4.56.10", "@jsonjoy.com/fs-node-utils": "4.56.10", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q=="], + + "@jsonjoy.com/fs-node": ["@jsonjoy.com/fs-node@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-core": "4.56.10", "@jsonjoy.com/fs-node-builtins": "4.56.10", "@jsonjoy.com/fs-node-utils": "4.56.10", "@jsonjoy.com/fs-print": "4.56.10", "@jsonjoy.com/fs-snapshot": "4.56.10", "glob-to-regex.js": "^1.0.0", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q=="], + + "@jsonjoy.com/fs-node-builtins": ["@jsonjoy.com/fs-node-builtins@4.56.10", "", { "peerDependencies": { "tslib": "2" } }, "sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw=="], + + "@jsonjoy.com/fs-node-to-fsa": ["@jsonjoy.com/fs-node-to-fsa@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-fsa": "4.56.10", "@jsonjoy.com/fs-node-builtins": "4.56.10", "@jsonjoy.com/fs-node-utils": "4.56.10" }, "peerDependencies": { "tslib": "2" } }, "sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw=="], + + "@jsonjoy.com/fs-node-utils": ["@jsonjoy.com/fs-node-utils@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.56.10" }, "peerDependencies": { "tslib": "2" } }, "sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg=="], + + "@jsonjoy.com/fs-print": ["@jsonjoy.com/fs-print@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-node-utils": "4.56.10", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw=="], + + "@jsonjoy.com/fs-snapshot": ["@jsonjoy.com/fs-snapshot@4.56.10", "", { "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", "@jsonjoy.com/fs-node-utils": "4.56.10", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g=="], + + "@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@1.21.0", "", { "dependencies": { "@jsonjoy.com/base64": "^1.1.2", "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg=="], + + "@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@1.0.2", "", { "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/util": "^1.9.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg=="], + + "@jsonjoy.com/util": ["@jsonjoy.com/util@1.9.0", "", { "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", "@jsonjoy.com/codegen": "^1.0.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ=="], + + "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], + + "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.26.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.18.0", "", { "os": "android", "cpu": "arm" }, "sha512-EhwJNzbfLwQQIeyak3n08EB3UHknMnjy1dFyL98r3xlorje2uzHOT2vkB5nB1zqtTtzT31uSot3oGZFfODbGUg=="], + + "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.18.0", "", { "os": "android", "cpu": "arm64" }, "sha512-esOPsT9S9B6vEMMp1qR9Yz5UepQXljoWRJYoyp7GV/4SYQOSTpN0+V2fTruxbMmzqLK+fjCEU2x3SVhc96LQLQ=="], + + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.18.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iJknScn8fRLRhGR6VHG31bzOoyLihSDmsJHRjHwRUL0yF1MkLlvzmZ+liKl9MGl+WZkZHaOFT5T1jNlLSWTowQ=="], + + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.18.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-3rMweF2GQLzkaUoWgFKy1fRtk0dpj4JDqucoZLJN9IZG+TC+RZg7QMwG5WKMvmEjzdYmOTw1L1XqZDVXF2ksaQ=="], + + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.18.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TfXsFby4QvpGwmUP66+X+XXQsycddZe9ZUUu/vHhq2XGI1EkparCSzjpYW1Nz5fFncbI5oLymQLln/qR+qxyOw=="], + + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.18.0", "", { "os": "linux", "cpu": "arm" }, "sha512-WolOILquy9DJsHcfFMHeA5EjTCI9A7JoERFJru4UI2zKZcnfNPo5GApzYwiloscEp/s+fALPmyRntswUns0qHg=="], + + "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.18.0", "", { "os": "linux", "cpu": "arm" }, "sha512-r+5nHJyPdiBqOGTYAFyuq5RtuAQbm4y69GYWNG/uup9Cqr7RG9Ak0YZgGEbkQsc+XBs00ougu/D1+w3UAYIWHA=="], + + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.18.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-bUzg6QxljqMLLwsxYajAQEHW1LYRLdKOg/aykt14PSqUUOmfnOJjPdSLTiHIZCluVzPCQxv1LjoyRcoTAXfQaQ=="], + + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.18.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-l43GVwls5+YR8WXOIez5x7Pp/MfhdkMOZOOjFUSWC/9qMnSLX1kd95j9oxDrkWdD321JdHTyd4eau5KQPxZM9w=="], + + "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.18.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ayj7TweYWi/azxWmRpUZGz41kKNvfkXam20UrFhaQDrSNGNqefQRODxhJn0iv6jt4qChh7TUxDIoavR6ftRsjw=="], + + "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.18.0", "", { "os": "linux", "cpu": "none" }, "sha512-2Jz7jpq6BBNlBBup3usZB6sZWEZOBbjWn++/bKC2lpAT+sTEwdTonnf3rNcb+XY7+v53jYB9pM8LEKVXZfr8BA=="], + + "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.18.0", "", { "os": "linux", "cpu": "none" }, "sha512-omw8/ISOc6ubR247iEMma4/JRfbY2I+nGJC59oKBhCIEZoyqEg/NmDSBc4ToMH+AsZDucqQUDOCku3k7pBiEag=="], + + "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.18.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-uFipBXaS+honSL5r5G/rlvVrkffUjpKwD3S/aIiwp64bylK3+RztgV+mM1blk+OT5gBRG864auhH6jCfrOo3ZA=="], + + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.18.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bY4uMIoKRv8Ine3UiKLFPWRZ+fPCDamTHZFf5pNOjlfmTJIANtJo0mzWDUdFZLYhVgQdegrDL9etZbTMR8qieg=="], + + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.18.0", "", { "os": "linux", "cpu": "x64" }, "sha512-40IicL/aitfNOWur06x7Do41WcqFJ9VUNAciFjZCXzF6wR2i6uVsi6N19ecqgSRoLYFCAoRYi9F50QteIxCwKQ=="], + + "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.18.0", "", { "os": "none", "cpu": "arm64" }, "sha512-DJIzYjUnSJtz4Trs/J9TnzivtPcUKn9AeL3YjHlM5+RvK27ZL9xISs3gg2VAo2nWU7ThuadC1jSYkWaZyONMwg=="], + + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.18.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-57+R8Ioqc8g9k80WovoupOoyIOfLEceHTizkUcwOXspXLhiZ67ScM7Q8OuvhDoRRSZzH6yI0qML3WZwMFR3s7g=="], + + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.18.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-t9Oa4BPptJqVlHTT1cV1frs+LY/vjsKhHI6ltj2EwoGM1TykJ0WW43UlQaU4SC8N+oTY8JRbAywVMNkfqjSu9w=="], + + "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.18.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-4maf/f6ea5IEtIXqGwSw38srRtVHTre9iKShG4gjzat7c3Iq6B1OppXMj8gNmTuM4n8Xh1hQM9z2hBELccJr1g=="], + + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.18.0", "", { "os": "win32", "cpu": "x64" }, "sha512-EhW8Su3AEACSw5HfzKMmyCtV0oArNrVViPdeOfvVYL9TrkL+/4c8fWHFTBtxUMUyCjhSG5xYNdwty1D/TAgL0Q=="], + + "@paralleldrive/cuid2": ["@paralleldrive/cuid2@3.3.0", "", { "dependencies": { "@noble/hashes": "^2.0.1", "bignumber.js": "^9.3.1", "error-causes": "^3.0.2" }, "bin": { "cuid2": "bin/cuid2.js" } }, "sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw=="], + + "@perstack/anthropic-provider": ["@perstack/anthropic-provider@workspace:packages/providers/anthropic"], + + "@perstack/api-client": ["@perstack/api-client@0.0.56", "", { "peerDependencies": { "@perstack/core": ">0.0.42", "zod": ">=4.3.6" } }, "sha512-FL5xfx30HQHaCUU96eBbfMf7DGk3h+bAWoaaomvR65fz01Xe8+FZzGxLmdZy723yIFnFN3Dhp3JudYStxA5RxA=="], + + "@perstack/azure-openai-provider": ["@perstack/azure-openai-provider@workspace:packages/providers/azure-openai"], + + "@perstack/base": ["@perstack/base@workspace:apps/base"], + + "@perstack/bedrock-provider": ["@perstack/bedrock-provider@workspace:packages/providers/bedrock"], + + "@perstack/core": ["@perstack/core@workspace:packages/core"], + + "@perstack/create-expert-skill": ["@perstack/create-expert-skill@workspace:apps/create-expert-skill"], + + "@perstack/deepseek-provider": ["@perstack/deepseek-provider@workspace:packages/providers/deepseek"], + + "@perstack/filesystem-storage": ["@perstack/filesystem-storage@workspace:packages/filesystem"], + + "@perstack/google-provider": ["@perstack/google-provider@workspace:packages/providers/google"], + + "@perstack/installer": ["@perstack/installer@workspace:packages/installer"], + + "@perstack/log": ["@perstack/log@workspace:packages/log"], + + "@perstack/ollama-provider": ["@perstack/ollama-provider@workspace:packages/providers/ollama"], + + "@perstack/openai-provider": ["@perstack/openai-provider@workspace:packages/providers/openai"], + + "@perstack/perstack-toml": ["@perstack/perstack-toml@workspace:packages/perstack-toml"], + + "@perstack/provider-core": ["@perstack/provider-core@workspace:packages/providers/core"], + + "@perstack/react": ["@perstack/react@workspace:packages/react"], + + "@perstack/runtime": ["@perstack/runtime@workspace:packages/runtime"], + + "@perstack/skill-manager": ["@perstack/skill-manager@workspace:packages/skill-manager"], + + "@perstack/tui": ["@perstack/tui@workspace:packages/tui"], + + "@perstack/tui-components": ["@perstack/tui-components@workspace:packages/tui-components"], + + "@perstack/vertex-provider": ["@perstack/vertex-provider@workspace:packages/providers/vertex"], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.8", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.12.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw=="], + + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ=="], + + "@smithy/types": ["@smithy/types@4.12.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw=="], + + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew=="], + + "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw=="], + + "@smithy/util-utf8": ["@smithy/util-utf8@4.2.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], + + "@testing-library/react": ["@testing-library/react@16.3.2", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g=="], + + "@tsconfig/node22": ["@tsconfig/node22@22.0.5", "", {}, "sha512-hLf2ld+sYN/BtOJjHUWOk568dvjFQkHnLNa6zce25GIH+vxKfvTgm3qpaH6ToF5tu/NN0IH66s+Bb5wElHrLcw=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], + + "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="], + + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="], + + "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ai": ["ai@6.0.97", "", { "dependencies": { "@ai-sdk/gateway": "3.0.53", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.15", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-eZIAcBymwGhBwncRH/v9pillZNMeRCDkc4BwcvwXerXd7sxjVxRis3ZNCNCpP02pVH4NLs81ljm4cElC4vbNcQ=="], + + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + + "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "auto-bind": ["auto-bind@5.0.1", "", {}, "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg=="], + + "aws4fetch": ["aws4fetch@1.0.20", "", {}, "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g=="], + + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], + + "brace-expansion": ["brace-expansion@5.0.3", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], + + "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + + "code-excerpt": ["code-excerpt@4.0.0", "", { "dependencies": { "convert-to-spaces": "^2.0.1" } }, "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + + "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-to-spaces": ["convert-to-spaces@2.0.1", "", {}, "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], + + "create-expert": ["create-expert@workspace:apps/create-expert"], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "dataloader": ["dataloader@1.4.0", "", {}, "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "error-causes": ["error-causes@3.0.2", "", {}, "sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-toolkit": ["es-toolkit@1.44.0", "", {}, "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], + + "express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gaxios": ["gaxios@7.1.3", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2", "rimraf": "^5.0.1" } }, "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ=="], + + "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="], + + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "glob-to-regex.js": ["glob-to-regex.js@1.2.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "google-auth-library": ["google-auth-library@10.5.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" } }, "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w=="], + + "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gtoken": ["gtoken@8.0.0", "", { "dependencies": { "gaxios": "^7.0.0", "jws": "^4.0.0" } }, "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw=="], + + "happy-dom": ["happy-dom@18.0.1", "", { "dependencies": { "@types/node": "^20.0.0", "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" } }, "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hono": ["hono@4.12.1", "", {}, "sha512-hi9afu8g0lfJVLolxElAZGANCTTl6bewIdsRNhaywfP9K8BPf++F2z6OLrYGIinUwpRKzbZHMhPwvc0ZEpAwGw=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="], + + "hyperdyperid": ["hyperdyperid@1.2.0", "", {}, "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A=="], + + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ink": ["ink@6.8.0", "", { "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.4", "ansi-escapes": "^7.3.0", "ansi-styles": "^6.2.1", "auto-bind": "^5.0.1", "chalk": "^5.6.0", "cli-boxes": "^3.0.0", "cli-cursor": "^4.0.0", "cli-truncate": "^5.1.1", "code-excerpt": "^4.0.0", "es-toolkit": "^1.39.10", "indent-string": "^5.0.0", "is-in-ci": "^2.0.0", "patch-console": "^2.0.0", "react-reconciler": "^0.33.0", "scheduler": "^0.27.0", "signal-exit": "^3.0.7", "slice-ansi": "^8.0.0", "stack-utils": "^2.0.6", "string-width": "^8.1.1", "terminal-size": "^4.0.1", "type-fest": "^5.4.1", "widest-line": "^6.0.0", "wrap-ansi": "^9.0.0", "ws": "^8.18.0", "yoga-layout": "~3.2.1" }, "peerDependencies": { "@types/react": ">=19.0.0", "react": ">=19.0.0", "react-devtools-core": ">=6.1.2" }, "optionalPeers": ["@types/react", "react-devtools-core"] }, "sha512-sbl1RdLOgkO9isK42WCZlJCFN9hb++sX9dsklOvfd1YQ3bQ2AiFu12Q6tFlr0HvEUvzraJntQCCpfEoUe9DSzA=="], + + "ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-in-ci": ["is-in-ci@2.0.0", "", { "bin": { "is-in-ci": "cli.js" } }, "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="], + + "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], + + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], + + "knip": ["knip@5.84.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-F1+yACEsSapAwmQLzfD4i9uPsnI82P4p5ABpNQ9pcc4fpQtjHEX34XDtNl5863I4O6SCECpymylcWDHI3ouhQQ=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "memfs": ["memfs@4.56.10", "", { "dependencies": { "@jsonjoy.com/fs-core": "4.56.10", "@jsonjoy.com/fs-fsa": "4.56.10", "@jsonjoy.com/fs-node": "4.56.10", "@jsonjoy.com/fs-node-builtins": "4.56.10", "@jsonjoy.com/fs-node-to-fsa": "4.56.10", "@jsonjoy.com/fs-node-utils": "4.56.10", "@jsonjoy.com/fs-print": "4.56.10", "@jsonjoy.com/fs-snapshot": "4.56.10", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", "thingies": "^2.5.0", "tree-dump": "^1.0.3", "tslib": "^2.0.0" } }, "sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimatch": ["minimatch@9.0.6", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "ollama-ai-provider-v2": ["ollama-ai-provider-v2@3.3.1", "", { "dependencies": { "@ai-sdk/provider": "^3.0.8", "@ai-sdk/provider-utils": "^4.0.15" }, "peerDependencies": { "ai": "^5.0.0 || ^6.0.0", "zod": "^4.0.16" } }, "sha512-j4BBqqQnvf/uDz+aPYcgU4/MQZERw087Fn1DMGtViA/PgahBq36jHKHVoZfx8mxj+w8cxsKd3eYaDgyZPhE6YA=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], + + "oxc-resolver": ["oxc-resolver@11.18.0", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.18.0", "@oxc-resolver/binding-android-arm64": "11.18.0", "@oxc-resolver/binding-darwin-arm64": "11.18.0", "@oxc-resolver/binding-darwin-x64": "11.18.0", "@oxc-resolver/binding-freebsd-x64": "11.18.0", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.18.0", "@oxc-resolver/binding-linux-arm-musleabihf": "11.18.0", "@oxc-resolver/binding-linux-arm64-gnu": "11.18.0", "@oxc-resolver/binding-linux-arm64-musl": "11.18.0", "@oxc-resolver/binding-linux-ppc64-gnu": "11.18.0", "@oxc-resolver/binding-linux-riscv64-gnu": "11.18.0", "@oxc-resolver/binding-linux-riscv64-musl": "11.18.0", "@oxc-resolver/binding-linux-s390x-gnu": "11.18.0", "@oxc-resolver/binding-linux-x64-gnu": "11.18.0", "@oxc-resolver/binding-linux-x64-musl": "11.18.0", "@oxc-resolver/binding-openharmony-arm64": "11.18.0", "@oxc-resolver/binding-wasm32-wasi": "11.18.0", "@oxc-resolver/binding-win32-arm64-msvc": "11.18.0", "@oxc-resolver/binding-win32-ia32-msvc": "11.18.0", "@oxc-resolver/binding-win32-x64-msvc": "11.18.0" } }, "sha512-Fv/b05AfhpYoCDvsog6tgsDm2yIwIeJafpMFLncNwKHRYu+Y1xQu5Q/rgUn7xBfuhNgjtPO7C0jCf7p2fLDj1g=="], + + "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], + + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "patch-console": ["patch-console@2.0.0", "", {}, "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "perstack": ["perstack@workspace:apps/perstack"], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], + + "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="], + + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + + "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "react-reconciler": ["react-reconciler@0.33.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA=="], + + "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@5.0.10", "", { "dependencies": { "glob": "^10.3.7" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="], + + "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], + + "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "string-width": ["string-width@8.2.0", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], + + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], + + "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], + + "terminal-size": ["terminal-size@4.0.1", "", {}, "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ=="], + + "thingies": ["thingies@2.5.0", "", { "peerDependencies": { "tslib": "^2" } }, "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "tree-dump": ["tree-dump@1.1.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA=="], + + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "turbo": ["turbo@2.8.10", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.10", "turbo-darwin-arm64": "2.8.10", "turbo-linux-64": "2.8.10", "turbo-linux-arm64": "2.8.10", "turbo-windows-64": "2.8.10", "turbo-windows-arm64": "2.8.10" }, "bin": { "turbo": "bin/turbo" } }, "sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.8.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g=="], + + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA=="], + + "turbo-linux-64": ["turbo-linux-64@2.8.10", "", { "os": "linux", "cpu": "x64" }, "sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA=="], + + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ=="], + + "turbo-windows-64": ["turbo-windows-64@2.8.10", "", { "os": "win32", "cpu": "x64" }, "sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw=="], + + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ=="], + + "type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici": ["undici@7.22.0", "", {}, "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg=="], + + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "widest-line": ["widest-line@6.0.0", "", { "dependencies": { "string-width": "^8.1.0" } }, "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + + "xstate": ["xstate@5.28.0", "", {}, "sha512-Iaqq6ZrUzqeUtA3hC5LQKZfR8ZLzEFTImMHJM3jWEdVvXWdKvvVLXZEiNQWm3SCA9ZbEou/n5rcsna1wb9t28A=="], + + "yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="], + + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + + "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + + "@changesets/changelog-github/dotenv": ["dotenv@8.6.0", "", {}, "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@17.67.0", "", { "dependencies": { "@jsonjoy.com/base64": "17.67.0", "@jsonjoy.com/buffers": "17.67.0", "@jsonjoy.com/codegen": "17.67.0", "@jsonjoy.com/json-pointer": "17.67.0", "@jsonjoy.com/util": "17.67.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w=="], + + "@jsonjoy.com/fs-snapshot/@jsonjoy.com/util": ["@jsonjoy.com/util@17.67.0", "", { "dependencies": { "@jsonjoy.com/buffers": "17.67.0", "@jsonjoy.com/codegen": "17.67.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew=="], + + "@jsonjoy.com/json-pack/@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.1", "", { "peerDependencies": { "tslib": "2" } }, "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA=="], + + "@jsonjoy.com/util/@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.1", "", { "peerDependencies": { "tslib": "2" } }, "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA=="], + + "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], + + "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "cli-truncate/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "happy-dom/@types/node": ["@types/node@20.19.33", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "spawndamnit/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "string-width-cjs/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/base64": ["@jsonjoy.com/base64@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw=="], + + "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q=="], + + "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@17.67.0", "", { "dependencies": { "@jsonjoy.com/util": "17.67.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA=="], + + "@jsonjoy.com/fs-snapshot/@jsonjoy.com/util/@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q=="], + + "happy-dom/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "wrap-ansi-cjs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + } +} diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 00000000..022519da --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[test] +coverageSkipTestFiles = true diff --git a/e2e/README.md b/e2e/README.md index f6798931..154773e8 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -5,20 +5,20 @@ End-to-end tests for the Perstack CLI. This document serves as the authoritative ## Prerequisites ```bash -pnpm build +bun run build ``` ## Running Tests ```bash # Run all E2E tests (sequential, fail-fast) -pnpm test:e2e +bun test e2e/ # Run specific test file -pnpm test:e2e -- run.test.ts +bun test e2e/ -- run.test.ts # Run tests matching pattern -pnpm test:e2e -- --testNamePattern "delegate" +bun test e2e/ -- --testNamePattern "delegate" ``` ## Test Structure diff --git a/e2e/create-expert/create-expert.test.ts b/e2e/create-expert/create-expert.test.ts index ef12ffe8..a587001e 100644 --- a/e2e/create-expert/create-expert.test.ts +++ b/e2e/create-expert/create-expert.test.ts @@ -8,12 +8,13 @@ * * Binary: apps/create-expert/dist/bin/cli.js (--headless mode) */ + +import { describe, expect, it } from "bun:test" import { spawn } from "node:child_process" import fs from "node:fs" import os from "node:os" import path from "node:path" import TOML from "smol-toml" -import { describe, expect, it } from "vitest" import { assertEventSequenceContains } from "../lib/assertions.js" import { extractToolCalls, filterEventsByType } from "../lib/event-parser.js" import { injectProviderArgs } from "../lib/round-robin.js" @@ -32,7 +33,7 @@ function runCreateExpert(query: string, cwd: string, timeout = LLM_TIMEOUT): Pro return new Promise((resolve, reject) => { let stdout = "" let stderr = "" - const proc = spawn("node", [CLI_PATH, ...args], { + const proc = spawn("bun", [CLI_PATH, ...args], { cwd, env: { ...process.env }, stdio: ["pipe", "pipe", "pipe"], diff --git a/e2e/fixtures/minimal-mcp-server.mjs b/e2e/fixtures/minimal-mcp-server.mjs index 95ba5abb..daa35c22 100644 --- a/e2e/fixtures/minimal-mcp-server.mjs +++ b/e2e/fixtures/minimal-mcp-server.mjs @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env bun /** * Minimal MCP server for e2e testing. * Uses newline-delimited JSON (NDJSON) protocol matching the MCP SDK stdio transport. diff --git a/e2e/lib/runner.ts b/e2e/lib/runner.ts index 49ee9722..bca62614 100644 --- a/e2e/lib/runner.ts +++ b/e2e/lib/runner.ts @@ -53,7 +53,7 @@ export async function runCli(args: string[], options?: RunOptions): Promise { let stdout = "" let stderr = "" - const proc = spawn("node", ["./apps/perstack/dist/bin/cli.js", ...finalArgs], { + const proc = spawn("bun", ["./apps/perstack/dist/bin/cli.js", ...finalArgs], { cwd, env, stdio: ["pipe", "pipe", "pipe"], diff --git a/e2e/perstack-cli/bundled-base.test.ts b/e2e/perstack-cli/bundled-base.test.ts index 18cf5ba8..c553a4c6 100644 --- a/e2e/perstack-cli/bundled-base.test.ts +++ b/e2e/perstack-cli/bundled-base.test.ts @@ -6,7 +6,7 @@ * * TOML: e2e/experts/bundled-base.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/continue.test.ts b/e2e/perstack-cli/continue.test.ts index 64f44da7..e67e01e8 100644 --- a/e2e/perstack-cli/continue.test.ts +++ b/e2e/perstack-cli/continue.test.ts @@ -8,7 +8,7 @@ * * TOML: e2e/experts/continue-resume.toml, e2e/experts/parallel-delegate.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { filterEventsByType, getEventSequence } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/delegate.test.ts b/e2e/perstack-cli/delegate.test.ts index a1ef4975..c06ad8f8 100644 --- a/e2e/perstack-cli/delegate.test.ts +++ b/e2e/perstack-cli/delegate.test.ts @@ -8,7 +8,7 @@ * * TOML: e2e/experts/delegate-chain.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertNoRetry } from "../lib/assertions.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/error-handling.test.ts b/e2e/perstack-cli/error-handling.test.ts index 774eaea1..3c46843b 100644 --- a/e2e/perstack-cli/error-handling.test.ts +++ b/e2e/perstack-cli/error-handling.test.ts @@ -8,7 +8,7 @@ * * TOML: e2e/experts/error-handling.toml, e2e/experts/errors.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/interactive.test.ts b/e2e/perstack-cli/interactive.test.ts index 17745517..0a561648 100644 --- a/e2e/perstack-cli/interactive.test.ts +++ b/e2e/perstack-cli/interactive.test.ts @@ -8,7 +8,7 @@ * * TOML: e2e/experts/mixed-tools.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertCheckpointState, assertEventSequenceContains, diff --git a/e2e/perstack-cli/lockfile.test.ts b/e2e/perstack-cli/lockfile.test.ts index 736c22ac..f589c312 100644 --- a/e2e/perstack-cli/lockfile.test.ts +++ b/e2e/perstack-cli/lockfile.test.ts @@ -7,8 +7,9 @@ * * TOML: e2e/experts/lockfile.toml */ + +import { afterEach, beforeEach, describe, expect, it } from "bun:test" import { existsSync, readFileSync, unlinkSync } from "node:fs" -import { afterEach, beforeEach, describe, expect, it } from "vitest" import { assertEventSequenceContains } from "../lib/assertions.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/log.test.ts b/e2e/perstack-cli/log.test.ts index 550052f7..af101b41 100644 --- a/e2e/perstack-cli/log.test.ts +++ b/e2e/perstack-cli/log.test.ts @@ -7,7 +7,7 @@ * * These tests do NOT invoke LLM APIs - they test CLI parsing and basic behavior. */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { runCli } from "../lib/runner.js" describe("Log Command", () => { diff --git a/e2e/perstack-cli/options.test.ts b/e2e/perstack-cli/options.test.ts index c857a734..ffec484a 100644 --- a/e2e/perstack-cli/options.test.ts +++ b/e2e/perstack-cli/options.test.ts @@ -8,7 +8,7 @@ * * TOML: e2e/experts/global-runtime.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { runCli, withEventParsing } from "../lib/runner.js" const GLOBAL_RUNTIME_CONFIG = "./e2e/experts/global-runtime.toml" diff --git a/e2e/perstack-cli/providers.test.ts b/e2e/perstack-cli/providers.test.ts index dcf1e1fe..2256005d 100644 --- a/e2e/perstack-cli/providers.test.ts +++ b/e2e/perstack-cli/providers.test.ts @@ -10,7 +10,7 @@ * * TOML: e2e/experts/providers.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { hasAnthropicKey, hasGoogleKey, hasOpenAIKey } from "../lib/prerequisites.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/published-expert.test.ts b/e2e/perstack-cli/published-expert.test.ts index 0292d311..cf4b9f00 100644 --- a/e2e/perstack-cli/published-expert.test.ts +++ b/e2e/perstack-cli/published-expert.test.ts @@ -8,7 +8,7 @@ * These tests verify graceful error handling without LLM API calls * (errors occur before LLM generation starts). */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { runCli } from "../lib/runner.js" describe.concurrent("Published Expert", () => { diff --git a/e2e/perstack-cli/reasoning-budget.test.ts b/e2e/perstack-cli/reasoning-budget.test.ts index bf74b80c..83e944ad 100644 --- a/e2e/perstack-cli/reasoning-budget.test.ts +++ b/e2e/perstack-cli/reasoning-budget.test.ts @@ -6,7 +6,7 @@ * * TOML: e2e/experts/reasoning-budget.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/run.test.ts b/e2e/perstack-cli/run.test.ts index 8530513a..32d0ec1f 100644 --- a/e2e/perstack-cli/run.test.ts +++ b/e2e/perstack-cli/run.test.ts @@ -9,7 +9,7 @@ * * TOML: e2e/experts/global-runtime.toml, special-tools.toml, multi-modal.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains, assertToolCallCount } from "../lib/assertions.js" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/runtime-version.test.ts b/e2e/perstack-cli/runtime-version.test.ts index 36859f42..a1560b95 100644 --- a/e2e/perstack-cli/runtime-version.test.ts +++ b/e2e/perstack-cli/runtime-version.test.ts @@ -10,7 +10,7 @@ * * TOML: e2e/experts/runtime-version.toml, e2e/experts/runtime-version-future.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/skills.test.ts b/e2e/perstack-cli/skills.test.ts index 5f0917dd..4c87e3a5 100644 --- a/e2e/perstack-cli/skills.test.ts +++ b/e2e/perstack-cli/skills.test.ts @@ -8,7 +8,7 @@ * * TOML: e2e/experts/skills.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/streaming.test.ts b/e2e/perstack-cli/streaming.test.ts index 77618c2a..a9beb8d3 100644 --- a/e2e/perstack-cli/streaming.test.ts +++ b/e2e/perstack-cli/streaming.test.ts @@ -7,7 +7,7 @@ * * TOML: e2e/experts/reasoning-budget.toml (reuses reasoning budget experts) */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import type { ParsedEvent } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/e2e/perstack-cli/validation.test.ts b/e2e/perstack-cli/validation.test.ts index 015e77c4..a3134bcf 100644 --- a/e2e/perstack-cli/validation.test.ts +++ b/e2e/perstack-cli/validation.test.ts @@ -9,7 +9,7 @@ * * These tests do NOT invoke LLM APIs - they test CLI parsing and validation. */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { runCli } from "../lib/runner.js" describe.concurrent("CLI Validation", () => { diff --git a/e2e/perstack-cli/versioned-base.test.ts b/e2e/perstack-cli/versioned-base.test.ts index 76bdf46d..9c10bf9d 100644 --- a/e2e/perstack-cli/versioned-base.test.ts +++ b/e2e/perstack-cli/versioned-base.test.ts @@ -6,7 +6,7 @@ * * TOML: e2e/experts/versioned-base.toml */ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { assertEventSequenceContains } from "../lib/assertions.js" import { filterEventsByType } from "../lib/event-parser.js" import { runCli, withEventParsing } from "../lib/runner.js" diff --git a/knip.json b/knip.json index 2b990517..9cda98a6 100644 --- a/knip.json +++ b/knip.json @@ -1,6 +1,6 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "ignoreDependencies": ["vitest"], + "ignoreDependencies": [], "ignoreExportsUsedInFile": true, "ignore": [ "dist/**/*", diff --git a/package.json b/package.json index 0edfe50a..77b34f52 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,30 @@ { "name": "perstack-monorepo", "private": true, + "workspaces": [ + "packages/*", + "packages/providers/*", + "apps/*" + ], "scripts": { "clean": "turbo run clean", - "check-deps": "pnpx knip --config ./knip.json", + "check-deps": "bunx knip --config ./knip.json", "dev": "turbo run dev", "reset": "turbo run reset", "build": "turbo run build", "changeset": "changeset", "version": "changeset version", - "release": "pnpm run clean && pnpm run build && changeset publish", - "test": "vitest run --project unit --coverage --coverage.reporter=lcov --coverage.reporter=text", - "test:watch": "vitest watch --project unit", - "test:e2e": "vitest run --project e2e", + "release": "bun run clean && bun run build && changeset publish", + "test": "turbo run test", + "test:watch": "bun test --watch packages/ apps/", + "test:e2e": "bun test --timeout 300000 e2e/", "format-and-lint": "biome check .", "format-and-lint:fix": "biome check . --write", "typecheck": "turbo run typecheck --continue", - "validate:changeset": "tsx scripts/validate-changeset.ts", - "validate:versions": "tsx scripts/validate-version-sync.ts", - "check:schema-diff": "tsx scripts/check-schema-diff.ts", - "validate:all": "pnpm validate:versions && pnpm validate:changeset && pnpm check:schema-diff" + "validate:changeset": "bun scripts/validate-changeset.ts", + "validate:versions": "bun scripts/validate-version-sync.ts", + "check:schema-diff": "bun scripts/check-schema-diff.ts", + "validate:all": "bun run validate:versions && bun run validate:changeset && bun run check:schema-diff" }, "devDependencies": { "@biomejs/biome": "^2.4.2", @@ -27,19 +32,13 @@ "@changesets/cli": "^2.29.8", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "@vitest/coverage-v8": "^4.0.18", - "dotenv": "^17.3.1", - "jsdom": "^28.0.0", "knip": "5.84.1", "smol-toml": "^1.6.0", - "tsdown": "^0.20.3", - "tsx": "^4.21.0", "turbo": "latest", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" }, - "packageManager": "pnpm@10.10.0" + "packageManager": "bun@1.3.5" } diff --git a/packages/core/package.json b/packages/core/package.json index dba0d545..9b67bbaf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@paralleldrive/cuid2": "^3.3.0", @@ -32,11 +33,9 @@ "devDependencies": { "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/core/src/adapters/event-creators.test.ts b/packages/core/src/adapters/event-creators.test.ts index 16efc686..368e6351 100644 --- a/packages/core/src/adapters/event-creators.test.ts +++ b/packages/core/src/adapters/event-creators.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createCallToolsEvent, createCompleteRunEvent, diff --git a/packages/core/src/schemas/expert.test.ts b/packages/core/src/schemas/expert.test.ts index 8b9f41ca..7146eb3e 100644 --- a/packages/core/src/schemas/expert.test.ts +++ b/packages/core/src/schemas/expert.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { ZodError } from "zod" import { expertSchema } from "./expert.js" diff --git a/packages/core/src/schemas/perstack-toml.test.ts b/packages/core/src/schemas/perstack-toml.test.ts index 332c561e..e17928f1 100644 --- a/packages/core/src/schemas/perstack-toml.test.ts +++ b/packages/core/src/schemas/perstack-toml.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { domainPatternSchema, perstackConfigSchema } from "./perstack-toml.js" describe("domainPatternSchema", () => { diff --git a/packages/core/src/schemas/run-command.test.ts b/packages/core/src/schemas/run-command.test.ts index 899f2b56..b39f8587 100644 --- a/packages/core/src/schemas/run-command.test.ts +++ b/packages/core/src/schemas/run-command.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { runCommandInputSchema, startCommandInputSchema } from "./run-command.js" describe("@perstack/core: runCommandInputSchema", () => { diff --git a/packages/core/src/schemas/runtime.test.ts b/packages/core/src/schemas/runtime.test.ts index 7fbfd681..82963cee 100644 --- a/packages/core/src/schemas/runtime.test.ts +++ b/packages/core/src/schemas/runtime.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createEvent, createRuntimeEvent, parseExpertKey } from "./runtime.js" describe("@perstack/core: parseExpertKey", () => { diff --git a/packages/core/src/schemas/skill.test.ts b/packages/core/src/schemas/skill.test.ts index 3bc3abe9..08d921c5 100644 --- a/packages/core/src/schemas/skill.test.ts +++ b/packages/core/src/schemas/skill.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { interactiveSkillSchema, mcpSseSkillSchema, mcpStdioSkillSchema } from "./skill.js" describe("@perstack/core: mcpStdioSkillSchema", () => { diff --git a/packages/core/src/utils/activity.test.ts b/packages/core/src/utils/activity.test.ts index 8629db50..337f4d38 100644 --- a/packages/core/src/utils/activity.test.ts +++ b/packages/core/src/utils/activity.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import type { Checkpoint, ParallelActivitiesGroup, Step, ToolCall, ToolResult } from "../index.js" import { getActivities } from "./activity.js" diff --git a/packages/core/src/utils/env-filter.test.ts b/packages/core/src/utils/env-filter.test.ts index e681bcb7..503b42cb 100644 --- a/packages/core/src/utils/env-filter.test.ts +++ b/packages/core/src/utils/env-filter.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it } from "vitest" +import { afterEach, beforeEach, describe, expect, it } from "bun:test" import { getFilteredEnv, SAFE_ENV_VARS } from "./env-filter.js" describe("getFilteredEnv", () => { diff --git a/packages/core/src/utils/event-filter.test.ts b/packages/core/src/utils/event-filter.test.ts index 993ad636..ccbefe7a 100644 --- a/packages/core/src/utils/event-filter.test.ts +++ b/packages/core/src/utils/event-filter.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import type { PerstackEvent } from "../schemas/runtime.js" import { createFilteredEventListener, validateEventFilter } from "./event-filter.js" diff --git a/packages/core/src/utils/expert-type.test.ts b/packages/core/src/utils/expert-type.test.ts index 234bfb6f..b10234fa 100644 --- a/packages/core/src/utils/expert-type.test.ts +++ b/packages/core/src/utils/expert-type.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { getExpertScope, getExpertShortName, diff --git a/packages/core/src/utils/zod-error.test.ts b/packages/core/src/utils/zod-error.test.ts index fdc9ea7f..6b081f87 100644 --- a/packages/core/src/utils/zod-error.test.ts +++ b/packages/core/src/utils/zod-error.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { z } from "zod" import { formatZodError, parseWithFriendlyError } from "./zod-error.js" diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/core/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index ed443cff..d6effd0b 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,5 +1,5 @@ { "extends": "@tsconfig/node22/tsconfig.json", "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/filesystem/README.md b/packages/filesystem/README.md index ab6c1d42..f4695e5d 100644 --- a/packages/filesystem/README.md +++ b/packages/filesystem/README.md @@ -5,7 +5,7 @@ Perstack Filesystem Persistence - Job, Checkpoint, Event, and Run storage. ## Installation ```bash -pnpm add @perstack/filesystem-storage +bun add @perstack/filesystem-storage ``` ## Usage diff --git a/packages/filesystem/package.json b/packages/filesystem/package.json index 84be1877..c01ee4b0 100644 --- a/packages/filesystem/package.json +++ b/packages/filesystem/package.json @@ -23,8 +23,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*" @@ -33,11 +34,9 @@ "@paralleldrive/cuid2": "^3.3.0", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/filesystem/src/checkpoint.test.ts b/packages/filesystem/src/checkpoint.test.ts index 6cbc00f7..fa96d790 100644 --- a/packages/filesystem/src/checkpoint.test.ts +++ b/packages/filesystem/src/checkpoint.test.ts @@ -1,8 +1,8 @@ +import { afterEach, beforeEach, describe, expect, it } from "bun:test" import fs from "node:fs/promises" import path from "node:path" import { createId } from "@paralleldrive/cuid2" import type { Checkpoint, RunEvent, Usage } from "@perstack/core" -import { afterEach, beforeEach, describe, expect, it } from "vitest" import { defaultRetrieveCheckpoint, defaultStoreCheckpoint } from "./checkpoint.js" import { defaultStoreEvent } from "./event.js" diff --git a/packages/filesystem/src/run-setting.test.ts b/packages/filesystem/src/run-setting.test.ts index 6b9b58df..a06a3835 100644 --- a/packages/filesystem/src/run-setting.test.ts +++ b/packages/filesystem/src/run-setting.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { defaultGetRunDir } from "./run-setting.js" describe("@perstack/filesystem-storage: defaultGetRunDir", () => { diff --git a/packages/filesystem/tsconfig.build.json b/packages/filesystem/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/filesystem/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/filesystem/tsconfig.json b/packages/filesystem/tsconfig.json index 83e76576..e9289d0e 100644 --- a/packages/filesystem/tsconfig.json +++ b/packages/filesystem/tsconfig.json @@ -6,5 +6,6 @@ "rootDir": ".", "noEmit": true, "strict": true - } + }, + "exclude": ["**/*.test.ts"] } diff --git a/packages/installer/package.json b/packages/installer/package.json index 0790782a..55fd1499 100644 --- a/packages/installer/package.json +++ b/packages/installer/package.json @@ -23,7 +23,7 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", + "build": "rm -rf dist && tsc -p tsconfig.build.json", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -36,11 +36,9 @@ "@perstack/tui": "workspace:*", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/installer/tsconfig.build.json b/packages/installer/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/installer/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/installer/tsconfig.json b/packages/installer/tsconfig.json index a10de72d..c33bc685 100644 --- a/packages/installer/tsconfig.json +++ b/packages/installer/tsconfig.json @@ -1,5 +1,5 @@ { "extends": "@tsconfig/node22/tsconfig.json", "include": ["**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/log/package.json b/packages/log/package.json index 5a9554f4..4b2dac12 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -23,8 +23,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*", @@ -33,11 +34,9 @@ "devDependencies": { "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/log/src/data-fetcher.test.ts b/packages/log/src/data-fetcher.test.ts index a8394bf3..f18a251a 100644 --- a/packages/log/src/data-fetcher.test.ts +++ b/packages/log/src/data-fetcher.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock } from "bun:test" import type { Checkpoint, Job, RunEvent, RunSetting } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { createLogDataFetcher } from "./data-fetcher.js" const mockJob: Job = { @@ -82,14 +82,14 @@ const mockRunSetting: RunSetting = { describe("createLogDataFetcher", () => { const mockStorage = { - getAllJobs: vi.fn(), - retrieveJob: vi.fn(), - getCheckpointsByJobId: vi.fn(), - retrieveCheckpoint: vi.fn(), - getEventContents: vi.fn(), - getAllRuns: vi.fn(), - getJobIds: vi.fn().mockReturnValue([]), - getBasePath: vi.fn().mockReturnValue("/tmp/test"), + getAllJobs: mock(), + retrieveJob: mock(), + getCheckpointsByJobId: mock(), + retrieveCheckpoint: mock(), + getEventContents: mock(), + getAllRuns: mock(), + getJobIds: mock().mockReturnValue([]), + getBasePath: mock().mockReturnValue("/tmp/test"), } it("returns undefined for non-existent job", async () => { diff --git a/packages/log/src/filter.test.ts b/packages/log/src/filter.test.ts index d2aa432d..7ad588ff 100644 --- a/packages/log/src/filter.test.ts +++ b/packages/log/src/filter.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { applyFilters, evaluateCondition, diff --git a/packages/log/src/formatter.test.ts b/packages/log/src/formatter.test.ts index b19741fa..20ac4c8b 100644 --- a/packages/log/src/formatter.test.ts +++ b/packages/log/src/formatter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { Checkpoint, Job, RunEvent } from "@perstack/core" -import { describe, expect, it } from "vitest" import { createSummary, formatJson, formatTerminal } from "./formatter.js" import type { LogOutput } from "./types.js" diff --git a/packages/log/tsconfig.build.json b/packages/log/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/log/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/log/tsconfig.json b/packages/log/tsconfig.json index a10de72d..c33bc685 100644 --- a/packages/log/tsconfig.json +++ b/packages/log/tsconfig.json @@ -1,5 +1,5 @@ { "extends": "@tsconfig/node22/tsconfig.json", "include": ["**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/perstack-toml/package.json b/packages/perstack-toml/package.json index 3d80064a..0d3d9b8c 100644 --- a/packages/perstack-toml/package.json +++ b/packages/perstack-toml/package.json @@ -23,8 +23,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "memfs": "^4.56.10", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/perstack-toml/src/config.test.ts b/packages/perstack-toml/src/config.test.ts index fea567fa..03facb98 100644 --- a/packages/perstack-toml/src/config.test.ts +++ b/packages/perstack-toml/src/config.test.ts @@ -1,20 +1,25 @@ -import { vol } from "memfs" -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" +import { afterAll, afterEach, beforeEach, describe, expect, it, mock, spyOn } from "bun:test" +import { fs, vol } from "memfs" import { getPerstackConfig } from "./config.js" -vi.mock("node:fs/promises", async () => { - const memfs = await import("memfs") - return memfs.fs.promises +mock.module("node:fs/promises", () => fs.promises) + +afterAll(() => { + mock.restore() }) describe("getPerstackConfig", () => { + let originalFetch: typeof globalThis.fetch + beforeEach(() => { + originalFetch = globalThis.fetch vol.reset() - vi.spyOn(process, "cwd").mockReturnValue("/test") + spyOn(process, "cwd").mockReturnValue("/test") }) afterEach(() => { - vi.restoreAllMocks() + globalThis.fetch = originalFetch + mock.restore() }) describe("local config", () => { @@ -60,7 +65,7 @@ instruction = "Main instruction" it("throws when perstack.toml not found anywhere", async () => { vol.fromJSON({}) - vi.spyOn(process, "cwd").mockReturnValue("/") + spyOn(process, "cwd").mockReturnValue("/") await expect(getPerstackConfig()).rejects.toThrow( "perstack.toml not found. Create one or specify --config path.", @@ -136,11 +141,11 @@ instruction = "Test" [experts."test-expert"] instruction = "Test instruction" ` - const mockFetch = vi.fn().mockResolvedValue({ + const mockFetch = mock().mockResolvedValue({ ok: true, text: () => Promise.resolve(mockToml), }) - vi.stubGlobal("fetch", mockFetch) + globalThis.fetch = mockFetch const config = await getPerstackConfig( "https://raw.githubusercontent.com/owner/repo/main/perstack.toml", ) @@ -165,20 +170,20 @@ instruction = "Test instruction" }) it("should throw error when fetch fails", async () => { - const mockFetch = vi.fn().mockResolvedValue({ + const mockFetch = mock().mockResolvedValue({ ok: false, status: 404, statusText: "Not Found", }) - vi.stubGlobal("fetch", mockFetch) + globalThis.fetch = mockFetch await expect( getPerstackConfig("https://raw.githubusercontent.com/owner/repo/main/perstack.toml"), ).rejects.toThrow("Failed to fetch remote config: 404 Not Found") }) it("should throw friendly error for network failures", async () => { - const mockFetch = vi.fn().mockRejectedValue(new Error("Network error")) - vi.stubGlobal("fetch", mockFetch) + const mockFetch = mock().mockRejectedValue(new Error("Network error")) + globalThis.fetch = mockFetch await expect( getPerstackConfig("https://raw.githubusercontent.com/owner/repo/main/perstack.toml"), ).rejects.toThrow("Failed to fetch remote config: Network error") diff --git a/packages/perstack-toml/src/lockfile.test.ts b/packages/perstack-toml/src/lockfile.test.ts index 2e9a8d82..013c3176 100644 --- a/packages/perstack-toml/src/lockfile.test.ts +++ b/packages/perstack-toml/src/lockfile.test.ts @@ -1,6 +1,6 @@ +import { afterEach, beforeEach, describe, expect, it, mock, spyOn } from "bun:test" import fs from "node:fs" import path from "node:path" -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { findLockfile, loadLockfile } from "./lockfile.js" describe("lockfile", () => { @@ -15,7 +15,7 @@ describe("lockfile", () => { }) afterEach(() => { - vi.restoreAllMocks() + mock.restore() if (fs.existsSync(testDir)) { fs.rmSync(testDir, { recursive: true, force: true }) } @@ -83,7 +83,7 @@ toolDefinitions = [] }) afterEach(() => { - vi.restoreAllMocks() + mock.restore() if (fs.existsSync(testDir)) { fs.rmSync(testDir, { recursive: true, force: true }) } @@ -142,7 +142,7 @@ toolDefinitions = [] // Create lockfile in parent directory const lockfilePath = path.join(testDir, "perstack.lock") fs.writeFileSync(lockfilePath, "") - vi.spyOn(process, "cwd").mockReturnValue(nestedDir) + spyOn(process, "cwd").mockReturnValue(nestedDir) const result = findLockfile() @@ -152,7 +152,7 @@ toolDefinitions = [] it("finds lockfile in current directory", () => { const lockfilePath = path.join(testDir, "perstack.lock") fs.writeFileSync(lockfilePath, "") - vi.spyOn(process, "cwd").mockReturnValue(testDir) + spyOn(process, "cwd").mockReturnValue(testDir) const result = findLockfile() diff --git a/packages/perstack-toml/tsconfig.build.json b/packages/perstack-toml/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/perstack-toml/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/perstack-toml/tsconfig.json b/packages/perstack-toml/tsconfig.json index a10de72d..c33bc685 100644 --- a/packages/perstack-toml/tsconfig.json +++ b/packages/perstack-toml/tsconfig.json @@ -1,5 +1,5 @@ { "extends": "@tsconfig/node22/tsconfig.json", "include": ["**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/anthropic/package.json b/packages/providers/anthropic/package.json index 07d07523..dc97a551 100644 --- a/packages/providers/anthropic/package.json +++ b/packages/providers/anthropic/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/anthropic": "^3.0.44", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/anthropic/src/adapter.test.ts b/packages/providers/anthropic/src/adapter.test.ts index df0cfdc5..f8393aff 100644 --- a/packages/providers/anthropic/src/adapter.test.ts +++ b/packages/providers/anthropic/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { AnthropicProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { AnthropicProviderAdapter } from "./adapter.js" const mockConfig: AnthropicProviderConfig = { diff --git a/packages/providers/anthropic/src/errors.test.ts b/packages/providers/anthropic/src/errors.test.ts index db87d213..419d837f 100644 --- a/packages/providers/anthropic/src/errors.test.ts +++ b/packages/providers/anthropic/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isAnthropicRetryable, normalizeAnthropicError } from "./errors.js" describe("normalizeAnthropicError", () => { diff --git a/packages/providers/anthropic/src/skills.test.ts b/packages/providers/anthropic/src/skills.test.ts index 1dab009c..8b3541af 100644 --- a/packages/providers/anthropic/src/skills.test.ts +++ b/packages/providers/anthropic/src/skills.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { AnthropicProviderSkill } from "@perstack/provider-core" -import { describe, expect, it } from "vitest" import { buildProviderOptions, hasCustomProviderSkills } from "./skills.js" describe("buildProviderOptions", () => { diff --git a/packages/providers/anthropic/tsconfig.build.json b/packages/providers/anthropic/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/anthropic/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/anthropic/tsconfig.json b/packages/providers/anthropic/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/anthropic/tsconfig.json +++ b/packages/providers/anthropic/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/azure-openai/package.json b/packages/providers/azure-openai/package.json index d288f3fd..dfb4ae5e 100644 --- a/packages/providers/azure-openai/package.json +++ b/packages/providers/azure-openai/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/azure": "^3.0.31", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/azure-openai/src/adapter.test.ts b/packages/providers/azure-openai/src/adapter.test.ts index ec02c827..5259819c 100644 --- a/packages/providers/azure-openai/src/adapter.test.ts +++ b/packages/providers/azure-openai/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { AzureOpenAiProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { AzureOpenAIProviderAdapter } from "./adapter.js" const mockConfig: AzureOpenAiProviderConfig = { diff --git a/packages/providers/azure-openai/src/errors.test.ts b/packages/providers/azure-openai/src/errors.test.ts index 5e128090..fb744d76 100644 --- a/packages/providers/azure-openai/src/errors.test.ts +++ b/packages/providers/azure-openai/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isAzureOpenAIRetryable, normalizeAzureOpenAIError } from "./errors.js" describe("normalizeAzureOpenAIError", () => { diff --git a/packages/providers/azure-openai/tsconfig.build.json b/packages/providers/azure-openai/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/azure-openai/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/azure-openai/tsconfig.json b/packages/providers/azure-openai/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/azure-openai/tsconfig.json +++ b/packages/providers/azure-openai/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/bedrock/package.json b/packages/providers/bedrock/package.json index e37d328a..0be7dc81 100644 --- a/packages/providers/bedrock/package.json +++ b/packages/providers/bedrock/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/amazon-bedrock": "^4.0.60", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/bedrock/src/adapter.test.ts b/packages/providers/bedrock/src/adapter.test.ts index ab43c506..ca35871a 100644 --- a/packages/providers/bedrock/src/adapter.test.ts +++ b/packages/providers/bedrock/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { AmazonBedrockProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { BedrockProviderAdapter } from "./adapter.js" const mockConfig: AmazonBedrockProviderConfig = { diff --git a/packages/providers/bedrock/src/errors.test.ts b/packages/providers/bedrock/src/errors.test.ts index b9577f2e..4879e784 100644 --- a/packages/providers/bedrock/src/errors.test.ts +++ b/packages/providers/bedrock/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isBedrockRetryable, normalizeBedrockError } from "./errors.js" describe("normalizeBedrockError", () => { diff --git a/packages/providers/bedrock/tsconfig.build.json b/packages/providers/bedrock/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/bedrock/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/bedrock/tsconfig.json b/packages/providers/bedrock/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/bedrock/tsconfig.json +++ b/packages/providers/bedrock/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/core/package.json b/packages/providers/core/package.json index bdddfa96..309afa94 100644 --- a/packages/providers/core/package.json +++ b/packages/providers/core/package.json @@ -11,8 +11,9 @@ }, "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*", @@ -22,11 +23,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/core/src/base.test.ts b/packages/providers/core/src/base.test.ts index 931d0771..254b82fe 100644 --- a/packages/providers/core/src/base.test.ts +++ b/packages/providers/core/src/base.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { LanguageModel } from "ai" -import { describe, expect, it } from "vitest" import { BaseProviderAdapter } from "./base.js" class TestProviderAdapter extends BaseProviderAdapter { diff --git a/packages/providers/core/tsconfig.build.json b/packages/providers/core/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/core/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/core/tsconfig.json b/packages/providers/core/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/core/tsconfig.json +++ b/packages/providers/core/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/deepseek/package.json b/packages/providers/deepseek/package.json index abeccbff..c56746b9 100644 --- a/packages/providers/deepseek/package.json +++ b/packages/providers/deepseek/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/deepseek": "^2.0.20", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/deepseek/src/adapter.test.ts b/packages/providers/deepseek/src/adapter.test.ts index 91146fa5..b31a37e9 100644 --- a/packages/providers/deepseek/src/adapter.test.ts +++ b/packages/providers/deepseek/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { DeepseekProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { DeepseekProviderAdapter } from "./adapter.js" const mockConfig: DeepseekProviderConfig = { diff --git a/packages/providers/deepseek/src/errors.test.ts b/packages/providers/deepseek/src/errors.test.ts index 5e4f1ba2..c202b80f 100644 --- a/packages/providers/deepseek/src/errors.test.ts +++ b/packages/providers/deepseek/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isDeepSeekRetryable, normalizeDeepSeekError } from "./errors.js" describe("normalizeDeepSeekError", () => { diff --git a/packages/providers/deepseek/tsconfig.build.json b/packages/providers/deepseek/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/deepseek/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/deepseek/tsconfig.json b/packages/providers/deepseek/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/deepseek/tsconfig.json +++ b/packages/providers/deepseek/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/google/package.json b/packages/providers/google/package.json index 5141a178..ba5ccb63 100644 --- a/packages/providers/google/package.json +++ b/packages/providers/google/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/google": "^3.0.29", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/google/src/adapter.test.ts b/packages/providers/google/src/adapter.test.ts index 6b213b79..77dda89f 100644 --- a/packages/providers/google/src/adapter.test.ts +++ b/packages/providers/google/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { GoogleGenerativeAiProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { GoogleProviderAdapter } from "./adapter.js" const mockConfig: GoogleGenerativeAiProviderConfig = { diff --git a/packages/providers/google/src/errors.test.ts b/packages/providers/google/src/errors.test.ts index 575442b7..3d4dc714 100644 --- a/packages/providers/google/src/errors.test.ts +++ b/packages/providers/google/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isGoogleRetryable, normalizeGoogleError } from "./errors.js" describe("normalizeGoogleError", () => { diff --git a/packages/providers/google/tsconfig.build.json b/packages/providers/google/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/google/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/google/tsconfig.json b/packages/providers/google/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/google/tsconfig.json +++ b/packages/providers/google/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/ollama/package.json b/packages/providers/ollama/package.json index d6a30663..8f04a2b4 100644 --- a/packages/providers/ollama/package.json +++ b/packages/providers/ollama/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/ollama/src/adapter.test.ts b/packages/providers/ollama/src/adapter.test.ts index 995e702b..81599d4f 100644 --- a/packages/providers/ollama/src/adapter.test.ts +++ b/packages/providers/ollama/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { OllamaProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { OllamaProviderAdapter } from "./adapter.js" const mockConfig: OllamaProviderConfig = { diff --git a/packages/providers/ollama/src/errors.test.ts b/packages/providers/ollama/src/errors.test.ts index 4ab4332a..bbce7ab7 100644 --- a/packages/providers/ollama/src/errors.test.ts +++ b/packages/providers/ollama/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isOllamaRetryable, normalizeOllamaError } from "./errors.js" describe("normalizeOllamaError", () => { diff --git a/packages/providers/ollama/tsconfig.build.json b/packages/providers/ollama/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/ollama/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/ollama/tsconfig.json b/packages/providers/ollama/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/ollama/tsconfig.json +++ b/packages/providers/ollama/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/openai/package.json b/packages/providers/openai/package.json index ada706c6..503bfc3f 100644 --- a/packages/providers/openai/package.json +++ b/packages/providers/openai/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/openai": "^3.0.29", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/openai/src/adapter.test.ts b/packages/providers/openai/src/adapter.test.ts index 72a9ed42..bb8ae004 100644 --- a/packages/providers/openai/src/adapter.test.ts +++ b/packages/providers/openai/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { OpenAiProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { OpenAIProviderAdapter } from "./adapter.js" const mockConfig: OpenAiProviderConfig = { diff --git a/packages/providers/openai/src/errors.test.ts b/packages/providers/openai/src/errors.test.ts index bd493a46..5090087e 100644 --- a/packages/providers/openai/src/errors.test.ts +++ b/packages/providers/openai/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isOpenAIRetryable, normalizeOpenAIError } from "./errors.js" describe("normalizeOpenAIError", () => { diff --git a/packages/providers/openai/tsconfig.build.json b/packages/providers/openai/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/openai/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/openai/tsconfig.json b/packages/providers/openai/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/openai/tsconfig.json +++ b/packages/providers/openai/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/providers/vertex/package.json b/packages/providers/vertex/package.json index 6334c455..0918854d 100644 --- a/packages/providers/vertex/package.json +++ b/packages/providers/vertex/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@ai-sdk/google-vertex": "^4.0.58", @@ -34,11 +35,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "ai": "^6.0.86", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/providers/vertex/src/adapter.test.ts b/packages/providers/vertex/src/adapter.test.ts index 7bc1af28..8014c152 100644 --- a/packages/providers/vertex/src/adapter.test.ts +++ b/packages/providers/vertex/src/adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { GoogleVertexProviderConfig } from "@perstack/core" -import { describe, expect, it } from "vitest" import { VertexProviderAdapter } from "./adapter.js" const mockConfig: GoogleVertexProviderConfig = { diff --git a/packages/providers/vertex/src/errors.test.ts b/packages/providers/vertex/src/errors.test.ts index 823237be..7da5782f 100644 --- a/packages/providers/vertex/src/errors.test.ts +++ b/packages/providers/vertex/src/errors.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { APICallError } from "ai" -import { describe, expect, it } from "vitest" import { isVertexRetryable, normalizeVertexError } from "./errors.js" describe("normalizeVertexError", () => { diff --git a/packages/providers/vertex/tsconfig.build.json b/packages/providers/vertex/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/providers/vertex/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/providers/vertex/tsconfig.json b/packages/providers/vertex/tsconfig.json index f64040ac..563aebf5 100644 --- a/packages/providers/vertex/tsconfig.json +++ b/packages/providers/vertex/tsconfig.json @@ -14,5 +14,5 @@ "noEmit": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/react/README.md b/packages/react/README.md index c11154e8..c7fceab2 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -5,9 +5,7 @@ Reusable React hooks and utilities for Perstack integration. This is the shared ## Installation ```bash -npm install @perstack/react -# or -pnpm add @perstack/react +bun add @perstack/react ``` ## Usage diff --git a/packages/react/bunfig.toml b/packages/react/bunfig.toml new file mode 100644 index 00000000..36399045 --- /dev/null +++ b/packages/react/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["./happydom.ts"] diff --git a/packages/react/happydom.ts b/packages/react/happydom.ts new file mode 100644 index 00000000..ccb1ad42 --- /dev/null +++ b/packages/react/happydom.ts @@ -0,0 +1,52 @@ +import { Window } from "happy-dom" + +const window = new Window() + +const globals = [ + "document", + "HTMLElement", + "HTMLInputElement", + "HTMLTextAreaElement", + "HTMLSelectElement", + "HTMLButtonElement", + "HTMLFormElement", + "HTMLAnchorElement", + "HTMLDivElement", + "HTMLSpanElement", + "HTMLImageElement", + "HTMLCanvasElement", + "DocumentFragment", + "Element", + "Event", + "CustomEvent", + "MouseEvent", + "KeyboardEvent", + "Node", + "NodeList", + "Text", + "Comment", + "MutationObserver", + "navigator", + "getComputedStyle", + "requestAnimationFrame", + "cancelAnimationFrame", + "DOMParser", + "XMLSerializer", + "CSSStyleDeclaration", +] as const + +for (const key of globals) { + if (key in window) { + Object.defineProperty(globalThis, key, { + value: (window as any)[key], + writable: true, + configurable: true, + }) + } +} + +Object.defineProperty(globalThis, "window", { + value: window, + writable: true, + configurable: true, +}) diff --git a/packages/react/package.json b/packages/react/package.json index 8201dcd8..ef4778dc 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*" @@ -37,12 +38,10 @@ "@types/node": "^25.3.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "jsdom": "^28.0.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "happy-dom": "^18.0.1", + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/react/src/hooks/use-job-stream.test.ts b/packages/react/src/hooks/use-job-stream.test.ts index 87a042da..63c2a711 100644 --- a/packages/react/src/hooks/use-job-stream.test.ts +++ b/packages/react/src/hooks/use-job-stream.test.ts @@ -1,3 +1,5 @@ +import "../../happydom.js" +import { describe, expect, it } from "bun:test" import type { Checkpoint, ExpertMessage, @@ -9,7 +11,6 @@ import type { } from "@perstack/core" import { createEmptyUsage } from "@perstack/core" import { act, renderHook } from "@testing-library/react" -import { describe, expect, it } from "vitest" import type { StreamConnector } from "./use-job-stream.js" import { useJobStream } from "./use-job-stream.js" diff --git a/packages/react/src/hooks/use-job-streams.test.ts b/packages/react/src/hooks/use-job-streams.test.ts index ebcfeedb..336fc10d 100644 --- a/packages/react/src/hooks/use-job-streams.test.ts +++ b/packages/react/src/hooks/use-job-streams.test.ts @@ -1,7 +1,8 @@ +import "../../happydom.js" +import { describe, expect, it, spyOn } from "bun:test" import type { ExpertMessage, PerstackEvent, RunEvent, ToolCall, ToolResult } from "@perstack/core" import { createEmptyUsage } from "@perstack/core" import { act, renderHook } from "@testing-library/react" -import { describe, expect, it, vi } from "vitest" import type { StreamConnector } from "./use-job-stream.js" import { useJobStreams } from "./use-job-streams.js" @@ -311,7 +312,7 @@ describe("useJobStreams", () => { }) it("isolates errors between jobs", async () => { - const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {}) + const consoleSpy = spyOn(console, "error").mockImplementation(() => {}) const { connector, getStream } = createMultiStreamConnector() const jobs = [ { id: "job-1", enabled: true }, diff --git a/packages/react/src/hooks/use-run.test.ts b/packages/react/src/hooks/use-run.test.ts index ad9d2707..39952d8c 100644 --- a/packages/react/src/hooks/use-run.test.ts +++ b/packages/react/src/hooks/use-run.test.ts @@ -1,3 +1,5 @@ +import "../../happydom.js" +import { describe, expect, it } from "bun:test" import { type ActivityOrGroup, type Checkpoint, @@ -11,7 +13,6 @@ import { type ToolResult, } from "@perstack/core" import { act, renderHook } from "@testing-library/react" -import { describe, expect, it } from "vitest" import type { StreamingState } from "../types/index.js" import { createInitialActivityProcessState, diff --git a/packages/react/src/utils/event-to-activity.test.ts b/packages/react/src/utils/event-to-activity.test.ts index 07ee6ed6..b327b66f 100644 --- a/packages/react/src/utils/event-to-activity.test.ts +++ b/packages/react/src/utils/event-to-activity.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "bun:test" import type { Activity, ActivityOrGroup, @@ -7,7 +8,6 @@ import type { ToolCall, ToolResult, } from "@perstack/core" -import { describe, expect, it } from "vitest" import { createInitialActivityProcessState, processRunEventToActivity, diff --git a/packages/react/src/utils/group-by-run.test.ts b/packages/react/src/utils/group-by-run.test.ts index 28ef8402..329a1e52 100644 --- a/packages/react/src/utils/group-by-run.test.ts +++ b/packages/react/src/utils/group-by-run.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { Activity, ActivityOrGroup, ParallelActivitiesGroup } from "@perstack/core" -import { describe, expect, it } from "vitest" import { groupActivitiesByRun } from "./group-by-run.js" function createActivity(overrides: Partial = {}): Activity { diff --git a/packages/react/src/utils/stream.test.ts b/packages/react/src/utils/stream.test.ts index 65ecf5c3..9037d6c2 100644 --- a/packages/react/src/utils/stream.test.ts +++ b/packages/react/src/utils/stream.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { PerstackEvent, RunEvent } from "@perstack/core" -import { describe, expect, it } from "vitest" import { consumeStream, isAbortError, type StreamConnector } from "./stream.js" function createBaseEvent(overrides: Partial = {}): PerstackEvent { diff --git a/packages/react/tsconfig.build.json b/packages/react/tsconfig.build.json new file mode 100644 index 00000000..c87cd0dc --- /dev/null +++ b/packages/react/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/runtime/package.json b/packages/runtime/package.json index f27b9728..4e8c9b8c 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "find src -name '*.test.ts' -print0 | xargs -0 -n1 bun test" }, "dependencies": { "@ai-sdk/amazon-bedrock": "^4.0.60", @@ -55,11 +56,9 @@ "@perstack/vertex-provider": "workspace:*", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/runtime/src/events/event-emitter.test.ts b/packages/runtime/src/events/event-emitter.test.ts index e924cd3f..e571ca12 100644 --- a/packages/runtime/src/events/event-emitter.test.ts +++ b/packages/runtime/src/events/event-emitter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock } from "bun:test" import type { RunEvent } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { RunEventEmitter } from "./event-emitter.js" function createMockEvent(overrides: Partial = {}): RunEvent { @@ -18,7 +18,7 @@ function createMockEvent(overrides: Partial = {}): RunEvent { describe("@perstack/runtime: RunEventEmitter", () => { it("subscribes listener and emits event", async () => { const emitter = new RunEventEmitter() - const listener = vi.fn() + const listener = mock() emitter.subscribe(listener) const event = createMockEvent() await emitter.emit(event) @@ -34,8 +34,8 @@ describe("@perstack/runtime: RunEventEmitter", () => { it("notifies multiple listeners", async () => { const emitter = new RunEventEmitter() - const listener1 = vi.fn() - const listener2 = vi.fn() + const listener1 = mock() + const listener2 = mock() emitter.subscribe(listener1) emitter.subscribe(listener2) const event = createMockEvent() @@ -78,9 +78,9 @@ describe("@perstack/runtime: RunEventEmitter", () => { it("continues calling listeners when one throws and aggregates errors", async () => { const emitter = new RunEventEmitter() - const listener1 = vi.fn() - const listener2 = vi.fn().mockRejectedValue(new Error("test error")) - const listener3 = vi.fn() + const listener1 = mock() + const listener2 = mock().mockRejectedValue(new Error("test error")) + const listener3 = mock() emitter.subscribe(listener1) emitter.subscribe(listener2) emitter.subscribe(listener3) diff --git a/packages/runtime/src/helpers/checkpoint.test.ts b/packages/runtime/src/helpers/checkpoint.test.ts index 12878651..7c75aba7 100644 --- a/packages/runtime/src/helpers/checkpoint.test.ts +++ b/packages/runtime/src/helpers/checkpoint.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, spyOn } from "bun:test" import type { Checkpoint, RunSetting } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { buildDelegationReturnState, createInitialCheckpoint, @@ -197,7 +197,7 @@ describe("@perstack/runtime: buildDelegationReturnState", () => { }) it("uses empty string and warns when expertMessage has no text content", () => { - const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}) + const warnSpy = spyOn(console, "warn").mockImplementation(() => {}) const checkpointWithNoText: Checkpoint = { ...resultCheckpoint, messages: [ diff --git a/packages/runtime/src/helpers/lockfile.test.ts b/packages/runtime/src/helpers/lockfile.test.ts index 1ef3bd3d..9457fe7c 100644 --- a/packages/runtime/src/helpers/lockfile.test.ts +++ b/packages/runtime/src/helpers/lockfile.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { LockfileExpert, LockfileToolDefinition } from "@perstack/core" -import { describe, expect, it } from "vitest" import { getLockfileExpertToolDefinitions } from "./lockfile.js" const createLockfileExpert = ( diff --git a/packages/runtime/src/helpers/model.test.ts b/packages/runtime/src/helpers/model.test.ts index 597382ac..f507683d 100644 --- a/packages/runtime/src/helpers/model.test.ts +++ b/packages/runtime/src/helpers/model.test.ts @@ -1,5 +1,5 @@ +import { afterAll, describe, expect, it, mock } from "bun:test" import type { Usage } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { calculateContextWindowUsage, getContextWindow, @@ -7,38 +7,42 @@ import { getReasoningProviderOptions, } from "./model.js" -vi.mock("@ai-sdk/anthropic", () => ({ - createAnthropic: vi.fn(() => vi.fn(() => ({ provider: "anthropic" }))), +mock.module("@ai-sdk/anthropic", () => ({ + createAnthropic: mock(() => mock(() => ({ provider: "anthropic" }))), })) -vi.mock("@ai-sdk/google", () => ({ - createGoogleGenerativeAI: vi.fn(() => vi.fn(() => ({ provider: "google" }))), +mock.module("@ai-sdk/google", () => ({ + createGoogleGenerativeAI: mock(() => mock(() => ({ provider: "google" }))), })) -vi.mock("@ai-sdk/openai", () => ({ - createOpenAI: vi.fn(() => vi.fn(() => ({ provider: "openai" }))), +mock.module("@ai-sdk/openai", () => ({ + createOpenAI: mock(() => mock(() => ({ provider: "openai" }))), })) -vi.mock("ollama-ai-provider-v2", () => ({ - createOllama: vi.fn(() => vi.fn(() => ({ provider: "ollama" }))), +mock.module("ollama-ai-provider-v2", () => ({ + createOllama: mock(() => mock(() => ({ provider: "ollama" }))), })) -vi.mock("@ai-sdk/azure", () => ({ - createAzure: vi.fn(() => vi.fn(() => ({ provider: "azure" }))), +mock.module("@ai-sdk/azure", () => ({ + createAzure: mock(() => mock(() => ({ provider: "azure" }))), })) -vi.mock("@ai-sdk/amazon-bedrock", () => ({ - createAmazonBedrock: vi.fn(() => vi.fn(() => ({ provider: "bedrock" }))), +mock.module("@ai-sdk/amazon-bedrock", () => ({ + createAmazonBedrock: mock(() => mock(() => ({ provider: "bedrock" }))), })) -vi.mock("@ai-sdk/google-vertex", () => ({ - createVertex: vi.fn(() => vi.fn(() => ({ provider: "vertex" }))), +mock.module("@ai-sdk/google-vertex", () => ({ + createVertex: mock(() => mock(() => ({ provider: "vertex" }))), })) -vi.mock("@ai-sdk/deepseek", () => ({ - createDeepSeek: vi.fn(() => vi.fn(() => ({ provider: "deepseek" }))), +mock.module("@ai-sdk/deepseek", () => ({ + createDeepSeek: mock(() => mock(() => ({ provider: "deepseek" }))), })) +afterAll(() => { + mock.restore() +}) + describe("@perstack/runtime: model", () => { describe("getModel", () => { it("creates anthropic model", () => { diff --git a/packages/runtime/src/helpers/provider-adapter-factory.test.ts b/packages/runtime/src/helpers/provider-adapter-factory.test.ts index 600ea410..db9951ea 100644 --- a/packages/runtime/src/helpers/provider-adapter-factory.test.ts +++ b/packages/runtime/src/helpers/provider-adapter-factory.test.ts @@ -1,5 +1,5 @@ +import { beforeEach, describe, expect, it } from "bun:test" import { type AnthropicProviderConfig, PerstackError } from "@perstack/core" -import { beforeEach, describe, expect, it } from "vitest" import { clearProviderAdapterCache, createProviderAdapter } from "./provider-adapter-factory.js" describe("Provider Adapter Factory", () => { diff --git a/packages/runtime/src/helpers/resolve-expert.test.ts b/packages/runtime/src/helpers/resolve-expert.test.ts index 68551e46..609b5023 100644 --- a/packages/runtime/src/helpers/resolve-expert.test.ts +++ b/packages/runtime/src/helpers/resolve-expert.test.ts @@ -1,8 +1,8 @@ +import { afterAll, describe, expect, it, mock } from "bun:test" import type { Expert } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { resolveExpertToRun } from "./resolve-expert.js" -vi.mock("@perstack/api-client", () => ({ +mock.module("@perstack/api-client", () => ({ createApiClient: () => ({ experts: { get: async (expertKey: string) => ({ @@ -48,6 +48,10 @@ vi.mock("@perstack/api-client", () => ({ }), })) +afterAll(() => { + mock.restore() +}) + function createTestExpert(overrides: Partial = {}): Expert { return { key: "test-expert", diff --git a/packages/runtime/src/helpers/runtime-version.test.ts b/packages/runtime/src/helpers/runtime-version.test.ts index b1c5f24f..ddfbd778 100644 --- a/packages/runtime/src/helpers/runtime-version.test.ts +++ b/packages/runtime/src/helpers/runtime-version.test.ts @@ -1,10 +1,14 @@ +import { afterAll, describe, expect, it, mock } from "bun:test" import type { Expert, RuntimeVersion } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" -vi.mock("../../package.json", () => ({ +mock.module("../../package.json", () => ({ default: { version: "0.0.87" }, })) +afterAll(() => { + mock.restore() +}) + import { compareRuntimeVersions, determineJobRuntimeVersion, diff --git a/packages/runtime/src/helpers/setup-experts.test.ts b/packages/runtime/src/helpers/setup-experts.test.ts index 2152bf65..b4588961 100644 --- a/packages/runtime/src/helpers/setup-experts.test.ts +++ b/packages/runtime/src/helpers/setup-experts.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock } from "bun:test" import type { Expert, RunSetting } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { setupExperts } from "./setup-experts.js" describe("@perstack/runtime: setupExperts", () => { @@ -32,7 +32,7 @@ describe("@perstack/runtime: setupExperts", () => { } it("resolves expert and returns experts map", async () => { - const mockResolve = vi.fn().mockResolvedValue(baseExpert) + const mockResolve = mock().mockResolvedValue(baseExpert) const result = await setupExperts(baseSetting, mockResolve) expect(result.expertToRun).toEqual(baseExpert) expect(result.experts).toEqual({ "test-expert": baseExpert }) @@ -48,7 +48,7 @@ describe("@perstack/runtime: setupExperts", () => { ...baseSetting, experts: { existing: existingExpert }, } - const mockResolve = vi.fn().mockResolvedValue(baseExpert) + const mockResolve = mock().mockResolvedValue(baseExpert) const result = await setupExperts(settingWithExperts, mockResolve) expect(result.experts).toEqual({ existing: existingExpert, "test-expert": baseExpert }) expect(result.experts).not.toBe(settingWithExperts.experts) @@ -62,8 +62,7 @@ describe("@perstack/runtime: setupExperts", () => { } const delegateExpert1: Expert = { ...baseExpert, key: "delegate-1", name: "delegate-1" } const delegateExpert2: Expert = { ...baseExpert, key: "delegate-2", name: "delegate-2" } - const mockResolve = vi - .fn() + const mockResolve = mock() .mockResolvedValueOnce(expertWithDelegates) .mockResolvedValueOnce(delegateExpert1) .mockResolvedValueOnce(delegateExpert2) @@ -78,8 +77,7 @@ describe("@perstack/runtime: setupExperts", () => { ...baseExpert, delegates: ["missing-delegate"], } - const mockResolve = vi - .fn() + const mockResolve = mock() .mockResolvedValueOnce(expertWithDelegates) .mockResolvedValueOnce(null) await expect(setupExperts(baseSetting, mockResolve)).rejects.toThrow( @@ -92,7 +90,7 @@ describe("@perstack/runtime: setupExperts", () => { ...baseSetting, perstackApiKey: "my-api-key", } - const mockResolve = vi.fn().mockResolvedValue(baseExpert) + const mockResolve = mock().mockResolvedValue(baseExpert) await setupExperts(settingWithKey, mockResolve) expect(mockResolve).toHaveBeenCalledWith("test-expert", expect.any(Object), { perstackApiBaseUrl: "https://api.perstack.dev", @@ -109,7 +107,7 @@ describe("@perstack/runtime: setupExperts", () => { delegates: ["level2"], } const level2Expert: Expert = { ...baseExpert, key: "level2", name: "level2", delegates: [] } - const mockResolve = vi.fn().mockImplementation((key: string) => { + const mockResolve = mock().mockImplementation((key: string) => { if (key === "root") return Promise.resolve(rootExpert) if (key === "level1") return Promise.resolve(level1Expert) if (key === "level2") return Promise.resolve(level2Expert) @@ -132,7 +130,7 @@ describe("@perstack/runtime: setupExperts", () => { name: "level1", delegates: ["root"], } - const mockResolve = vi.fn().mockImplementation((key: string) => { + const mockResolve = mock().mockImplementation((key: string) => { if (key === "root") return Promise.resolve(rootExpert) if (key === "level1") return Promise.resolve(level1Expert) return Promise.resolve(null) @@ -163,7 +161,7 @@ describe("@perstack/runtime: setupExperts", () => { delegates: ["shared"], } const sharedExpert: Expert = { ...baseExpert, key: "shared", name: "shared", delegates: [] } - const mockResolve = vi.fn().mockImplementation((key: string) => { + const mockResolve = mock().mockImplementation((key: string) => { if (key === "root") return Promise.resolve(rootExpert) if (key === "branch-a") return Promise.resolve(branchAExpert) if (key === "branch-b") return Promise.resolve(branchBExpert) diff --git a/packages/runtime/src/helpers/thinking.test.ts b/packages/runtime/src/helpers/thinking.test.ts index 108cfcee..54b69a2b 100644 --- a/packages/runtime/src/helpers/thinking.test.ts +++ b/packages/runtime/src/helpers/thinking.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { extractThinkingParts, extractThinkingText, type ReasoningPart } from "./thinking.js" describe("@perstack/runtime: thinking", () => { diff --git a/packages/runtime/src/helpers/usage.test.ts b/packages/runtime/src/helpers/usage.test.ts index 4920e3eb..9ab73da9 100644 --- a/packages/runtime/src/helpers/usage.test.ts +++ b/packages/runtime/src/helpers/usage.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it } from "bun:test" import type { Usage } from "@perstack/core" import type { GenerateTextResult, ToolSet } from "ai" -import { describe, expect, it } from "vitest" import { createEmptyUsage, sumUsage, usageFromGenerateTextResult } from "./usage.js" describe("@perstack/runtime: usage", () => { diff --git a/packages/runtime/src/llm/executor.test.ts b/packages/runtime/src/llm/executor.test.ts index 347e9d4d..762bac2c 100644 --- a/packages/runtime/src/llm/executor.test.ts +++ b/packages/runtime/src/llm/executor.test.ts @@ -1,17 +1,19 @@ +import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test" import type { ProviderName } from "@perstack/core" import type { ProviderAdapter } from "@perstack/provider-core" import * as aiModule from "ai" -import { beforeEach, describe, expect, it, vi } from "vitest" import { LLMExecutor } from "./executor.js" import type { StreamCallbacks } from "./types.js" -vi.mock("ai", async (importOriginal) => { - const original = await importOriginal() - return { - ...original, - generateText: vi.fn(), - streamText: vi.fn(), - } +const originalAiModule = await import("ai") +mock.module("ai", () => ({ + ...originalAiModule, + generateText: mock(), + streamText: mock(), +})) + +afterAll(() => { + mock.restore() }) describe("LLMExecutor", () => { @@ -19,24 +21,24 @@ describe("LLMExecutor", () => { overrides: Partial = {}, ): ProviderAdapter => ({ providerName: "anthropic" as ProviderName, - createModel: vi.fn(), - getProviderTools: vi.fn().mockReturnValue({}), - getProviderOptions: vi.fn().mockReturnValue(undefined), - getReasoningOptions: vi.fn().mockReturnValue({ anthropic: { thinking: true } }), - normalizeError: vi.fn().mockImplementation((e) => e), - isRetryable: vi.fn().mockReturnValue(false), + createModel: mock(), + getProviderTools: mock().mockReturnValue({}), + getProviderOptions: mock().mockReturnValue(undefined), + getReasoningOptions: mock().mockReturnValue({ anthropic: { thinking: true } }), + normalizeError: mock().mockImplementation((e) => e), + isRetryable: mock().mockReturnValue(false), ...overrides, }) const createMockModel = () => ({ - generate: vi.fn(), + generate: mock(), }) as never - const mockGenerateText = vi.mocked(aiModule.generateText) + const mockGenerateText = aiModule.generateText as ReturnType beforeEach(() => { - vi.clearAllMocks() + mockGenerateText.mockClear() }) describe("generateText", () => { @@ -64,7 +66,7 @@ describe("LLMExecutor", () => { mockGenerateText.mockResolvedValue({ finishReason: "stop" } as never) const adapter = createMockAdapter({ - getReasoningOptions: vi.fn().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), + getReasoningOptions: mock().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -118,8 +120,8 @@ describe("LLMExecutor", () => { mockGenerateText.mockRejectedValue(error) const adapter = createMockAdapter({ - normalizeError: vi.fn().mockReturnValue({ message: "Normalized error" }), - isRetryable: vi.fn().mockReturnValue(true), + normalizeError: mock().mockReturnValue({ message: "Normalized error" }), + isRetryable: mock().mockReturnValue(true), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -159,7 +161,7 @@ describe("LLMExecutor", () => { mockGenerateText.mockResolvedValue({ finishReason: "stop" } as never) const adapter = createMockAdapter({ - getReasoningOptions: vi.fn().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), + getReasoningOptions: mock().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -193,8 +195,8 @@ describe("LLMExecutor", () => { mockGenerateText.mockRejectedValue(error) const adapter = createMockAdapter({ - normalizeError: vi.fn().mockReturnValue({ message: "Error" }), - isRetryable: vi.fn().mockReturnValue(false), + normalizeError: mock().mockReturnValue({ message: "Error" }), + isRetryable: mock().mockReturnValue(false), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -216,8 +218,8 @@ describe("LLMExecutor", () => { mockGenerateText.mockResolvedValue({ finishReason: "stop" } as never) const adapter = createMockAdapter({ - getProviderOptions: vi.fn().mockReturnValue({ anthropic: { cacheControl: true } }), - getReasoningOptions: vi.fn().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), + getProviderOptions: mock().mockReturnValue({ anthropic: { cacheControl: true } }), + getReasoningOptions: mock().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -245,7 +247,7 @@ describe("LLMExecutor", () => { mockGenerateText.mockResolvedValue({ finishReason: "stop" } as never) const adapter = createMockAdapter({ - getProviderOptions: vi.fn().mockReturnValue(undefined), + getProviderOptions: mock().mockReturnValue(undefined), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -266,7 +268,7 @@ describe("LLMExecutor", () => { }) describe("streamText", () => { - const mockStreamText = vi.mocked(aiModule.streamText) + const mockStreamText = aiModule.streamText as ReturnType // Helper to create a mock stream with async iterable fullStream type StreamPart = @@ -313,8 +315,8 @@ describe("LLMExecutor", () => { const executor = new LLMExecutor(adapter, model) const callbacks: StreamCallbacks = { - onReasoningStart: vi.fn(), - onReasoningDelta: vi.fn(), + onReasoningStart: mock(), + onReasoningDelta: mock(), } await executor.streamText({ messages: [], maxRetries: 3, tools: {} }, callbacks) @@ -338,8 +340,8 @@ describe("LLMExecutor", () => { const executor = new LLMExecutor(adapter, model) const callbacks: StreamCallbacks = { - onReasoningStart: vi.fn(), - onReasoningDelta: vi.fn(), + onReasoningStart: mock(), + onReasoningDelta: mock(), } await executor.streamText({ messages: [], maxRetries: 3, tools: {} }, callbacks) @@ -365,8 +367,8 @@ describe("LLMExecutor", () => { const executor = new LLMExecutor(adapter, model) const callbacks: StreamCallbacks = { - onResultStart: vi.fn(), - onResultDelta: vi.fn(), + onResultStart: mock(), + onResultDelta: mock(), } await executor.streamText({ messages: [], maxRetries: 3, tools: {} }, callbacks) @@ -389,8 +391,8 @@ describe("LLMExecutor", () => { const executor = new LLMExecutor(adapter, model) const callbacks: StreamCallbacks = { - onResultStart: vi.fn(), - onResultDelta: vi.fn(), + onResultStart: mock(), + onResultDelta: mock(), } await executor.streamText({ messages: [], maxRetries: 3, tools: {} }, callbacks) @@ -431,10 +433,10 @@ describe("LLMExecutor", () => { const executor = new LLMExecutor(adapter, model) const callbacks: StreamCallbacks = { - onReasoningStart: vi.fn(), - onReasoningDelta: vi.fn(), - onResultStart: vi.fn(), - onResultDelta: vi.fn(), + onReasoningStart: mock(), + onReasoningDelta: mock(), + onResultStart: mock(), + onResultDelta: mock(), } await executor.streamText({ messages: [], maxRetries: 3, tools: {} }, callbacks) @@ -465,8 +467,8 @@ describe("LLMExecutor", () => { mockStreamText.mockReturnValue(mockStream as never) const adapter = createMockAdapter({ - normalizeError: vi.fn().mockReturnValue({ message: "Normalized stream error" }), - isRetryable: vi.fn().mockReturnValue(true), + normalizeError: mock().mockReturnValue({ message: "Normalized stream error" }), + isRetryable: mock().mockReturnValue(true), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) @@ -498,10 +500,10 @@ describe("LLMExecutor", () => { const callOrder: string[] = [] const callbacks: StreamCallbacks = { - onReasoningStart: vi.fn(() => callOrder.push("reasoningStart")), - onReasoningDelta: vi.fn(() => callOrder.push("reasoningDelta")), - onResultStart: vi.fn(() => callOrder.push("resultStart")), - onResultDelta: vi.fn(() => callOrder.push("resultDelta")), + onReasoningStart: mock(() => callOrder.push("reasoningStart")), + onReasoningDelta: mock(() => callOrder.push("reasoningDelta")), + onResultStart: mock(() => callOrder.push("resultStart")), + onResultDelta: mock(() => callOrder.push("resultDelta")), } await executor.streamText({ messages: [], maxRetries: 3, tools: {} }, callbacks) @@ -521,7 +523,7 @@ describe("LLMExecutor", () => { mockStreamText.mockReturnValue(mockStream as never) const adapter = createMockAdapter({ - getReasoningOptions: vi.fn().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), + getReasoningOptions: mock().mockReturnValue({ anthropic: { thinking: { budget: 5000 } } }), }) const model = createMockModel() const executor = new LLMExecutor(adapter, model) diff --git a/packages/runtime/src/llm/mock-executor.test.ts b/packages/runtime/src/llm/mock-executor.test.ts index 45c7dd26..fe3a21e1 100644 --- a/packages/runtime/src/llm/mock-executor.test.ts +++ b/packages/runtime/src/llm/mock-executor.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createMockLLMExecutor, MockLLMExecutor } from "./mock-executor.js" describe("MockLLMExecutor", () => { diff --git a/packages/runtime/src/messages/message.test.ts b/packages/runtime/src/messages/message.test.ts index b0efdb55..14d6f6af 100644 --- a/packages/runtime/src/messages/message.test.ts +++ b/packages/runtime/src/messages/message.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createInstructionMessage } from "./instruction-message.js" import { createExpertMessage, diff --git a/packages/runtime/src/orchestration/coordinator-executor.test.ts b/packages/runtime/src/orchestration/coordinator-executor.test.ts index ededa333..d61ab1e3 100644 --- a/packages/runtime/src/orchestration/coordinator-executor.test.ts +++ b/packages/runtime/src/orchestration/coordinator-executor.test.ts @@ -1,12 +1,27 @@ +import { afterAll, describe, expect, it, mock } from "bun:test" import type { Checkpoint, Expert, RunSetting, RuntimeEvent } from "@perstack/core" import type { SkillAdapterLifecycleEvent } from "@perstack/skill-manager" -import { describe, expect, it, vi } from "vitest" import { CoordinatorExecutor } from "./coordinator-executor.js" +// Hoisted mock variables (inlined from vi.hoisted) +const mockSkillManagerInstance = { + getToolDefinitions: mock().mockReturnValue([]), + getAdapterByToolName: mock(), + callTool: mock(), + close: mock().mockResolvedValue(undefined), + isClosed: false, + getAdapters: mock().mockReturnValue(new Map()), +} +const capturedOnLifecycleEvent: { + current: ((event: SkillAdapterLifecycleEvent) => void) | undefined +} = { + current: undefined, +} + // Mock dependencies -vi.mock("../helpers/index.js", () => ({ - getContextWindow: vi.fn().mockReturnValue(100000), - setupExperts: vi.fn().mockResolvedValue({ +mock.module("../helpers/index.js", () => ({ + getContextWindow: mock().mockReturnValue(100000), + setupExperts: mock().mockResolvedValue({ expertToRun: { key: "test-expert", name: "Test Expert", @@ -22,77 +37,63 @@ vi.mock("../helpers/index.js", () => ({ }, }, }), - validateRuntimeVersion: vi.fn(), - createInitialCheckpoint: vi.fn().mockImplementation((id, params) => ({ - id, - jobId: params.jobId, - runId: params.runId, - status: "init", - stepNumber: 0, - messages: [], - expert: params.expert, - usage: { - inputTokens: 0, - outputTokens: 0, - reasoningTokens: 0, - totalTokens: 0, - cachedInputTokens: 0, - }, - contextWindow: params.contextWindow, - })), - createRunStartCheckpoint: vi.fn().mockImplementation((id, checkpoint, runId) => ({ - ...checkpoint, - id, - runId, - stepNumber: 1, - })), -})) - -const { mockSkillManagerInstance, capturedOnLifecycleEvent } = vi.hoisted(() => ({ - mockSkillManagerInstance: { - getToolDefinitions: vi.fn().mockReturnValue([]), - getAdapterByToolName: vi.fn(), - callTool: vi.fn(), - close: vi.fn().mockResolvedValue(undefined), - isClosed: false, - getAdapters: vi.fn().mockReturnValue(new Map()), - }, - capturedOnLifecycleEvent: { - current: undefined as ((event: SkillAdapterLifecycleEvent) => void) | undefined, - }, + validateRuntimeVersion: mock(), + createInitialCheckpoint: mock().mockImplementation( + (id: string, params: Record) => ({ + id, + jobId: params.jobId, + runId: params.runId, + status: "init", + stepNumber: 0, + messages: [], + expert: params.expert, + usage: { + inputTokens: 0, + outputTokens: 0, + reasoningTokens: 0, + totalTokens: 0, + cachedInputTokens: 0, + }, + contextWindow: params.contextWindow, + }), + ), + createRunStartCheckpoint: mock().mockImplementation( + (id: string, checkpoint: Record, runId: string) => ({ + ...checkpoint, + id, + runId, + stepNumber: 1, + }), + ), })) -vi.mock("@perstack/skill-manager", () => ({ +mock.module("@perstack/skill-manager", () => ({ SkillManager: { - fromExpert: vi - .fn() - .mockImplementation( - ( - _expert: unknown, - _experts: unknown, - options: { onLifecycleEvent?: (event: SkillAdapterLifecycleEvent) => void }, - ) => { - capturedOnLifecycleEvent.current = options?.onLifecycleEvent - return Promise.resolve(mockSkillManagerInstance) - }, - ), - fromLockfile: vi - .fn() - .mockImplementation( - ( - _expert: unknown, - _experts: unknown, - options: { onLifecycleEvent?: (event: SkillAdapterLifecycleEvent) => void }, - ) => { - capturedOnLifecycleEvent.current = options?.onLifecycleEvent - return Promise.resolve(mockSkillManagerInstance) - }, - ), + fromExpert: mock().mockImplementation( + ( + _expert: unknown, + _experts: unknown, + options: { onLifecycleEvent?: (event: SkillAdapterLifecycleEvent) => void }, + ) => { + capturedOnLifecycleEvent.current = options?.onLifecycleEvent + return Promise.resolve(mockSkillManagerInstance) + }, + ), + fromLockfile: mock().mockImplementation( + ( + _expert: unknown, + _experts: unknown, + options: { onLifecycleEvent?: (event: SkillAdapterLifecycleEvent) => void }, + ) => { + capturedOnLifecycleEvent.current = options?.onLifecycleEvent + return Promise.resolve(mockSkillManagerInstance) + }, + ), }, })) -vi.mock("../state-machine/index.js", () => ({ - executeStateMachine: vi.fn().mockResolvedValue({ +mock.module("../state-machine/index.js", () => ({ + executeStateMachine: mock().mockResolvedValue({ id: "result-cp", jobId: "job-1", runId: "run-1", @@ -111,6 +112,10 @@ vi.mock("../state-machine/index.js", () => ({ }), })) +afterAll(() => { + mock.restore() +}) + const createMockSetting = (overrides?: Partial): RunSetting => ({ jobId: "job-1", @@ -197,7 +202,7 @@ describe("@perstack/runtime: coordinator-executor", () => { }) it("emits init event when eventListener is provided", async () => { - const eventListener = vi.fn() + const eventListener = mock() const executor = new CoordinatorExecutor({ eventListener }) const setting = createMockSetting() @@ -241,7 +246,7 @@ describe("@perstack/runtime: coordinator-executor", () => { it("passes resolveExpertToRun to setupExperts", async () => { const { setupExperts } = await import("../helpers/index.js") - const resolveExpertToRun = vi.fn().mockResolvedValue({} as Expert) + const resolveExpertToRun = mock().mockResolvedValue({} as Expert) const executor = new CoordinatorExecutor({ resolveExpertToRun }) const setting = createMockSetting() @@ -252,7 +257,7 @@ describe("@perstack/runtime: coordinator-executor", () => { it("passes shouldContinueRun to executeStateMachine", async () => { const { executeStateMachine } = await import("../state-machine/index.js") - const shouldContinueRun = vi.fn().mockResolvedValue(true) + const shouldContinueRun = mock().mockResolvedValue(true) const executor = new CoordinatorExecutor({ shouldContinueRun }) const setting = createMockSetting() @@ -267,7 +272,7 @@ describe("@perstack/runtime: coordinator-executor", () => { it("passes storeCheckpoint to executeStateMachine", async () => { const { executeStateMachine } = await import("../state-machine/index.js") - const storeCheckpoint = vi.fn() + const storeCheckpoint = mock() const executor = new CoordinatorExecutor({ storeCheckpoint }) const setting = createMockSetting() @@ -282,7 +287,7 @@ describe("@perstack/runtime: coordinator-executor", () => { it("passes onLifecycleEvent bridge to SkillManager", async () => { const { SkillManager } = await import("@perstack/skill-manager") - const eventListener = vi.fn() + const eventListener = mock() const executor = new CoordinatorExecutor({ eventListener }) const setting = createMockSetting() diff --git a/packages/runtime/src/orchestration/delegation-executor.test.ts b/packages/runtime/src/orchestration/delegation-executor.test.ts index a99392cc..b1fe467c 100644 --- a/packages/runtime/src/orchestration/delegation-executor.test.ts +++ b/packages/runtime/src/orchestration/delegation-executor.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock, spyOn } from "bun:test" import type { Checkpoint, DelegationTarget, RunSetting, Usage } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { type DelegationContext, DelegationExecutor, @@ -65,7 +65,7 @@ describe("@perstack/runtime: delegation-executor", () => { const setting = createMockSetting() const context = createMockContext() const parentExpert = { key: "parent", name: "Parent", version: "1.0" } - const runFn = vi.fn() + const runFn = mock() await expect(executor.execute([], setting, context, parentExpert, runFn)).rejects.toThrow( "DelegationExecutor requires at least one delegation", @@ -95,7 +95,7 @@ describe("@perstack/runtime: delegation-executor", () => { ], } - const runFn = vi.fn().mockResolvedValueOnce(resultCheckpoint) + const runFn = mock().mockResolvedValueOnce(resultCheckpoint) const result = await executor.execute([delegation], setting, context, parentExpert, runFn) @@ -134,8 +134,7 @@ describe("@perstack/runtime: delegation-executor", () => { ], }) - const runFn = vi - .fn() + const runFn = mock() .mockResolvedValueOnce(createMockResultCheckpoint("expert-a", 3)) .mockResolvedValueOnce(createMockResultCheckpoint("expert-b", 5)) @@ -182,8 +181,7 @@ describe("@perstack/runtime: delegation-executor", () => { ], }) - const runFn = vi - .fn() + const runFn = mock() .mockResolvedValueOnce(createMockResultCheckpoint("expert-a")) .mockResolvedValueOnce(createMockResultCheckpoint("expert-b")) @@ -228,8 +226,7 @@ describe("@perstack/runtime: delegation-executor", () => { ], }) - const runFn = vi - .fn() + const runFn = mock() .mockResolvedValueOnce(createMockResultCheckpoint("expert-a")) .mockResolvedValueOnce(createMockResultCheckpoint("expert-b")) @@ -275,8 +272,7 @@ describe("@perstack/runtime: delegation-executor", () => { ], }) - const runFn = vi - .fn() + const runFn = mock() .mockResolvedValueOnce( createMockResultCheckpoint({ inputTokens: 100, @@ -311,7 +307,7 @@ describe("@perstack/runtime: delegation-executor", () => { const context = createMockContext() const parentExpert = { key: "parent", name: "Parent", version: "1.0" } - const runFn = vi.fn().mockResolvedValue({ + const runFn = mock().mockResolvedValue({ ...createMockCheckpoint(), status: "stoppedByError", messages: [], @@ -331,7 +327,7 @@ describe("@perstack/runtime: delegation-executor", () => { const context = createMockContext() const parentExpert = { key: "parent", name: "Parent", version: "1.0" } - const runFn = vi.fn().mockRejectedValue(new Error("MCP connection failed")) + const runFn = mock().mockRejectedValue(new Error("MCP connection failed")) const result = await executor.execute(delegations, setting, context, parentExpert, runFn) @@ -350,7 +346,7 @@ describe("@perstack/runtime: delegation-executor", () => { const context = createMockContext() const parentExpert = { key: "parent", name: "Parent", version: "1.0" } - const runFn = vi.fn().mockResolvedValue({ + const runFn = mock().mockResolvedValue({ ...createMockCheckpoint(), status: "completed", messages: [{ id: "msg-1", type: "userMessage", contents: [] }], @@ -362,7 +358,7 @@ describe("@perstack/runtime: delegation-executor", () => { }) it("uses empty string and warns when delegation result has no text part", async () => { - const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}) + const warnSpy = spyOn(console, "warn").mockImplementation(() => {}) const executor = new DelegationExecutor() const setting = createMockSetting() const delegations = [ @@ -372,7 +368,7 @@ describe("@perstack/runtime: delegation-executor", () => { const context = createMockContext() const parentExpert = { key: "parent", name: "Parent", version: "1.0" } - const runFn = vi.fn().mockResolvedValue({ + const runFn = mock().mockResolvedValue({ ...createMockCheckpoint(), status: "completed", messages: [ @@ -413,13 +409,12 @@ describe("@perstack/runtime: delegation-executor", () => { ], }) - const runFn = vi - .fn() + const runFn = mock() .mockResolvedValueOnce(createMockResultCheckpoint("expert-a")) .mockResolvedValueOnce(createMockResultCheckpoint("expert-b")) - const storeCheckpoint = vi.fn() - const eventListener = vi.fn() + const storeCheckpoint = mock() + const eventListener = mock() const parentOptions = { storeCheckpoint, eventListener, diff --git a/packages/runtime/src/run.test.ts b/packages/runtime/src/run.test.ts index 4716e089..475dfd97 100644 --- a/packages/runtime/src/run.test.ts +++ b/packages/runtime/src/run.test.ts @@ -1,22 +1,24 @@ +import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test" import type { Checkpoint, Job } from "@perstack/core" -import { beforeEach, describe, expect, it, vi } from "vitest" import { createCheckpoint, createRunSetting } from "../test/run-params.js" import { createEmptyUsage } from "./helpers/usage.js" import { run } from "./run.js" -const mockExecute = vi.fn() -const mockBuildReturnFromDelegation = vi.fn() +const mockExecute = mock() +const mockBuildReturnFromDelegation = mock() // Mock CoordinatorExecutor as a class -vi.mock("./orchestration/index.js", async (importOriginal) => { - const original = await importOriginal() - return { - ...original, - CoordinatorExecutor: class MockCoordinatorExecutor { - execute = mockExecute - }, - buildReturnFromDelegation: (...args: unknown[]) => mockBuildReturnFromDelegation(...args), - } +const originalOrchestrationModule = await import("./orchestration/index.js") +mock.module("./orchestration/index.js", () => ({ + ...originalOrchestrationModule, + CoordinatorExecutor: class MockCoordinatorExecutor { + execute = mockExecute + }, + buildReturnFromDelegation: (...args: unknown[]) => mockBuildReturnFromDelegation(...args), +})) + +afterAll(() => { + mock.restore() }) describe("@perstack/runtime: run", () => { @@ -24,7 +26,8 @@ describe("@perstack/runtime: run", () => { const checkpoint = createCheckpoint({ jobId: "test-job-id" }) beforeEach(() => { - vi.clearAllMocks() + mockExecute.mockClear() + mockBuildReturnFromDelegation.mockClear() }) function setupMockExecutor(results: Array<{ checkpoint: Checkpoint; expertToRun?: unknown }>) { @@ -90,8 +93,8 @@ describe("@perstack/runtime: run", () => { const completedCheckpoint = createCheckpoint({ status: "completed" }) setupMockExecutor([{ checkpoint: completedCheckpoint }]) - const storeJob = vi.fn() - const retrieveJob = vi.fn().mockResolvedValue(undefined) + const storeJob = mock() + const retrieveJob = mock().mockResolvedValue(undefined) await run({ setting, checkpoint }, { storeJob, retrieveJob }) @@ -121,8 +124,8 @@ describe("@perstack/runtime: run", () => { cachedInputTokens: 0, }, } - const storeJob = vi.fn() - const retrieveJob = vi.fn().mockResolvedValue(existingJob) + const storeJob = mock() + const retrieveJob = mock().mockResolvedValue(existingJob) await run({ setting, checkpoint }, { storeJob, retrieveJob }) @@ -148,8 +151,8 @@ describe("@perstack/runtime: run", () => { cachedInputTokens: 0, }, } - const storeJob = vi.fn() - const retrieveJob = vi.fn().mockResolvedValue(pausedJob) + const storeJob = mock() + const retrieveJob = mock().mockResolvedValue(pausedJob) await run({ setting, checkpoint }, { storeJob, retrieveJob }) @@ -161,7 +164,7 @@ describe("@perstack/runtime: run", () => { const completedCheckpoint = createCheckpoint({ status: "completed", stepNumber: 3 }) setupMockExecutor([{ checkpoint: completedCheckpoint }]) - const storeJob = vi.fn() + const storeJob = mock() await run({ setting, checkpoint }, { storeJob }) @@ -175,7 +178,7 @@ describe("@perstack/runtime: run", () => { const stoppedCheckpoint = createCheckpoint({ status: "stoppedByError" }) setupMockExecutor([{ checkpoint: stoppedCheckpoint }]) - const storeJob = vi.fn() + const storeJob = mock() await run({ setting, checkpoint }, { storeJob }) @@ -187,7 +190,7 @@ describe("@perstack/runtime: run", () => { const stoppedCheckpoint = createCheckpoint({ status: "stoppedByCancellation" }) setupMockExecutor([{ checkpoint: stoppedCheckpoint }]) - const storeJob = vi.fn() + const storeJob = mock() await run({ setting, checkpoint }, { storeJob }) @@ -249,7 +252,7 @@ describe("@perstack/runtime: run", () => { checkpoint: continueCheckpoint, }) - const retrieveCheckpoint = vi.fn().mockResolvedValue(parentCheckpoint) + const retrieveCheckpoint = mock().mockResolvedValue(parentCheckpoint) const result = await run({ setting, checkpoint }, { retrieveCheckpoint }) @@ -300,8 +303,8 @@ describe("@perstack/runtime: run", () => { startedAt: Date.now(), usage: createEmptyUsage(), } - const createJob = vi.fn().mockReturnValue(customJob) - const storeJob = vi.fn() + const createJob = mock().mockReturnValue(customJob) + const storeJob = mock() await run({ setting, checkpoint }, { createJob, storeJob }) diff --git a/packages/runtime/src/state-machine/actor-factory.test.ts b/packages/runtime/src/state-machine/actor-factory.test.ts index 132b7bef..203efd33 100644 --- a/packages/runtime/src/state-machine/actor-factory.test.ts +++ b/packages/runtime/src/state-machine/actor-factory.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it } from "bun:test" import type { Checkpoint, RunSetting } from "@perstack/core" import type { SkillManager } from "@perstack/skill-manager" -import { describe, expect, it } from "vitest" import type { LLMExecutor } from "../llm/index.js" import { createMockLLMExecutor } from "../llm/index.js" import { DefaultActorFactory, defaultActorFactory } from "./actor-factory.js" diff --git a/packages/runtime/src/state-machine/coordinator.test.ts b/packages/runtime/src/state-machine/coordinator.test.ts index 123a3a69..5a98d36c 100644 --- a/packages/runtime/src/state-machine/coordinator.test.ts +++ b/packages/runtime/src/state-machine/coordinator.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock } from "bun:test" import type { Checkpoint, RunEvent } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import type { ActorFactory } from "./actor-factory.js" import { StateMachineCoordinator, @@ -31,12 +31,12 @@ function createMockParams(overrides: Partial = {}): StateMac cachedInputTokens: 0, }, }, - eventListener: vi.fn().mockResolvedValue(undefined), + eventListener: mock().mockResolvedValue(undefined), skillManager: {} as never, eventEmitter: { - emit: vi.fn().mockResolvedValue(undefined), + emit: mock().mockResolvedValue(undefined), }, - storeCheckpoint: vi.fn().mockResolvedValue(undefined), + storeCheckpoint: mock().mockResolvedValue(undefined), ...overrides, } as StateMachineParams } @@ -44,14 +44,14 @@ function createMockParams(overrides: Partial = {}): StateMac function createMockActor(subscribeCallback?: (state: RunSnapshot) => void) { const subscribers: Array<(state: RunSnapshot) => void> = [] return { - subscribe: vi.fn((callback: (state: RunSnapshot) => void) => { + subscribe: mock((callback: (state: RunSnapshot) => void) => { subscribers.push(callback) if (subscribeCallback) { subscribeCallback = callback } - return { unsubscribe: vi.fn() } + return { unsubscribe: mock() } }), - start: vi.fn(() => { + start: mock(() => { // Simulate starting and immediately transitioning to Stopped for (const sub of subscribers) { sub({ @@ -71,20 +71,20 @@ function createMockActor(subscribeCallback?: (state: RunSnapshot) => void) { cachedInputTokens: 0, }, }, - eventListener: vi.fn(), + eventListener: mock(), skillManager: {} as never, }, } as unknown as RunSnapshot) } }), - stop: vi.fn(), - send: vi.fn(), + stop: mock(), + send: mock(), } } function createMockActorFactory(actor = createMockActor()): ActorFactory { return { - create: vi.fn().mockReturnValue(actor), + create: mock().mockReturnValue(actor), } } @@ -99,7 +99,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { it("accepts custom dependencies", () => { const params = createMockParams() const mockFactory = createMockActorFactory() - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const mockLogics = {} as unknown as StateMachineLogicsType const coordinator = new StateMachineCoordinator(params, { @@ -117,7 +117,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const params = createMockParams() const mockActor = createMockActor() const mockFactory = createMockActorFactory(mockActor) - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const coordinator = new StateMachineCoordinator(params, { actorFactory: mockFactory, @@ -141,7 +141,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const params = createMockParams() const mockActor = createMockActor() const mockFactory = createMockActorFactory(mockActor) - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const coordinator = new StateMachineCoordinator(params, { actorFactory: mockFactory, @@ -157,7 +157,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const params = createMockParams() const mockActor = createMockActor() const mockFactory = createMockActorFactory(mockActor) - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const coordinator = new StateMachineCoordinator(params, { actorFactory: mockFactory, @@ -173,7 +173,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const params = createMockParams() const mockActor = createMockActor() const mockFactory = createMockActorFactory(mockActor) - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const coordinator = new StateMachineCoordinator(params, { actorFactory: mockFactory, @@ -190,7 +190,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const params = createMockParams() const mockActor = createMockActor() const mockFactory = createMockActorFactory(mockActor) - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const coordinator = new StateMachineCoordinator(params, { actorFactory: mockFactory, @@ -206,14 +206,14 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { describe("handleStateChange", () => { it("handles stopped state correctly", async () => { const params = createMockParams() - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) // Create actor that doesn't auto-start const mockActor = { - subscribe: vi.fn().mockReturnValue({ unsubscribe: vi.fn() }), - start: vi.fn(), - stop: vi.fn(), - send: vi.fn(), + subscribe: mock().mockReturnValue({ unsubscribe: mock() }), + start: mock(), + stop: mock(), + send: mock(), } const mockFactory = createMockActorFactory(mockActor as never) @@ -255,10 +255,10 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { it("handles active state and calls logics", async () => { const params = createMockParams() - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const mockEvent: RunEvent = { type: "startRun" } as unknown as RunEvent - const mockInitLogic = vi.fn().mockResolvedValue(mockEvent) + const mockInitLogic = mock().mockResolvedValue(mockEvent) const mockLogics = { Init: mockInitLogic, } as unknown as StateMachineLogicsType @@ -287,17 +287,17 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const subscribers: Array<(state: RunSnapshot) => void> = [] const mockActor = { - subscribe: vi.fn((callback) => { + subscribe: mock((callback) => { subscribers.push(callback) - return { unsubscribe: vi.fn() } + return { unsubscribe: mock() } }), - start: vi.fn(() => { + start: mock(() => { for (const sub of subscribers) { sub(states[stateIndex++] as unknown as RunSnapshot) } }), - stop: vi.fn(), - send: vi.fn(() => { + stop: mock(), + send: mock(() => { // On send, transition to next state for (const sub of subscribers) { sub(states[stateIndex++] as unknown as RunSnapshot) @@ -321,7 +321,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { it("stores checkpoint when event contains checkpoint", async () => { const params = createMockParams() - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const eventCheckpoint = { status: "proceeding", stepNumber: 1, @@ -337,7 +337,7 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const mockEvent = { type: "startRun", checkpoint: eventCheckpoint } as unknown as RunEvent const mockLogics = { - Init: vi.fn().mockResolvedValue(mockEvent), + Init: mock().mockResolvedValue(mockEvent), } as unknown as StateMachineLogicsType let stateIndex = 0 @@ -354,17 +354,17 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { const subscribers: Array<(state: RunSnapshot) => void> = [] const mockActor = { - subscribe: vi.fn((callback) => { + subscribe: mock((callback) => { subscribers.push(callback) - return { unsubscribe: vi.fn() } + return { unsubscribe: mock() } }), - start: vi.fn(() => { + start: mock(() => { for (const sub of subscribers) { sub(states[stateIndex++] as unknown as RunSnapshot) } }), - stop: vi.fn(), - send: vi.fn(() => { + stop: mock(), + send: mock(() => { for (const sub of subscribers) { sub(states[stateIndex++] as unknown as RunSnapshot) } @@ -384,22 +384,22 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { }) it("respects shouldContinueRun callback and sets stoppedByCancellation status", async () => { - const shouldContinueRun = vi.fn().mockResolvedValue(false) + const shouldContinueRun = mock().mockResolvedValue(false) const params = createMockParams({ shouldContinueRun }) - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const mockEvent = { type: "startRun" } as unknown as RunEvent const mockLogics = { - Init: vi.fn().mockResolvedValue(mockEvent), + Init: mock().mockResolvedValue(mockEvent), } as unknown as StateMachineLogicsType const subscribers: Array<(state: RunSnapshot) => void> = [] const mockActor = { - subscribe: vi.fn((callback) => { + subscribe: mock((callback) => { subscribers.push(callback) - return { unsubscribe: vi.fn() } + return { unsubscribe: mock() } }), - start: vi.fn(() => { + start: mock(() => { for (const sub of subscribers) { sub({ value: "Init", @@ -412,8 +412,8 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { } as unknown as RunSnapshot) } }), - stop: vi.fn(), - send: vi.fn(), + stop: mock(), + send: mock(), } const mockFactory = createMockActorFactory(mockActor as never) @@ -436,20 +436,20 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { describe("error handling", () => { it("closes skill managers on error", async () => { const params = createMockParams() - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const testError = new Error("Test error") const mockLogics = { - Init: vi.fn().mockRejectedValue(testError), + Init: mock().mockRejectedValue(testError), } as unknown as StateMachineLogicsType const subscribers: Array<(state: RunSnapshot) => void> = [] const mockActor = { - subscribe: vi.fn((callback) => { + subscribe: mock((callback) => { subscribers.push(callback) - return { unsubscribe: vi.fn() } + return { unsubscribe: mock() } }), - start: vi.fn(() => { + start: mock(() => { for (const sub of subscribers) { sub({ value: "Init", @@ -457,8 +457,8 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { } as unknown as RunSnapshot) } }), - stop: vi.fn(), - send: vi.fn(), + stop: mock(), + send: mock(), } const mockFactory = createMockActorFactory(mockActor as never) @@ -474,15 +474,15 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { it("throws error when checkpoint is undefined in stopped state", async () => { const params = createMockParams() - const mockCloseManagers = vi.fn().mockResolvedValue(undefined) + const mockCloseManagers = mock().mockResolvedValue(undefined) const subscribers: Array<(state: RunSnapshot) => void> = [] const mockActor = { - subscribe: vi.fn((callback) => { + subscribe: mock((callback) => { subscribers.push(callback) - return { unsubscribe: vi.fn() } + return { unsubscribe: mock() } }), - start: vi.fn(() => { + start: mock(() => { for (const sub of subscribers) { sub({ value: "Stopped", @@ -490,8 +490,8 @@ describe("@perstack/runtime: StateMachineCoordinator", () => { } as unknown as RunSnapshot) } }), - stop: vi.fn(), - send: vi.fn(), + stop: mock(), + send: mock(), } const mockFactory = createMockActorFactory(mockActor as never) diff --git a/packages/runtime/src/state-machine/executor.test.ts b/packages/runtime/src/state-machine/executor.test.ts index 79499d33..3b17bfef 100644 --- a/packages/runtime/src/state-machine/executor.test.ts +++ b/packages/runtime/src/state-machine/executor.test.ts @@ -1,11 +1,11 @@ -import { describe, expect, it, vi } from "vitest" +import { afterAll, describe, expect, it, mock } from "bun:test" import type { ExecuteStateMachineParams } from "./executor.js" // Mock the coordinator module -vi.mock("./coordinator.js", () => ({ +mock.module("./coordinator.js", () => ({ StateMachineCoordinator: class MockCoordinator { constructor(public params: ExecuteStateMachineParams) {} - execute = vi.fn().mockResolvedValue({ + execute = mock().mockResolvedValue({ status: "completed", stepNumber: 1, messages: [], @@ -20,6 +20,10 @@ vi.mock("./coordinator.js", () => ({ }, })) +afterAll(() => { + mock.restore() +}) + import { executeStateMachine } from "./executor.js" function createMockParams(): ExecuteStateMachineParams { @@ -45,12 +49,12 @@ function createMockParams(): ExecuteStateMachineParams { cachedInputTokens: 0, }, }, - eventListener: vi.fn().mockResolvedValue(undefined), + eventListener: mock().mockResolvedValue(undefined), skillManagers: {}, eventEmitter: { - emit: vi.fn().mockResolvedValue(undefined), + emit: mock().mockResolvedValue(undefined), }, - storeCheckpoint: vi.fn().mockResolvedValue(undefined), + storeCheckpoint: mock().mockResolvedValue(undefined), } as unknown as ExecuteStateMachineParams } diff --git a/packages/runtime/src/state-machine/states/calling-delegates.test.ts b/packages/runtime/src/state-machine/states/calling-delegates.test.ts index d8e436d5..19de9d5c 100644 --- a/packages/runtime/src/state-machine/states/calling-delegates.test.ts +++ b/packages/runtime/src/state-machine/states/calling-delegates.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { Checkpoint } from "@perstack/core" -import { describe, expect, it } from "vitest" type StopRunByDelegateResult = { type: "stopRunByDelegate" diff --git a/packages/runtime/src/state-machine/states/calling-interactive-tools.test.ts b/packages/runtime/src/state-machine/states/calling-interactive-tools.test.ts index 5e38065b..d097ac2f 100644 --- a/packages/runtime/src/state-machine/states/calling-interactive-tools.test.ts +++ b/packages/runtime/src/state-machine/states/calling-interactive-tools.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createCheckpoint, createMockSkillManagerFromAdapters, diff --git a/packages/runtime/src/state-machine/states/calling-mcp-tools.test.ts b/packages/runtime/src/state-machine/states/calling-mcp-tools.test.ts index 5dc864e7..f951e1b8 100644 --- a/packages/runtime/src/state-machine/states/calling-mcp-tools.test.ts +++ b/packages/runtime/src/state-machine/states/calling-mcp-tools.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it, mock } from "bun:test" import { createId } from "@paralleldrive/cuid2" import type { SkillAdapter, SkillManager } from "@perstack/skill-manager" -import { describe, expect, it, vi } from "vitest" import { createCheckpoint, createRunSetting, createStep } from "../../../test/run-params.js" import type { LLMExecutor } from "../../llm/index.js" import { createMockLLMExecutor } from "../../llm/index.js" @@ -94,10 +94,10 @@ describe("@perstack/runtime: callingMcpToolsLogic", () => { { id: "tc_3", skillName: "skill-b", toolName: "tool3", args: { x: 3 } }, ], }) - const callToolA = vi.fn(async (toolName: string) => [ + const callToolA = mock(async (toolName: string) => [ { type: "textPart", text: `Result from ${toolName}`, id: createId() }, ]) - const callToolB = vi.fn(async (toolName: string) => [ + const callToolB = mock(async (toolName: string) => [ { type: "textPart", text: `Result from ${toolName}`, id: createId() }, ]) const skillManager = createMockSkillManager({ @@ -132,7 +132,7 @@ describe("@perstack/runtime: callingMcpToolsLogic", () => { { id: "tc_second", skillName: "test-skill", toolName: "fastTool", args: {} }, ], }) - const callTool = vi.fn(async (toolName: string) => { + const callTool = mock(async (toolName: string) => { if (toolName === "slowTool") { await new Promise((r) => setTimeout(r, 50)) } @@ -167,7 +167,7 @@ describe("@perstack/runtime: callingMcpToolsLogic", () => { ], }) const DELAY_MS = 30 - const callTool = vi.fn(async () => { + const callTool = mock(async () => { await new Promise((r) => setTimeout(r, DELAY_MS)) return [{ type: "textPart", text: "done", id: createId() }] }) diff --git a/packages/runtime/src/state-machine/states/finishing-step.test.ts b/packages/runtime/src/state-machine/states/finishing-step.test.ts index f17ae63c..6a896144 100644 --- a/packages/runtime/src/state-machine/states/finishing-step.test.ts +++ b/packages/runtime/src/state-machine/states/finishing-step.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createCheckpoint, createMockSkillManagerFromAdapters, diff --git a/packages/runtime/src/state-machine/states/generating-tool-call.test.ts b/packages/runtime/src/state-machine/states/generating-tool-call.test.ts index 1b2a22f5..ec3a6eec 100644 --- a/packages/runtime/src/state-machine/states/generating-tool-call.test.ts +++ b/packages/runtime/src/state-machine/states/generating-tool-call.test.ts @@ -1,6 +1,6 @@ +import { beforeEach, describe, expect, it } from "bun:test" import type { SkillAdapter, SkillManager } from "@perstack/skill-manager" import type { GenerateTextResult, ToolSet } from "ai" -import { beforeEach, describe, expect, it } from "vitest" import { createCheckpoint, createRunSetting, createStep } from "../../../test/run-params.js" import type { LLMExecutor } from "../../llm/index.js" import { createMockLLMExecutor, type MockLLMExecutor } from "../../llm/index.js" diff --git a/packages/runtime/src/state-machine/states/init.test.ts b/packages/runtime/src/state-machine/states/init.test.ts index 95f745cb..0e55473d 100644 --- a/packages/runtime/src/state-machine/states/init.test.ts +++ b/packages/runtime/src/state-machine/states/init.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createCheckpoint, createMockSkillManagerFromAdapters, diff --git a/packages/runtime/src/state-machine/states/preparing-for-step.test.ts b/packages/runtime/src/state-machine/states/preparing-for-step.test.ts index 63f00b91..e289bd88 100644 --- a/packages/runtime/src/state-machine/states/preparing-for-step.test.ts +++ b/packages/runtime/src/state-machine/states/preparing-for-step.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { createCheckpoint, createMockSkillManagerFromAdapters, diff --git a/packages/runtime/src/state-machine/states/resolving-tool-result.test.ts b/packages/runtime/src/state-machine/states/resolving-tool-result.test.ts index f01b24af..297dd58e 100644 --- a/packages/runtime/src/state-machine/states/resolving-tool-result.test.ts +++ b/packages/runtime/src/state-machine/states/resolving-tool-result.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { createId } from "@paralleldrive/cuid2" -import { describe, expect, it } from "vitest" import { createCheckpoint, createMockSkillManagerFromAdapters, diff --git a/packages/runtime/src/state-machine/states/resuming-from-stop.test.ts b/packages/runtime/src/state-machine/states/resuming-from-stop.test.ts index df4224db..26fbb8d2 100644 --- a/packages/runtime/src/state-machine/states/resuming-from-stop.test.ts +++ b/packages/runtime/src/state-machine/states/resuming-from-stop.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import { createId } from "@paralleldrive/cuid2" -import { describe, expect, it } from "vitest" import { createCheckpoint, createMockSkillManagerFromAdapters, diff --git a/packages/runtime/src/tool-execution/executor-factory.test.ts b/packages/runtime/src/tool-execution/executor-factory.test.ts index 80d328f7..fe4b7c79 100644 --- a/packages/runtime/src/tool-execution/executor-factory.test.ts +++ b/packages/runtime/src/tool-execution/executor-factory.test.ts @@ -1,11 +1,11 @@ +import { beforeEach, describe, expect, it, mock } from "bun:test" import type { ToolCall } from "@perstack/core" import type { SkillAdapter, SkillManager } from "@perstack/skill-manager" -import { beforeEach, describe, expect, it, vi } from "vitest" import { ToolExecutorFactory, toolExecutorFactory } from "./executor-factory.js" const createMockSkillManager = ( type: "mcp" | "delegate" | "interactive", - callToolFn = vi.fn(), + callToolFn = mock(), ): SkillManager => { const adapter = { type, @@ -25,7 +25,7 @@ const createMockSkillManager = ( describe("@perstack/runtime: executor-factory", () => { beforeEach(() => { - vi.clearAllMocks() + // mocks are created per test via createMockSkillManager }) describe("ToolExecutorFactory", () => { @@ -55,9 +55,7 @@ describe("@perstack/runtime: executor-factory", () => { describe("execute()", () => { it("executes MCP tool calls successfully", async () => { - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "textPart", id: "1", text: "result" }]) + const callToolFn = mock().mockResolvedValue([{ type: "textPart", id: "1", text: "result" }]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { diff --git a/packages/runtime/src/tool-execution/mcp-executor.test.ts b/packages/runtime/src/tool-execution/mcp-executor.test.ts index d6c1d4e0..f3463352 100644 --- a/packages/runtime/src/tool-execution/mcp-executor.test.ts +++ b/packages/runtime/src/tool-execution/mcp-executor.test.ts @@ -1,11 +1,11 @@ +import { beforeEach, describe, expect, it, mock } from "bun:test" import type { ToolCall } from "@perstack/core" import type { SkillAdapter, SkillManager } from "@perstack/skill-manager" -import { beforeEach, describe, expect, it, vi } from "vitest" import { McpToolExecutor } from "./mcp-executor.js" const createMockSkillManager = ( type: "mcp" | "delegate" | "interactive", - callToolFn = vi.fn(), + callToolFn = mock(), ): SkillManager => { const adapter = { type, @@ -25,7 +25,7 @@ const createMockSkillManager = ( describe("@perstack/runtime: mcp-executor", () => { beforeEach(() => { - vi.clearAllMocks() + // mocks are created per test via createMockSkillManager }) describe("McpToolExecutor", () => { @@ -35,9 +35,9 @@ describe("@perstack/runtime: mcp-executor", () => { }) it("executes a simple tool call and returns result", async () => { - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "textPart", id: "1", text: "Hello, World!" }]) + const callToolFn = mock().mockResolvedValue([ + { type: "textPart", id: "1", text: "Hello, World!" }, + ]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { @@ -79,9 +79,9 @@ describe("@perstack/runtime: mcp-executor", () => { mimeType: "image/png", size: 1024, }) - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "textPart", id: "part-1", text: fileInfo }]) + const callToolFn = mock().mockResolvedValue([ + { type: "textPart", id: "part-1", text: fileInfo }, + ]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { @@ -108,9 +108,9 @@ describe("@perstack/runtime: mcp-executor", () => { mimeType: "application/pdf", size: 2048, }) - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "textPart", id: "part-1", text: fileInfo }]) + const callToolFn = mock().mockResolvedValue([ + { type: "textPart", id: "part-1", text: fileInfo }, + ]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { @@ -130,9 +130,9 @@ describe("@perstack/runtime: mcp-executor", () => { }) it("handles non-textPart results unchanged", async () => { - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "imagePart", id: "img-1", data: "base64data" }]) + const callToolFn = mock().mockResolvedValue([ + { type: "imagePart", id: "img-1", data: "base64data" }, + ]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { @@ -150,9 +150,9 @@ describe("@perstack/runtime: mcp-executor", () => { }) it("handles non-JSON text parts for file tools", async () => { - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "textPart", id: "part-1", text: "not valid json" }]) + const callToolFn = mock().mockResolvedValue([ + { type: "textPart", id: "part-1", text: "not valid json" }, + ]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { @@ -171,9 +171,9 @@ describe("@perstack/runtime: mcp-executor", () => { }) it("handles JSON that is not FileInfo format", async () => { - const callToolFn = vi - .fn() - .mockResolvedValue([{ type: "textPart", id: "part-1", text: '{"foo": "bar"}' }]) + const callToolFn = mock().mockResolvedValue([ + { type: "textPart", id: "part-1", text: '{"foo": "bar"}' }, + ]) const skillManager = createMockSkillManager("mcp", callToolFn) const toolCall: ToolCall = { diff --git a/packages/runtime/src/tool-execution/tool-classifier.test.ts b/packages/runtime/src/tool-execution/tool-classifier.test.ts index 2fcdcc47..e592a5e4 100644 --- a/packages/runtime/src/tool-execution/tool-classifier.test.ts +++ b/packages/runtime/src/tool-execution/tool-classifier.test.ts @@ -1,13 +1,13 @@ +import { beforeEach, describe, expect, it, mock } from "bun:test" import type { SkillType, ToolCall } from "@perstack/core" import type { SkillAdapter, SkillManager } from "@perstack/skill-manager" -import { beforeEach, describe, expect, it, vi } from "vitest" import { classifyToolCalls, getToolTypeByName } from "./tool-classifier.js" function createMockAdapter(type: SkillType, toolName: string): SkillAdapter { return { type, name: `${type}-skill`, - callTool: vi.fn(), + callTool: mock(), getToolDefinitions: () => [{ name: toolName, skillName: `${type}-skill`, inputSchema: {} }], } as unknown as SkillAdapter } @@ -31,7 +31,7 @@ function createMockSkillManager(adapters: Record): SkillMa describe("@perstack/runtime: tool-classifier", () => { beforeEach(() => { - vi.clearAllMocks() + // mocks are created per test via createMockAdapter/createMockSkillManager }) describe("getToolTypeByName()", () => { diff --git a/packages/runtime/tsconfig.build.json b/packages/runtime/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/runtime/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/runtime/tsconfig.json b/packages/runtime/tsconfig.json index 8dc109a2..c32c3a8e 100644 --- a/packages/runtime/tsconfig.json +++ b/packages/runtime/tsconfig.json @@ -4,5 +4,5 @@ "resolveJsonModule": true }, "include": ["**/*.ts", "**/*.tsx", "package.json"], - "exclude": ["node_modules", "dist", "tsdown.config.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/skill-manager/package.json b/packages/skill-manager/package.json index ec677d80..6f7c6db8 100644 --- a/packages/skill-manager/package.json +++ b/packages/skill-manager/package.json @@ -22,8 +22,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", @@ -35,11 +36,9 @@ "devDependencies": { "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/skill-manager/src/adapters/delegate-adapter.test.ts b/packages/skill-manager/src/adapters/delegate-adapter.test.ts index e25ef679..d0e000aa 100644 --- a/packages/skill-manager/src/adapters/delegate-adapter.test.ts +++ b/packages/skill-manager/src/adapters/delegate-adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { Expert } from "@perstack/core" -import { describe, expect, it } from "vitest" import { DelegateSkillAdapter } from "./delegate-adapter.js" function createExpert(overrides: Partial = {}): Expert { diff --git a/packages/skill-manager/src/adapters/in-memory-base-adapter.test.ts b/packages/skill-manager/src/adapters/in-memory-base-adapter.test.ts index 4c5076e7..101c19ac 100644 --- a/packages/skill-manager/src/adapters/in-memory-base-adapter.test.ts +++ b/packages/skill-manager/src/adapters/in-memory-base-adapter.test.ts @@ -1,40 +1,45 @@ -import { describe, expect, it, vi } from "vitest" +import { afterAll, describe, expect, it, mock } from "bun:test" import type { TransportFactory } from "../transport-factory.js" import { InMemoryBaseSkillAdapter } from "./in-memory-base-adapter.js" -vi.mock("@modelcontextprotocol/sdk/client/index.js", () => { - const mockClient = vi.fn() - mockClient.prototype.connect = vi.fn().mockResolvedValue(undefined) - mockClient.prototype.listTools = vi.fn().mockResolvedValue({ - tools: [ - { - name: "read_file", - description: "Read a text file", - inputSchema: { type: "object" }, - }, - { - name: "write_file", - description: "Write a text file", - inputSchema: { type: "object" }, - }, - ], - }) - mockClient.prototype.callTool = vi.fn().mockResolvedValue({ - content: [{ type: "text", text: "file content" }], - }) - mockClient.prototype.close = vi.fn().mockResolvedValue(undefined) - return { Client: mockClient } +mock.module("@modelcontextprotocol/sdk/client/index.js", () => { + class MockClient { + connect = mock().mockResolvedValue(undefined) + listTools = mock().mockResolvedValue({ + tools: [ + { + name: "read_file", + description: "Read a text file", + inputSchema: { type: "object" }, + }, + { + name: "write_file", + description: "Write a text file", + inputSchema: { type: "object" }, + }, + ], + }) + callTool = mock().mockResolvedValue({ + content: [{ type: "text", text: "file content" }], + }) + close = mock().mockResolvedValue(undefined) + } + return { Client: MockClient } }) -vi.mock("@perstack/base", () => ({ +mock.module("@perstack/base", () => ({ BASE_SKILL_NAME: "@perstack/base", BASE_SKILL_VERSION: "0.0.1", - createBaseServer: vi.fn().mockReturnValue({ - connect: vi.fn().mockResolvedValue(undefined), - close: vi.fn().mockResolvedValue(undefined), + createBaseServer: mock().mockReturnValue({ + connect: mock().mockResolvedValue(undefined), + close: mock().mockResolvedValue(undefined), }), })) +afterAll(() => { + mock.restore() +}) + function createBaseSkill() { return { type: "mcpStdioSkill" as const, @@ -50,13 +55,13 @@ function createBaseSkill() { function createMockTransportFactory(): TransportFactory { const mockTransport = { - start: vi.fn(), - close: vi.fn(), + start: mock(), + close: mock(), } return { - createStdio: vi.fn(), - createSse: vi.fn(), - createInMemoryPair: vi.fn().mockReturnValue([mockTransport, mockTransport]), + createStdio: mock(), + createSse: mock(), + createInMemoryPair: mock().mockReturnValue([mockTransport, mockTransport]), } } diff --git a/packages/skill-manager/src/adapters/interactive-adapter.test.ts b/packages/skill-manager/src/adapters/interactive-adapter.test.ts index cea47ddb..34c79bcc 100644 --- a/packages/skill-manager/src/adapters/interactive-adapter.test.ts +++ b/packages/skill-manager/src/adapters/interactive-adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { InteractiveSkill } from "@perstack/core" -import { describe, expect, it } from "vitest" import { InteractiveSkillAdapter } from "./interactive-adapter.js" function createInteractiveSkill(overrides: Partial = {}): InteractiveSkill { diff --git a/packages/skill-manager/src/adapters/lockfile-adapter.test.ts b/packages/skill-manager/src/adapters/lockfile-adapter.test.ts index ab0c74dc..578151cd 100644 --- a/packages/skill-manager/src/adapters/lockfile-adapter.test.ts +++ b/packages/skill-manager/src/adapters/lockfile-adapter.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock } from "bun:test" import type { LockfileToolDefinition, McpSseSkill, McpStdioSkill } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import type { SkillAdapter } from "../skill-adapter.js" import type { SkillAdapterFactory } from "../skill-adapter-factory.js" import type { SkillAdapterLifecycleEvent } from "../types.js" @@ -44,26 +44,26 @@ function createMockAdapter( name: "mock-adapter", type: "mcp", state: "ready", - connect: vi.fn().mockResolvedValue(undefined), - disconnect: vi.fn().mockResolvedValue(undefined), - getToolDefinitions: vi.fn().mockReturnValue( + connect: mock().mockResolvedValue(undefined), + disconnect: mock().mockResolvedValue(undefined), + getToolDefinitions: mock().mockReturnValue( tools.map((t) => ({ ...t, inputSchema: { type: "object" }, interactive: false, })), ), - callTool: vi.fn().mockResolvedValue([{ type: "textPart", text: "real result", id: "test-id" }]), + callTool: mock().mockResolvedValue([{ type: "textPart", text: "real result", id: "test-id" }]), } as unknown as SkillAdapter } function createMockFactory(adapter?: SkillAdapter): SkillAdapterFactory { const mockAdapter = adapter ?? createMockAdapter() return { - createMcp: vi.fn().mockReturnValue(mockAdapter), - createInMemoryBase: vi.fn().mockReturnValue(mockAdapter), - createInteractive: vi.fn().mockReturnValue(mockAdapter), - createDelegate: vi.fn().mockReturnValue(mockAdapter), + createMcp: mock().mockReturnValue(mockAdapter), + createInMemoryBase: mock().mockReturnValue(mockAdapter), + createInteractive: mock().mockReturnValue(mockAdapter), + createDelegate: mock().mockReturnValue(mockAdapter), } } @@ -145,8 +145,8 @@ describe("@perstack/skill-manager: LockfileSkillAdapter", () => { }) await adapter.connect() await adapter.callTool("tool-a", { arg: "value" }) - expect(factory.createMcp).toHaveBeenCalledOnce() - expect(mockAdapter.connect).toHaveBeenCalledOnce() + expect(factory.createMcp).toHaveBeenCalledTimes(1) + expect(mockAdapter.connect).toHaveBeenCalledTimes(1) expect(mockAdapter.callTool).toHaveBeenCalledWith("tool-a", { arg: "value" }) }) @@ -162,7 +162,7 @@ describe("@perstack/skill-manager: LockfileSkillAdapter", () => { await adapter.connect() await adapter.callTool("tool-a", {}) await adapter.callTool("tool-b", {}) - expect(factory.createMcp).toHaveBeenCalledOnce() + expect(factory.createMcp).toHaveBeenCalledTimes(1) }) it("prevents race condition on concurrent callTool", async () => { @@ -176,7 +176,7 @@ describe("@perstack/skill-manager: LockfileSkillAdapter", () => { }) await adapter.connect() await Promise.all([adapter.callTool("tool-a", {}), adapter.callTool("tool-b", {})]) - expect(factory.createMcp).toHaveBeenCalledOnce() + expect(factory.createMcp).toHaveBeenCalledTimes(1) }) it("uses InMemoryBase for base skill without version", async () => { @@ -194,7 +194,7 @@ describe("@perstack/skill-manager: LockfileSkillAdapter", () => { }) await adapter.connect() await adapter.callTool("tool-a", {}) - expect(factory.createInMemoryBase).toHaveBeenCalledOnce() + expect(factory.createInMemoryBase).toHaveBeenCalledTimes(1) expect(factory.createMcp).not.toHaveBeenCalled() }) }) @@ -212,7 +212,7 @@ describe("@perstack/skill-manager: LockfileSkillAdapter", () => { await adapter.connect() await adapter.callTool("tool-a", {}) await adapter.disconnect() - expect(mockAdapter.disconnect).toHaveBeenCalledOnce() + expect(mockAdapter.disconnect).toHaveBeenCalledTimes(1) }) it("does not error if no real adapter was created", async () => { @@ -297,7 +297,7 @@ describe("@perstack/skill-manager: LockfileSkillAdapter", () => { }) it("passes onLifecycleEvent to real adapter factory context", async () => { - const onLifecycleEvent = vi.fn() + const onLifecycleEvent = mock() const mockAdapter = createMockAdapter() const factory = createMockFactory(mockAdapter) const adapter = new LockfileSkillAdapter({ diff --git a/packages/skill-manager/src/adapters/mcp-adapter.test.ts b/packages/skill-manager/src/adapters/mcp-adapter.test.ts index 68a7b556..bb9b4ad3 100644 --- a/packages/skill-manager/src/adapters/mcp-adapter.test.ts +++ b/packages/skill-manager/src/adapters/mcp-adapter.test.ts @@ -1,28 +1,34 @@ +import { afterAll, describe, expect, it, mock } from "bun:test" import type { McpSseSkill, McpStdioSkill } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import type { TransportFactory } from "../transport-factory.js" import { McpSkillAdapter } from "./mcp-adapter.js" -vi.mock("@modelcontextprotocol/sdk/client/index.js", () => { - const mockClient = vi.fn() - mockClient.prototype.connect = vi.fn().mockResolvedValue(undefined) - mockClient.prototype.listTools = vi.fn().mockResolvedValue({ - tools: [ - { - name: "test-tool", - description: "A test tool", - inputSchema: { type: "object" }, - }, - ], - }) - mockClient.prototype.callTool = vi.fn().mockResolvedValue({ - content: [{ type: "text", text: "result" }], - }) - mockClient.prototype.close = vi.fn().mockResolvedValue(undefined) - mockClient.prototype.getServerVersion = vi - .fn() - .mockReturnValue({ name: "test-server", version: "1.0" }) - return { Client: mockClient } +mock.module("@modelcontextprotocol/sdk/client/index.js", () => { + class MockClient { + connect = mock().mockResolvedValue(undefined) + listTools = mock().mockResolvedValue({ + tools: [ + { + name: "test-tool", + description: "A test tool", + inputSchema: { type: "object" }, + }, + ], + }) + callTool = mock().mockResolvedValue({ + content: [{ type: "text", text: "result" }], + }) + close = mock().mockResolvedValue(undefined) + getServerVersion = mock().mockReturnValue({ + name: "test-server", + version: "1.0", + }) + } + return { Client: MockClient } +}) + +afterAll(() => { + mock.restore() }) function createStdioSkill(overrides: Partial = {}): McpStdioSkill { @@ -53,16 +59,16 @@ function createSseSkill(overrides: Partial = {}): McpSseSkill { function createMockTransportFactory(): TransportFactory { return { - createStdio: vi.fn().mockReturnValue({ - start: vi.fn(), - close: vi.fn(), + createStdio: mock().mockReturnValue({ + start: mock(), + close: mock(), stderr: null, }), - createSse: vi.fn().mockReturnValue({ - start: vi.fn(), - close: vi.fn(), + createSse: mock().mockReturnValue({ + start: mock(), + close: mock(), }), - createInMemoryPair: vi.fn(), + createInMemoryPair: mock(), } } diff --git a/packages/skill-manager/src/skill-manager.test.ts b/packages/skill-manager/src/skill-manager.test.ts index ee7f8d6c..d9397c0e 100644 --- a/packages/skill-manager/src/skill-manager.test.ts +++ b/packages/skill-manager/src/skill-manager.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it, mock } from "bun:test" import type { Expert, McpSseSkill, McpStdioSkill, ToolDefinition } from "@perstack/core" -import { describe, expect, it, vi } from "vitest" import { InMemoryBaseSkillAdapter } from "./adapters/in-memory-base-adapter.js" import type { SkillAdapter } from "./skill-adapter.js" import type { SkillAdapterFactory } from "./skill-adapter-factory.js" @@ -19,18 +19,16 @@ function createMockAdapter( skill: undefined, expert: undefined, interactiveSkill: undefined, - connect: vi.fn().mockImplementation(async () => { + connect: mock().mockImplementation(async () => { adapter.state = "ready" }), - disconnect: vi.fn().mockImplementation(async () => { + disconnect: mock().mockImplementation(async () => { adapter.state = "closed" }), - getToolDefinitions: vi.fn().mockReturnValue(tools), - callTool: vi - .fn() - .mockResolvedValue([ - { type: "textPart", text: "mock result", id: "test-id" }, - ] as ToolCallResult), + getToolDefinitions: mock().mockReturnValue(tools), + callTool: mock().mockResolvedValue([ + { type: "textPart", text: "mock result", id: "test-id" }, + ] as ToolCallResult), } return adapter as unknown as SkillAdapter } @@ -38,7 +36,7 @@ function createMockAdapter( function createMockFactory(adapters?: Record): SkillAdapterFactory { const _defaultAdapter = createMockAdapter("default", []) return { - createMcp: vi.fn().mockImplementation((skill: McpStdioSkill | McpSseSkill) => { + createMcp: mock().mockImplementation((skill: McpStdioSkill | McpSseSkill) => { return ( adapters?.[skill.name] ?? createMockAdapter(skill.name, [ @@ -52,7 +50,7 @@ function createMockFactory(adapters?: Record): SkillAdapte ]) ) }), - createInMemoryBase: vi.fn().mockImplementation((_skill: McpStdioSkill) => { + createInMemoryBase: mock().mockImplementation((_skill: McpStdioSkill) => { return ( adapters?.["@perstack/base"] ?? createMockAdapter("@perstack/base", [ @@ -66,7 +64,7 @@ function createMockFactory(adapters?: Record): SkillAdapte ]) ) }), - createInteractive: vi.fn().mockImplementation((skill) => { + createInteractive: mock().mockImplementation((skill) => { return ( adapters?.[skill.name] ?? createMockAdapter( @@ -84,7 +82,7 @@ function createMockFactory(adapters?: Record): SkillAdapte ) ) }), - createDelegate: vi.fn().mockImplementation((expert: Expert) => { + createDelegate: mock().mockImplementation((expert: Expert) => { return ( adapters?.[expert.name] ?? createMockAdapter( @@ -172,7 +170,7 @@ describe("@perstack/skill-manager: SkillManager", () => { }, ) expect(manager.isClosed).toBe(false) - expect(factory.createInMemoryBase).toHaveBeenCalledOnce() + expect(factory.createInMemoryBase).toHaveBeenCalledTimes(1) await manager.close() }) @@ -201,8 +199,8 @@ describe("@perstack/skill-manager: SkillManager", () => { }, }) const manager = await SkillManager.fromExpert(expert, {}, { env: {}, factory }) - expect(factory.createMcp).toHaveBeenCalledOnce() - expect(factory.createInMemoryBase).toHaveBeenCalledOnce() + expect(factory.createMcp).toHaveBeenCalledTimes(1) + expect(factory.createInMemoryBase).toHaveBeenCalledTimes(1) await manager.close() }) @@ -226,7 +224,7 @@ describe("@perstack/skill-manager: SkillManager", () => { }, }) const manager = await SkillManager.fromExpert(expert, {}, { env: {}, factory }) - expect(factory.createInteractive).toHaveBeenCalledOnce() + expect(factory.createInteractive).toHaveBeenCalledTimes(1) await manager.close() }) @@ -262,7 +260,7 @@ describe("@perstack/skill-manager: SkillManager", () => { const expert = createExpert({ delegates: ["delegate-expert"] }) const experts = { "delegate-expert": delegateExpert } const manager = await SkillManager.fromExpert(expert, experts, { env: {}, factory }) - expect(factory.createDelegate).toHaveBeenCalledOnce() + expect(factory.createDelegate).toHaveBeenCalledTimes(1) await manager.close() }) @@ -276,7 +274,7 @@ describe("@perstack/skill-manager: SkillManager", () => { it("cleans up all adapters on failure", async () => { const failingAdapter = createMockAdapter("fail-skill") - ;(failingAdapter.connect as ReturnType).mockRejectedValue( + ;(failingAdapter.connect as ReturnType).mockRejectedValue( new Error("connect failed"), ) const factory = createMockFactory({ "fail-skill": failingAdapter }) @@ -308,13 +306,13 @@ describe("@perstack/skill-manager: SkillManager", () => { }) const manager = await SkillManager.fromExpert(expert, {}, { env: {}, factory }) expect(factory.createInMemoryBase).not.toHaveBeenCalled() - expect(factory.createMcp).toHaveBeenCalledOnce() + expect(factory.createMcp).toHaveBeenCalledTimes(1) await manager.close() }) it("passes onLifecycleEvent to factory context", async () => { const factory = createMockFactory() - const onLifecycleEvent = vi.fn() + const onLifecycleEvent = mock() const expert = createExpert() const manager = await SkillManager.fromExpert( expert, @@ -365,7 +363,7 @@ describe("@perstack/skill-manager: SkillManager", () => { }, }, ) - expect(factory.createDelegate).toHaveBeenCalledOnce() + expect(factory.createDelegate).toHaveBeenCalledTimes(1) await manager.close() }) }) @@ -522,7 +520,7 @@ describe("@perstack/skill-manager: SkillManager", () => { it("addSkill passes onLifecycleEvent to factory context", async () => { const factory = createMockFactory() - const onLifecycleEvent = vi.fn() + const onLifecycleEvent = mock() const manager = await SkillManager.fromExpert( createExpert(), {}, @@ -749,12 +747,12 @@ describe("InMemoryBaseSkillAdapter binding", () => { it("bindSkillManagement replaces placeholder methods", () => { const skill = createBaseSkill() const adapter = new InMemoryBaseSkillAdapter(skill) - const addSkill = vi.fn().mockResolvedValue({ tools: [] }) - const removeSkill = vi.fn().mockResolvedValue(undefined) - const addDelegate = vi.fn().mockResolvedValue({ delegateToolName: "d" }) - const removeDelegate = vi.fn().mockResolvedValue(undefined) - const createExpert = vi.fn().mockResolvedValue({ expertKey: "x" }) - const addDelegateFromConfig = vi.fn().mockResolvedValue({ delegateToolName: "d" }) + const addSkill = mock().mockResolvedValue({ tools: [] }) + const removeSkill = mock().mockResolvedValue(undefined) + const addDelegate = mock().mockResolvedValue({ delegateToolName: "d" }) + const removeDelegate = mock().mockResolvedValue(undefined) + const createExpert = mock().mockResolvedValue({ expertKey: "x" }) + const addDelegateFromConfig = mock().mockResolvedValue({ delegateToolName: "d" }) adapter.bindSkillManagement({ addSkill, removeSkill, @@ -776,7 +774,7 @@ describe("InMemoryBaseSkillAdapter binding", () => { interactive: false, }, ]) - const bindFn = vi.fn() + const bindFn = mock() ;(baseAdapter as unknown as { bindSkillManagement: typeof bindFn }).bindSkillManagement = bindFn Object.setPrototypeOf(baseAdapter, InMemoryBaseSkillAdapter.prototype) @@ -814,7 +812,7 @@ describe("InMemoryBaseSkillAdapter binding", () => { }, ]) // Add bindSkillManagement to mock and make it instanceof InMemoryBaseSkillAdapter-like - const bindFn = vi.fn() + const bindFn = mock() ;(baseAdapter as unknown as { bindSkillManagement: typeof bindFn }).bindSkillManagement = bindFn // Override prototype check Object.setPrototypeOf(baseAdapter, InMemoryBaseSkillAdapter.prototype) @@ -822,7 +820,7 @@ describe("InMemoryBaseSkillAdapter binding", () => { const factory = createMockFactory({ "@perstack/base": baseAdapter }) const expert = createExpert() const manager = await SkillManager.fromExpert(expert, {}, { env: {}, factory }) - expect(bindFn).toHaveBeenCalledOnce() + expect(bindFn).toHaveBeenCalledTimes(1) expect(bindFn).toHaveBeenCalledWith( expect.objectContaining({ addSkill: expect.any(Function), diff --git a/packages/skill-manager/src/utils/base-skill-helpers.test.ts b/packages/skill-manager/src/utils/base-skill-helpers.test.ts index 5c5552b5..4206c06d 100644 --- a/packages/skill-manager/src/utils/base-skill-helpers.test.ts +++ b/packages/skill-manager/src/utils/base-skill-helpers.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { McpSseSkill, McpStdioSkill } from "@perstack/core" -import { describe, expect, it } from "vitest" import { hasExplicitBaseVersion, isBaseSkill, shouldUseBundledBase } from "./base-skill-helpers.js" const createMcpStdioSkill = (overrides: Partial = {}): McpStdioSkill => ({ diff --git a/packages/skill-manager/src/utils/command-args.test.ts b/packages/skill-manager/src/utils/command-args.test.ts index 745eac1d..b4779314 100644 --- a/packages/skill-manager/src/utils/command-args.test.ts +++ b/packages/skill-manager/src/utils/command-args.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { McpStdioSkill } from "@perstack/core" -import { describe, expect, it } from "vitest" import { getCommandArgs } from "./command-args.js" function createSkill(overrides: Partial = {}): McpStdioSkill { diff --git a/packages/skill-manager/src/utils/ip-validator.test.ts b/packages/skill-manager/src/utils/ip-validator.test.ts index 31acc387..b9b0a96e 100644 --- a/packages/skill-manager/src/utils/ip-validator.test.ts +++ b/packages/skill-manager/src/utils/ip-validator.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest" +import { describe, expect, it } from "bun:test" import { isPrivateOrLocalIP } from "./ip-validator.js" describe("@perstack/skill-manager: isPrivateOrLocalIP", () => { diff --git a/packages/skill-manager/src/utils/mcp-converters.test.ts b/packages/skill-manager/src/utils/mcp-converters.test.ts index 2e5d6614..3b5b0a42 100644 --- a/packages/skill-manager/src/utils/mcp-converters.test.ts +++ b/packages/skill-manager/src/utils/mcp-converters.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js" -import { describe, expect, it } from "vitest" import { convertPart, convertResource, diff --git a/packages/skill-manager/tsconfig.build.json b/packages/skill-manager/tsconfig.build.json new file mode 100644 index 00000000..ee605a9d --- /dev/null +++ b/packages/skill-manager/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "." + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/skill-manager/tsconfig.json b/packages/skill-manager/tsconfig.json index ed443cff..d6effd0b 100644 --- a/packages/skill-manager/tsconfig.json +++ b/packages/skill-manager/tsconfig.json @@ -1,5 +1,5 @@ { "extends": "@tsconfig/node22/tsconfig.json", "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/tui-components/package.json b/packages/tui-components/package.json index 1b41689a..27c4ea33 100644 --- a/packages/tui-components/package.json +++ b/packages/tui-components/package.json @@ -23,8 +23,9 @@ ], "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ../../tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@perstack/core": "workspace:*", @@ -36,11 +37,9 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "@types/react": "^19.2.14", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/tui-components/src/execution/hooks/use-delegation-tree.test.ts b/packages/tui-components/src/execution/hooks/use-delegation-tree.test.ts index 02fca6f8..4b78a9f8 100644 --- a/packages/tui-components/src/execution/hooks/use-delegation-tree.test.ts +++ b/packages/tui-components/src/execution/hooks/use-delegation-tree.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { Checkpoint, PerstackEvent, ToolCall, Usage } from "@perstack/core" -import { describe, expect, it } from "vitest" import { createInitialDelegationTreeState, deriveActionLabel, diff --git a/packages/tui-components/tsconfig.build.json b/packages/tui-components/tsconfig.build.json new file mode 100644 index 00000000..c87cd0dc --- /dev/null +++ b/packages/tui-components/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/tui/package.json b/packages/tui/package.json index e699807f..4a1bff93 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -13,8 +13,9 @@ }, "scripts": { "clean": "rm -rf dist", - "build": "pnpm run clean && tsdown --config ./tsdown.config.ts", - "typecheck": "tsc --noEmit" + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "bun test" }, "dependencies": { "@paralleldrive/cuid2": "^3.3.0", @@ -27,11 +28,9 @@ "@perstack/runtime": "workspace:*", "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", - "tsdown": "^0.20.3", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.0.0" + "bun": ">=1.2.0" } } diff --git a/packages/tui/src/lib/context.test.ts b/packages/tui/src/lib/context.test.ts index 8b998343..311fc132 100644 --- a/packages/tui/src/lib/context.test.ts +++ b/packages/tui/src/lib/context.test.ts @@ -1,12 +1,16 @@ +import { afterAll, afterEach, beforeEach, describe, expect, it, mock } from "bun:test" import type { PerstackConfig } from "@perstack/core" -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { resolveRunContext } from "./context.js" -vi.mock("./run-manager.js", () => ({ - getCheckpointById: vi.fn(), - getMostRecentCheckpoint: vi.fn(), +mock.module("./run-manager.js", () => ({ + getCheckpointById: mock(), + getMostRecentCheckpoint: mock(), })) +afterAll(() => { + mock.restore() +}) + describe("resolveRunContext", () => { const originalEnv = { ...process.env } @@ -29,7 +33,7 @@ describe("resolveRunContext", () => { }) afterEach(() => { - vi.restoreAllMocks() + mock.restore() // Restore original env for (const key of Object.keys(process.env)) { delete process.env[key] diff --git a/packages/tui/src/lib/get-env.test.ts b/packages/tui/src/lib/get-env.test.ts index 6dbd1229..37cf76c5 100644 --- a/packages/tui/src/lib/get-env.test.ts +++ b/packages/tui/src/lib/get-env.test.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it } from "vitest" +import { afterEach, beforeEach, describe, expect, it } from "bun:test" import { getEnv } from "./get-env.js" describe("getEnv", () => { diff --git a/packages/tui/src/lib/provider-config.test.ts b/packages/tui/src/lib/provider-config.test.ts index 07e858d1..66e158af 100644 --- a/packages/tui/src/lib/provider-config.test.ts +++ b/packages/tui/src/lib/provider-config.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from "bun:test" import type { ProviderTable } from "@perstack/core" -import { describe, expect, it } from "vitest" import { getProviderConfig } from "./provider-config.js" type ConfigWithApiKey = { apiKey: string } diff --git a/packages/tui/tsconfig.build.json b/packages/tui/tsconfig.build.json new file mode 100644 index 00000000..c87cd0dc --- /dev/null +++ b/packages/tui/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["**/*.test.ts"] +} diff --git a/packages/tui/tsconfig.json b/packages/tui/tsconfig.json index 054c5f08..4c73f786 100644 --- a/packages/tui/tsconfig.json +++ b/packages/tui/tsconfig.json @@ -2,5 +2,5 @@ "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { "resolveJsonModule": true, "jsx": "react-jsx" }, "include": ["**/*.ts"], - "exclude": ["node_modules", "dist", "tsdown.config.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/packages/tui/tsdown.config.ts b/packages/tui/tsdown.config.ts deleted file mode 100644 index 6250021a..00000000 --- a/packages/tui/tsdown.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsdown" -import { baseConfig } from "../../tsdown.config.ts" - -export default defineConfig({ - ...baseConfig, - entry: { - "src/index": "src/index.ts", - "src/lib/context": "src/lib/context.ts", - "src/lib/interactive": "src/lib/interactive.ts", - "src/lib/get-env": "src/lib/get-env.ts", - "src/lib/provider-config": "src/lib/provider-config.ts", - }, -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 9670d4be..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,6604 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - '@biomejs/biome': - specifier: ^2.4.2 - version: 2.4.3 - '@changesets/changelog-github': - specifier: ^0.5.2 - version: 0.5.2 - '@changesets/cli': - specifier: ^2.29.8 - version: 2.29.8(@types/node@25.3.0) - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - '@vitest/coverage-v8': - specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) - dotenv: - specifier: ^17.3.1 - version: 17.3.1 - jsdom: - specifier: ^28.0.0 - version: 28.1.0(@noble/hashes@2.0.1) - knip: - specifier: 5.84.1 - version: 5.84.1(@types/node@25.3.0)(typescript@5.9.3) - smol-toml: - specifier: ^1.6.0 - version: 1.6.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - tsx: - specifier: ^4.21.0 - version: 4.21.0 - turbo: - specifier: latest - version: 2.8.10 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - apps/base: - dependencies: - '@modelcontextprotocol/sdk': - specifier: ^1.26.0 - version: 1.26.0(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../packages/core - commander: - specifier: ^14.0.3 - version: 14.0.3 - zod: - specifier: ^4.3.6 - version: 4.3.6 - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - apps/create-expert: - dependencies: - commander: - specifier: ^14.0.3 - version: 14.0.3 - devDependencies: - '@perstack/core': - specifier: workspace:* - version: link:../../packages/core - '@perstack/perstack-toml': - specifier: workspace:* - version: link:../../packages/perstack-toml - '@perstack/runtime': - specifier: workspace:* - version: link:../../packages/runtime - '@perstack/tui': - specifier: workspace:* - version: link:../../packages/tui - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - - apps/create-expert-skill: - dependencies: - '@modelcontextprotocol/sdk': - specifier: ^1.26.0 - version: 1.26.0(zod@4.3.6) - commander: - specifier: ^14.0.3 - version: 14.0.3 - ts-dedent: - specifier: ^2.2.0 - version: 2.2.0 - zod: - specifier: ^4.3.6 - version: 4.3.6 - devDependencies: - '@perstack/tui': - specifier: workspace:* - version: link:../../packages/tui - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - apps/perstack: - dependencies: - commander: - specifier: ^14.0.3 - version: 14.0.3 - devDependencies: - '@perstack/core': - specifier: workspace:* - version: link:../../packages/core - '@perstack/installer': - specifier: workspace:* - version: link:../../packages/installer - '@perstack/log': - specifier: workspace:* - version: link:../../packages/log - '@perstack/perstack-toml': - specifier: workspace:* - version: link:../../packages/perstack-toml - '@perstack/tui': - specifier: workspace:* - version: link:../../packages/tui - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/core: - dependencies: - '@paralleldrive/cuid2': - specifier: ^3.3.0 - version: 3.3.0 - zod: - specifier: ^4.3.6 - version: 4.3.6 - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/filesystem: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../core - devDependencies: - '@paralleldrive/cuid2': - specifier: ^3.3.0 - version: 3.3.0 - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/installer: - dependencies: - '@perstack/api-client': - specifier: ^0.0.56 - version: 0.0.56(@perstack/core@packages+core)(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../core - '@perstack/perstack-toml': - specifier: workspace:* - version: link:../perstack-toml - '@perstack/skill-manager': - specifier: workspace:* - version: link:../skill-manager - devDependencies: - '@perstack/tui': - specifier: workspace:* - version: link:../tui - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/log: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../core - '@perstack/filesystem-storage': - specifier: workspace:* - version: link:../filesystem - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/perstack-toml: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../core - smol-toml: - specifier: ^1.6.0 - version: 1.6.0 - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - memfs: - specifier: ^4.56.10 - version: 4.56.10(tslib@2.8.1) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/anthropic: - dependencies: - '@ai-sdk/anthropic': - specifier: ^3.0.44 - version: 3.0.46(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/azure-openai: - dependencies: - '@ai-sdk/azure': - specifier: ^3.0.31 - version: 3.0.31(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/bedrock: - dependencies: - '@ai-sdk/amazon-bedrock': - specifier: ^4.0.60 - version: 4.0.62(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/core: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../../core - undici: - specifier: ^7.22.0 - version: 7.22.0 - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/deepseek: - dependencies: - '@ai-sdk/deepseek': - specifier: ^2.0.20 - version: 2.0.20(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/google: - dependencies: - '@ai-sdk/google': - specifier: ^3.0.29 - version: 3.0.30(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/ollama: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - ollama-ai-provider-v2: - specifier: ^3.3.0 - version: 3.3.1(ai@6.0.94(zod@4.3.6))(zod@4.3.6) - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/openai: - dependencies: - '@ai-sdk/openai': - specifier: ^3.0.29 - version: 3.0.30(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/providers/vertex: - dependencies: - '@ai-sdk/google-vertex': - specifier: ^4.0.58 - version: 4.0.61(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../../core - '@perstack/provider-core': - specifier: workspace:* - version: link:../core - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/react: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../core - react: - specifier: '>=18.0.0' - version: 19.2.4 - devDependencies: - '@testing-library/react': - specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.4))(react@19.2.4) - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - '@types/react': - specifier: ^19.2.14 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) - jsdom: - specifier: ^28.0.0 - version: 28.1.0(@noble/hashes@2.0.1) - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/runtime: - dependencies: - '@ai-sdk/amazon-bedrock': - specifier: ^4.0.60 - version: 4.0.62(zod@4.3.6) - '@ai-sdk/anthropic': - specifier: ^3.0.44 - version: 3.0.46(zod@4.3.6) - '@ai-sdk/azure': - specifier: ^3.0.31 - version: 3.0.31(zod@4.3.6) - '@ai-sdk/deepseek': - specifier: ^2.0.20 - version: 2.0.20(zod@4.3.6) - '@ai-sdk/google': - specifier: ^3.0.29 - version: 3.0.30(zod@4.3.6) - '@ai-sdk/google-vertex': - specifier: ^4.0.58 - version: 4.0.61(zod@4.3.6) - '@ai-sdk/openai': - specifier: ^3.0.29 - version: 3.0.30(zod@4.3.6) - '@paralleldrive/cuid2': - specifier: ^3.3.0 - version: 3.3.0 - '@perstack/api-client': - specifier: ^0.0.56 - version: 0.0.56(@perstack/core@packages+core)(zod@4.3.6) - '@perstack/core': - specifier: workspace:* - version: link:../core - '@perstack/skill-manager': - specifier: workspace:* - version: link:../skill-manager - ai: - specifier: ^6.0.86 - version: 6.0.94(zod@4.3.6) - ollama-ai-provider-v2: - specifier: ^3.3.0 - version: 3.3.1(ai@6.0.94(zod@4.3.6))(zod@4.3.6) - ts-dedent: - specifier: ^2.2.0 - version: 2.2.0 - undici: - specifier: ^7.22.0 - version: 7.22.0 - xstate: - specifier: ^5.28.0 - version: 5.28.0 - devDependencies: - '@perstack/anthropic-provider': - specifier: workspace:* - version: link:../providers/anthropic - '@perstack/azure-openai-provider': - specifier: workspace:* - version: link:../providers/azure-openai - '@perstack/bedrock-provider': - specifier: workspace:* - version: link:../providers/bedrock - '@perstack/deepseek-provider': - specifier: workspace:* - version: link:../providers/deepseek - '@perstack/google-provider': - specifier: workspace:* - version: link:../providers/google - '@perstack/ollama-provider': - specifier: workspace:* - version: link:../providers/ollama - '@perstack/openai-provider': - specifier: workspace:* - version: link:../providers/openai - '@perstack/provider-core': - specifier: workspace:* - version: link:../providers/core - '@perstack/vertex-provider': - specifier: workspace:* - version: link:../providers/vertex - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/skill-manager: - dependencies: - '@modelcontextprotocol/sdk': - specifier: ^1.26.0 - version: 1.26.0(zod@4.3.6) - '@paralleldrive/cuid2': - specifier: ^3.3.0 - version: 3.3.0 - '@perstack/base': - specifier: workspace:* - version: link:../../apps/base - '@perstack/core': - specifier: workspace:* - version: link:../core - '@perstack/perstack-toml': - specifier: workspace:* - version: link:../perstack-toml - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/tui: - dependencies: - '@paralleldrive/cuid2': - specifier: ^3.3.0 - version: 3.3.0 - '@perstack/core': - specifier: workspace:* - version: link:../core - '@perstack/tui-components': - specifier: workspace:* - version: link:../tui-components - dotenv: - specifier: ^17.3.1 - version: 17.3.1 - devDependencies: - '@perstack/filesystem-storage': - specifier: workspace:* - version: link:../filesystem - '@perstack/runtime': - specifier: workspace:* - version: link:../runtime - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - packages/tui-components: - dependencies: - '@perstack/core': - specifier: workspace:* - version: link:../core - '@perstack/react': - specifier: workspace:* - version: link:../react - ink: - specifier: ^6.7.0 - version: 6.8.0(@types/react@19.2.14)(react@19.2.4) - react: - specifier: ^19.2.4 - version: 19.2.4 - devDependencies: - '@tsconfig/node22': - specifier: ^22.0.5 - version: 22.0.5 - '@types/node': - specifier: ^25.3.0 - version: 25.3.0 - '@types/react': - specifier: ^19.2.14 - version: 19.2.14 - tsdown: - specifier: ^0.20.3 - version: 0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - -packages: - - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - - '@ai-sdk/amazon-bedrock@4.0.62': - resolution: {integrity: sha512-d5ng22ROzhUgUZ4UTGHIAIWx/0q8Xen6NRB2JezKqJdctZgwS2YF0quqBRmk5qu6kZ00ZfifOfDtaHKhJ2A2SQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/anthropic@3.0.46': - resolution: {integrity: sha512-zXJPiNHaIiQ6XUqLeSYZ3ZbSzjqt1pNWEUf2hlkXlmmw8IF8KI0ruuGaDwKCExmtuNRf0E4TDxhsc9wRgWTzpw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/azure@3.0.31': - resolution: {integrity: sha512-W9x6nt+yf+Ns0/Wx7U9TXHLmfu7mOUqy1b/drtVd3DvNfDudyruQM/YjM2268Q0FatSrPlA2RlnPVPGRH/4V8Q==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/deepseek@2.0.20': - resolution: {integrity: sha512-MAL04sDTOWUiBjAGWaVgyeE4bYRb9QpKYRlIeCTZFga6I8yQs50XakhWEssrmvVihdpHGkqpDtCHsFqCydsWLA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/gateway@3.0.52': - resolution: {integrity: sha512-lYCXP8T3YnIDiz8DP7loAMT27wnblc3IAYzQ7igg89RCRyTUjk6ffbxHXXQ5Pmv8jrdLF0ZIJnH54Dsr1OCKHg==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/google-vertex@4.0.61': - resolution: {integrity: sha512-cTi/qcvqNmrOrCBekrJEXnn4yCTiWyBb9gO6Ofn0OqRboGJOCEfDp5RHWlRREWHhDOJPyZAk2mY8FDJW2PrtUA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/google@3.0.30': - resolution: {integrity: sha512-ZzG6dU0XUSSXbxQJJTQUFpWeKkfzdpR7IykEZwaiaW5d+3u3RZ/zkRiGwAOcUpLp6k0eMd+IJF4looJv21ecxw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/openai@3.0.30': - resolution: {integrity: sha512-YDht3t7TDyWKP+JYZp20VuYqSjyF2brHYh47GGFDUPf2wZiqNQ263ecL+quar2bP3GZ3BeQA8f0m2B7UwLPR+g==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider-utils@4.0.15': - resolution: {integrity: sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider@3.0.8': - resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} - engines: {node: '>=18'} - - '@alcalzone/ansi-tokenize@0.2.5': - resolution: {integrity: sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw==} - engines: {node: '>=18'} - - '@asamuzakjp/css-color@4.1.2': - resolution: {integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==} - - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/types@3.973.0': - resolution: {integrity: sha512-jYIdB7a7jhRTvyb378nsjyvJh1Si+zVduJ6urMNGpz8RjkmHZ+9vM2H07XaIB2Cfq0GhJRZYOfUCH8uqQhqBkQ==} - engines: {node: '>=20.0.0'} - - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@8.0.0-rc.1': - resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@8.0.0-rc.2': - resolution: {integrity: sha512-noLx87RwlBEMrTzncWd/FvTxoJ9+ycHNg0n8yyYydIoDsLZuxknKgWRJUqcrVkNrJ74uGyhWQzQaS3q8xfGAhQ==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@8.0.0-rc.1': - resolution: {integrity: sha512-I4YnARytXC2RzkLNVnf5qFNFMzp679qZpmtw/V3Jt2uGnWiIxyJtaukjG7R8pSx8nG2NamICpGfljQsogj+FbQ==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@8.0.0-rc.1': - resolution: {integrity: sha512-6HyyU5l1yK/7h9Ki52i5h6mDAx4qJdiLQO4FdCyJNoB/gy3T3GGJdhQzzbZgvgZCugYBvwtQiWRt94QKedHnkA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} - engines: {node: '>=6.9.0'} - - '@babel/types@8.0.0-rc.1': - resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} - engines: {node: ^20.19.0 || >=22.12.0} - - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} - - '@biomejs/biome@2.4.3': - resolution: {integrity: sha512-cBrjf6PNF6yfL8+kcNl85AjiK2YHNsbU0EvDOwiZjBPbMbQ5QcgVGFpjD0O52p8nec5O8NYw7PKw3xUR7fPAkQ==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@2.4.3': - resolution: {integrity: sha512-eOafSFlI/CF4id2tlwq9CVHgeEqvTL5SrhWff6ZORp6S3NL65zdsR3ugybItkgF8Pf4D9GSgtbB6sE3UNgOM9w==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@2.4.3': - resolution: {integrity: sha512-V2+av4ilbWcBMNufTtMMXVW00nPwyIjI5qf7n9wSvUaZ+tt0EvMGk46g9sAFDJBEDOzSyoRXiSP6pCvKTOEbPA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@2.4.3': - resolution: {integrity: sha512-QuFzvsGo8BA4Xm7jGX5idkw6BqFblcCPySMTvq0AhGYnhUej5VJIDJbmTKfHqwjHepZiC4fA+T5i6wmiZolZNw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@2.4.3': - resolution: {integrity: sha512-0m+O0x9FgK99FAwDK+fiDtjs2wnqq7bvfj17KJVeCkTwT/liI+Q9njJG7lwXK0iSJVXeFNRIxukpVI3SifMYAA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@2.4.3': - resolution: {integrity: sha512-qEc0OCpj/uytruQ4wLM0yWNJLZy0Up8H1Er5MW3SrstqM6J2d4XqdNA86xzCy8MQCHpoVZ3lFye3GBlIL4/ljw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@2.4.3': - resolution: {integrity: sha512-NVqh0saIU0u5OfOp/0jFdlKRE59+XyMvWmtx0f6Nm/2OpdxBl04coRIftBbY9d1gfu+23JVv4CItAqPYrjYh5w==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@2.4.3': - resolution: {integrity: sha512-gRO96vrIARilv/Cp2ZnmNNL5LSZg3RO75GPp13hsLO3N4YVpE7saaMDp2bcyV48y2N2Pbit1brkGVGta0yd6VQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@2.4.3': - resolution: {integrity: sha512-vSm/vOJe06pf14aGHfHl3Ar91Nlx4YYmohElDJ+17UbRwe99n987S/MhAlQOkONqf1utJor04ChkCPmKb8SWdw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - - '@bramus/specificity@2.4.2': - resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} - hasBin: true - - '@changesets/apply-release-plan@7.0.14': - resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} - - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - - '@changesets/changelog-github@0.5.2': - resolution: {integrity: sha512-HeGeDl8HaIGj9fQHo/tv5XKQ2SNEi9+9yl1Bss1jttPqeiASRXhfi0A2wv8yFKCp07kR1gpOI5ge6+CWNm1jPw==} - - '@changesets/cli@2.29.8': - resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} - hasBin: true - - '@changesets/config@3.1.2': - resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - - '@changesets/get-github-info@0.7.0': - resolution: {integrity: sha512-+i67Bmhfj9V4KfDeS1+Tz3iF32btKZB2AAx+cYMqDSRFP7r3/ZdGbjCo+c6qkyViN9ygDuBjzageuPGJtKGe5A==} - - '@changesets/get-release-plan@4.0.14': - resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - - '@changesets/parse@0.4.2': - resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} - - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - - '@changesets/read@0.6.6': - resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} - - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - - '@csstools/color-helpers@6.0.1': - resolution: {integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==} - engines: {node: '>=20.19.0'} - - '@csstools/css-calc@3.1.1': - resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-color-parser@4.0.1': - resolution: {integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.0.27': - resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} - - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} - engines: {node: '>=20.19.0'} - - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@exodus/bytes@1.14.1': - resolution: {integrity: sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true - - '@hono/node-server@1.19.9': - resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} - - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} - - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/base64@17.65.0': - resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@1.2.1': - resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@17.65.0': - resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/codegen@1.0.0': - resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/codegen@17.65.0': - resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-core@4.56.10': - resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-fsa@4.56.10': - resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-builtins@4.56.10': - resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-to-fsa@4.56.10': - resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-utils@4.56.10': - resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node@4.56.10': - resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-print@4.56.10': - resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-snapshot@4.56.10': - resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.21.0': - resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@17.65.0': - resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@1.0.2': - resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@17.65.0': - resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@17.65.0': - resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - - '@modelcontextprotocol/sdk@1.26.0': - resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - - '@mswjs/interceptors@0.40.0': - resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} - engines: {node: '>=18'} - - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - - '@noble/hashes@2.0.1': - resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} - engines: {node: '>= 20.19.0'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - - '@open-draft/logger@0.3.0': - resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - - '@open-draft/until@2.1.0': - resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@oxc-project/types@0.112.0': - resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} - - '@oxc-resolver/binding-android-arm-eabi@11.17.1': - resolution: {integrity: sha512-+VuZyMYYaap5uDAU1xDU3Kul0FekLqpBS8kI5JozlWfYQKnc/HsZg2gHPkQrj0SC9lt74WMNCfOzZZJlYXSdEQ==} - cpu: [arm] - os: [android] - - '@oxc-resolver/binding-android-arm64@11.17.1': - resolution: {integrity: sha512-YlDDTjvOEKhom/cRSVsXsMVeXVIAM9PJ/x2mfe08rfuS0iIEfJd8PngKbEIhG72WPxleUa+vkEZj9ncmC14z3Q==} - cpu: [arm64] - os: [android] - - '@oxc-resolver/binding-darwin-arm64@11.17.1': - resolution: {integrity: sha512-HOYYLSY4JDk14YkXaz/ApgJYhgDP4KsG8EZpgpOxdszGW9HmIMMY/vXqVKYW74dSH+GQkIXYxBrEh3nv+XODVg==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@11.17.1': - resolution: {integrity: sha512-JHPJbsa5HvPq2/RIdtGlqfaG9zV2WmgvHrKTYmlW0L5esqtKCBuetFudXTBzkNcyD69kSZLzH92AzTr6vFHMFg==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@11.17.1': - resolution: {integrity: sha512-UD1FRC8j8xZstFXYsXwQkNmmg7vUbee006IqxokwDUUA+xEgKZDpLhBEiVKM08Urb+bn7Q0gn6M1pyNR0ng5mg==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1': - resolution: {integrity: sha512-wFWC1wyf2ROFWTxK5x0Enm++DSof3EBQ/ypyAesMDLiYxOOASDoMOZG1ylWUnlKaCt5W7eNOWOzABpdfFf/ssA==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm-musleabihf@11.17.1': - resolution: {integrity: sha512-k/hUif0GEBk/csSqCfTPXb8AAVs1NNWCa/skBghvNbTtORcWfOVqJ3mM+2pE189+enRm4UnryLREu5ysI0kXEQ==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@11.17.1': - resolution: {integrity: sha512-Cwm6A071ww60QouJ9LoHAwBgEoZzHQ0Qaqk2E7WLfBdiQN9mLXIDhnrpn04hlRElRPhLiu/dtg+o5PPLvaINXQ==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-musl@11.17.1': - resolution: {integrity: sha512-+hwlE2v3m0r3sk93SchJL1uyaKcPjf+NGO/TD2DZUDo+chXx7FfaEj0nUMewigSt7oZ2sQN9Z4NJOtUa75HE5Q==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-ppc64-gnu@11.17.1': - resolution: {integrity: sha512-bO+rsaE5Ox8cFyeL5Ct5tzot1TnQpFa/Wmu5k+hqBYSH2dNVDGoi0NizBN5QV8kOIC6O5MZr81UG4yW/2FyDTA==} - cpu: [ppc64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-gnu@11.17.1': - resolution: {integrity: sha512-B/P+hxKQ1oX4YstI9Lyh4PGzqB87Ddqj/A4iyRBbPdXTcxa+WW3oRLx1CsJKLmHPdDk461Hmbghq1Bm3pl+8Aw==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-musl@11.17.1': - resolution: {integrity: sha512-ulp2H3bFXzd/th2maH+QNKj5qgOhJ3v9Yspdf1svTw3CDOuuTl6sRKsWQ7MUw0vnkSNvQndtflBwVXgzZvURsQ==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-s390x-gnu@11.17.1': - resolution: {integrity: sha512-LAXYVe3rKk09Zo9YKF2ZLBcH8sz8Oj+JIyiUxiHtq0hiYLMsN6dOpCf2hzQEjPAmsSEA/hdC1PVKeXo+oma8mQ==} - cpu: [s390x] - os: [linux] - - '@oxc-resolver/binding-linux-x64-gnu@11.17.1': - resolution: {integrity: sha512-3RAhxipMKE8RCSPn7O//sj440i+cYTgYbapLeOoDvQEt6R1QcJjTsFgI4iz99FhVj3YbPxlZmcLB5VW+ipyRTA==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-linux-x64-musl@11.17.1': - resolution: {integrity: sha512-wpjMEubGU8r9VjZTLdZR3aPHaBqTl8Jl8F4DBbgNoZ+yhkhQD1/MGvY70v2TLnAI6kAHSvcqgfvaqKDa2iWsPQ==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-openharmony-arm64@11.17.1': - resolution: {integrity: sha512-XIE4w17RYAVIgx+9Gs3deTREq5tsmalbatYOOBGNdH7n0DfTE600c7wYXsp7ANc3BPDXsInnOzXDEPCvO1F6cg==} - cpu: [arm64] - os: [openharmony] - - '@oxc-resolver/binding-wasm32-wasi@11.17.1': - resolution: {integrity: sha512-Lqi5BlHX3zS4bpSOkIbOKVf7DIk6Gvmdifr2OuOI58eUUyP944M8/OyaB09cNpPy9Vukj7nmmhOzj8pwLgAkIg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@11.17.1': - resolution: {integrity: sha512-l6lTcLBQVj1HNquFpXSsrkCIM8X5Hlng5YNQJrg00z/KyovvDV5l3OFhoRyZ+aLBQ74zUnMRaJZC7xcBnHyeNg==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-ia32-msvc@11.17.1': - resolution: {integrity: sha512-VTzVtfnCCsU/6GgvursWoyZrhe3Gj/RyXzDWmh4/U1Y3IW0u1FZbp+hCIlBL16pRPbDc5YvXVtCOnA41QOrOoQ==} - cpu: [ia32] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.17.1': - resolution: {integrity: sha512-jRPVU+6/12baj87q2+UGRh30FBVBzqKdJ7rP/mSqiL1kpNQB9yZ1j0+m3sru1m+C8hiFK7lBFwjUtYUBI7+UpQ==} - cpu: [x64] - os: [win32] - - '@paralleldrive/cuid2@3.3.0': - resolution: {integrity: sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw==} - hasBin: true - - '@perstack/api-client@0.0.56': - resolution: {integrity: sha512-FL5xfx30HQHaCUU96eBbfMf7DGk3h+bAWoaaomvR65fz01Xe8+FZzGxLmdZy723yIFnFN3Dhp3JudYStxA5RxA==} - peerDependencies: - '@perstack/core': '>0.0.42' - zod: '>=4.3.6' - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@quansync/fs@1.0.0': - resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - - '@rolldown/binding-android-arm64@1.0.0-rc.3': - resolution: {integrity: sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.0.0-rc.3': - resolution: {integrity: sha512-JWWLzvcmc/3pe7qdJqPpuPk91SoE/N+f3PcWx/6ZwuyDVyungAEJPvKm/eEldiDdwTmaEzWfIR+HORxYWrCi1A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.0.0-rc.3': - resolution: {integrity: sha512-MTakBxfx3tde5WSmbHxuqlDsIW0EzQym+PJYGF4P6lG2NmKzi128OGynoFUqoD5ryCySEY85dug4v+LWGBElIw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.0.0-rc.3': - resolution: {integrity: sha512-jje3oopyOLs7IwfvXoS6Lxnmie5JJO7vW29fdGFu5YGY1EDbVDhD+P9vDihqS5X6fFiqL3ZQZCMBg6jyHkSVww==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': - resolution: {integrity: sha512-A0n8P3hdLAaqzSFrQoA42p23ZKBYQOw+8EH5r15Sa9X1kD9/JXe0YT2gph2QTWvdr0CVK2BOXiK6ENfy6DXOag==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': - resolution: {integrity: sha512-kWXkoxxarYISBJ4bLNf5vFkEbb4JvccOwxWDxuK9yee8lg5XA7OpvlTptfRuwEvYcOZf+7VS69Uenpmpyo5Bjw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': - resolution: {integrity: sha512-Z03/wrqau9Bicfgb3Dbs6SYTHliELk2PM2LpG2nFd+cGupTMF5kanLEcj2vuuJLLhptNyS61rtk7SOZ+lPsTUA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': - resolution: {integrity: sha512-iSXXZsQp08CSilff/DCTFZHSVEpEwdicV3W8idHyrByrcsRDVh9sGC3sev6d8BygSGj3vt8GvUKBPCoyMA4tgQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': - resolution: {integrity: sha512-qaj+MFudtdCv9xZo9znFvkgoajLdc+vwf0Kz5N44g+LU5XMe+IsACgn3UG7uTRlCCvhMAGXm1XlpEA5bZBrOcw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': - resolution: {integrity: sha512-U662UnMETyjT65gFmG9ma+XziENrs7BBnENi/27swZPYagubfHRirXHG2oMl+pEax2WvO7Kb9gHZmMakpYqBHQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': - resolution: {integrity: sha512-gekrQ3Q2HiC1T5njGyuUJoGpK/l6B/TNXKed3fZXNf9YRTJn3L5MOZsFBn4bN2+UX+8+7hgdlTcEsexX988G4g==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': - resolution: {integrity: sha512-85y5JifyMgs8m5K2XzR/VDsapKbiFiohl7s5lEj7nmNGO0pkTXE7q6TQScei96BNAsoK7JC3pA7ukA8WRHVJpg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': - resolution: {integrity: sha512-a4VUQZH7LxGbUJ3qJ/TzQG8HxdHvf+jOnqf7B7oFx1TEBm+j2KNL2zr5SQ7wHkNAcaPevF6gf9tQnVBnC4mD+A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-rc.3': - resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - - '@rollup/rollup-android-arm-eabi@4.56.0': - resolution: {integrity: sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.56.0': - resolution: {integrity: sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.56.0': - resolution: {integrity: sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.56.0': - resolution: {integrity: sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.56.0': - resolution: {integrity: sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.56.0': - resolution: {integrity: sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.56.0': - resolution: {integrity: sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.56.0': - resolution: {integrity: sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.56.0': - resolution: {integrity: sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.56.0': - resolution: {integrity: sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.56.0': - resolution: {integrity: sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loong64-musl@4.56.0': - resolution: {integrity: sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.56.0': - resolution: {integrity: sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.56.0': - resolution: {integrity: sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.56.0': - resolution: {integrity: sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.56.0': - resolution: {integrity: sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.56.0': - resolution: {integrity: sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.56.0': - resolution: {integrity: sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.56.0': - resolution: {integrity: sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-openbsd-x64@4.56.0': - resolution: {integrity: sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.56.0': - resolution: {integrity: sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.56.0': - resolution: {integrity: sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.56.0': - resolution: {integrity: sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.56.0': - resolution: {integrity: sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.56.0': - resolution: {integrity: sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==} - cpu: [x64] - os: [win32] - - '@smithy/eventstream-codec@4.2.8': - resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} - engines: {node: '>=18.0.0'} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.12.0': - resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} - engines: {node: '>=18.0.0'} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/react@16.3.2': - resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} - 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 - - '@tsconfig/node22@22.0.5': - resolution: {integrity: sha512-hLf2ld+sYN/BtOJjHUWOk568dvjFQkHnLNa6zce25GIH+vxKfvTgm3qpaH6ToF5tu/NN0IH66s+Bb5wElHrLcw==} - - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@25.3.0': - resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - - '@types/statuses@2.0.6': - resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - - '@vercel/oidc@3.1.0': - resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} - engines: {node: '>= 20'} - - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} - peerDependencies: - '@vitest/browser': 4.0.18 - vitest: 4.0.18 - peerDependenciesMeta: - '@vitest/browser': - optional: true - - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} - - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} - - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - ai@6.0.94: - resolution: {integrity: sha512-/F9wh262HbK05b/5vILh38JvPiheonT+kBj1L97712E7VPchqmcx7aJuZN3QSk5Pj6knxUJLm2FFpYJI1pHXUA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - ansis@4.2.0: - resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} - engines: {node: '>=14'} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - ast-kit@3.0.0-beta.1: - resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} - engines: {node: '>=20.19.0'} - - ast-v8-to-istanbul@0.3.10: - resolution: {integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==} - - auto-bind@5.0.1: - resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - aws4fetch@1.0.20: - resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - birpc@4.0.0: - resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} - engines: {node: '>=20'} - - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - code-excerpt@4.0.0: - resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-to-spaces@2.0.1: - resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - cssstyle@6.0.1: - resolution: {integrity: sha512-IoJs7La+oFp/AB033wBStxNOJt4+9hHMxsXUPANcoXL2b3W4DZKghlJ2cI/eyeRZIQ9ysvYEorVhjrcYctWbog==} - engines: {node: '>=20'} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - dataloader@1.4.0: - resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dotenv@17.3.1: - resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} - engines: {node: '>=12'} - - dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} - - dts-resolver@2.1.3: - resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} - engines: {node: '>=20.19.0'} - peerDependencies: - oxc-resolver: '>=11.0.0' - peerDependenciesMeta: - oxc-resolver: - optional: true - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} - engines: {node: '>=14'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - - error-causes@3.0.2: - resolution: {integrity: sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-toolkit@1.44.0: - resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} - - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} - - express-rate-limit@8.2.1: - resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - - fd-package-json@2.0.0: - resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - formatly@0.3.0: - resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} - engines: {node: '>=18.3.0'} - hasBin: true - - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gaxios@7.1.3: - resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} - engines: {node: '>=18'} - - gcp-metadata@8.1.2: - resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} - engines: {node: '>=18'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} - engines: {node: '>=18'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - glob@10.5.0: - resolution: {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 - hasBin: true - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - google-auth-library@10.5.0: - resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} - engines: {node: '>=18'} - - google-logging-utils@1.1.3: - resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} - engines: {node: '>=14'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphql@16.12.0: - resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - - gtoken@8.0.0: - resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} - engines: {node: '>=18'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - - hono@4.11.9: - resolution: {integrity: sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==} - engines: {node: '>=16.9.0'} - - hookable@6.0.1: - resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} - - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-id@4.1.3: - resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} - hasBin: true - - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-without-cache@0.2.5: - resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} - engines: {node: '>=20.19.0'} - - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ink@6.8.0: - resolution: {integrity: sha512-sbl1RdLOgkO9isK42WCZlJCFN9hb++sX9dsklOvfd1YQ3bQ2AiFu12Q6tFlr0HvEUvzraJntQCCpfEoUe9DSzA==} - engines: {node: '>=20'} - peerDependencies: - '@types/react': '>=19.0.0' - react: '>=19.0.0' - react-devtools-core: '>=6.1.2' - peerDependenciesMeta: - '@types/react': - optional: true - react-devtools-core: - optional: true - - ip-address@10.0.1: - resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-in-ci@2.0.0: - resolution: {integrity: sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==} - engines: {node: '>=20'} - hasBin: true - - is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - - jws@4.0.1: - resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - - knip@5.84.1: - resolution: {integrity: sha512-F1+yACEsSapAwmQLzfD4i9uPsnI82P4p5ABpNQ9pcc4fpQtjHEX34XDtNl5863I4O6SCECpymylcWDHI3ouhQQ==} - engines: {node: '>=18.18.0'} - hasBin: true - peerDependencies: - '@types/node': '>=18' - typescript: '>=5.0.4 <7' - - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} - engines: {node: '>= 12.0.0'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} - engines: {node: 20 || >=22} - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - magicast@0.5.1: - resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - memfs@4.56.10: - resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} - peerDependencies: - tslib: '2' - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - msw@2.12.4: - resolution: {integrity: sha512-rHNiVfTyKhzc0EjoXUBVGteNKBevdjOlVC6GlIRXpy+/3LHEIGRovnB5WPjcvmNODVQ1TNFnoa7wsGbd0V3epg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.8.x' - peerDependenciesMeta: - typescript: - optional: true - - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - - ollama-ai-provider-v2@3.3.1: - resolution: {integrity: sha512-j4BBqqQnvf/uDz+aPYcgU4/MQZERw087Fn1DMGtViA/PgahBq36jHKHVoZfx8mxj+w8cxsKd3eYaDgyZPhE6YA==} - engines: {node: '>=18'} - peerDependencies: - ai: ^5.0.0 || ^6.0.0 - zod: ^4.0.16 - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - - outvariant@1.4.3: - resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - - oxc-resolver@11.17.1: - resolution: {integrity: sha512-pyRXK9kH81zKlirHufkFhOFBZRks8iAMLwPH8gU7lvKFiuzUH9L8MxDEllazwOb8fjXMcWjY1PMDfMJ2/yh5cw==} - - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - patch-console@2.0.0: - resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} - - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - - quansync@1.0.0: - resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - - react-dom@19.2.3: - resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} - peerDependencies: - react: ^19.2.3 - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react-reconciler@0.33.0: - resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^19.2.0 - - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} - engines: {node: '>=0.10.0'} - - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - rettime@0.7.0: - resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - - rolldown-plugin-dts@0.22.1: - resolution: {integrity: sha512-5E0AiM5RSQhU6cjtkDFWH6laW4IrMu0j1Mo8x04Xo1ALHmaRMs9/7zej7P3RrryVHW/DdZAp85MA7Be55p0iUw==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@ts-macro/tsc': ^0.3.6 - '@typescript/native-preview': '>=7.0.0-dev.20250601.1' - rolldown: ^1.0.0-rc.3 - typescript: ^5.0.0 - vue-tsc: ~3.2.0 - peerDependenciesMeta: - '@ts-macro/tsc': - optional: true - '@typescript/native-preview': - optional: true - typescript: - optional: true - vue-tsc: - optional: true - - rolldown@1.0.0-rc.3: - resolution: {integrity: sha512-Po/YZECDOqVXjIXrtC5h++a5NLvKAQNrd9ggrIG3sbDfGO5BqTUsrI6l8zdniKRp3r5Tp/2JTrXqx4GIguFCMw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - rollup@4.56.0: - resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - - slice-ansi@8.0.0: - resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} - engines: {node: '>=20'} - - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} - engines: {node: '>= 18'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - - strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string-width@8.1.1: - resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} - engines: {node: '>=20'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@5.0.3: - resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} - engines: {node: '>=14.16'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - tagged-tag@1.0.0: - resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} - engines: {node: '>=20'} - - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - - terminal-size@4.0.1: - resolution: {integrity: sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==} - engines: {node: '>=18'} - - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} - engines: {node: '>=18'} - - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} - engines: {node: '>=14.0.0'} - - tldts-core@7.0.19: - resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} - - tldts@7.0.19: - resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} - hasBin: true - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} - engines: {node: '>=16'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - - tree-dump@1.1.0: - resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - tsdown@0.20.3: - resolution: {integrity: sha512-qWOUXSbe4jN8JZEgrkc/uhJpC8VN2QpNu3eZkBWwNuTEjc/Ik1kcc54ycfcQ5QPRHeu9OQXaLfCI3o7pEJgB2w==} - engines: {node: '>=20.19.0'} - hasBin: true - peerDependencies: - '@arethetypeswrong/core': ^0.18.1 - '@vitejs/devtools': '*' - publint: ^0.3.0 - typescript: ^5.0.0 - unplugin-lightningcss: ^0.4.0 - unplugin-unused: ^0.5.0 - peerDependenciesMeta: - '@arethetypeswrong/core': - optional: true - '@vitejs/devtools': - optional: true - publint: - optional: true - typescript: - optional: true - unplugin-lightningcss: - optional: true - unplugin-unused: - optional: true - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} - engines: {node: '>=18.0.0'} - hasBin: true - - turbo-darwin-64@2.8.10: - resolution: {integrity: sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.8.10: - resolution: {integrity: sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.8.10: - resolution: {integrity: sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.8.10: - resolution: {integrity: sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.8.10: - resolution: {integrity: sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.8.10: - resolution: {integrity: sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==} - cpu: [arm64] - os: [win32] - - turbo@2.8.10: - resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} - hasBin: true - - type-fest@5.4.1: - resolution: {integrity: sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==} - engines: {node: '>=20'} - - type-fest@5.4.4: - resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} - engines: {node: '>=20'} - - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - unconfig-core@7.5.0: - resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} - - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - - undici@7.22.0: - resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} - engines: {node: '>=20.18.1'} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unrun@0.2.27: - resolution: {integrity: sha512-Mmur1UJpIbfxasLOhPRvox/QS4xBiDii71hMP7smfRthGcwFL2OAmYRgduLANOAU4LUkvVamuP+02U+c90jlrw==} - engines: {node: '>=20.19.0'} - hasBin: true - peerDependencies: - synckit: ^0.11.11 - peerDependenciesMeta: - synckit: - optional: true - - until-async@3.0.2: - resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - 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 - - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - - walk-up-path@4.0.0: - resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} - engines: {node: 20 || >=22} - - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} - - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} - - whatwg-url@16.0.0: - resolution: {integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - widest-line@6.0.0: - resolution: {integrity: sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==} - engines: {node: '>=20'} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - 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 - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - xstate@5.28.0: - resolution: {integrity: sha512-Iaqq6ZrUzqeUtA3hC5LQKZfR8ZLzEFTImMHJM3jWEdVvXWdKvvVLXZEiNQWm3SCA9ZbEou/n5rcsna1wb9t28A==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - - yoga-layout@3.2.1: - resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - -snapshots: - - '@acemir/cssom@0.9.31': {} - - '@ai-sdk/amazon-bedrock@4.0.62(zod@4.3.6)': - dependencies: - '@ai-sdk/anthropic': 3.0.46(zod@4.3.6) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - '@smithy/eventstream-codec': 4.2.8 - '@smithy/util-utf8': 4.2.0 - aws4fetch: 1.0.20 - zod: 4.3.6 - - '@ai-sdk/anthropic@3.0.46(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - zod: 4.3.6 - - '@ai-sdk/azure@3.0.31(zod@4.3.6)': - dependencies: - '@ai-sdk/openai': 3.0.30(zod@4.3.6) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - zod: 4.3.6 - - '@ai-sdk/deepseek@2.0.20(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - zod: 4.3.6 - - '@ai-sdk/gateway@3.0.52(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - '@vercel/oidc': 3.1.0 - zod: 4.3.6 - - '@ai-sdk/google-vertex@4.0.61(zod@4.3.6)': - dependencies: - '@ai-sdk/anthropic': 3.0.46(zod@4.3.6) - '@ai-sdk/google': 3.0.30(zod@4.3.6) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - google-auth-library: 10.5.0 - zod: 4.3.6 - transitivePeerDependencies: - - supports-color - - '@ai-sdk/google@3.0.30(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - zod: 4.3.6 - - '@ai-sdk/openai@3.0.30(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - zod: 4.3.6 - - '@ai-sdk/provider-utils@4.0.15(zod@4.3.6)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 4.3.6 - - '@ai-sdk/provider@3.0.8': - dependencies: - json-schema: 0.4.0 - - '@alcalzone/ansi-tokenize@0.2.5': - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - '@asamuzakjp/css-color@4.1.2': - dependencies: - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - lru-cache: 11.2.6 - - '@asamuzakjp/dom-selector@6.8.1': - dependencies: - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.1.0 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.6 - - '@asamuzakjp/nwsapi@2.3.9': {} - - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 - tslib: 2.8.1 - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-sdk/types@3.973.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/generator@8.0.0-rc.1': - dependencies: - '@babel/parser': 8.0.0-rc.1 - '@babel/types': 8.0.0-rc.1 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 - jsesc: 3.1.0 - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-string-parser@8.0.0-rc.2': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-identifier@8.0.0-rc.1': {} - - '@babel/parser@7.28.6': - dependencies: - '@babel/types': 7.28.6 - - '@babel/parser@8.0.0-rc.1': - dependencies: - '@babel/types': 8.0.0-rc.1 - - '@babel/runtime@7.28.6': {} - - '@babel/types@7.28.6': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@babel/types@8.0.0-rc.1': - dependencies: - '@babel/helper-string-parser': 8.0.0-rc.2 - '@babel/helper-validator-identifier': 8.0.0-rc.1 - - '@bcoe/v8-coverage@1.0.2': {} - - '@biomejs/biome@2.4.3': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.3 - '@biomejs/cli-darwin-x64': 2.4.3 - '@biomejs/cli-linux-arm64': 2.4.3 - '@biomejs/cli-linux-arm64-musl': 2.4.3 - '@biomejs/cli-linux-x64': 2.4.3 - '@biomejs/cli-linux-x64-musl': 2.4.3 - '@biomejs/cli-win32-arm64': 2.4.3 - '@biomejs/cli-win32-x64': 2.4.3 - - '@biomejs/cli-darwin-arm64@2.4.3': - optional: true - - '@biomejs/cli-darwin-x64@2.4.3': - optional: true - - '@biomejs/cli-linux-arm64-musl@2.4.3': - optional: true - - '@biomejs/cli-linux-arm64@2.4.3': - optional: true - - '@biomejs/cli-linux-x64-musl@2.4.3': - optional: true - - '@biomejs/cli-linux-x64@2.4.3': - optional: true - - '@biomejs/cli-win32-arm64@2.4.3': - optional: true - - '@biomejs/cli-win32-x64@2.4.3': - optional: true - - '@bramus/specificity@2.4.2': - dependencies: - css-tree: 3.1.0 - - '@changesets/apply-release-plan@7.0.14': - dependencies: - '@changesets/config': 3.1.2 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.4 - - '@changesets/assemble-release-plan@6.0.9': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.4 - - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/changelog-github@0.5.2': - dependencies: - '@changesets/get-github-info': 0.7.0 - '@changesets/types': 6.1.0 - dotenv: 8.6.0 - transitivePeerDependencies: - - encoding - - '@changesets/cli@2.29.8(@types/node@25.3.0)': - dependencies: - '@changesets/apply-release-plan': 7.0.14 - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.2 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.14 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.6 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@25.3.0) - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.3 - spawndamnit: 3.0.1 - term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' - - '@changesets/config@3.1.2': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 - - '@changesets/errors@0.2.0': - dependencies: - extendable-error: 0.1.7 - - '@changesets/get-dependents-graph@2.1.3': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.4 - - '@changesets/get-github-info@0.7.0': - dependencies: - dataloader: 1.4.0 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - '@changesets/get-release-plan@4.0.14': - dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.2 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.6 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/get-version-range-type@0.4.0': {} - - '@changesets/git@3.0.4': - dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 - - '@changesets/logger@0.1.1': - dependencies: - picocolors: 1.1.1 - - '@changesets/parse@0.4.2': - dependencies: - '@changesets/types': 6.1.0 - js-yaml: 4.1.1 - - '@changesets/pre@2.0.2': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - - '@changesets/read@0.6.6': - dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.2 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 - - '@changesets/should-skip-package@0.1.2': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/types@4.1.0': {} - - '@changesets/types@6.1.0': {} - - '@changesets/write@0.4.0': - dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.3 - prettier: 2.8.8 - - '@csstools/color-helpers@6.0.1': {} - - '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-color-parser@4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.0.1 - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.0.27': {} - - '@csstools/css-tokenizer@4.0.0': {} - - '@emnapi/core@1.8.1': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.8.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.1.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.27.2': - optional: true - - '@esbuild/android-arm64@0.27.2': - optional: true - - '@esbuild/android-arm@0.27.2': - optional: true - - '@esbuild/android-x64@0.27.2': - optional: true - - '@esbuild/darwin-arm64@0.27.2': - optional: true - - '@esbuild/darwin-x64@0.27.2': - optional: true - - '@esbuild/freebsd-arm64@0.27.2': - optional: true - - '@esbuild/freebsd-x64@0.27.2': - optional: true - - '@esbuild/linux-arm64@0.27.2': - optional: true - - '@esbuild/linux-arm@0.27.2': - optional: true - - '@esbuild/linux-ia32@0.27.2': - optional: true - - '@esbuild/linux-loong64@0.27.2': - optional: true - - '@esbuild/linux-mips64el@0.27.2': - optional: true - - '@esbuild/linux-ppc64@0.27.2': - optional: true - - '@esbuild/linux-riscv64@0.27.2': - optional: true - - '@esbuild/linux-s390x@0.27.2': - optional: true - - '@esbuild/linux-x64@0.27.2': - optional: true - - '@esbuild/netbsd-arm64@0.27.2': - optional: true - - '@esbuild/netbsd-x64@0.27.2': - optional: true - - '@esbuild/openbsd-arm64@0.27.2': - optional: true - - '@esbuild/openbsd-x64@0.27.2': - optional: true - - '@esbuild/openharmony-arm64@0.27.2': - optional: true - - '@esbuild/sunos-x64@0.27.2': - optional: true - - '@esbuild/win32-arm64@0.27.2': - optional: true - - '@esbuild/win32-ia32@0.27.2': - optional: true - - '@esbuild/win32-x64@0.27.2': - optional: true - - '@exodus/bytes@1.14.1(@noble/hashes@2.0.1)': - optionalDependencies: - '@noble/hashes': 2.0.1 - - '@hono/node-server@1.19.9(hono@4.11.9)': - dependencies: - hono: 4.11.9 - - '@inquirer/ansi@1.0.2': - optional: true - - '@inquirer/confirm@5.1.21(@types/node@25.3.0)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) - optionalDependencies: - '@types/node': 25.3.0 - optional: true - - '@inquirer/core@10.3.2(@types/node@25.3.0)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.0) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 25.3.0 - optional: true - - '@inquirer/external-editor@1.0.3(@types/node@25.3.0)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 25.3.0 - - '@inquirer/figures@1.0.15': - optional: true - - '@inquirer/type@3.0.10(@types/node@25.3.0)': - optionalDependencies: - '@types/node': 25.3.0 - optional: true - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@manypkg/find-root@1.1.0': - dependencies: - '@babel/runtime': 7.28.6 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.28.6 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - - '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': - dependencies: - '@hono/node-server': 1.19.9(hono@4.11.9) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.11.9 - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) - transitivePeerDependencies: - - supports-color - - '@mswjs/interceptors@0.40.0': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - optional: true - - '@napi-rs/wasm-runtime@1.1.1': - dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@noble/hashes@2.0.1': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@open-draft/deferred-promise@2.2.0': - optional: true - - '@open-draft/logger@0.3.0': - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.3 - optional: true - - '@open-draft/until@2.1.0': - optional: true - - '@opentelemetry/api@1.9.0': {} - - '@oxc-project/types@0.112.0': {} - - '@oxc-resolver/binding-android-arm-eabi@11.17.1': - optional: true - - '@oxc-resolver/binding-android-arm64@11.17.1': - optional: true - - '@oxc-resolver/binding-darwin-arm64@11.17.1': - optional: true - - '@oxc-resolver/binding-darwin-x64@11.17.1': - optional: true - - '@oxc-resolver/binding-freebsd-x64@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-arm-musleabihf@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-arm64-gnu@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-arm64-musl@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-ppc64-gnu@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-riscv64-gnu@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-riscv64-musl@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-s390x-gnu@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-x64-gnu@11.17.1': - optional: true - - '@oxc-resolver/binding-linux-x64-musl@11.17.1': - optional: true - - '@oxc-resolver/binding-openharmony-arm64@11.17.1': - optional: true - - '@oxc-resolver/binding-wasm32-wasi@11.17.1': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@oxc-resolver/binding-win32-arm64-msvc@11.17.1': - optional: true - - '@oxc-resolver/binding-win32-ia32-msvc@11.17.1': - optional: true - - '@oxc-resolver/binding-win32-x64-msvc@11.17.1': - optional: true - - '@paralleldrive/cuid2@3.3.0': - dependencies: - '@noble/hashes': 2.0.1 - bignumber.js: 9.3.1 - error-causes: 3.0.2 - - '@perstack/api-client@0.0.56(@perstack/core@packages+core)(zod@4.3.6)': - dependencies: - '@perstack/core': link:packages/core - zod: 4.3.6 - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@quansync/fs@1.0.0': - dependencies: - quansync: 1.0.0 - - '@rolldown/binding-android-arm64@1.0.0-rc.3': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-rc.3': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-rc.3': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0-rc.3': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': - optional: true - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': - optional: true - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': - optional: true - - '@rolldown/pluginutils@1.0.0-rc.3': {} - - '@rollup/rollup-android-arm-eabi@4.56.0': - optional: true - - '@rollup/rollup-android-arm64@4.56.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.56.0': - optional: true - - '@rollup/rollup-darwin-x64@4.56.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.56.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.56.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.56.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.56.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.56.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.56.0': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.56.0': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.56.0': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.56.0': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.56.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.56.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.56.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.56.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.56.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.56.0': - optional: true - - '@rollup/rollup-openbsd-x64@4.56.0': - optional: true - - '@rollup/rollup-openharmony-arm64@4.56.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.56.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.56.0': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.56.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.56.0': - optional: true - - '@smithy/eventstream-codec@4.2.8': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.12.0 - '@smithy/util-hex-encoding': 4.2.0 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/is-array-buffer@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/types@4.12.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-buffer-from@4.2.0': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@4.2.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.1 - - '@standard-schema/spec@1.1.0': {} - - '@testing-library/dom@10.4.1': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.28.6 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.4))(react@19.2.4)': - dependencies: - '@babel/runtime': 7.28.6 - '@testing-library/dom': 10.4.1 - react: 19.2.4 - react-dom: 19.2.3(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@tsconfig/node22@22.0.5': {} - - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/aria-query@5.0.4': {} - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/deep-eql@4.0.2': {} - - '@types/estree@1.0.8': {} - - '@types/jsesc@2.5.1': {} - - '@types/node@12.20.55': {} - - '@types/node@25.3.0': - dependencies: - undici-types: 7.18.2 - - '@types/react-dom@19.2.3(@types/react@19.2.14)': - dependencies: - '@types/react': 19.2.14 - - '@types/react@19.2.14': - dependencies: - csstype: 3.2.3 - - '@types/statuses@2.0.6': - optional: true - - '@vercel/oidc@3.1.0': {} - - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.18 - ast-v8-to-istanbul: 0.3.10 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - magicast: 0.5.1 - obug: 2.1.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - - '@vitest/expect@4.0.18': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - chai: 6.2.2 - tinyrainbow: 3.0.3 - - '@vitest/mocker@4.0.18(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 4.0.18 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - msw: 2.12.4(@types/node@25.3.0)(typescript@5.9.3) - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - - '@vitest/pretty-format@4.0.18': - dependencies: - tinyrainbow: 3.0.3 - - '@vitest/runner@4.0.18': - dependencies: - '@vitest/utils': 4.0.18 - pathe: 2.0.3 - - '@vitest/snapshot@4.0.18': - dependencies: - '@vitest/pretty-format': 4.0.18 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.0.18': {} - - '@vitest/utils@4.0.18': - dependencies: - '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - - agent-base@7.1.4: {} - - ai@6.0.94(zod@4.3.6): - dependencies: - '@ai-sdk/gateway': 3.0.52(zod@4.3.6) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - '@opentelemetry/api': 1.9.0 - zod: 4.3.6 - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-colors@4.1.3: {} - - ansi-escapes@7.3.0: - dependencies: - environment: 1.1.0 - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.3: {} - - ansis@4.2.0: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - array-union@2.1.0: {} - - assertion-error@2.0.1: {} - - ast-kit@3.0.0-beta.1: - dependencies: - '@babel/parser': 8.0.0-rc.1 - estree-walker: 3.0.3 - pathe: 2.0.3 - - ast-v8-to-istanbul@0.3.10: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - estree-walker: 3.0.3 - js-tokens: 9.0.1 - - auto-bind@5.0.1: {} - - aws4fetch@1.0.20: {} - - balanced-match@1.0.2: {} - - base64-js@1.5.1: {} - - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 - - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - - bignumber.js@9.3.1: {} - - birpc@4.0.0: {} - - body-parser@2.2.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.14.1 - raw-body: 3.0.2 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - buffer-equal-constant-time@1.0.1: {} - - bytes@3.1.2: {} - - cac@6.7.14: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - chai@6.2.2: {} - - chalk@5.6.2: {} - - chardet@2.1.1: {} - - ci-info@3.9.0: {} - - cli-boxes@3.0.0: {} - - cli-cursor@4.0.0: - dependencies: - restore-cursor: 4.0.0 - - cli-truncate@5.1.1: - dependencies: - slice-ansi: 7.1.2 - string-width: 8.1.1 - - cli-width@4.1.0: - optional: true - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - optional: true - - code-excerpt@4.0.0: - dependencies: - convert-to-spaces: 2.0.1 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.3: {} - - content-disposition@1.0.1: {} - - content-type@1.0.5: {} - - convert-to-spaces@2.0.1: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cookie@1.1.1: - optional: true - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-tree@3.1.0: - dependencies: - mdn-data: 2.12.2 - source-map-js: 1.2.1 - - cssstyle@6.0.1: - dependencies: - '@asamuzakjp/css-color': 4.1.2 - '@csstools/css-syntax-patches-for-csstree': 1.0.27 - css-tree: 3.1.0 - lru-cache: 11.2.6 - - csstype@3.2.3: {} - - data-uri-to-buffer@4.0.1: {} - - data-urls@7.0.0(@noble/hashes@2.0.1): - dependencies: - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0(@noble/hashes@2.0.1) - transitivePeerDependencies: - - '@noble/hashes' - - dataloader@1.4.0: {} - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decimal.js@10.6.0: {} - - defu@6.1.4: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - detect-indent@6.1.0: {} - - detect-libc@2.1.2: - optional: true - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dom-accessibility-api@0.5.16: {} - - dotenv@17.3.1: {} - - dotenv@8.6.0: {} - - dts-resolver@2.1.3(oxc-resolver@11.17.1): - optionalDependencies: - oxc-resolver: 11.17.1 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - emoji-regex@10.6.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - empathic@2.0.0: {} - - encodeurl@2.0.0: {} - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - entities@6.0.1: {} - - environment@1.1.0: {} - - error-causes@3.0.2: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-toolkit@1.44.0: {} - - esbuild@0.27.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 - - escalade@3.2.0: - optional: true - - escape-html@1.0.3: {} - - escape-string-regexp@2.0.0: {} - - esprima@4.0.1: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - - etag@1.8.1: {} - - eventsource-parser@3.0.6: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.6 - - expect-type@1.3.0: {} - - express-rate-limit@8.2.1(express@5.2.1): - dependencies: - express: 5.2.1 - ip-address: 10.0.1 - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.0.1 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.1 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - extend@3.0.2: {} - - extendable-error@0.1.7: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-uri@3.1.0: {} - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - - fd-package-json@2.0.0: - dependencies: - walk-up-path: 4.0.0 - - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - formatly@0.3.0: - dependencies: - fd-package-json: 2.0.0 - - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - - forwarded@0.2.0: {} - - fresh@2.0.0: {} - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gaxios@7.1.3: - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6 - node-fetch: 3.3.2 - rimraf: 5.0.10 - transitivePeerDependencies: - - supports-color - - gcp-metadata@8.1.2: - dependencies: - gaxios: 7.1.3 - google-logging-utils: 1.1.3 - json-bigint: 1.0.0 - transitivePeerDependencies: - - supports-color - - get-caller-file@2.0.5: - optional: true - - get-east-asian-width@1.4.0: {} - - get-intrinsic@1.3.0: - 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 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-tsconfig@4.13.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - get-tsconfig@4.13.6: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regex.js@1.2.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - google-auth-library@10.5.0: - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 7.1.3 - gcp-metadata: 8.1.2 - google-logging-utils: 1.1.3 - gtoken: 8.0.0 - jws: 4.0.1 - transitivePeerDependencies: - - supports-color - - google-logging-utils@1.1.3: {} - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - graphql@16.12.0: - optional: true - - gtoken@8.0.0: - dependencies: - gaxios: 7.1.3 - jws: 4.0.1 - transitivePeerDependencies: - - supports-color - - has-flag@4.0.0: {} - - has-symbols@1.1.0: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - headers-polyfill@4.0.3: - optional: true - - hono@4.11.9: {} - - hookable@6.0.1: {} - - html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): - dependencies: - '@exodus/bytes': 1.14.1(@noble/hashes@2.0.1) - transitivePeerDependencies: - - '@noble/hashes' - - html-escaper@2.0.2: {} - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - human-id@4.1.3: {} - - hyperdyperid@1.2.0: {} - - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - import-without-cache@0.2.5: {} - - indent-string@5.0.0: {} - - inherits@2.0.4: {} - - ink@6.8.0(@types/react@19.2.14)(react@19.2.4): - dependencies: - '@alcalzone/ansi-tokenize': 0.2.5 - ansi-escapes: 7.3.0 - ansi-styles: 6.2.3 - auto-bind: 5.0.1 - chalk: 5.6.2 - cli-boxes: 3.0.0 - cli-cursor: 4.0.0 - cli-truncate: 5.1.1 - code-excerpt: 4.0.0 - es-toolkit: 1.44.0 - indent-string: 5.0.0 - is-in-ci: 2.0.0 - patch-console: 2.0.0 - react: 19.2.4 - react-reconciler: 0.33.0(react@19.2.4) - scheduler: 0.27.0 - signal-exit: 3.0.7 - slice-ansi: 8.0.0 - stack-utils: 2.0.6 - string-width: 8.1.1 - terminal-size: 4.0.1 - type-fest: 5.4.1 - widest-line: 6.0.0 - wrap-ansi: 9.0.2 - ws: 8.19.0 - yoga-layout: 3.2.1 - optionalDependencies: - '@types/react': 19.2.14 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ip-address@10.0.1: {} - - ipaddr.js@1.9.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.4.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-in-ci@2.0.0: {} - - is-node-process@1.2.0: - optional: true - - is-number@7.0.0: {} - - is-potential-custom-element-name@1.0.1: {} - - is-promise@4.0.0: {} - - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - - is-windows@1.0.2: {} - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jiti@2.6.1: {} - - jose@6.1.3: {} - - js-tokens@4.0.0: {} - - js-tokens@9.0.1: {} - - js-yaml@3.14.2: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - - jsdom@28.1.0(@noble/hashes@2.0.1): - dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.8.1 - '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.14.1(@noble/hashes@2.0.1) - cssstyle: 6.0.1 - data-urls: 7.0.0(@noble/hashes@2.0.1) - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - undici: 7.22.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.0(@noble/hashes@2.0.1) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - - supports-color - - jsesc@3.1.0: {} - - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - - json-schema-traverse@1.0.0: {} - - json-schema-typed@8.0.2: {} - - json-schema@0.4.0: {} - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jwa@2.0.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@4.0.1: - dependencies: - jwa: 2.0.1 - safe-buffer: 5.2.1 - - knip@5.84.1(@types/node@25.3.0)(typescript@5.9.3): - dependencies: - '@nodelib/fs.walk': 1.2.8 - '@types/node': 25.3.0 - fast-glob: 3.3.3 - formatly: 0.3.0 - jiti: 2.6.1 - js-yaml: 4.1.1 - minimist: 1.2.8 - oxc-resolver: 11.17.1 - picocolors: 1.1.1 - picomatch: 4.0.3 - smol-toml: 1.6.0 - strip-json-comments: 5.0.3 - typescript: 5.9.3 - zod: 4.3.6 - - lightningcss-android-arm64@1.30.2: - optional: true - - lightningcss-darwin-arm64@1.30.2: - optional: true - - lightningcss-darwin-x64@1.30.2: - optional: true - - lightningcss-freebsd-x64@1.30.2: - optional: true - - lightningcss-linux-arm-gnueabihf@1.30.2: - optional: true - - lightningcss-linux-arm64-gnu@1.30.2: - optional: true - - lightningcss-linux-arm64-musl@1.30.2: - optional: true - - lightningcss-linux-x64-gnu@1.30.2: - optional: true - - lightningcss-linux-x64-musl@1.30.2: - optional: true - - lightningcss-win32-arm64-msvc@1.30.2: - optional: true - - lightningcss-win32-x64-msvc@1.30.2: - optional: true - - lightningcss@1.30.2: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 - optional: true - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - lodash.startcase@4.4.0: {} - - lru-cache@10.4.3: {} - - lru-cache@11.2.6: {} - - lz-string@1.5.0: {} - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - magicast@0.5.1: - dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 - source-map-js: 1.2.1 - - make-dir@4.0.0: - dependencies: - semver: 7.7.4 - - math-intrinsics@1.1.0: {} - - mdn-data@2.12.2: {} - - media-typer@1.1.0: {} - - memfs@4.56.10(tslib@2.8.1): - dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - merge-descriptors@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.54.0: {} - - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - - mimic-fn@2.1.0: {} - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - mri@1.2.0: {} - - ms@2.1.3: {} - - msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3): - dependencies: - '@inquirer/confirm': 5.1.21(@types/node@25.3.0) - '@mswjs/interceptors': 0.40.0 - '@open-draft/deferred-promise': 2.2.0 - '@types/statuses': 2.0.6 - cookie: 1.1.1 - graphql: 16.12.0 - headers-polyfill: 4.0.3 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - rettime: 0.7.0 - statuses: 2.0.2 - strict-event-emitter: 0.5.1 - tough-cookie: 6.0.0 - type-fest: 5.4.4 - until-async: 3.0.2 - yargs: 17.7.2 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/node' - optional: true - - mute-stream@2.0.0: - optional: true - - nanoid@3.3.11: {} - - negotiator@1.0.0: {} - - node-domexception@1.0.0: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - obug@2.1.1: {} - - ollama-ai-provider-v2@3.3.1(ai@6.0.94(zod@4.3.6))(zod@4.3.6): - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - ai: 6.0.94(zod@4.3.6) - zod: 4.3.6 - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - outdent@0.5.0: {} - - outvariant@1.4.3: - optional: true - - oxc-resolver@11.17.1: - optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.17.1 - '@oxc-resolver/binding-android-arm64': 11.17.1 - '@oxc-resolver/binding-darwin-arm64': 11.17.1 - '@oxc-resolver/binding-darwin-x64': 11.17.1 - '@oxc-resolver/binding-freebsd-x64': 11.17.1 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.17.1 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.17.1 - '@oxc-resolver/binding-linux-arm64-gnu': 11.17.1 - '@oxc-resolver/binding-linux-arm64-musl': 11.17.1 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.17.1 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.17.1 - '@oxc-resolver/binding-linux-riscv64-musl': 11.17.1 - '@oxc-resolver/binding-linux-s390x-gnu': 11.17.1 - '@oxc-resolver/binding-linux-x64-gnu': 11.17.1 - '@oxc-resolver/binding-linux-x64-musl': 11.17.1 - '@oxc-resolver/binding-openharmony-arm64': 11.17.1 - '@oxc-resolver/binding-wasm32-wasi': 11.17.1 - '@oxc-resolver/binding-win32-arm64-msvc': 11.17.1 - '@oxc-resolver/binding-win32-ia32-msvc': 11.17.1 - '@oxc-resolver/binding-win32-x64-msvc': 11.17.1 - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-map@2.1.0: {} - - p-try@2.2.0: {} - - package-json-from-dist@1.0.1: {} - - package-manager-detector@0.2.11: - dependencies: - quansync: 0.2.11 - - parse5@8.0.0: - dependencies: - entities: 6.0.1 - - parseurl@1.3.3: {} - - patch-console@2.0.0: {} - - path-exists@4.0.0: {} - - path-key@3.1.1: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@6.3.0: - optional: true - - path-to-regexp@8.3.0: {} - - path-type@4.0.0: {} - - pathe@2.0.3: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.3: {} - - pify@4.0.1: {} - - pkce-challenge@5.0.1: {} - - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prettier@2.8.8: {} - - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - punycode@2.3.1: {} - - qs@6.14.1: - dependencies: - side-channel: 1.1.0 - - quansync@0.2.11: {} - - quansync@1.0.0: {} - - queue-microtask@1.2.3: {} - - range-parser@1.2.1: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - - react-dom@19.2.3(react@19.2.4): - dependencies: - react: 19.2.4 - scheduler: 0.27.0 - - react-is@17.0.2: {} - - react-reconciler@0.33.0(react@19.2.4): - dependencies: - react: 19.2.4 - scheduler: 0.27.0 - - react@19.2.4: {} - - read-yaml-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.2 - pify: 4.0.1 - strip-bom: 3.0.0 - - require-directory@2.1.1: - optional: true - - require-from-string@2.0.2: {} - - resolve-from@5.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - restore-cursor@4.0.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - rettime@0.7.0: - optional: true - - reusify@1.1.0: {} - - rimraf@5.0.10: - dependencies: - glob: 10.5.0 - - rolldown-plugin-dts@0.22.1(oxc-resolver@11.17.1)(rolldown@1.0.0-rc.3)(typescript@5.9.3): - dependencies: - '@babel/generator': 8.0.0-rc.1 - '@babel/helper-validator-identifier': 8.0.0-rc.1 - '@babel/parser': 8.0.0-rc.1 - '@babel/types': 8.0.0-rc.1 - ast-kit: 3.0.0-beta.1 - birpc: 4.0.0 - dts-resolver: 2.1.3(oxc-resolver@11.17.1) - get-tsconfig: 4.13.6 - obug: 2.1.1 - rolldown: 1.0.0-rc.3 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - oxc-resolver - - rolldown@1.0.0-rc.3: - dependencies: - '@oxc-project/types': 0.112.0 - '@rolldown/pluginutils': 1.0.0-rc.3 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.3 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.3 - '@rolldown/binding-darwin-x64': 1.0.0-rc.3 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.3 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.3 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.3 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.3 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.3 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - - rollup@4.56.0: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.56.0 - '@rollup/rollup-android-arm64': 4.56.0 - '@rollup/rollup-darwin-arm64': 4.56.0 - '@rollup/rollup-darwin-x64': 4.56.0 - '@rollup/rollup-freebsd-arm64': 4.56.0 - '@rollup/rollup-freebsd-x64': 4.56.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.56.0 - '@rollup/rollup-linux-arm-musleabihf': 4.56.0 - '@rollup/rollup-linux-arm64-gnu': 4.56.0 - '@rollup/rollup-linux-arm64-musl': 4.56.0 - '@rollup/rollup-linux-loong64-gnu': 4.56.0 - '@rollup/rollup-linux-loong64-musl': 4.56.0 - '@rollup/rollup-linux-ppc64-gnu': 4.56.0 - '@rollup/rollup-linux-ppc64-musl': 4.56.0 - '@rollup/rollup-linux-riscv64-gnu': 4.56.0 - '@rollup/rollup-linux-riscv64-musl': 4.56.0 - '@rollup/rollup-linux-s390x-gnu': 4.56.0 - '@rollup/rollup-linux-x64-gnu': 4.56.0 - '@rollup/rollup-linux-x64-musl': 4.56.0 - '@rollup/rollup-openbsd-x64': 4.56.0 - '@rollup/rollup-openharmony-arm64': 4.56.0 - '@rollup/rollup-win32-arm64-msvc': 4.56.0 - '@rollup/rollup-win32-ia32-msvc': 4.56.0 - '@rollup/rollup-win32-x64-gnu': 4.56.0 - '@rollup/rollup-win32-x64-msvc': 4.56.0 - fsevents: 2.3.3 - - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.3.0 - transitivePeerDependencies: - - supports-color - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.27.0: {} - - semver@7.7.3: {} - - semver@7.7.4: {} - - send@1.2.1: - 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 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - - setprototypeof@1.2.0: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - siginfo@2.0.0: {} - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - slash@3.0.0: {} - - slice-ansi@7.1.2: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - slice-ansi@8.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - smol-toml@1.6.0: {} - - source-map-js@1.2.1: {} - - spawndamnit@3.0.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - sprintf-js@1.0.3: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - stackback@0.0.2: {} - - statuses@2.0.2: {} - - std-env@3.10.0: {} - - strict-event-emitter@0.5.1: - optional: true - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - - string-width@8.1.1: - dependencies: - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - - strip-bom@3.0.0: {} - - strip-json-comments@5.0.3: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - symbol-tree@3.2.4: {} - - tagged-tag@1.0.0: {} - - term-size@2.2.1: {} - - terminal-size@4.0.1: {} - - thingies@2.5.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - tinybench@2.9.0: {} - - tinyexec@1.0.2: {} - - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - tinyrainbow@3.0.3: {} - - tldts-core@7.0.19: {} - - tldts@7.0.19: - dependencies: - tldts-core: 7.0.19 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tough-cookie@6.0.0: - dependencies: - tldts: 7.0.19 - - tr46@0.0.3: {} - - tr46@6.0.0: - dependencies: - punycode: 2.3.1 - - tree-dump@1.1.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - tree-kill@1.2.2: {} - - ts-dedent@2.2.0: {} - - tsdown@0.20.3(oxc-resolver@11.17.1)(typescript@5.9.3): - dependencies: - ansis: 4.2.0 - cac: 6.7.14 - defu: 6.1.4 - empathic: 2.0.0 - hookable: 6.0.1 - import-without-cache: 0.2.5 - obug: 2.1.1 - picomatch: 4.0.3 - rolldown: 1.0.0-rc.3 - rolldown-plugin-dts: 0.22.1(oxc-resolver@11.17.1)(rolldown@1.0.0-rc.3)(typescript@5.9.3) - semver: 7.7.4 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tree-kill: 1.2.2 - unconfig-core: 7.5.0 - unrun: 0.2.27 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@ts-macro/tsc' - - '@typescript/native-preview' - - oxc-resolver - - synckit - - vue-tsc - - tslib@2.8.1: {} - - tsx@4.21.0: - dependencies: - esbuild: 0.27.2 - get-tsconfig: 4.13.0 - optionalDependencies: - fsevents: 2.3.3 - - turbo-darwin-64@2.8.10: - optional: true - - turbo-darwin-arm64@2.8.10: - optional: true - - turbo-linux-64@2.8.10: - optional: true - - turbo-linux-arm64@2.8.10: - optional: true - - turbo-windows-64@2.8.10: - optional: true - - turbo-windows-arm64@2.8.10: - optional: true - - turbo@2.8.10: - optionalDependencies: - turbo-darwin-64: 2.8.10 - turbo-darwin-arm64: 2.8.10 - turbo-linux-64: 2.8.10 - turbo-linux-arm64: 2.8.10 - turbo-windows-64: 2.8.10 - turbo-windows-arm64: 2.8.10 - - type-fest@5.4.1: - dependencies: - tagged-tag: 1.0.0 - - type-fest@5.4.4: - dependencies: - tagged-tag: 1.0.0 - optional: true - - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.2 - - typescript@5.9.3: {} - - unconfig-core@7.5.0: - dependencies: - '@quansync/fs': 1.0.0 - quansync: 1.0.0 - - undici-types@7.18.2: {} - - undici@7.22.0: {} - - universalify@0.1.2: {} - - unpipe@1.0.0: {} - - unrun@0.2.27: - dependencies: - rolldown: 1.0.0-rc.3 - - until-async@3.0.2: - optional: true - - vary@1.1.2: {} - - vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.56.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 25.3.0 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - tsx: 4.21.0 - yaml: 2.8.2 - - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.0.1))(lightningcss@1.30.2)(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.12.4(@types/node@25.3.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - es-module-lexer: 1.7.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 25.3.0 - jsdom: 28.1.0(@noble/hashes@2.0.1) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - - walk-up-path@4.0.0: {} - - web-streams-polyfill@3.3.3: {} - - webidl-conversions@3.0.1: {} - - webidl-conversions@8.0.1: {} - - whatwg-mimetype@5.0.0: {} - - whatwg-url@16.0.0(@noble/hashes@2.0.1): - dependencies: - '@exodus/bytes': 1.14.1(@noble/hashes@2.0.1) - tr46: 6.0.0 - webidl-conversions: 8.0.1 - transitivePeerDependencies: - - '@noble/hashes' - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - widest-line@6.0.0: - dependencies: - string-width: 8.1.1 - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - optional: true - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.1.2 - - wrappy@1.0.2: {} - - ws@8.19.0: {} - - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - - xstate@5.28.0: {} - - y18n@5.0.8: - optional: true - - yaml@2.8.2: - optional: true - - yargs-parser@21.1.1: - optional: true - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - optional: true - - yoctocolors-cjs@2.1.3: - optional: true - - yoga-layout@3.2.1: {} - - zod-to-json-schema@3.25.1(zod@4.3.6): - dependencies: - zod: 4.3.6 - - zod@4.3.6: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index cadcda62..00000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,5 +0,0 @@ -packages: - - packages/* - - packages/providers/* - - apps/* -overrides: diff --git a/scripts/check-schema-diff.ts b/scripts/check-schema-diff.ts index b7a3c188..94b181ee 100644 --- a/scripts/check-schema-diff.ts +++ b/scripts/check-schema-diff.ts @@ -58,7 +58,7 @@ async function check() { const changesetFiles = await getChangesets() if (changesetFiles.length === 0) { console.log("\n❌ Schema files changed but no changeset found!") - console.log("Run: pnpm changeset") + console.log("Run: bunx changeset") console.log("Schema changes require at least a minor version bump.") exit(1) } diff --git a/tsdown.config.ts b/tsdown.config.ts deleted file mode 100644 index 5b0026a7..00000000 --- a/tsdown.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig, type UserConfig } from "tsdown" - -export const baseConfig: UserConfig = { - cwd: process.cwd(), - dts: true, - entry: { "src/index": "src/index.ts" }, - fixedExtension: false, - format: "es", - inlineOnly: false, - sourcemap: true, -} - -export default defineConfig(baseConfig) diff --git a/types/bun-test.d.ts b/types/bun-test.d.ts new file mode 100644 index 00000000..e0d95c1d --- /dev/null +++ b/types/bun-test.d.ts @@ -0,0 +1,60 @@ +/** + * Minimal type declarations for bun:test. + * We avoid using @types/bun globally because it conflicts with Node.js fetch types from undici. + */ +declare module "bun:test" { + type Fn = (...args: any[]) => any + + interface MockFunction { + (...args: Parameters): ReturnType + readonly mock: { + readonly calls: Parameters[] + readonly results: Array<{ type: "return" | "throw"; value: any }> + readonly lastCall: Parameters | undefined + } + mockClear(): this + mockReset(): this + mockRestore(): this + mockReturnValue(value: ReturnType): this + mockReturnValueOnce(value: ReturnType): this + mockResolvedValue(value: Awaited>): this + mockResolvedValueOnce(value: Awaited>): this + mockRejectedValue(value: unknown): this + mockRejectedValueOnce(value: unknown): this + mockImplementation(fn: T): this + mockImplementationOnce(fn: T): this + } + + type TestFn = (done?: (err?: unknown) => void) => void | Promise + + export function describe(name: string, fn: () => void): void + export namespace describe { + function skip(name: string, fn: () => void): void + function only(name: string, fn: () => void): void + function todo(name: string, fn?: () => void): void + } + + export function it(name: string, fn: TestFn, timeout?: number): void + export namespace it { + function skip(name: string, fn: TestFn, timeout?: number): void + function only(name: string, fn: TestFn, timeout?: number): void + function todo(name: string, fn?: TestFn): void + } + + export { it as test } + + export function expect(value: any): any + + export function beforeEach(fn: () => void | Promise): void + export function afterEach(fn: () => void | Promise): void + export function beforeAll(fn: () => void | Promise): void + export function afterAll(fn: () => void | Promise): void + + export function mock(fn?: T): MockFunction + export namespace mock { + function module(id: string, factory: () => any): void + function restore(): void + } + + export function spyOn(obj: T, method: K): MockFunction +} diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index 1fb1800d..00000000 --- a/vitest.config.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { config } from "dotenv" -import { defineConfig } from "vitest/config" - -// Load .env and .env.local for E2E tests (e.g., NPM_TOKEN for Docker tests) -config({ path: ".env" }) -config({ path: ".env.local" }) - -export default defineConfig({ - test: { - projects: [ - { - test: { - name: "unit", - globals: true, - environment: "node", - include: ["**/*.test.ts"], - exclude: ["**/node_modules/**", "**/dist/**", "e2e/**", "packages/react/**"], - }, - }, - { - test: { - name: "react", - globals: true, - environment: "jsdom", - include: ["packages/react/**/*.test.ts"], - exclude: ["**/node_modules/**", "**/dist/**"], - }, - }, - { - test: { - name: "e2e", - globals: true, - environment: "node", - include: ["e2e/**/*.test.ts"], - testTimeout: 300000, - hookTimeout: 300000, - fileParallelism: false, - }, - }, - ], - coverage: { - exclude: [ - "**/node_modules/**", - "**/dist/**", - "**/*.test.ts", - "**/*.tsx", - "e2e/**", - "benchmarks/**", - "examples/**", - "scripts/**", - "demo/**", - "docs/**", - "packages/runtime/src/state-machine/machine.ts", - ], - }, - }, -}) From 98334826645f6fc78bb14ca19f346c0c53e265a4 Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Sun, 22 Feb 2026 15:54:39 +0000 Subject: [PATCH 2/6] fix(ci): use turbo for test isolation and fix knip config - CI test step: use `bun run test` (turbo) instead of `bun test` directly to get per-package process isolation (prevents mock.module leaks) - knip: add entry points for create-expert-skill and runtime test files (previously discovered via tsdown/vitest plugins) - Remove unused smol-toml from root devDependencies (was used in deleted vitest.config.ts) - Add empty changeset Co-Authored-By: Claude Opus 4.6 --- .changeset/wide-words-unite.md | 2 ++ .github/workflows/ci.yml | 4 ++-- bun.lock | 1 - knip.json | 7 ++++++- package.json | 1 - 5 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/wide-words-unite.md diff --git a/.changeset/wide-words-unite.md b/.changeset/wide-words-unite.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/wide-words-unite.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6073c0cd..32aa886e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -152,8 +152,8 @@ jobs: - name: Prepare test environment run: bun run reset - - name: Run tests with coverage - run: bun test --coverage packages/ apps/ + - name: Run tests + run: bun run test build: name: Build diff --git a/bun.lock b/bun.lock index 90420ff7..b9292e61 100644 --- a/bun.lock +++ b/bun.lock @@ -11,7 +11,6 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "knip": "5.84.1", - "smol-toml": "^1.6.0", "turbo": "latest", "typescript": "^5.9.3", }, diff --git a/knip.json b/knip.json index 9cda98a6..91a6774f 100644 --- a/knip.json +++ b/knip.json @@ -5,7 +5,6 @@ "ignore": [ "dist/**/*", "**/*.test.ts", - "**/*.test.tsx", "**/test/**/*", "docs/**/*", "scripts/**/*", @@ -19,6 +18,12 @@ }, "apps/create-expert": { "ignoreDependencies": ["@perstack/runtime"] + }, + "apps/create-expert-skill": { + "entry": ["bin/server.ts"] + }, + "packages/runtime": { + "entry": ["src/**/*.test.ts"] } } } diff --git a/package.json b/package.json index 77b34f52..080d33e4 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "@tsconfig/node22": "^22.0.5", "@types/node": "^25.3.0", "knip": "5.84.1", - "smol-toml": "^1.6.0", "turbo": "latest", "typescript": "^5.9.3" }, From 903a5df3a6ae8e3f2ced60fe0266ac0d2a2f7ae0 Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Sun, 22 Feb 2026 15:56:17 +0000 Subject: [PATCH 3/6] fix(knip): add explicit entry points for create-expert apps CI knip may not auto-discover entries from package.json bin/exports fields. Add explicit entries to ensure consistent behavior. Co-Authored-By: Claude Opus 4.6 --- knip.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/knip.json b/knip.json index 91a6774f..565d7a9f 100644 --- a/knip.json +++ b/knip.json @@ -17,10 +17,11 @@ "entry": ["bin/cli.ts"] }, "apps/create-expert": { + "entry": ["bin/cli.ts"], "ignoreDependencies": ["@perstack/runtime"] }, "apps/create-expert-skill": { - "entry": ["bin/server.ts"] + "entry": ["bin/server.ts", "src/index.ts"] }, "packages/runtime": { "entry": ["src/**/*.test.ts"] From 36931a77ad8509410022571936dc231a56ec7280 Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Sun, 22 Feb 2026 15:58:09 +0000 Subject: [PATCH 4/6] fix(knip): mark public API export and fix entry discovery - Mark collectToolDefinitionsForExpert as @public (part of runtime's public API, documented in README, but not imported internally) - Previously the vitest plugin traced this through test files Co-Authored-By: Claude Opus 4.6 --- packages/runtime/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime/src/index.ts b/packages/runtime/src/index.ts index ee096f90..e948e83a 100755 --- a/packages/runtime/src/index.ts +++ b/packages/runtime/src/index.ts @@ -13,6 +13,7 @@ export type CollectToolDefinitionsOptions = { perstackBaseSkillCommand?: string[] } +/** @public */ export async function collectToolDefinitionsForExpert( expert: Expert, options: CollectToolDefinitionsOptions, From dcf7a1d7ebf26c7daed92db01b0f6fda1342b95b Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Mon, 23 Feb 2026 06:14:19 +0000 Subject: [PATCH 5/6] chore: remove unnecessary bunfig.toml files - Root bunfig.toml: only had coverageSkipTestFiles, but CI doesn't use --coverage - packages/react/bunfig.toml: happydom preload is redundant since hook test files already import happydom directly Co-Authored-By: Claude Opus 4.6 --- bunfig.toml | 2 -- packages/react/bunfig.toml | 2 -- 2 files changed, 4 deletions(-) delete mode 100644 bunfig.toml delete mode 100644 packages/react/bunfig.toml diff --git a/bunfig.toml b/bunfig.toml deleted file mode 100644 index 022519da..00000000 --- a/bunfig.toml +++ /dev/null @@ -1,2 +0,0 @@ -[test] -coverageSkipTestFiles = true diff --git a/packages/react/bunfig.toml b/packages/react/bunfig.toml deleted file mode 100644 index 36399045..00000000 --- a/packages/react/bunfig.toml +++ /dev/null @@ -1,2 +0,0 @@ -[test] -preload = ["./happydom.ts"] From c6003c058e8af75b25457e92bf1e217155c3bc9e Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Mon, 23 Feb 2026 06:32:02 +0000 Subject: [PATCH 6/6] chore: remove unused bun-test.d.ts type declarations Test files are excluded from tsconfig.json in all packages, so tsc never resolves bun:test imports. The type declarations are unnecessary. Co-Authored-By: Claude Opus 4.6 --- types/bun-test.d.ts | 60 --------------------------------------------- 1 file changed, 60 deletions(-) delete mode 100644 types/bun-test.d.ts diff --git a/types/bun-test.d.ts b/types/bun-test.d.ts deleted file mode 100644 index e0d95c1d..00000000 --- a/types/bun-test.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Minimal type declarations for bun:test. - * We avoid using @types/bun globally because it conflicts with Node.js fetch types from undici. - */ -declare module "bun:test" { - type Fn = (...args: any[]) => any - - interface MockFunction { - (...args: Parameters): ReturnType - readonly mock: { - readonly calls: Parameters[] - readonly results: Array<{ type: "return" | "throw"; value: any }> - readonly lastCall: Parameters | undefined - } - mockClear(): this - mockReset(): this - mockRestore(): this - mockReturnValue(value: ReturnType): this - mockReturnValueOnce(value: ReturnType): this - mockResolvedValue(value: Awaited>): this - mockResolvedValueOnce(value: Awaited>): this - mockRejectedValue(value: unknown): this - mockRejectedValueOnce(value: unknown): this - mockImplementation(fn: T): this - mockImplementationOnce(fn: T): this - } - - type TestFn = (done?: (err?: unknown) => void) => void | Promise - - export function describe(name: string, fn: () => void): void - export namespace describe { - function skip(name: string, fn: () => void): void - function only(name: string, fn: () => void): void - function todo(name: string, fn?: () => void): void - } - - export function it(name: string, fn: TestFn, timeout?: number): void - export namespace it { - function skip(name: string, fn: TestFn, timeout?: number): void - function only(name: string, fn: TestFn, timeout?: number): void - function todo(name: string, fn?: TestFn): void - } - - export { it as test } - - export function expect(value: any): any - - export function beforeEach(fn: () => void | Promise): void - export function afterEach(fn: () => void | Promise): void - export function beforeAll(fn: () => void | Promise): void - export function afterAll(fn: () => void | Promise): void - - export function mock(fn?: T): MockFunction - export namespace mock { - function module(id: string, factory: () => any): void - function restore(): void - } - - export function spyOn(obj: T, method: K): MockFunction -}