@opengsd/gsd-pi 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -3
- package/dist/claude-cli-check.js +1 -1
- package/dist/cli-policy.d.ts +1 -1
- package/dist/cli-policy.js +2 -2
- package/dist/cli.js +4 -3
- package/dist/extension-sort.js +1 -1
- package/dist/extension-validator.js +1 -1
- package/dist/help-text.js +8 -0
- package/dist/loader-entrypoint.js +1 -1
- package/dist/loader.js +0 -0
- package/dist/resource-loader.js +22 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +2 -2
- package/dist/resources/extensions/github-sync/templates.js +1 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -1
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +1 -1
- package/dist/resources/extensions/gsd/auto/lease-conflict-notice.js +1 -1
- package/dist/resources/extensions/gsd/auto/loop.js +2 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
- package/dist/resources/extensions/gsd/auto/phases.js +9 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +110 -44
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +18 -0
- package/dist/resources/extensions/gsd/auto/session.js +1 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +1 -1
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +1 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +1 -1
- package/dist/resources/extensions/gsd/auto-budget.js +1 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +1 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +1 -1
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-status-message.js +1 -1
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +1 -1
- package/dist/resources/extensions/gsd/auto-verification.js +1 -1
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +1 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +33 -4
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +5 -9
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +3 -1
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +69 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
- package/dist/resources/extensions/gsd/browser-evidence.js +1 -1
- package/dist/resources/extensions/gsd/closeout-recovery.js +1 -1
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
- package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +1 -1
- package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
- package/dist/resources/extensions/gsd/commands-closeout.js +1 -1
- package/dist/resources/extensions/gsd/commands-ship.js +1 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +1 -1
- package/dist/resources/extensions/gsd/commands-worktree.js +1 -1
- package/dist/resources/extensions/gsd/component-loader.js +1 -1
- package/dist/resources/extensions/gsd/db/auto-workers.js +1 -1
- package/dist/resources/extensions/gsd/db/command-queue.js +1 -1
- package/dist/resources/extensions/gsd/db/milestone-leases.js +20 -6
- package/dist/resources/extensions/gsd/db/runtime-kv.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +1 -1
- package/dist/resources/extensions/gsd/db-adapter.js +1 -1
- package/dist/resources/extensions/gsd/db-base-schema.js +1 -1
- package/dist/resources/extensions/gsd/db-connection-cache.js +1 -1
- package/dist/resources/extensions/gsd/db-coordination-schema.js +1 -1
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +1 -1
- package/dist/resources/extensions/gsd/db-gate-rows.js +1 -1
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +1 -1
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +1 -1
- package/dist/resources/extensions/gsd/db-migration-backup.js +1 -1
- package/dist/resources/extensions/gsd/db-migration-steps.js +1 -1
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +1 -1
- package/dist/resources/extensions/gsd/db-open-state.js +1 -1
- package/dist/resources/extensions/gsd/db-provider.js +1 -1
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +1 -1
- package/dist/resources/extensions/gsd/db-schema-metadata.js +1 -1
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +1 -1
- package/dist/resources/extensions/gsd/db-transaction.js +1 -1
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +1 -1
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +1 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +1 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -1
- package/dist/resources/extensions/gsd/ecosystem/loader.js +1 -1
- package/dist/resources/extensions/gsd/escalation.js +1 -1
- package/dist/resources/extensions/gsd/fresh-run-ui.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +1 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -1
- package/dist/resources/extensions/gsd/gsd-command-home.js +1 -1
- package/dist/resources/extensions/gsd/gsd-db.js +1 -1
- package/dist/resources/extensions/gsd/guided-unit-context.js +1 -1
- package/dist/resources/extensions/gsd/health-widget.js +1 -1
- package/dist/resources/extensions/gsd/knowledge-backfill.js +1 -1
- package/dist/resources/extensions/gsd/knowledge-capture.js +1 -1
- package/dist/resources/extensions/gsd/knowledge-parser.js +1 -1
- package/dist/resources/extensions/gsd/knowledge-projection.js +1 -1
- package/dist/resources/extensions/gsd/legacy-telemetry.js +1 -3
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/md-importer.js +2 -2
- package/dist/resources/extensions/gsd/memory-backfill.js +1 -1
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/metrics.js +1 -1
- package/dist/resources/extensions/gsd/migrate/audit.js +4 -2
- package/dist/resources/extensions/gsd/migrate/command.js +27 -5
- package/dist/resources/extensions/gsd/migrate/parser.js +57 -11
- package/dist/resources/extensions/gsd/migrate/parsers.js +16 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +1 -0
- package/dist/resources/extensions/gsd/migrate/safety.js +1 -1
- package/dist/resources/extensions/gsd/migrate/transformer.js +79 -6
- package/dist/resources/extensions/gsd/migrate/validator.js +22 -1
- package/dist/resources/extensions/gsd/migrate/writer.js +1 -1
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +1 -1
- package/dist/resources/extensions/gsd/model-router.js +1 -1
- package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +1 -1
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
- package/dist/resources/extensions/gsd/paths.js +1 -1
- package/dist/resources/extensions/gsd/pending-auto-start.js +1 -1
- package/dist/resources/extensions/gsd/planning-depth.js +1 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +1 -1
- package/dist/resources/extensions/gsd/pr-evidence.js +1 -1
- package/dist/resources/extensions/gsd/pre-execution-checks.js +1 -1
- package/dist/resources/extensions/gsd/process-task-path.js +1 -1
- package/dist/resources/extensions/gsd/prompts/review-migration.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +1 -1
- package/dist/resources/extensions/gsd/repository-registry.js +1 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +1 -1
- package/dist/resources/extensions/gsd/schemas/parsers.js +1 -1
- package/dist/resources/extensions/gsd/schemas/validate.js +1 -1
- package/dist/resources/extensions/gsd/skill-manifest.js +1 -1
- package/dist/resources/extensions/gsd/slice-cadence.js +1 -1
- package/dist/resources/extensions/gsd/smart-entry-routing.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/errors.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/types.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation.js +1 -1
- package/dist/resources/extensions/gsd/state.js +9 -18
- package/dist/resources/extensions/gsd/tool-contract.js +1 -1
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +8 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +1 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +1 -1
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +1 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/tui/render-kit.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +1 -1
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit.js +1 -1
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -1
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +1 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +1 -1
- package/dist/resources/extensions/gsd/uok/plan-v2.js +1 -1
- package/dist/resources/extensions/gsd/uok/timeline.js +1 -1
- package/dist/resources/extensions/gsd/validation-block-guard.js +1 -1
- package/dist/resources/extensions/gsd/verification-gate.js +28 -12
- package/dist/resources/extensions/gsd/verification-verdict.js +9 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -1
- package/dist/resources/extensions/gsd/watch/splash-palette.js +1 -1
- package/dist/resources/extensions/gsd/workflow-manifest.js +1 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +1 -1
- package/dist/resources/extensions/gsd/workflow-protocol.js +1 -1
- package/dist/resources/extensions/gsd/workflow-templates.js +1 -1
- package/dist/resources/extensions/gsd/working-output-messages.js +1 -1
- package/dist/resources/extensions/gsd/workspace.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +1 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +1 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +1 -1
- package/dist/resources/extensions/mcp-client/manager.js +1 -1
- package/dist/resources/extensions/ollama/index.js +1 -1
- package/dist/resources/extensions/ollama/model-capabilities.js +1 -1
- package/dist/resources/extensions/ollama/ndjson-stream.js +1 -1
- package/dist/resources/extensions/ollama/ollama-chat-provider.js +1 -1
- package/dist/resources/extensions/ollama/ollama-client.js +1 -1
- package/dist/resources/extensions/ollama/ollama-commands.js +1 -1
- package/dist/resources/extensions/ollama/ollama-discovery.js +1 -1
- package/dist/resources/extensions/ollama/ollama-tool.js +1 -1
- package/dist/resources/extensions/ollama/thinking-parser.js +1 -1
- package/dist/resources/extensions/ollama/types.js +1 -1
- package/dist/resources/extensions/shared/cmux-events.js +1 -1
- package/dist/resources/extensions/shared/gsd-phase-state.js +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -1
- package/dist/resources/extensions/subagent/launch.js +1 -1
- package/dist/resources/extensions/subagent/run-store.js +1 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +1 -1
- package/dist/resources/extensions/visual-brief/index.js +1 -1
- package/dist/resources/extensions/visual-brief/page-contract.js +1 -1
- package/dist/resources/extensions/visual-brief/prompts.js +1 -1
- package/dist/resources/skills/api-design/SKILL.md +1 -1
- package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/dist/resources/skills/observability/SKILL.md +4 -4
- package/dist/resources/skills/security-review/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-check.d.ts +5 -2
- package/dist/update-check.js +10 -7
- package/dist/update-cmd.d.ts +6 -1
- package/dist/update-cmd.js +4 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-a662c55787b78a48.js → page-0fa92deaf6721345.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-68f32aa90495be18.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-4dbb4d03b2d85d57.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-da6af500e9c35ea7.js → main-app-c3abead5a8518a30.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-de2636d5a7f60b61.js +1 -0
- package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib → sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3} +0 -0
- package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/package.json +11 -5
- package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
- package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
- package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
- package/dist/web/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/package.json +13 -7
- package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/LICENSE +191 -0
- package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +369 -0
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/binding.Makefile +6 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +168 -0
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.Makefile +6 -0
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +106 -0
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +110 -0
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +106 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +1 -1
- package/package.json +11 -7
- package/packages/contracts/dist/index.js +1 -1
- package/packages/contracts/dist/index.js.map +1 -1
- package/packages/contracts/dist/rpc.js +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/rpc.test.js +1 -1
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.js +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/contracts/src/index.ts +1 -1
- package/packages/contracts/src/rpc.test.ts +1 -1
- package/packages/contracts/src/rpc.ts +1 -1
- package/packages/contracts/src/workflow.ts +1 -1
- package/packages/daemon/package.json +3 -3
- package/packages/mcp-server/dist/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/mcp-server/src/import-candidates.test.ts +1 -1
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +1 -1
- package/packages/mcp-server/src/workflow-tools.ts +1 -1
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/dist/grep/index.js +35 -1
- package/packages/native/dist/index.d.ts +1 -0
- package/packages/native/dist/index.js +4 -1
- package/packages/native/dist/native.d.ts +2 -0
- package/packages/native/dist/native.js +38 -25
- package/packages/native/dist/text/index.js +118 -6
- package/packages/native/dist/xxhash/index.d.ts +1 -2
- package/packages/native/dist/xxhash/index.js +7 -7
- package/packages/native/package.json +1 -1
- package/packages/native/src/__tests__/function-fallback.test.mjs +37 -0
- package/packages/native/src/__tests__/text-fallback.test.mjs +44 -0
- package/packages/native/src/grep/index.ts +38 -1
- package/packages/native/src/index.ts +2 -0
- package/packages/native/src/native.ts +37 -22
- package/packages/native/src/text/index.ts +145 -32
- package/packages/native/src/xxhash/index.ts +6 -9
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/token-audit.js +1 -1
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/token-audit.test.ts +1 -1
- package/packages/pi-agent-core/src/token-audit.ts +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/fake-model.d.ts +1 -1
- package/packages/pi-ai/dist/models/fake-model.js +1 -1
- package/packages/pi-ai/dist/models/fake-model.js.map +1 -1
- package/packages/pi-ai/dist/providers/api-family.js +1 -1
- package/packages/pi-ai/dist/providers/api-family.js.map +1 -1
- package/packages/pi-ai/dist/providers/api-family.test.js +1 -1
- package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/fake.d.ts +1 -1
- package/packages/pi-ai/dist/providers/fake.js +1 -1
- package/packages/pi-ai/dist/providers/fake.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/provider-capabilities.js +1 -1
- package/packages/pi-ai/dist/providers/provider-capabilities.js.map +1 -1
- package/packages/pi-ai/dist/providers/provider-capabilities.test.js +1 -1
- package/packages/pi-ai/dist/providers/provider-capabilities.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages-report.test.js +1 -1
- package/packages/pi-ai/dist/providers/transform-messages-report.test.js.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/models/fake-model.ts +1 -1
- package/packages/pi-ai/src/providers/api-family.test.ts +1 -1
- package/packages/pi-ai/src/providers/api-family.ts +1 -1
- package/packages/pi-ai/src/providers/fake.ts +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +1 -1
- package/packages/pi-ai/src/providers/provider-capabilities.test.ts +1 -1
- package/packages/pi-ai/src/providers/provider-capabilities.ts +1 -1
- package/packages/pi-ai/src/providers/transform-messages-report.test.ts +1 -1
- package/packages/pi-ai/src/types.ts +1 -1
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.js +5 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.test.js +21 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -2
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +1 -1
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +1 -1
- package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/model-discovery.test.ts +22 -0
- package/packages/pi-coding-agent/src/core/model-discovery.ts +6 -1
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +1 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -1
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +1 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/keys.test.js +1 -1
- package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.js +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/utils.test.js +5 -2
- package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/box.test.js +1 -1
- package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/editor.test.js +1 -1
- package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +1 -1
- package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -1
- package/packages/pi-tui/dist/components/box.js +1 -1
- package/packages/pi-tui/dist/components/box.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +1 -1
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/truncated-text.js +1 -1
- package/packages/pi-tui/dist/components/truncated-text.js.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/keys.js +1 -1
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +1 -1
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/style.js +1 -1
- package/packages/pi-tui/dist/style.js.map +1 -1
- package/packages/pi-tui/dist/tui.js +1 -1
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts +3 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +46 -2
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/keys.test.ts +1 -1
- package/packages/pi-tui/src/__tests__/style.test.ts +1 -1
- package/packages/pi-tui/src/__tests__/tui.test.ts +1 -1
- package/packages/pi-tui/src/__tests__/utils.test.ts +6 -2
- package/packages/pi-tui/src/components/__tests__/box.test.ts +1 -1
- package/packages/pi-tui/src/components/__tests__/editor.test.ts +1 -1
- package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +1 -1
- package/packages/pi-tui/src/components/box.ts +1 -1
- package/packages/pi-tui/src/components/editor.ts +1 -1
- package/packages/pi-tui/src/components/input.ts +1 -1
- package/packages/pi-tui/src/components/truncated-text.ts +1 -1
- package/packages/pi-tui/src/index.ts +1 -1
- package/packages/pi-tui/src/keys.ts +1 -1
- package/packages/pi-tui/src/overlay-layout.ts +1 -1
- package/packages/pi-tui/src/style.ts +1 -1
- package/packages/pi-tui/src/tui.ts +1 -1
- package/packages/pi-tui/src/utils.ts +47 -2
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-types.js +1 -1
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/packages/rpc-client/src/rpc-types.ts +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +36 -3
- package/scripts/lib/workspace-manifest.cjs +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +2 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +5 -5
- package/src/resources/extensions/github-sync/templates.ts +1 -1
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +1 -1
- package/src/resources/extensions/github-sync/tests/templates.test.ts +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -1
- package/src/resources/extensions/gsd/auto/contracts.ts +1 -1
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +1 -1
- package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -0
- package/src/resources/extensions/gsd/auto/loop.ts +2 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
- package/src/resources/extensions/gsd/auto/phases.ts +14 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +117 -45
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +40 -0
- package/src/resources/extensions/gsd/auto/session.ts +1 -1
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +1 -1
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +1 -1
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +1 -1
- package/src/resources/extensions/gsd/auto-budget.ts +1 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +1 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +1 -1
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-status-message.ts +1 -1
- package/src/resources/extensions/gsd/auto-timers.ts +13 -4
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +1 -1
- package/src/resources/extensions/gsd/auto-verification.ts +1 -1
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +1 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +36 -4
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +5 -9
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +3 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -1
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +81 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
- package/src/resources/extensions/gsd/browser-evidence.ts +1 -1
- package/src/resources/extensions/gsd/closeout-recovery.ts +1 -1
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
- package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -2
- package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
- package/src/resources/extensions/gsd/commands-closeout.ts +1 -1
- package/src/resources/extensions/gsd/commands-ship.ts +1 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +1 -1
- package/src/resources/extensions/gsd/commands-worktree.ts +1 -1
- package/src/resources/extensions/gsd/component-loader.ts +1 -1
- package/src/resources/extensions/gsd/db/auto-workers.ts +1 -1
- package/src/resources/extensions/gsd/db/command-queue.ts +1 -1
- package/src/resources/extensions/gsd/db/milestone-leases.ts +20 -6
- package/src/resources/extensions/gsd/db/runtime-kv.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +1 -1
- package/src/resources/extensions/gsd/db-adapter.ts +1 -1
- package/src/resources/extensions/gsd/db-base-schema.ts +1 -1
- package/src/resources/extensions/gsd/db-connection-cache.ts +1 -1
- package/src/resources/extensions/gsd/db-coordination-schema.ts +1 -1
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +1 -1
- package/src/resources/extensions/gsd/db-gate-rows.ts +1 -1
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +1 -1
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +1 -1
- package/src/resources/extensions/gsd/db-migration-backup.ts +1 -1
- package/src/resources/extensions/gsd/db-migration-steps.ts +1 -1
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +1 -1
- package/src/resources/extensions/gsd/db-open-state.ts +1 -1
- package/src/resources/extensions/gsd/db-provider.ts +1 -1
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +1 -1
- package/src/resources/extensions/gsd/db-schema-metadata.ts +1 -1
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +1 -1
- package/src/resources/extensions/gsd/db-transaction.ts +1 -1
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +1 -1
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +1 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +1 -1
- package/src/resources/extensions/gsd/doctor-types.ts +1 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +1 -1
- package/src/resources/extensions/gsd/ecosystem/loader.ts +1 -1
- package/src/resources/extensions/gsd/escalation.ts +1 -1
- package/src/resources/extensions/gsd/fresh-run-ui.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -1
- package/src/resources/extensions/gsd/gsd-command-home.ts +1 -1
- package/src/resources/extensions/gsd/gsd-db.ts +1 -1
- package/src/resources/extensions/gsd/guided-unit-context.ts +1 -1
- package/src/resources/extensions/gsd/health-widget.ts +1 -1
- package/src/resources/extensions/gsd/knowledge-backfill.ts +1 -1
- package/src/resources/extensions/gsd/knowledge-capture.ts +1 -1
- package/src/resources/extensions/gsd/knowledge-parser.ts +1 -1
- package/src/resources/extensions/gsd/knowledge-projection.ts +1 -1
- package/src/resources/extensions/gsd/legacy-telemetry.ts +1 -4
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/md-importer.ts +2 -2
- package/src/resources/extensions/gsd/memory-backfill.ts +1 -1
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/metrics.ts +1 -1
- package/src/resources/extensions/gsd/migrate/audit.ts +8 -2
- package/src/resources/extensions/gsd/migrate/command.ts +31 -5
- package/src/resources/extensions/gsd/migrate/index.ts +1 -1
- package/src/resources/extensions/gsd/migrate/parser.ts +63 -10
- package/src/resources/extensions/gsd/migrate/parsers.ts +17 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +1 -0
- package/src/resources/extensions/gsd/migrate/safety.ts +1 -1
- package/src/resources/extensions/gsd/migrate/transformer.ts +81 -6
- package/src/resources/extensions/gsd/migrate/types.ts +29 -1
- package/src/resources/extensions/gsd/migrate/validator.ts +25 -1
- package/src/resources/extensions/gsd/migrate/writer.ts +6 -1
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +1 -1
- package/src/resources/extensions/gsd/model-router.ts +1 -1
- package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +1 -1
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
- package/src/resources/extensions/gsd/paths.ts +1 -1
- package/src/resources/extensions/gsd/pending-auto-start.ts +1 -1
- package/src/resources/extensions/gsd/planning-depth.ts +1 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +1 -1
- package/src/resources/extensions/gsd/pr-evidence.ts +1 -1
- package/src/resources/extensions/gsd/pre-execution-checks.ts +1 -1
- package/src/resources/extensions/gsd/process-task-path.ts +1 -1
- package/src/resources/extensions/gsd/prompts/review-migration.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +1 -1
- package/src/resources/extensions/gsd/repository-registry.ts +1 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +1 -1
- package/src/resources/extensions/gsd/schemas/parsers.ts +1 -1
- package/src/resources/extensions/gsd/schemas/validate.ts +1 -1
- package/src/resources/extensions/gsd/skill-manifest.ts +1 -1
- package/src/resources/extensions/gsd/slice-cadence.ts +1 -1
- package/src/resources/extensions/gsd/smart-entry-routing.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/errors.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation.ts +1 -1
- package/src/resources/extensions/gsd/state.ts +9 -17
- package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +65 -6
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +22 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -52
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-workers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/cmux.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/command-queue.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -30
- package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/header-renderer.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -52
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/headless-command.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1 -23
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +2 -32
- package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +3 -3
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +1 -158
- package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/paths-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -4
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +27 -10
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/update-command.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +16 -7
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +12 -1
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workspace.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +1 -1
- package/src/resources/extensions/gsd/tool-contract.ts +1 -1
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +1 -1
- package/src/resources/extensions/gsd/tools/exec-tool.ts +1 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +1 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/tui/render-kit.ts +1 -1
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +1 -1
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/uok/audit.ts +1 -1
- package/src/resources/extensions/gsd/uok/contracts.ts +1 -1
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +1 -1
- package/src/resources/extensions/gsd/uok/kernel.ts +1 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +1 -1
- package/src/resources/extensions/gsd/uok/plan-v2.ts +1 -1
- package/src/resources/extensions/gsd/uok/timeline.ts +1 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +1 -1
- package/src/resources/extensions/gsd/verification-gate.ts +28 -12
- package/src/resources/extensions/gsd/verification-verdict.ts +10 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -1
- package/src/resources/extensions/gsd/watch/splash-palette.ts +1 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +1 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +1 -1
- package/src/resources/extensions/gsd/workflow-protocol.ts +1 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +1 -1
- package/src/resources/extensions/gsd/working-output-messages.ts +1 -1
- package/src/resources/extensions/gsd/workspace.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +1 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +1 -1
- package/src/resources/extensions/mcp-client/manager.ts +1 -1
- package/src/resources/extensions/mcp-client/tests/manager.test.ts +1 -1
- package/src/resources/extensions/ollama/index.ts +1 -1
- package/src/resources/extensions/ollama/model-capabilities.ts +1 -1
- package/src/resources/extensions/ollama/ndjson-stream.ts +1 -1
- package/src/resources/extensions/ollama/ollama-chat-provider.ts +1 -1
- package/src/resources/extensions/ollama/ollama-client.ts +1 -1
- package/src/resources/extensions/ollama/ollama-commands.ts +1 -1
- package/src/resources/extensions/ollama/ollama-discovery.ts +1 -1
- package/src/resources/extensions/ollama/ollama-tool.ts +1 -1
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +1 -1
- package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +1 -1
- package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +1 -1
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +1 -1
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +1 -1
- package/src/resources/extensions/ollama/thinking-parser.ts +1 -1
- package/src/resources/extensions/ollama/types.ts +1 -1
- package/src/resources/extensions/shared/cmux-events.ts +1 -1
- package/src/resources/extensions/shared/gsd-phase-state.ts +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -1
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +1 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +1 -1
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +1 -1
- package/src/resources/extensions/subagent/launch.ts +1 -1
- package/src/resources/extensions/subagent/run-store.ts +1 -1
- package/src/resources/extensions/subagent/tests/launch.test.ts +1 -1
- package/src/resources/extensions/subagent/tests/run-store.test.ts +1 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +1 -1
- package/src/resources/extensions/visual-brief/index.ts +1 -1
- package/src/resources/extensions/visual-brief/page-contract.ts +1 -1
- package/src/resources/extensions/visual-brief/prompts.ts +1 -1
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +1 -1
- package/src/resources/skills/api-design/SKILL.md +1 -1
- package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +1 -1
- package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/src/resources/skills/observability/SKILL.md +4 -4
- package/src/resources/skills/security-review/SKILL.md +1 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-82017658b76e2494.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-d660442e70026068.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1065c9a10c4c2187.js +0 -1
- package/dist/web/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -175
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -290
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -743
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +0 -138
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -514
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
- package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -313
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -1049
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -170
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -206
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -149
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
- package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
- package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -263
- package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -954
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -431
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -549
- package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
- package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -248
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -347
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +0 -567
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -252
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -609
- package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +0 -348
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1645
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -766
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -216
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +0 -242
- /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → xbY3PcWtH3LhCQlgKH75u}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → xbY3PcWtH3LhCQlgKH75u}/_ssgManifest.js +0 -0
- /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/lib/index.js +0 -0
- /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/versions.json +0 -0
- /package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/LICENSE +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* gsd-pi fake model — paired with the fake LLM provider for e2e tests.
|
|
3
3
|
*
|
|
4
4
|
* Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the
|
|
5
5
|
* conditional branch in models/index.ts. The model is invisible to normal
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* gsd-pi fake model — paired with the fake LLM provider for e2e tests.
|
|
3
3
|
*
|
|
4
4
|
* Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the
|
|
5
5
|
* conditional branch in models/index.ts. The model is invisible to normal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-model.js","sourceRoot":"","sources":["../../src/models/fake-model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAkB;IACxC,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,uBAAuB;IAC7B,GAAG,EAAE,MAAM;IACX,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,2BAA2B;IACpC,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,IAAI,EAAE;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;KACb;IACD,aAAa,EAAE,OAAO;IACtB,SAAS,EAAE,KAAK;CAChB,CAAC","sourcesContent":["/**\n *
|
|
1
|
+
{"version":3,"file":"fake-model.js","sourceRoot":"","sources":["../../src/models/fake-model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAkB;IACxC,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,uBAAuB;IAC7B,GAAG,EAAE,MAAM;IACX,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,2BAA2B;IACpC,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,IAAI,EAAE;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;KACb;IACD,aAAa,EAAE,OAAO;IACtB,SAAS,EAAE,KAAK;CAChB,CAAC","sourcesContent":["/**\n * gsd-pi fake model — paired with the fake LLM provider for e2e tests.\n *\n * Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the\n * conditional branch in models/index.ts. The model is invisible to normal\n * users; it shows up in `--list-models` only inside e2e test subprocesses.\n */\n\nimport type { Model } from \"../types.js\";\n\nexport const FAKE_PROVIDER = \"gsd-fake\" as const;\nexport const FAKE_MODEL_ID = \"gsd-fake-model\" as const;\n\nexport const FAKE_MODEL: Model<\"fake\"> = {\n\tid: FAKE_MODEL_ID,\n\tname: \"GSD Fake (e2e replay)\",\n\tapi: \"fake\",\n\tprovider: FAKE_PROVIDER,\n\tbaseUrl: \"https://fake.gsd.local/v1\",\n\treasoning: false,\n\tinput: [\"text\"],\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t},\n\tcontextWindow: 200_000,\n\tmaxTokens: 8_192,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-family.js","sourceRoot":"","sources":["../../src/providers/api-family.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"api-family.js","sourceRoot":"","sources":["../../src/providers/api-family.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,2DAA2D;AAC3D,4EAA4E;AAC5E,iEAAiE;AACjE,0EAA0E;AAC1E,kEAAkE;AAClE,0EAA0E;AAC1E,eAAe;AAKf;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,GAAG,KAAK,oBAAoB,IAAI,GAAG,KAAK,kBAAkB,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,CACL,GAAG,KAAK,oBAAoB;QAC5B,GAAG,KAAK,kBAAkB;QAC1B,GAAG,KAAK,wBAAwB;QAChC,GAAG,KAAK,wBAAwB,CACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,CACL,GAAG,KAAK,sBAAsB;QAC9B,GAAG,KAAK,mBAAmB;QAC3B,GAAG,KAAK,eAAe,CACxB,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,EAAE,GAAG,KAAK,yBAAyB,CAAC;AAClD,CAAC","sourcesContent":["// gsd-pi / pi-ai: API-shape family predicates\n//\n// Rule (see docs/dev/ADR-012-provider-id-vs-api-shape.md):\n// Gate API-shape-dependent behavior (tool schemas, request payload shape,\n// streaming format) on `model.api`, never on `model.provider`.\n// `provider` is a credential/transport identifier that varies by vendor\n// routing (e.g. `anthropic`, `claude-code`, `anthropic-vertex`,\n// `amazon-bedrock`, `vercel-ai-gateway`) even when the wire protocol is\n// identical.\n\n/** Minimal shape — any object with an optional `api` string works. */\ntype HasApi = { api?: string } | null | undefined;\n\n/**\n * True for any transport that speaks the Anthropic Messages wire protocol:\n * direct Anthropic, Claude Code OAuth, Anthropic-on-Vertex, Vercel AI Gateway\n * Anthropic routes, etc.\n *\n * Excludes Bedrock-hosted Claude — Bedrock Converse uses a different tool\n * schema and is matched by `isBedrockApi` instead.\n */\nexport function isAnthropicApi(model: HasApi): boolean {\n const api = model?.api;\n return api === \"anthropic-messages\" || api === \"anthropic-vertex\";\n}\n\n/**\n * True for any transport that speaks an OpenAI-shaped wire protocol:\n * Chat Completions, Responses, Azure-hosted Responses, Codex-hosted Responses.\n */\nexport function isOpenAIApi(model: HasApi): boolean {\n const api = model?.api;\n return (\n api === \"openai-completions\" ||\n api === \"openai-responses\" ||\n api === \"azure-openai-responses\" ||\n api === \"openai-codex-responses\"\n );\n}\n\n/**\n * True for any transport that speaks a Google Gemini wire protocol:\n * Generative AI REST, Gemini CLI, Vertex AI.\n */\nexport function isGeminiApi(model: HasApi): boolean {\n const api = model?.api;\n return (\n api === \"google-generative-ai\" ||\n api === \"google-gemini-cli\" ||\n api === \"google-vertex\"\n );\n}\n\n/** True for AWS Bedrock Converse transports. */\nexport function isBedrockApi(model: HasApi): boolean {\n return model?.api === \"bedrock-converse-stream\";\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// gsd-
|
|
1
|
+
// gsd-pi / pi-ai: api-family predicate tests
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
3
|
import assert from "node:assert/strict";
|
|
4
4
|
import { isAnthropicApi, isBedrockApi, isGeminiApi, isOpenAIApi, } from "./api-family.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-family.test.js","sourceRoot":"","sources":["../../src/providers/api-family.test.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"api-family.test.js","sourceRoot":"","sources":["../../src/providers/api-family.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi / pi-ai: api-family predicate tests\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n isAnthropicApi,\n isBedrockApi,\n isGeminiApi,\n isOpenAIApi,\n} from \"./api-family.js\";\n\n// Every api value registered via registerApiProvider() in register-builtins.ts.\n// Keep in sync with that file — the expectations below assert every api is\n// classified by exactly one family (except mistral, which is its own family\n// and belongs to none of the helpers).\nconst ALL_REGISTERED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-completions\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"bedrock-converse-stream\",\n \"mistral-conversations\",\n] as const;\n\ndescribe(\"isAnthropicApi\", () => {\n test(\"matches anthropic-messages and anthropic-vertex\", () => {\n assert.equal(isAnthropicApi({ api: \"anthropic-messages\" }), true);\n assert.equal(isAnthropicApi({ api: \"anthropic-vertex\" }), true);\n });\n\n test(\"excludes bedrock-converse-stream (different tool schema)\", () => {\n assert.equal(isAnthropicApi({ api: \"bedrock-converse-stream\" }), false);\n });\n\n test(\"excludes every non-Anthropic registered api\", () => {\n const nonAnthropic = ALL_REGISTERED_APIS.filter(\n (a) => a !== \"anthropic-messages\" && a !== \"anthropic-vertex\",\n );\n for (const api of nonAnthropic) {\n assert.equal(isAnthropicApi({ api }), false, `api=${api}`);\n }\n });\n\n test(\"tolerates null/undefined/missing api\", () => {\n assert.equal(isAnthropicApi(null), false);\n assert.equal(isAnthropicApi(undefined), false);\n assert.equal(isAnthropicApi({}), false);\n assert.equal(isAnthropicApi({ api: \"\" }), false);\n });\n});\n\ndescribe(\"isOpenAIApi\", () => {\n test(\"matches all OpenAI-shaped apis\", () => {\n for (const api of [\n \"openai-completions\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n ]) {\n assert.equal(isOpenAIApi({ api }), true, `api=${api}`);\n }\n });\n\n test(\"excludes every non-OpenAI registered api\", () => {\n const nonOpenAI = ALL_REGISTERED_APIS.filter(\n (a) =>\n a !== \"openai-completions\" &&\n a !== \"openai-responses\" &&\n a !== \"azure-openai-responses\" &&\n a !== \"openai-codex-responses\",\n );\n for (const api of nonOpenAI) {\n assert.equal(isOpenAIApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"isGeminiApi\", () => {\n test(\"matches all Gemini-shaped apis\", () => {\n for (const api of [\"google-generative-ai\", \"google-gemini-cli\", \"google-vertex\"]) {\n assert.equal(isGeminiApi({ api }), true, `api=${api}`);\n }\n });\n\n test(\"excludes every non-Gemini registered api\", () => {\n const nonGemini = ALL_REGISTERED_APIS.filter(\n (a) =>\n a !== \"google-generative-ai\" &&\n a !== \"google-gemini-cli\" &&\n a !== \"google-vertex\",\n );\n for (const api of nonGemini) {\n assert.equal(isGeminiApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"isBedrockApi\", () => {\n test(\"matches only bedrock-converse-stream\", () => {\n assert.equal(isBedrockApi({ api: \"bedrock-converse-stream\" }), true);\n for (const api of ALL_REGISTERED_APIS.filter((a) => a !== \"bedrock-converse-stream\")) {\n assert.equal(isBedrockApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"api-family exclusivity\", () => {\n test(\"every registered api belongs to exactly one family (or mistral = none)\", () => {\n for (const api of ALL_REGISTERED_APIS) {\n const matches = [\n isAnthropicApi({ api }),\n isOpenAIApi({ api }),\n isGeminiApi({ api }),\n isBedrockApi({ api }),\n ].filter(Boolean).length;\n const expected = api === \"mistral-conversations\" ? 0 : 1;\n assert.equal(\n matches,\n expected,\n `api=${api} matched ${matches} families (expected ${expected})`,\n );\n }\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* gsd-pi fake LLM provider — deterministic JSONL replay for e2e tests.
|
|
3
3
|
*
|
|
4
4
|
* Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a
|
|
5
5
|
* JSONL transcript file (one turn per line) and replays scripted responses
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* gsd-pi fake LLM provider — deterministic JSONL replay for e2e tests.
|
|
3
3
|
*
|
|
4
4
|
* Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a
|
|
5
5
|
* JSONL transcript file (one turn per line) and replays scripted responses
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * GSD-2 fake LLM provider — deterministic JSONL replay for e2e tests.\n *\n * Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a\n * JSONL transcript file (one turn per line) and replays scripted responses\n * sequentially. Each turn carries structural assertions about the incoming\n * request — if the request shape drifts, the provider fails loudly so tests\n * surface it instead of silently consuming wrong inputs.\n *\n * IMPORTANT: env var must be set BEFORE pi-ai is imported. Tests achieve\n * this by setting it on the subprocess they spawn. In-process tests cannot\n * mix fake and real providers in the same Node process.\n *\n * Transcript format (JSONL, one turn per line):\n * {\n * \"turn\": 1,\n * \"expect\": {\n * \"modelId\": \"gsd-fake-model\",\n * \"messageCount\": 2, // optional, exact match\n * \"lastUserText\": \"do X\", // optional, substring match\n * \"systemContains\": [\"...\"], // optional, all must be present\n * \"toolNames\": [\"read_file\"], // optional, exact set\n * \"hasToolResultFor\": \"read_file\" // optional, last message is a toolResult for this name\n * },\n * \"emit\": { \"kind\": \"text\", \"text\": \"...\", \"stopReason\": \"stop\" }\n * | { \"kind\": \"tool_use\", \"calls\": [...], \"stopReason\": \"toolUse\" }\n * | { \"kind\": \"error_429\", \"message\": \"rate limited\", \"retryAfterMs\": 1000 }\n * | { \"kind\": \"malformed\" }\n * | { \"kind\": \"timeout\", \"delayMs\": 60000 }\n * }\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { ApiProvider } from \"../api-registry.js\";\nimport type {\n\tAssistantMessage,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamOptions,\n\tToolCall,\n\tUserMessage,\n} from \"../types.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\n\nexport const FAKE_API = \"fake\" as const;\n\ninterface ExpectFields {\n\tmodelId?: string;\n\tmessageCount?: number;\n\tlastUserText?: string;\n\tsystemContains?: string[];\n\ttoolNames?: string[];\n\thasToolResultFor?: string;\n}\n\ntype EmitSpec =\n\t| { kind: \"text\"; text: string; stopReason?: \"stop\" | \"length\" }\n\t| {\n\t\t\tkind: \"tool_use\";\n\t\t\tcalls: { id?: string; name: string; input: Record<string, unknown> }[];\n\t\t\tstopReason?: \"toolUse\";\n\t }\n\t| { kind: \"error_429\"; message?: string; retryAfterMs?: number }\n\t| { kind: \"malformed\"; message?: string }\n\t| { kind: \"timeout\"; delayMs?: number };\n\ninterface TranscriptTurn {\n\tturn: number;\n\texpect?: ExpectFields;\n\temit: EmitSpec;\n}\n\nfunction parseTranscript(path: string): TranscriptTurn[] {\n\tconst raw = readFileSync(path, \"utf8\");\n\tconst lines = raw.split(\"\\n\").filter((l) => l.trim().length > 0);\n\tconst turns: TranscriptTurn[] = [];\n\tfor (const [i, line] of lines.entries()) {\n\t\ttry {\n\t\t\tturns.push(JSON.parse(line));\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: failed to parse transcript ${path} line ${i + 1}: ${(err as Error).message}\\n line: ${line}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn turns;\n}\n\nfunction lastUserMessage(ctx: Context): UserMessage | undefined {\n\tfor (let i = ctx.messages.length - 1; i >= 0; i--) {\n\t\tconst m = ctx.messages[i];\n\t\tif (m.role === \"user\") return m;\n\t}\n\treturn undefined;\n}\n\nfunction userText(m: UserMessage): string {\n\tif (typeof m.content === \"string\") return m.content;\n\treturn m.content\n\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n}\n\nfunction checkExpectations(model: Model<typeof FAKE_API>, ctx: Context, turn: TranscriptTurn): void {\n\tconst e = turn.expect;\n\tif (!e) return;\n\tconst fail = (msg: string): never => {\n\t\t// Surface mismatch with enough context to debug, then throw.\n\t\tconst detail = {\n\t\t\tturn: turn.turn,\n\t\t\tmodelId: model.id,\n\t\t\tmessageCount: ctx.messages.length,\n\t\t\tlastUserText: lastUserMessage(ctx) ? userText(lastUserMessage(ctx)!).slice(0, 200) : null,\n\t\t\ttoolNames: ctx.tools?.map((t) => t.name) ?? [],\n\t\t};\n\t\tthrow new Error(`fake-llm: turn ${turn.turn} expectation mismatch: ${msg}\\n actual: ${JSON.stringify(detail)}`);\n\t};\n\n\tif (e.modelId !== undefined && model.id !== e.modelId) {\n\t\tfail(`expected modelId=${e.modelId}, got ${model.id}`);\n\t}\n\tif (e.messageCount !== undefined && ctx.messages.length !== e.messageCount) {\n\t\tfail(`expected messageCount=${e.messageCount}, got ${ctx.messages.length}`);\n\t}\n\tif (e.lastUserText !== undefined) {\n\t\tconst last = lastUserMessage(ctx);\n\t\tif (!last) fail(`expected lastUserText to contain \"${e.lastUserText}\", but no user messages found`);\n\t\tconst text = userText(last!);\n\t\tif (!text.includes(e.lastUserText)) {\n\t\t\tfail(`expected lastUserText to contain \"${e.lastUserText}\", got \"${text.slice(0, 200)}\"`);\n\t\t}\n\t}\n\tif (e.systemContains && e.systemContains.length > 0) {\n\t\tconst sys = ctx.systemPrompt ?? \"\";\n\t\tfor (const needle of e.systemContains) {\n\t\t\tif (!sys.includes(needle)) fail(`expected systemPrompt to contain \"${needle}\"`);\n\t\t}\n\t}\n\tif (e.toolNames) {\n\t\tconst actual = (ctx.tools ?? []).map((t) => t.name).sort();\n\t\tconst expected = [...e.toolNames].sort();\n\t\tif (actual.length !== expected.length || actual.some((n, i) => n !== expected[i])) {\n\t\t\tfail(`expected toolNames=${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n\t\t}\n\t}\n\tif (e.hasToolResultFor !== undefined) {\n\t\tconst last = ctx.messages[ctx.messages.length - 1];\n\t\tif (!last || last.role !== \"toolResult\" || last.toolName !== e.hasToolResultFor) {\n\t\t\tfail(`expected last message to be a toolResult for \"${e.hasToolResultFor}\"`);\n\t\t}\n\t}\n}\n\nfunction buildAssistantMessage(\n\tmodel: Model<typeof FAKE_API>,\n\temit: EmitSpec,\n): AssistantMessage {\n\tconst content: AssistantMessage[\"content\"] = [];\n\tlet stopReason: AssistantMessage[\"stopReason\"] = \"stop\";\n\n\tif (emit.kind === \"text\") {\n\t\tcontent.push({ type: \"text\", text: emit.text });\n\t\tstopReason = emit.stopReason ?? \"stop\";\n\t} else if (emit.kind === \"tool_use\") {\n\t\tfor (const [i, call] of emit.calls.entries()) {\n\t\t\tconst tc: ToolCall = {\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: call.id ?? `fake-tool-${Date.now()}-${i}`,\n\t\t\t\tname: call.name,\n\t\t\t\targuments: call.input,\n\t\t\t};\n\t\t\tcontent.push(tc);\n\t\t}\n\t\tstopReason = \"toolUse\";\n\t}\n\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent,\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\n/**\n * Create a fake provider bound to a transcript file. Each call to stream()\n * advances the turn cursor by one. Caller is responsible for ensuring the\n * transcript has enough turns.\n */\nexport function createFakeProvider(opts: { transcriptPath: string }): ApiProvider<typeof FAKE_API> {\n\tconst transcript = parseTranscript(opts.transcriptPath);\n\tlet cursor = 0;\n\n\tfunction nextTurn(): TranscriptTurn {\n\t\tif (cursor >= transcript.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: provider invoked ${cursor + 1} times but transcript only has ${transcript.length} turns. Add another turn to ${opts.transcriptPath}.`,\n\t\t\t);\n\t\t}\n\t\treturn transcript[cursor++];\n\t}\n\n\tfunction streamTurn(model: Model<typeof FAKE_API>, ctx: Context): AssistantMessageEventStream {\n\t\tconst stream = new AssistantMessageEventStream();\n\t\tconst turn = nextTurn();\n\n\t\t// Synchronously validate expectations BEFORE doing any async work — this\n\t\t// way drift mismatches are reported with the request that caused them.\n\t\tcheckExpectations(model, ctx, turn);\n\n\t\tconst emit = turn.emit;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tif (emit.kind === \"error_429\") {\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"rate_limit_exceeded\",\n\t\t\t\t\t\tretryAfterMs: emit.retryAfterMs,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"malformed\") {\n\t\t\t\t\t// Simulate a provider that emits a corrupted/incomplete response.\n\t\t\t\t\t// The agent loop converts this to stopReason: \"error\".\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"malformed_response\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"timeout\") {\n\t\t\t\t\tconst delay = emit.delayMs ?? 60_000;\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, delay));\n\t\t\t\t\t// If the caller hasn't already aborted, emit a synthetic timeout error.\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: \"timeout\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = buildAssistantMessage(model, emit);\n\t\t\t\tstream.push({ type: \"start\", partial: { ...message, content: [] } });\n\n\t\t\t\tif (emit.kind === \"text\") {\n\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: 0, partial: message });\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_delta\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tdelta: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_end\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tcontent: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t} else if (emit.kind === \"tool_use\") {\n\t\t\t\t\tfor (const [i, c] of message.content.entries()) {\n\t\t\t\t\t\tif (c.type !== \"toolCall\") continue;\n\t\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: i, partial: message });\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\t\tcontentIndex: i,\n\t\t\t\t\t\t\ttoolCall: c,\n\t\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"done\",\n\t\t\t\t\treason: message.stopReason as \"stop\" | \"length\" | \"toolUse\" | \"pauseTurn\",\n\t\t\t\t\tmessage,\n\t\t\t\t});\n\t\t\t\tstream.end(message);\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: model.api,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\terrorMessage: (err as Error).message,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\tstream.end(errorMsg);\n\t\t\t}\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\treturn {\n\t\tapi: FAKE_API,\n\t\tstream: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: StreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"stream\"],\n\t\tstreamSimple: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: SimpleStreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"streamSimple\"],\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * gsd-pi fake LLM provider — deterministic JSONL replay for e2e tests.\n *\n * Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a\n * JSONL transcript file (one turn per line) and replays scripted responses\n * sequentially. Each turn carries structural assertions about the incoming\n * request — if the request shape drifts, the provider fails loudly so tests\n * surface it instead of silently consuming wrong inputs.\n *\n * IMPORTANT: env var must be set BEFORE pi-ai is imported. Tests achieve\n * this by setting it on the subprocess they spawn. In-process tests cannot\n * mix fake and real providers in the same Node process.\n *\n * Transcript format (JSONL, one turn per line):\n * {\n * \"turn\": 1,\n * \"expect\": {\n * \"modelId\": \"gsd-fake-model\",\n * \"messageCount\": 2, // optional, exact match\n * \"lastUserText\": \"do X\", // optional, substring match\n * \"systemContains\": [\"...\"], // optional, all must be present\n * \"toolNames\": [\"read_file\"], // optional, exact set\n * \"hasToolResultFor\": \"read_file\" // optional, last message is a toolResult for this name\n * },\n * \"emit\": { \"kind\": \"text\", \"text\": \"...\", \"stopReason\": \"stop\" }\n * | { \"kind\": \"tool_use\", \"calls\": [...], \"stopReason\": \"toolUse\" }\n * | { \"kind\": \"error_429\", \"message\": \"rate limited\", \"retryAfterMs\": 1000 }\n * | { \"kind\": \"malformed\" }\n * | { \"kind\": \"timeout\", \"delayMs\": 60000 }\n * }\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { ApiProvider } from \"../api-registry.js\";\nimport type {\n\tAssistantMessage,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamOptions,\n\tToolCall,\n\tUserMessage,\n} from \"../types.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\n\nexport const FAKE_API = \"fake\" as const;\n\ninterface ExpectFields {\n\tmodelId?: string;\n\tmessageCount?: number;\n\tlastUserText?: string;\n\tsystemContains?: string[];\n\ttoolNames?: string[];\n\thasToolResultFor?: string;\n}\n\ntype EmitSpec =\n\t| { kind: \"text\"; text: string; stopReason?: \"stop\" | \"length\" }\n\t| {\n\t\t\tkind: \"tool_use\";\n\t\t\tcalls: { id?: string; name: string; input: Record<string, unknown> }[];\n\t\t\tstopReason?: \"toolUse\";\n\t }\n\t| { kind: \"error_429\"; message?: string; retryAfterMs?: number }\n\t| { kind: \"malformed\"; message?: string }\n\t| { kind: \"timeout\"; delayMs?: number };\n\ninterface TranscriptTurn {\n\tturn: number;\n\texpect?: ExpectFields;\n\temit: EmitSpec;\n}\n\nfunction parseTranscript(path: string): TranscriptTurn[] {\n\tconst raw = readFileSync(path, \"utf8\");\n\tconst lines = raw.split(\"\\n\").filter((l) => l.trim().length > 0);\n\tconst turns: TranscriptTurn[] = [];\n\tfor (const [i, line] of lines.entries()) {\n\t\ttry {\n\t\t\tturns.push(JSON.parse(line));\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: failed to parse transcript ${path} line ${i + 1}: ${(err as Error).message}\\n line: ${line}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn turns;\n}\n\nfunction lastUserMessage(ctx: Context): UserMessage | undefined {\n\tfor (let i = ctx.messages.length - 1; i >= 0; i--) {\n\t\tconst m = ctx.messages[i];\n\t\tif (m.role === \"user\") return m;\n\t}\n\treturn undefined;\n}\n\nfunction userText(m: UserMessage): string {\n\tif (typeof m.content === \"string\") return m.content;\n\treturn m.content\n\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n}\n\nfunction checkExpectations(model: Model<typeof FAKE_API>, ctx: Context, turn: TranscriptTurn): void {\n\tconst e = turn.expect;\n\tif (!e) return;\n\tconst fail = (msg: string): never => {\n\t\t// Surface mismatch with enough context to debug, then throw.\n\t\tconst detail = {\n\t\t\tturn: turn.turn,\n\t\t\tmodelId: model.id,\n\t\t\tmessageCount: ctx.messages.length,\n\t\t\tlastUserText: lastUserMessage(ctx) ? userText(lastUserMessage(ctx)!).slice(0, 200) : null,\n\t\t\ttoolNames: ctx.tools?.map((t) => t.name) ?? [],\n\t\t};\n\t\tthrow new Error(`fake-llm: turn ${turn.turn} expectation mismatch: ${msg}\\n actual: ${JSON.stringify(detail)}`);\n\t};\n\n\tif (e.modelId !== undefined && model.id !== e.modelId) {\n\t\tfail(`expected modelId=${e.modelId}, got ${model.id}`);\n\t}\n\tif (e.messageCount !== undefined && ctx.messages.length !== e.messageCount) {\n\t\tfail(`expected messageCount=${e.messageCount}, got ${ctx.messages.length}`);\n\t}\n\tif (e.lastUserText !== undefined) {\n\t\tconst last = lastUserMessage(ctx);\n\t\tif (!last) fail(`expected lastUserText to contain \"${e.lastUserText}\", but no user messages found`);\n\t\tconst text = userText(last!);\n\t\tif (!text.includes(e.lastUserText)) {\n\t\t\tfail(`expected lastUserText to contain \"${e.lastUserText}\", got \"${text.slice(0, 200)}\"`);\n\t\t}\n\t}\n\tif (e.systemContains && e.systemContains.length > 0) {\n\t\tconst sys = ctx.systemPrompt ?? \"\";\n\t\tfor (const needle of e.systemContains) {\n\t\t\tif (!sys.includes(needle)) fail(`expected systemPrompt to contain \"${needle}\"`);\n\t\t}\n\t}\n\tif (e.toolNames) {\n\t\tconst actual = (ctx.tools ?? []).map((t) => t.name).sort();\n\t\tconst expected = [...e.toolNames].sort();\n\t\tif (actual.length !== expected.length || actual.some((n, i) => n !== expected[i])) {\n\t\t\tfail(`expected toolNames=${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n\t\t}\n\t}\n\tif (e.hasToolResultFor !== undefined) {\n\t\tconst last = ctx.messages[ctx.messages.length - 1];\n\t\tif (!last || last.role !== \"toolResult\" || last.toolName !== e.hasToolResultFor) {\n\t\t\tfail(`expected last message to be a toolResult for \"${e.hasToolResultFor}\"`);\n\t\t}\n\t}\n}\n\nfunction buildAssistantMessage(\n\tmodel: Model<typeof FAKE_API>,\n\temit: EmitSpec,\n): AssistantMessage {\n\tconst content: AssistantMessage[\"content\"] = [];\n\tlet stopReason: AssistantMessage[\"stopReason\"] = \"stop\";\n\n\tif (emit.kind === \"text\") {\n\t\tcontent.push({ type: \"text\", text: emit.text });\n\t\tstopReason = emit.stopReason ?? \"stop\";\n\t} else if (emit.kind === \"tool_use\") {\n\t\tfor (const [i, call] of emit.calls.entries()) {\n\t\t\tconst tc: ToolCall = {\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: call.id ?? `fake-tool-${Date.now()}-${i}`,\n\t\t\t\tname: call.name,\n\t\t\t\targuments: call.input,\n\t\t\t};\n\t\t\tcontent.push(tc);\n\t\t}\n\t\tstopReason = \"toolUse\";\n\t}\n\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent,\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\n/**\n * Create a fake provider bound to a transcript file. Each call to stream()\n * advances the turn cursor by one. Caller is responsible for ensuring the\n * transcript has enough turns.\n */\nexport function createFakeProvider(opts: { transcriptPath: string }): ApiProvider<typeof FAKE_API> {\n\tconst transcript = parseTranscript(opts.transcriptPath);\n\tlet cursor = 0;\n\n\tfunction nextTurn(): TranscriptTurn {\n\t\tif (cursor >= transcript.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: provider invoked ${cursor + 1} times but transcript only has ${transcript.length} turns. Add another turn to ${opts.transcriptPath}.`,\n\t\t\t);\n\t\t}\n\t\treturn transcript[cursor++];\n\t}\n\n\tfunction streamTurn(model: Model<typeof FAKE_API>, ctx: Context): AssistantMessageEventStream {\n\t\tconst stream = new AssistantMessageEventStream();\n\t\tconst turn = nextTurn();\n\n\t\t// Synchronously validate expectations BEFORE doing any async work — this\n\t\t// way drift mismatches are reported with the request that caused them.\n\t\tcheckExpectations(model, ctx, turn);\n\n\t\tconst emit = turn.emit;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tif (emit.kind === \"error_429\") {\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"rate_limit_exceeded\",\n\t\t\t\t\t\tretryAfterMs: emit.retryAfterMs,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"malformed\") {\n\t\t\t\t\t// Simulate a provider that emits a corrupted/incomplete response.\n\t\t\t\t\t// The agent loop converts this to stopReason: \"error\".\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"malformed_response\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"timeout\") {\n\t\t\t\t\tconst delay = emit.delayMs ?? 60_000;\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, delay));\n\t\t\t\t\t// If the caller hasn't already aborted, emit a synthetic timeout error.\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: \"timeout\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = buildAssistantMessage(model, emit);\n\t\t\t\tstream.push({ type: \"start\", partial: { ...message, content: [] } });\n\n\t\t\t\tif (emit.kind === \"text\") {\n\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: 0, partial: message });\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_delta\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tdelta: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_end\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tcontent: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t} else if (emit.kind === \"tool_use\") {\n\t\t\t\t\tfor (const [i, c] of message.content.entries()) {\n\t\t\t\t\t\tif (c.type !== \"toolCall\") continue;\n\t\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: i, partial: message });\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\t\tcontentIndex: i,\n\t\t\t\t\t\t\ttoolCall: c,\n\t\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"done\",\n\t\t\t\t\treason: message.stopReason as \"stop\" | \"length\" | \"toolUse\" | \"pauseTurn\",\n\t\t\t\t\tmessage,\n\t\t\t\t});\n\t\t\t\tstream.end(message);\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: model.api,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\terrorMessage: (err as Error).message,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\tstream.end(errorMsg);\n\t\t\t}\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\treturn {\n\t\tapi: FAKE_API,\n\t\tstream: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: StreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"stream\"],\n\t\tstreamSimple: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: SimpleStreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"streamSimple\"],\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-gemini-cli.test.js","sourceRoot":"","sources":["../../src/providers/google-gemini-cli.test.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"google-gemini-cli.test.js","sourceRoot":"","sources":["../../src/providers/google-gemini-cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Tests Google Gemini CLI compatible provider behavior.\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport type { Context, Model } from \"../types.js\";\nimport { streamGoogleGeminiCli } from \"./google-gemini-cli.js\";\n\nfunction antigravityModel(id = \"gemini-3-pro-preview\"): Model<\"google-gemini-cli\"> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: \"google-gemini-cli\",\n\t\tprovider: \"google-antigravity\",\n\t\tbaseUrl: \"https://antigravity.example.test\",\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200000,\n\t\tmaxTokens: 32000,\n\t};\n}\n\ntest(\"Antigravity requests use the supported default User-Agent version\", async (t) => {\n\tconst originalFetch = globalThis.fetch;\n\tconst originalVersion = process.env.PI_AI_ANTIGRAVITY_VERSION;\n\tlet headers: Headers | undefined;\n\n\tt.after(() => {\n\t\tglobalThis.fetch = originalFetch;\n\t\tif (originalVersion === undefined) {\n\t\t\tdelete process.env.PI_AI_ANTIGRAVITY_VERSION;\n\t\t} else {\n\t\t\tprocess.env.PI_AI_ANTIGRAVITY_VERSION = originalVersion;\n\t\t}\n\t});\n\n\tdelete process.env.PI_AI_ANTIGRAVITY_VERSION;\n\tglobalThis.fetch = async (_input: string | URL | Request, init?: RequestInit) => {\n\t\theaders = new Headers(init?.headers);\n\t\treturn new Response(\n\t\t\t`data: ${JSON.stringify({\n\t\t\t\tresponse: {\n\t\t\t\t\tcandidates: [{ content: { parts: [{ text: \"ok\" }] }, finishReason: \"STOP\" }],\n\t\t\t\t},\n\t\t\t})}\\n\\n`,\n\t\t\t{ headers: { \"Content-Type\": \"text/event-stream\" } },\n\t\t);\n\t};\n\n\tconst context: Context = {\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n\tconst stream = streamGoogleGeminiCli(antigravityModel(), context, {\n\t\tapiKey: JSON.stringify({ token: \"access-token\", projectId: \"test-project\" }),\n\t});\n\tconst result = await stream.result();\n\n\tassert.equal(result.stopReason, \"stop\");\n\tassert.equal(headers?.get(\"User-Agent\"), \"antigravity/1.23.0 darwin/arm64\");\n});\n\ntest(\"antigravity 404 names Antigravity instead of Cloud Code Assist (#4606)\", async (t) => {\n\tconst originalFetch = globalThis.fetch;\n\tconst originalSetTimeout = globalThis.setTimeout;\n\n\tt.after(() => {\n\t\tglobalThis.fetch = originalFetch;\n\t\tglobalThis.setTimeout = originalSetTimeout;\n\t});\n\n\tglobalThis.fetch = async () =>\n\t\tnew Response(JSON.stringify({ error: { message: \"model not found\" } }), { status: 404 });\n\tglobalThis.setTimeout = ((callback: (...args: unknown[]) => void, _ms?: number, ...args: unknown[]) => {\n\t\tqueueMicrotask(() => callback(...args));\n\t\treturn 0;\n\t}) as unknown as typeof setTimeout;\n\n\tconst context: Context = {\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n\tconst stream = streamGoogleGeminiCli(antigravityModel(\"removed-antigravity-model\"), context, {\n\t\tapiKey: JSON.stringify({ token: \"token\", projectId: \"project\" }),\n\t});\n\tconst result = await stream.result();\n\n\tassert.equal(result.stopReason, \"error\");\n\tassert.match(result.errorMessage ?? \"\", /Antigravity API error \\(404\\)/);\n\tassert.doesNotMatch(result.errorMessage ?? \"\", /Cloud Code Assist API error/);\n});\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// gsd-pi — Provider Capabilities Registry (ADR-005 Phase 1)
|
|
2
2
|
// Declarative registry of what each API provider supports, consolidating
|
|
3
3
|
// scattered knowledge from *-shared.ts files into a queryable data structure.
|
|
4
4
|
// ─── Registry ───────────────────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-capabilities.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 — Provider Capabilities Registry (ADR-005 Phase 1)\n// Declarative registry of what each API provider supports, consolidating\n// scattered knowledge from *-shared.ts files into a queryable data structure.\n\nimport type { Api } from \"../types.js\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * Declarative capability profile for an API provider.\n * Used by the model router to filter incompatible models and by the tool\n * system to adjust tool sets per provider.\n */\nexport interface ProviderCapabilities {\n /** Whether models from this provider support tool/function calling */\n toolCalling: boolean;\n /** Maximum number of tools the provider handles well (0 = unlimited) */\n maxTools: number;\n /** Whether tool results can contain images */\n imageToolResults: boolean;\n /** Whether the provider supports structured JSON output */\n structuredOutput: boolean;\n /** Tool call ID format constraints */\n toolCallIdFormat: {\n maxLength: number;\n allowedChars: RegExp;\n };\n /** Whether thinking/reasoning blocks are preserved cross-turn */\n thinkingPersistence: \"full\" | \"text-only\" | \"none\";\n /** Schema features NOT supported (tools using these get filtered) */\n unsupportedSchemaFeatures: string[];\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────────\n\n/**\n * Built-in provider capability profiles.\n *\n * Sources (consolidated from scattered *-shared.ts files):\n * - anthropic-shared.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n * - openai-responses-shared.ts: ID normalization (64-char, fc_ prefix), image-in-tool-result workaround\n * - google-shared.ts: sanitizeSchemaForGoogle (patternProperties, const), requiresToolCallId\n * - mistral.ts: MISTRAL_TOOL_CALL_ID_LENGTH = 9\n * - amazon-bedrock.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n */\nexport const PROVIDER_CAPABILITIES: Record<string, ProviderCapabilities> = {\n \"anthropic-messages\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"anthropic-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false, // images sent as separate user message, not in tool result\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"azure-openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-codex-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-completions\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"google-generative-ai\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-gemini-cli\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"mistral-conversations\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 9, allowedChars: /^[a-zA-Z0-9]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n \"bedrock-converse-stream\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true, // Bedrock supports image content blocks in tool results\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"ollama-chat\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: false,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n};\n\n// ─── Default (permissive) profile for unknown providers ─────────────────────\n\nconst DEFAULT_CAPABILITIES: ProviderCapabilities = {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n};\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Get capabilities for a provider API. Returns a permissive default for\n * unknown providers (preserving existing behavior per ADR-005 principle 5).\n */\nexport function getProviderCapabilities(api: string): ProviderCapabilities {\n return PROVIDER_CAPABILITIES[api] ?? DEFAULT_CAPABILITIES;\n}\n\n/**\n * Check if a provider supports all required schema features.\n * Returns the list of unsupported features (empty if all supported).\n */\nexport function getUnsupportedFeatures(api: string, requiredFeatures: string[]): string[] {\n const caps = getProviderCapabilities(api);\n return requiredFeatures.filter(f => caps.unsupportedSchemaFeatures.includes(f));\n}\n\n/**\n * Deep-merge user-provided capability overrides with built-in defaults.\n * Partial overrides merge with the built-in profile for the given API.\n */\nexport function mergeCapabilityOverrides(\n api: string,\n overrides: Partial<Omit<ProviderCapabilities, \"toolCallIdFormat\">> & {\n toolCallIdFormat?: Partial<ProviderCapabilities[\"toolCallIdFormat\"]>;\n },\n): ProviderCapabilities {\n const base = getProviderCapabilities(api);\n return {\n ...base,\n ...overrides,\n toolCallIdFormat: overrides.toolCallIdFormat\n ? { ...base.toolCallIdFormat, ...overrides.toolCallIdFormat }\n : base.toolCallIdFormat,\n };\n}\n\n/**\n * Get all registered API names in the capability registry.\n * Used by lint rules to verify all providers in register-builtins.ts\n * have corresponding capability entries.\n */\nexport function getRegisteredApis(): string[] {\n return Object.keys(PROVIDER_CAPABILITIES);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"provider-capabilities.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi — Provider Capabilities Registry (ADR-005 Phase 1)\n// Declarative registry of what each API provider supports, consolidating\n// scattered knowledge from *-shared.ts files into a queryable data structure.\n\nimport type { Api } from \"../types.js\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * Declarative capability profile for an API provider.\n * Used by the model router to filter incompatible models and by the tool\n * system to adjust tool sets per provider.\n */\nexport interface ProviderCapabilities {\n /** Whether models from this provider support tool/function calling */\n toolCalling: boolean;\n /** Maximum number of tools the provider handles well (0 = unlimited) */\n maxTools: number;\n /** Whether tool results can contain images */\n imageToolResults: boolean;\n /** Whether the provider supports structured JSON output */\n structuredOutput: boolean;\n /** Tool call ID format constraints */\n toolCallIdFormat: {\n maxLength: number;\n allowedChars: RegExp;\n };\n /** Whether thinking/reasoning blocks are preserved cross-turn */\n thinkingPersistence: \"full\" | \"text-only\" | \"none\";\n /** Schema features NOT supported (tools using these get filtered) */\n unsupportedSchemaFeatures: string[];\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────────\n\n/**\n * Built-in provider capability profiles.\n *\n * Sources (consolidated from scattered *-shared.ts files):\n * - anthropic-shared.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n * - openai-responses-shared.ts: ID normalization (64-char, fc_ prefix), image-in-tool-result workaround\n * - google-shared.ts: sanitizeSchemaForGoogle (patternProperties, const), requiresToolCallId\n * - mistral.ts: MISTRAL_TOOL_CALL_ID_LENGTH = 9\n * - amazon-bedrock.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n */\nexport const PROVIDER_CAPABILITIES: Record<string, ProviderCapabilities> = {\n \"anthropic-messages\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"anthropic-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false, // images sent as separate user message, not in tool result\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"azure-openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-codex-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-completions\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"google-generative-ai\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-gemini-cli\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"mistral-conversations\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 9, allowedChars: /^[a-zA-Z0-9]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n \"bedrock-converse-stream\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true, // Bedrock supports image content blocks in tool results\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"ollama-chat\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: false,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n};\n\n// ─── Default (permissive) profile for unknown providers ─────────────────────\n\nconst DEFAULT_CAPABILITIES: ProviderCapabilities = {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n};\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Get capabilities for a provider API. Returns a permissive default for\n * unknown providers (preserving existing behavior per ADR-005 principle 5).\n */\nexport function getProviderCapabilities(api: string): ProviderCapabilities {\n return PROVIDER_CAPABILITIES[api] ?? DEFAULT_CAPABILITIES;\n}\n\n/**\n * Check if a provider supports all required schema features.\n * Returns the list of unsupported features (empty if all supported).\n */\nexport function getUnsupportedFeatures(api: string, requiredFeatures: string[]): string[] {\n const caps = getProviderCapabilities(api);\n return requiredFeatures.filter(f => caps.unsupportedSchemaFeatures.includes(f));\n}\n\n/**\n * Deep-merge user-provided capability overrides with built-in defaults.\n * Partial overrides merge with the built-in profile for the given API.\n */\nexport function mergeCapabilityOverrides(\n api: string,\n overrides: Partial<Omit<ProviderCapabilities, \"toolCallIdFormat\">> & {\n toolCallIdFormat?: Partial<ProviderCapabilities[\"toolCallIdFormat\"]>;\n },\n): ProviderCapabilities {\n const base = getProviderCapabilities(api);\n return {\n ...base,\n ...overrides,\n toolCallIdFormat: overrides.toolCallIdFormat\n ? { ...base.toolCallIdFormat, ...overrides.toolCallIdFormat }\n : base.toolCallIdFormat,\n };\n}\n\n/**\n * Get all registered API names in the capability registry.\n * Used by lint rules to verify all providers in register-builtins.ts\n * have corresponding capability entries.\n */\nexport function getRegisteredApis(): string[] {\n return Object.keys(PROVIDER_CAPABILITIES);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// gsd-pi — Provider Capabilities Registry Tests (ADR-005 Phase 1)
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
3
|
import assert from "node:assert/strict";
|
|
4
4
|
import { PROVIDER_CAPABILITIES, getProviderCapabilities, getUnsupportedFeatures, mergeCapabilityOverrides, getRegisteredApis, } from "./provider-capabilities.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-capabilities.test.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.test.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,+EAA+E;AAE/E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,MAAM,aAAa,GAAG;QACpB,oBAAoB;QACpB,kBAAkB;QAClB,kBAAkB;QAClB,wBAAwB;QACxB,wBAAwB;QACxB,oBAAoB;QACpB,sBAAsB;QACtB,mBAAmB;QACnB,eAAe;QACf,uBAAuB;QACvB,yBAAyB;QACzB,aAAa;KACd,CAAC;IAEF,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,CAAC,EAAE,CACP,qBAAqB,CAAC,GAAG,CAAC,EAC1B,qCAAqC,GAAG,EAAE,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,8BAA8B,GAAG,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAC;YACjF,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAC;YACjF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,GAAG,6BAA6B,CAAC,CAAC;YACpG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,YAAY,MAAM,EAAE,GAAG,GAAG,gCAAgC,CAAC,CAAC;YACxG,MAAM,CAAC,EAAE,CACP,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAChE,GAAG,GAAG,4BAA4B,IAAI,CAAC,mBAAmB,GAAG,CAC9D,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,GAAG,GAAG,4BAA4B,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,EAAE,CACP,qBAAqB,CAAC,sBAAsB,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CACtG,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,EAAE,CACP,qBAAqB,CAAC,sBAAsB,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC1F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,WAAW,GAAG,sBAAsB,CAAC,sBAAsB,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;QACnG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,WAAW,GAAG,sBAAsB,CAAC,oBAAoB,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,WAAW,GAAG,sBAAsB,CAAC,aAAa,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,wBAAwB,CAAC,kBAAkB,EAAE;YAC1D,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC5C,kCAAkC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,wBAAwB,CAAC,oBAAoB,EAAE;YAC5D,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;SACrC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACrD,mCAAmC;QACnC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,YAAY,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,wBAAwB,CAAC,aAAa,EAAE;YACrD,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// GSD-2 — Provider Capabilities Registry Tests (ADR-005 Phase 1)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n PROVIDER_CAPABILITIES,\n getProviderCapabilities,\n getUnsupportedFeatures,\n mergeCapabilityOverrides,\n getRegisteredApis,\n} from \"./provider-capabilities.js\";\n\n// ─── Registry Completeness ──────────────────────────────────────────────────\n\ndescribe(\"PROVIDER_CAPABILITIES registry\", () => {\n const EXPECTED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"mistral-conversations\",\n \"bedrock-converse-stream\",\n \"ollama-chat\",\n ];\n\n test(\"covers all expected API providers\", () => {\n for (const api of EXPECTED_APIS) {\n assert.ok(\n PROVIDER_CAPABILITIES[api],\n `Missing capability entry for API: ${api}`,\n );\n }\n });\n\n test(\"getRegisteredApis returns all entries\", () => {\n const registered = getRegisteredApis();\n for (const api of EXPECTED_APIS) {\n assert.ok(registered.includes(api), `getRegisteredApis missing: ${api}`);\n }\n });\n\n test(\"all entries have required fields\", () => {\n for (const [api, caps] of Object.entries(PROVIDER_CAPABILITIES)) {\n assert.equal(typeof caps.toolCalling, \"boolean\", `${api}.toolCalling`);\n assert.equal(typeof caps.maxTools, \"number\", `${api}.maxTools`);\n assert.equal(typeof caps.imageToolResults, \"boolean\", `${api}.imageToolResults`);\n assert.equal(typeof caps.structuredOutput, \"boolean\", `${api}.structuredOutput`);\n assert.ok(caps.toolCallIdFormat, `${api}.toolCallIdFormat`);\n assert.equal(typeof caps.toolCallIdFormat.maxLength, \"number\", `${api}.toolCallIdFormat.maxLength`);\n assert.ok(caps.toolCallIdFormat.allowedChars instanceof RegExp, `${api}.toolCallIdFormat.allowedChars`);\n assert.ok(\n [\"full\", \"text-only\", \"none\"].includes(caps.thinkingPersistence),\n `${api}.thinkingPersistence is \"${caps.thinkingPersistence}\"`,\n );\n assert.ok(Array.isArray(caps.unsupportedSchemaFeatures), `${api}.unsupportedSchemaFeatures`);\n }\n });\n});\n\n// ─── Provider-specific Values ───────────────────────────────────────────────\n\ndescribe(\"provider-specific capabilities\", () => {\n test(\"Anthropic supports full thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].thinkingPersistence, \"full\");\n });\n\n test(\"Anthropic supports image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].imageToolResults, true);\n });\n\n test(\"Anthropic tool call ID is 64 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].toolCallIdFormat.maxLength, 64);\n });\n\n test(\"Mistral tool call ID is 9 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].toolCallIdFormat.maxLength, 9);\n });\n\n test(\"Mistral has no thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].thinkingPersistence, \"none\");\n });\n\n test(\"Google does not support patternProperties\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"patternProperties\"),\n );\n });\n\n test(\"Google does not support const\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"const\"),\n );\n });\n\n test(\"OpenAI Responses does not support image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].imageToolResults, false);\n });\n\n test(\"OpenAI Responses has text-only thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].thinkingPersistence, \"text-only\");\n });\n});\n\n// ─── getProviderCapabilities ────────────────────────────────────────────────\n\ndescribe(\"getProviderCapabilities\", () => {\n test(\"returns known provider capabilities\", () => {\n const caps = getProviderCapabilities(\"anthropic-messages\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.thinkingPersistence, \"full\");\n });\n\n test(\"returns permissive defaults for unknown providers\", () => {\n const caps = getProviderCapabilities(\"unknown-provider-xyz\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.imageToolResults, true);\n assert.deepEqual(caps.unsupportedSchemaFeatures, []);\n });\n});\n\n// ─── getUnsupportedFeatures ─────────────────────────────────────────────────\n\ndescribe(\"getUnsupportedFeatures\", () => {\n test(\"returns unsupported features for Google\", () => {\n const unsupported = getUnsupportedFeatures(\"google-generative-ai\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, [\"patternProperties\", \"const\"]);\n });\n\n test(\"returns empty for Anthropic with any features\", () => {\n const unsupported = getUnsupportedFeatures(\"anthropic-messages\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, []);\n });\n\n test(\"returns empty for unknown provider\", () => {\n const unsupported = getUnsupportedFeatures(\"unknown-xyz\", [\"patternProperties\"]);\n assert.deepEqual(unsupported, []);\n });\n});\n\n// ─── mergeCapabilityOverrides ───────────────────────────────────────────────\n\ndescribe(\"mergeCapabilityOverrides\", () => {\n test(\"overrides individual fields\", () => {\n const merged = mergeCapabilityOverrides(\"openai-responses\", {\n imageToolResults: true,\n });\n assert.equal(merged.imageToolResults, true);\n // Non-overridden fields preserved\n assert.equal(merged.toolCalling, true);\n assert.equal(merged.thinkingPersistence, \"text-only\");\n });\n\n test(\"deep-merges toolCallIdFormat\", () => {\n const merged = mergeCapabilityOverrides(\"anthropic-messages\", {\n toolCallIdFormat: { maxLength: 128 },\n });\n assert.equal(merged.toolCallIdFormat.maxLength, 128);\n // allowedChars preserved from base\n assert.ok(merged.toolCallIdFormat.allowedChars instanceof RegExp);\n });\n\n test(\"uses permissive defaults for unknown provider\", () => {\n const merged = mergeCapabilityOverrides(\"unknown-xyz\", {\n imageToolResults: false,\n });\n assert.equal(merged.imageToolResults, false);\n assert.equal(merged.toolCalling, true); // from default\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"provider-capabilities.test.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi — Provider Capabilities Registry Tests (ADR-005 Phase 1)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n PROVIDER_CAPABILITIES,\n getProviderCapabilities,\n getUnsupportedFeatures,\n mergeCapabilityOverrides,\n getRegisteredApis,\n} from \"./provider-capabilities.js\";\n\n// ─── Registry Completeness ──────────────────────────────────────────────────\n\ndescribe(\"PROVIDER_CAPABILITIES registry\", () => {\n const EXPECTED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"mistral-conversations\",\n \"bedrock-converse-stream\",\n \"ollama-chat\",\n ];\n\n test(\"covers all expected API providers\", () => {\n for (const api of EXPECTED_APIS) {\n assert.ok(\n PROVIDER_CAPABILITIES[api],\n `Missing capability entry for API: ${api}`,\n );\n }\n });\n\n test(\"getRegisteredApis returns all entries\", () => {\n const registered = getRegisteredApis();\n for (const api of EXPECTED_APIS) {\n assert.ok(registered.includes(api), `getRegisteredApis missing: ${api}`);\n }\n });\n\n test(\"all entries have required fields\", () => {\n for (const [api, caps] of Object.entries(PROVIDER_CAPABILITIES)) {\n assert.equal(typeof caps.toolCalling, \"boolean\", `${api}.toolCalling`);\n assert.equal(typeof caps.maxTools, \"number\", `${api}.maxTools`);\n assert.equal(typeof caps.imageToolResults, \"boolean\", `${api}.imageToolResults`);\n assert.equal(typeof caps.structuredOutput, \"boolean\", `${api}.structuredOutput`);\n assert.ok(caps.toolCallIdFormat, `${api}.toolCallIdFormat`);\n assert.equal(typeof caps.toolCallIdFormat.maxLength, \"number\", `${api}.toolCallIdFormat.maxLength`);\n assert.ok(caps.toolCallIdFormat.allowedChars instanceof RegExp, `${api}.toolCallIdFormat.allowedChars`);\n assert.ok(\n [\"full\", \"text-only\", \"none\"].includes(caps.thinkingPersistence),\n `${api}.thinkingPersistence is \"${caps.thinkingPersistence}\"`,\n );\n assert.ok(Array.isArray(caps.unsupportedSchemaFeatures), `${api}.unsupportedSchemaFeatures`);\n }\n });\n});\n\n// ─── Provider-specific Values ───────────────────────────────────────────────\n\ndescribe(\"provider-specific capabilities\", () => {\n test(\"Anthropic supports full thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].thinkingPersistence, \"full\");\n });\n\n test(\"Anthropic supports image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].imageToolResults, true);\n });\n\n test(\"Anthropic tool call ID is 64 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].toolCallIdFormat.maxLength, 64);\n });\n\n test(\"Mistral tool call ID is 9 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].toolCallIdFormat.maxLength, 9);\n });\n\n test(\"Mistral has no thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].thinkingPersistence, \"none\");\n });\n\n test(\"Google does not support patternProperties\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"patternProperties\"),\n );\n });\n\n test(\"Google does not support const\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"const\"),\n );\n });\n\n test(\"OpenAI Responses does not support image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].imageToolResults, false);\n });\n\n test(\"OpenAI Responses has text-only thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].thinkingPersistence, \"text-only\");\n });\n});\n\n// ─── getProviderCapabilities ────────────────────────────────────────────────\n\ndescribe(\"getProviderCapabilities\", () => {\n test(\"returns known provider capabilities\", () => {\n const caps = getProviderCapabilities(\"anthropic-messages\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.thinkingPersistence, \"full\");\n });\n\n test(\"returns permissive defaults for unknown providers\", () => {\n const caps = getProviderCapabilities(\"unknown-provider-xyz\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.imageToolResults, true);\n assert.deepEqual(caps.unsupportedSchemaFeatures, []);\n });\n});\n\n// ─── getUnsupportedFeatures ─────────────────────────────────────────────────\n\ndescribe(\"getUnsupportedFeatures\", () => {\n test(\"returns unsupported features for Google\", () => {\n const unsupported = getUnsupportedFeatures(\"google-generative-ai\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, [\"patternProperties\", \"const\"]);\n });\n\n test(\"returns empty for Anthropic with any features\", () => {\n const unsupported = getUnsupportedFeatures(\"anthropic-messages\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, []);\n });\n\n test(\"returns empty for unknown provider\", () => {\n const unsupported = getUnsupportedFeatures(\"unknown-xyz\", [\"patternProperties\"]);\n assert.deepEqual(unsupported, []);\n });\n});\n\n// ─── mergeCapabilityOverrides ───────────────────────────────────────────────\n\ndescribe(\"mergeCapabilityOverrides\", () => {\n test(\"overrides individual fields\", () => {\n const merged = mergeCapabilityOverrides(\"openai-responses\", {\n imageToolResults: true,\n });\n assert.equal(merged.imageToolResults, true);\n // Non-overridden fields preserved\n assert.equal(merged.toolCalling, true);\n assert.equal(merged.thinkingPersistence, \"text-only\");\n });\n\n test(\"deep-merges toolCallIdFormat\", () => {\n const merged = mergeCapabilityOverrides(\"anthropic-messages\", {\n toolCallIdFormat: { maxLength: 128 },\n });\n assert.equal(merged.toolCallIdFormat.maxLength, 128);\n // allowedChars preserved from base\n assert.ok(merged.toolCallIdFormat.allowedChars instanceof RegExp);\n });\n\n test(\"uses permissive defaults for unknown provider\", () => {\n const merged = mergeCapabilityOverrides(\"unknown-xyz\", {\n imageToolResults: false,\n });\n assert.equal(merged.imageToolResults, false);\n assert.equal(merged.toolCalling, true); // from default\n });\n});\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// gsd-pi — ProviderSwitchReport Tests (ADR-005 Phase 3)
|
|
2
2
|
import { describe, test } from "node:test";
|
|
3
3
|
import assert from "node:assert/strict";
|
|
4
4
|
import { transformMessages, createEmptyReport, hasTransformations } from "./transform-messages.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-messages-report.test.js","sourceRoot":"","sources":["../../src/providers/transform-messages-report.test.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 — ProviderSwitchReport Tests (ADR-005 Phase 3)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport { transformMessages, createEmptyReport, hasTransformations } from \"./transform-messages.js\";\nimport type { ProviderSwitchReport } from \"./transform-messages.js\";\nimport type { Message, Model, AssistantMessage, ToolCall } from \"../types.js\";\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction makeModel(overrides: Partial<Model<any>> = {}): Model<any> {\n return {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n baseUrl: \"\",\n reasoning: false,\n input: [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 200000,\n maxTokens: 8192,\n ...overrides,\n } as Model<any>;\n}\n\nfunction makeAssistantMsg(overrides: Partial<AssistantMessage> = {}): AssistantMessage {\n return {\n role: \"assistant\",\n content: [],\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },\n stopReason: \"stop\",\n timestamp: Date.now(),\n ...overrides,\n };\n}\n\n// ─── createEmptyReport / hasTransformations ─────────────────────────────────\n\ndescribe(\"createEmptyReport\", () => {\n test(\"creates report with zero counters\", () => {\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n assert.equal(report.fromApi, \"anthropic-messages\");\n assert.equal(report.toApi, \"openai-responses\");\n assert.equal(report.thinkingBlocksDropped, 0);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.toolCallIdsRemapped, 0);\n assert.equal(report.syntheticToolResultsInserted, 0);\n assert.equal(report.thoughtSignaturesDropped, 0);\n });\n});\n\ndescribe(\"hasTransformations\", () => {\n test(\"returns false for empty report\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n assert.equal(hasTransformations(report), false);\n });\n\n test(\"returns true when any counter is non-zero\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n report.thinkingBlocksDropped = 1;\n assert.equal(hasTransformations(report), true);\n });\n});\n\n// ─── Report Tracking in transformMessages ───────────────────────────────────\n\ndescribe(\"transformMessages with report tracking\", () => {\n test(\"tracks thinking blocks dropped for redacted cross-model\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"\", redacted: true },\n { type: \"text\", text: \"Hello\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDropped, 1);\n });\n\n test(\"tracks thinking blocks downgraded to plain text\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think about this...\" },\n { type: \"text\", text: \"Here is my answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 1);\n });\n\n test(\"tracks tool call IDs remapped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"original-long-id-that-needs-normalization|with-special-chars\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"openai\",\n api: \"openai-responses\",\n model: \"gpt-5\",\n content: [toolCall],\n }),\n ];\n const normalizer = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n const report = createEmptyReport(\"openai-responses\", \"anthropic-messages\");\n transformMessages(messages, model, normalizer, report);\n assert.equal(report.toolCallIdsRemapped, 1);\n });\n\n test(\"tracks thought signatures dropped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_001\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n thoughtSignature: \"some-opaque-signature\",\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"google\",\n api: \"google-generative-ai\",\n model: \"gemini-2.5-pro\",\n content: [toolCall],\n }),\n ];\n const report = createEmptyReport(\"google-generative-ai\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thoughtSignaturesDropped, 1);\n });\n\n test(\"tracks synthetic tool results inserted\", () => {\n const model = makeModel();\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_orphan\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n // Assistant message with tool call followed by another assistant (no tool result)\n const messages: Message[] = [\n makeAssistantMsg({ content: [toolCall, { type: \"text\", text: \"Using bash\" }] }),\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Next message\" }] }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.syntheticToolResultsInserted, 1);\n });\n\n test(\"does not count transformations for same-model messages\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think...\" },\n { type: \"text\", text: \"Answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.thinkingBlocksDropped, 0);\n });\n\n test(\"works without report parameter (backward compatible)\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Hello\" }] }),\n ];\n // Should not throw\n const result = transformMessages(messages, model);\n assert.ok(Array.isArray(result));\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"transform-messages-report.test.js","sourceRoot":"","sources":["../../src/providers/transform-messages-report.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi — ProviderSwitchReport Tests (ADR-005 Phase 3)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport { transformMessages, createEmptyReport, hasTransformations } from \"./transform-messages.js\";\nimport type { ProviderSwitchReport } from \"./transform-messages.js\";\nimport type { Message, Model, AssistantMessage, ToolCall } from \"../types.js\";\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction makeModel(overrides: Partial<Model<any>> = {}): Model<any> {\n return {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n baseUrl: \"\",\n reasoning: false,\n input: [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 200000,\n maxTokens: 8192,\n ...overrides,\n } as Model<any>;\n}\n\nfunction makeAssistantMsg(overrides: Partial<AssistantMessage> = {}): AssistantMessage {\n return {\n role: \"assistant\",\n content: [],\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },\n stopReason: \"stop\",\n timestamp: Date.now(),\n ...overrides,\n };\n}\n\n// ─── createEmptyReport / hasTransformations ─────────────────────────────────\n\ndescribe(\"createEmptyReport\", () => {\n test(\"creates report with zero counters\", () => {\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n assert.equal(report.fromApi, \"anthropic-messages\");\n assert.equal(report.toApi, \"openai-responses\");\n assert.equal(report.thinkingBlocksDropped, 0);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.toolCallIdsRemapped, 0);\n assert.equal(report.syntheticToolResultsInserted, 0);\n assert.equal(report.thoughtSignaturesDropped, 0);\n });\n});\n\ndescribe(\"hasTransformations\", () => {\n test(\"returns false for empty report\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n assert.equal(hasTransformations(report), false);\n });\n\n test(\"returns true when any counter is non-zero\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n report.thinkingBlocksDropped = 1;\n assert.equal(hasTransformations(report), true);\n });\n});\n\n// ─── Report Tracking in transformMessages ───────────────────────────────────\n\ndescribe(\"transformMessages with report tracking\", () => {\n test(\"tracks thinking blocks dropped for redacted cross-model\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"\", redacted: true },\n { type: \"text\", text: \"Hello\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDropped, 1);\n });\n\n test(\"tracks thinking blocks downgraded to plain text\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think about this...\" },\n { type: \"text\", text: \"Here is my answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 1);\n });\n\n test(\"tracks tool call IDs remapped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"original-long-id-that-needs-normalization|with-special-chars\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"openai\",\n api: \"openai-responses\",\n model: \"gpt-5\",\n content: [toolCall],\n }),\n ];\n const normalizer = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n const report = createEmptyReport(\"openai-responses\", \"anthropic-messages\");\n transformMessages(messages, model, normalizer, report);\n assert.equal(report.toolCallIdsRemapped, 1);\n });\n\n test(\"tracks thought signatures dropped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_001\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n thoughtSignature: \"some-opaque-signature\",\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"google\",\n api: \"google-generative-ai\",\n model: \"gemini-2.5-pro\",\n content: [toolCall],\n }),\n ];\n const report = createEmptyReport(\"google-generative-ai\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thoughtSignaturesDropped, 1);\n });\n\n test(\"tracks synthetic tool results inserted\", () => {\n const model = makeModel();\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_orphan\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n // Assistant message with tool call followed by another assistant (no tool result)\n const messages: Message[] = [\n makeAssistantMsg({ content: [toolCall, { type: \"text\", text: \"Using bash\" }] }),\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Next message\" }] }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.syntheticToolResultsInserted, 1);\n });\n\n test(\"does not count transformations for same-model messages\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think...\" },\n { type: \"text\", text: \"Answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.thinkingBlocksDropped, 0);\n });\n\n test(\"works without report parameter (backward compatible)\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Hello\" }] }),\n ];\n // Should not throw\n const result = transformMessages(messages, model);\n assert.ok(Array.isArray(result));\n });\n});\n"]}
|