gsd-pi 2.76.0-dev.fe143342a → 2.77.0-dev.1594b263e
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 +18 -36
- package/dist/claude-cli-check.js +36 -3
- package/dist/cli-web-branch.d.ts +1 -0
- package/dist/cli-web-branch.js +3 -0
- package/dist/cli.js +38 -2
- package/dist/extension-discovery.d.ts +6 -0
- package/dist/extension-discovery.js +37 -0
- package/dist/extension-registry.d.ts +3 -0
- package/dist/extension-sort.d.ts +18 -0
- package/dist/extension-sort.js +114 -0
- package/dist/extension-validator.d.ts +47 -0
- package/dist/extension-validator.js +127 -0
- package/dist/headless.js +49 -4
- package/dist/loader.js +35 -7
- package/dist/onboarding.js +45 -0
- package/dist/provider-migrations.d.ts +18 -0
- package/dist/provider-migrations.js +14 -0
- package/dist/resource-loader.d.ts +40 -0
- package/dist/resource-loader.js +32 -13
- package/dist/resources/extensions/browser-tools/capture.js +9 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +9 -4
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +559 -76
- package/dist/resources/extensions/cmux/index.js +20 -0
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
- package/dist/resources/extensions/google-search/index.js +3 -375
- package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
- package/dist/resources/extensions/gsd/auto/loop.js +133 -2
- package/dist/resources/extensions/gsd/auto/phases.js +110 -42
- package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
- package/dist/resources/extensions/gsd/auto/session.js +24 -3
- package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +216 -40
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +125 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +240 -66
- package/dist/resources/extensions/gsd/auto-prompts.js +386 -104
- package/dist/resources/extensions/gsd/auto-recovery.js +124 -4
- package/dist/resources/extensions/gsd/auto-start.js +141 -66
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +230 -86
- package/dist/resources/extensions/gsd/auto.js +159 -48
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +36 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +161 -11
- package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
- package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
- package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
- package/dist/resources/extensions/gsd/component-loader.js +447 -0
- package/dist/resources/extensions/gsd/component-types.js +69 -0
- package/dist/resources/extensions/gsd/context-store.js +23 -7
- package/dist/resources/extensions/gsd/detection.js +49 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/file-lock.js +49 -9
- package/dist/resources/extensions/gsd/forensics.js +106 -0
- package/dist/resources/extensions/gsd/gate-registry.js +2 -2
- package/dist/resources/extensions/gsd/git-constants.js +28 -1
- package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
- package/dist/resources/extensions/gsd/git-service.js +127 -2
- package/dist/resources/extensions/gsd/gitignore.js +2 -0
- package/dist/resources/extensions/gsd/gsd-db.js +95 -32
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow.js +214 -13
- package/dist/resources/extensions/gsd/health-widget.js +4 -1
- package/dist/resources/extensions/gsd/journal.js +17 -2
- package/dist/resources/extensions/gsd/key-manager.js +22 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
- package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
- package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +42 -3
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/notifications.js +30 -16
- package/dist/resources/extensions/gsd/pre-execution-checks.js +31 -6
- package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +5 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/reports.js +5 -4
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +12 -4
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- package/dist/resources/extensions/gsd/session-lock.js +19 -10
- package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
- package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
- package/dist/resources/extensions/gsd/state.js +69 -58
- package/dist/resources/extensions/gsd/sync-lock.js +98 -42
- package/dist/resources/extensions/gsd/token-counter.js +22 -5
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
- package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
- package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
- package/dist/resources/extensions/gsd/uok/audit.js +18 -2
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
- package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
- package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +30 -7
- package/dist/resources/extensions/gsd/uok/writer.js +82 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
- package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
- package/dist/resources/extensions/gsd/worktree-resolver.js +136 -17
- package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
- package/dist/resources/extensions/mcp-client/auth.js +10 -1
- package/dist/resources/extensions/mcp-client/index.js +121 -10
- package/dist/resources/extensions/ollama/index.js +5 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -5
- package/dist/resources/extensions/shared/cmux-events.js +12 -0
- package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
- package/dist/resources/skills/create-skill/SKILL.md +2 -2
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/dist/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/dist/resources/skills/write-docs/SKILL.md +2 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- 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/react-loadable-manifest.json +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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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/2826.e9f5195e91f9cad2.js +11 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
- package/dist/welcome-screen.js +6 -1
- package/dist/wizard.js +2 -0
- package/package.json +17 -16
- package/packages/daemon/package.json +2 -2
- package/packages/daemon/src/logger.ts +4 -3
- package/packages/mcp-server/README.md +3 -3
- package/packages/mcp-server/dist/env-writer.d.ts +1 -0
- package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
- package/packages/mcp-server/dist/env-writer.js +74 -6
- package/packages/mcp-server/dist/env-writer.js.map +1 -1
- package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
- package/packages/mcp-server/dist/remote-questions.js +732 -0
- package/packages/mcp-server/dist/remote-questions.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +31 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +179 -93
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts +14 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +49 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +9 -3
- package/packages/mcp-server/src/env-writer.test.ts +79 -1
- package/packages/mcp-server/src/env-writer.ts +76 -6
- package/packages/mcp-server/src/mcp-server.test.ts +89 -0
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/readers/readers.test.ts +5 -1
- package/packages/mcp-server/src/remote-questions.test.ts +294 -0
- package/packages/mcp-server/src/remote-questions.ts +916 -0
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +236 -108
- package/packages/mcp-server/src/session-manager.ts +43 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
- package/packages/mcp-server/src/workflow-tools.ts +19 -6
- package/packages/mcp-server/tsconfig.test.json +19 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +7 -2
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
- package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
- package/packages/native/src/__tests__/ps.test.mjs +14 -8
- package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
- package/packages/native/src/__tests__/truncate.test.mjs +17 -2
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +6 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
- package/packages/pi-agent-core/src/agent.test.ts +96 -102
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +9 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts +38 -0
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/custom.js +41 -0
- package/packages/pi-ai/dist/models/custom.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +43 -70
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +36 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +16 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/package.json +6 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- package/packages/pi-ai/src/models/capability-patches.ts +10 -2
- package/packages/pi-ai/src/models/custom.ts +42 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openai.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +46 -73
- package/packages/pi-ai/src/models.test.ts +48 -11
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
- package/packages/pi-ai/src/providers/anthropic.ts +9 -3
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
- package/packages/pi-ai/src/providers/simple-options.ts +17 -1
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -31
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
- 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.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +7 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +21 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
- 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__/tool-execution.test.js +36 -5
- 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/dynamic-border.test.js +20 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +139 -0
- 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-state.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +118 -14
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +6 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -36
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
- package/packages/pi-coding-agent/src/core/agent-session.ts +11 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
- package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +15 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
- package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
- package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
- package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +30 -1
- package/packages/pi-coding-agent/src/core/session-manager.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
- package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +160 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +132 -14
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +14 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +19 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +1 -1
- package/packages/pi-tui/dist/editor-component.d.ts +2 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/packages/pi-tui/dist/editor-component.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +20 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +6 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
- package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
- package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
- package/packages/pi-tui/src/components/editor.ts +22 -0
- package/packages/pi-tui/src/components/image.test.ts +10 -5
- package/packages/pi-tui/src/editor-component.ts +3 -0
- package/packages/pi-tui/src/stdin-buffer.ts +26 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-client.test.js +101 -51
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
- package/packages/rpc-client/package.json +6 -1
- package/packages/rpc-client/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +526 -0
- package/scripts/lib/workspace-manifest.cjs +86 -0
- package/scripts/link-workspace-packages.cjs +5 -17
- package/scripts/postinstall.js +9 -178
- package/src/resources/extensions/browser-tools/capture.ts +12 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
- package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +9 -4
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +609 -82
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1033 -87
- package/src/resources/extensions/cmux/index.ts +35 -10
- package/src/resources/extensions/github-sync/templates.ts +151 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
- package/src/resources/extensions/google-search/extension-manifest.json +5 -4
- package/src/resources/extensions/google-search/index.ts +9 -470
- package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +14 -1
- package/src/resources/extensions/gsd/auto/loop.ts +151 -2
- package/src/resources/extensions/gsd/auto/phases.ts +139 -41
- package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
- package/src/resources/extensions/gsd/auto/session.ts +35 -3
- package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
- package/src/resources/extensions/gsd/auto/types.ts +1 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +229 -39
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +132 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +255 -76
- package/src/resources/extensions/gsd/auto-prompts.ts +413 -94
- package/src/resources/extensions/gsd/auto-recovery.ts +125 -2
- package/src/resources/extensions/gsd/auto-start.ts +166 -60
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +251 -93
- package/src/resources/extensions/gsd/auto.ts +182 -54
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +43 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -9
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +193 -11
- package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
- package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
- package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
- package/src/resources/extensions/gsd/component-loader.ts +598 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/context-store.ts +25 -8
- package/src/resources/extensions/gsd/detection.ts +58 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/file-lock.ts +84 -11
- package/src/resources/extensions/gsd/forensics.ts +118 -1
- package/src/resources/extensions/gsd/gate-registry.ts +2 -2
- package/src/resources/extensions/gsd/git-constants.ts +30 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
- package/src/resources/extensions/gsd/git-service.ts +150 -2
- package/src/resources/extensions/gsd/gitignore.ts +2 -1
- package/src/resources/extensions/gsd/gsd-db.ts +97 -34
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +261 -14
- package/src/resources/extensions/gsd/health-widget.ts +3 -1
- package/src/resources/extensions/gsd/journal.ts +39 -3
- package/src/resources/extensions/gsd/key-manager.ts +22 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
- package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +48 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/notifications.ts +27 -15
- package/src/resources/extensions/gsd/pre-execution-checks.ts +33 -7
- package/src/resources/extensions/gsd/preferences-types.ts +8 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +5 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/reports.ts +5 -4
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +16 -3
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- package/src/resources/extensions/gsd/session-lock.ts +20 -10
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +76 -66
- package/src/resources/extensions/gsd/sync-lock.ts +97 -39
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +322 -286
- package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +296 -1
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
- package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +274 -112
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +42 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +242 -247
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +71 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/token-counter.ts +22 -5
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
- package/src/resources/extensions/gsd/types.ts +3 -3
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
- package/src/resources/extensions/gsd/uok/audit.ts +20 -2
- package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
- package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +39 -8
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +23 -3
- package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
- package/src/resources/extensions/gsd/worktree-resolver.ts +150 -18
- package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
- package/src/resources/extensions/mcp-client/auth.ts +12 -1
- package/src/resources/extensions/mcp-client/index.ts +132 -11
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
- package/src/resources/extensions/ollama/index.ts +5 -1
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
- package/src/resources/extensions/remote-questions/manager.ts +36 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
- package/src/resources/extensions/shared/cmux-events.ts +59 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
- package/src/resources/skills/create-skill/SKILL.md +2 -2
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/src/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/src/resources/skills/write-docs/SKILL.md +2 -1
- package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → MdwvuQQLlBY6wwiSO1Tgv}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → MdwvuQQLlBY6wwiSO1Tgv}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for test-helpers.ts — the timing helpers (waitForCondition,
|
|
3
|
+
* findLine) used to replace magic-number sleeps and positional line
|
|
4
|
+
* indexing in the test suite.
|
|
5
|
+
*
|
|
6
|
+
* The `extractSourceRegion` helper (introduced in #4773/#4774) is
|
|
7
|
+
* deliberately NOT tested here. It is the source-grep antipattern that
|
|
8
|
+
* #4784 names as the root problem; tests against toy fixtures only
|
|
9
|
+
* legitimize the pattern without validating behaviour. Its test cases
|
|
10
|
+
* were removed as part of #4834 — callers are being migrated to
|
|
11
|
+
* behaviour tests one file at a time, after which the helper is slated
|
|
12
|
+
* for deletion.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import test from "node:test";
|
|
16
|
+
import assert from "node:assert/strict";
|
|
17
|
+
|
|
18
|
+
import { waitForCondition, findLine } from "./test-helpers.ts";
|
|
19
|
+
|
|
20
|
+
// ─── waitForCondition ─────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
test("waitForCondition returns immediately when condition is true", async () => {
|
|
23
|
+
const result = await waitForCondition(() => true);
|
|
24
|
+
assert.equal(result, true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("waitForCondition waits and returns when condition becomes true", async () => {
|
|
28
|
+
let flipped = false;
|
|
29
|
+
setTimeout(() => { flipped = true; }, 30);
|
|
30
|
+
const result = await waitForCondition(() => flipped, { intervalMs: 5 });
|
|
31
|
+
assert.equal(result, true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("waitForCondition throws after timeout with description", async () => {
|
|
35
|
+
await assert.rejects(
|
|
36
|
+
waitForCondition(() => false, { timeoutMs: 50, intervalMs: 5, description: "the flag to flip" }),
|
|
37
|
+
/waiting for the flag to flip/i,
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("waitForCondition surfaces last error on timeout", async () => {
|
|
42
|
+
await assert.rejects(
|
|
43
|
+
waitForCondition(
|
|
44
|
+
() => { throw new Error("probe failed"); },
|
|
45
|
+
{ timeoutMs: 30, intervalMs: 5, description: "probe" },
|
|
46
|
+
),
|
|
47
|
+
/probe failed/,
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("waitForCondition returns the truthy value (not just true)", async () => {
|
|
52
|
+
let n = 0;
|
|
53
|
+
const result = await waitForCondition(() => {
|
|
54
|
+
n++;
|
|
55
|
+
return n >= 3 ? { ready: true, iteration: n } : null;
|
|
56
|
+
}, { intervalMs: 5 });
|
|
57
|
+
// The helper only resolves when the condition returns a truthy value, so
|
|
58
|
+
// result cannot be null here. Assert it and narrow for the follow-ups.
|
|
59
|
+
assert.ok(result, "waitForCondition must resolve with a truthy value, not null");
|
|
60
|
+
assert.equal(result.ready, true);
|
|
61
|
+
assert.equal(result.iteration, 3);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ─── findLine ─────────────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
test("findLine locates a line by regex", () => {
|
|
67
|
+
const output = "header\nstatus: ok\nfooter";
|
|
68
|
+
const match = findLine(output, /^status:/);
|
|
69
|
+
assert.equal(match.index, 1);
|
|
70
|
+
assert.equal(match.text, "status: ok");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("findLine locates a line by predicate", () => {
|
|
74
|
+
const output = "a\nb\nc";
|
|
75
|
+
const match = findLine(output, (l) => l === "b");
|
|
76
|
+
assert.equal(match.index, 1);
|
|
77
|
+
assert.equal(match.text, "b");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("findLine throws with preview when no line matches", () => {
|
|
81
|
+
assert.throws(
|
|
82
|
+
() => findLine("a\nb\nc", /NOTFOUND/),
|
|
83
|
+
/First 10 lines/,
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("findLine resets lastIndex between lines for /g regex patterns", () => {
|
|
88
|
+
// Without the reset, RegExp.test with /g flag stateful-advances lastIndex
|
|
89
|
+
// and can skip matches on subsequent calls. Verify the reset keeps
|
|
90
|
+
// per-line testing deterministic.
|
|
91
|
+
const output = "foo\nfoo\nfoo";
|
|
92
|
+
const globalRe = /foo/g;
|
|
93
|
+
const match = findLine(output, globalRe);
|
|
94
|
+
assert.equal(match.index, 0);
|
|
95
|
+
// Second call on the same pattern must also match — would fail without reset
|
|
96
|
+
const match2 = findLine(output, globalRe);
|
|
97
|
+
assert.equal(match2.index, 0);
|
|
98
|
+
});
|
|
@@ -59,3 +59,156 @@ export function createTestContext() {
|
|
|
59
59
|
|
|
60
60
|
return { assertEq, assertTrue, assertMatch, assertNoMatch, report };
|
|
61
61
|
}
|
|
62
|
+
|
|
63
|
+
// ─── Source-inspection helpers (DEPRECATED — do not add new callers) ──────────
|
|
64
|
+
//
|
|
65
|
+
// `extractSourceRegion` was introduced in #4773 / #4774 as a more-durable
|
|
66
|
+
// replacement for hand-rolled `src.slice(idx, idx + N)` patterns. Issue
|
|
67
|
+
// #4784 surfaced that the helper is the wrong target: its use case —
|
|
68
|
+
// testing that an identifier or phrase exists in production source text
|
|
69
|
+
// — is the source-grep antipattern that causes false coverage in the
|
|
70
|
+
// first place. Tests should exercise behaviour (call the function,
|
|
71
|
+
// assert on its return value or observable effects) rather than check
|
|
72
|
+
// whether specific identifier strings remain in source.
|
|
73
|
+
//
|
|
74
|
+
// CONTRIBUTING.md forbids new callers of this helper. Existing callers
|
|
75
|
+
// are being migrated one file at a time; the helper is slated for
|
|
76
|
+
// removal once the last caller is converted.
|
|
77
|
+
//
|
|
78
|
+
// Do not add new callers. If you are tempted to, file an issue
|
|
79
|
+
// describing the behavioural invariant you want to test and we will
|
|
80
|
+
// find a runtime assertion instead.
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @deprecated Use a real behaviour test against the function under
|
|
84
|
+
* inspection instead. See #4784 and CONTRIBUTING.md > "Test behaviour,
|
|
85
|
+
* not source shape". No new callers.
|
|
86
|
+
*
|
|
87
|
+
* Extract a region of source between a start anchor and either an explicit
|
|
88
|
+
* end anchor or, if none is given, a set of reasonable structural
|
|
89
|
+
* terminators (next `private `/`export `/`function `/`class `/`interface `/
|
|
90
|
+
* `//` section separator). Falls back to end-of-source if none match.
|
|
91
|
+
*
|
|
92
|
+
* @param src The source text.
|
|
93
|
+
* @param startAnchor Literal substring that marks the start of the region.
|
|
94
|
+
* Typically a function name, a section header comment, or
|
|
95
|
+
* a distinctive statement.
|
|
96
|
+
* @param endAnchor Optional. Either a literal substring that marks the end,
|
|
97
|
+
* or `{ fromIdx: number }` to find the *next* occurrence
|
|
98
|
+
* of `startAnchor` at or after `fromIdx` (useful when the
|
|
99
|
+
* anchor appears multiple times and a positional search
|
|
100
|
+
* is required). When omitted, structural terminators are
|
|
101
|
+
* used.
|
|
102
|
+
*
|
|
103
|
+
* Returns the extracted region (including the start anchor), or an empty
|
|
104
|
+
* string if `startAnchor` is not found.
|
|
105
|
+
*/
|
|
106
|
+
export function extractSourceRegion(
|
|
107
|
+
src: string,
|
|
108
|
+
startAnchor: string,
|
|
109
|
+
endAnchor?: string | { fromIdx: number },
|
|
110
|
+
): string {
|
|
111
|
+
const fromIdx = typeof endAnchor === "object" && endAnchor !== null
|
|
112
|
+
? endAnchor.fromIdx
|
|
113
|
+
: 0;
|
|
114
|
+
const endLiteral = typeof endAnchor === "string" ? endAnchor : undefined;
|
|
115
|
+
|
|
116
|
+
const startIdx = src.indexOf(startAnchor, fromIdx);
|
|
117
|
+
if (startIdx < 0) return "";
|
|
118
|
+
|
|
119
|
+
if (endLiteral) {
|
|
120
|
+
const endIdx = src.indexOf(endLiteral, startIdx + startAnchor.length);
|
|
121
|
+
return endIdx > 0 ? src.slice(startIdx, endIdx) : src.slice(startIdx);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Heuristic terminators — the next sibling declaration/section.
|
|
125
|
+
const terminators = [
|
|
126
|
+
"\n private ",
|
|
127
|
+
"\n public ",
|
|
128
|
+
"\n protected ",
|
|
129
|
+
"\n static ",
|
|
130
|
+
"\nexport function ",
|
|
131
|
+
"\nexport async function ",
|
|
132
|
+
"\nfunction ",
|
|
133
|
+
"\nasync function ",
|
|
134
|
+
"\nexport class ",
|
|
135
|
+
"\nclass ",
|
|
136
|
+
"\nexport interface ",
|
|
137
|
+
"\ninterface ",
|
|
138
|
+
"\n// ─", // section separator comments
|
|
139
|
+
"\n/** ", // next docblock
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
let earliestEnd = -1;
|
|
143
|
+
for (const t of terminators) {
|
|
144
|
+
const idx = src.indexOf(t, startIdx + startAnchor.length);
|
|
145
|
+
if (idx > 0 && (earliestEnd < 0 || idx < earliestEnd)) earliestEnd = idx;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return earliestEnd > 0 ? src.slice(startIdx, earliestEnd) : src.slice(startIdx);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Poll `condition()` until it returns truthy or `timeoutMs` elapses.
|
|
153
|
+
* Returns the truthy value from `condition()`, or throws on timeout.
|
|
154
|
+
*
|
|
155
|
+
* Use this instead of `await new Promise(r => setTimeout(r, <magic-ms>))`
|
|
156
|
+
* when waiting for a state change that tests produce. The fixed-sleep
|
|
157
|
+
* pattern is flaky: too short → race; too long → slow tests.
|
|
158
|
+
*
|
|
159
|
+
* @param condition Predicate. Returns truthy when done. May be async.
|
|
160
|
+
* @param opts.timeoutMs Max total wait. Defaults to 2000ms.
|
|
161
|
+
* @param opts.intervalMs Poll interval. Defaults to 10ms.
|
|
162
|
+
* @param opts.description Included in the timeout error for debuggability.
|
|
163
|
+
*/
|
|
164
|
+
export async function waitForCondition<T>(
|
|
165
|
+
condition: () => T | Promise<T>,
|
|
166
|
+
opts: { timeoutMs?: number; intervalMs?: number; description?: string } = {},
|
|
167
|
+
): Promise<T> {
|
|
168
|
+
const timeoutMs = opts.timeoutMs ?? 2000;
|
|
169
|
+
const intervalMs = opts.intervalMs ?? 10;
|
|
170
|
+
const deadline = Date.now() + timeoutMs;
|
|
171
|
+
let lastErr: unknown;
|
|
172
|
+
while (Date.now() < deadline) {
|
|
173
|
+
try {
|
|
174
|
+
const result = await condition();
|
|
175
|
+
if (result) return result;
|
|
176
|
+
} catch (e) {
|
|
177
|
+
lastErr = e;
|
|
178
|
+
}
|
|
179
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
180
|
+
}
|
|
181
|
+
const desc = opts.description ?? "condition";
|
|
182
|
+
const errSuffix = lastErr instanceof Error ? ` (last error: ${lastErr.message})` : "";
|
|
183
|
+
throw new Error(`waitForCondition timed out after ${timeoutMs}ms waiting for ${desc}${errSuffix}`);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Find the first line in rendered output that matches a predicate. Returns
|
|
188
|
+
* the line's index and text, or throws if no line matches.
|
|
189
|
+
*
|
|
190
|
+
* Use this instead of `lines[N]` indexing when the N is positional and
|
|
191
|
+
* could shift under formatting changes.
|
|
192
|
+
*/
|
|
193
|
+
export function findLine(
|
|
194
|
+
output: string,
|
|
195
|
+
predicate: RegExp | ((line: string) => boolean),
|
|
196
|
+
): { index: number; text: string } {
|
|
197
|
+
const lines = output.split("\n");
|
|
198
|
+
const fn = predicate instanceof RegExp
|
|
199
|
+
? (l: string) => {
|
|
200
|
+
// RegExp.test is stateful when the pattern has /g or /y flags
|
|
201
|
+
// (maintains lastIndex across calls). Reset before each test so
|
|
202
|
+
// matches on different lines don't silently skip.
|
|
203
|
+
if (predicate.global || predicate.sticky) predicate.lastIndex = 0;
|
|
204
|
+
return predicate.test(l);
|
|
205
|
+
}
|
|
206
|
+
: predicate;
|
|
207
|
+
for (let i = 0; i < lines.length; i++) {
|
|
208
|
+
if (fn(lines[i]!)) return { index: i, text: lines[i]! };
|
|
209
|
+
}
|
|
210
|
+
const preview = lines.slice(0, 10).join("\n");
|
|
211
|
+
throw new Error(
|
|
212
|
+
`findLine: no line matched. First 10 lines were:\n${preview}`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
@@ -102,7 +102,8 @@ describe("token-counter: estimateTokensForProvider", () => {
|
|
|
102
102
|
|
|
103
103
|
describe("token-counter: backward compatibility", () => {
|
|
104
104
|
it("countTokensSync returns heuristic estimate when tiktoken is not loaded", () => {
|
|
105
|
-
// Without tiktoken loaded, countTokensSync falls back to
|
|
105
|
+
// Without tiktoken loaded, countTokensSync falls back to estimateTokensForProvider.
|
|
106
|
+
// With no provider (defaults to "unknown", ratio 4.0): ceil(100/4) = 25.
|
|
106
107
|
const text = "A".repeat(100);
|
|
107
108
|
const result = countTokensSync(text);
|
|
108
109
|
// Either tiktoken is loaded (exact count) or heuristic (ceil(100/4) = 25)
|
|
@@ -127,3 +128,106 @@ describe("token-counter: backward compatibility", () => {
|
|
|
127
128
|
assert.equal(result, 0);
|
|
128
129
|
});
|
|
129
130
|
});
|
|
131
|
+
|
|
132
|
+
// ─── provider-aware fallback (issue #4529) ───────────────────────────────────
|
|
133
|
+
// Regression tests: countTokens/countTokensSync must use provider-specific
|
|
134
|
+
// ratios for their heuristic fallback, not a hardcoded GPT-4o / 4 divisor.
|
|
135
|
+
|
|
136
|
+
describe("token-counter: provider-aware heuristic fallback", () => {
|
|
137
|
+
// These tests exercise the heuristic path (no tiktoken or before init).
|
|
138
|
+
// We call estimateTokensForProvider directly to validate expected values,
|
|
139
|
+
// then verify countTokens/countTokensSync return the same values when
|
|
140
|
+
// tiktoken is unavailable.
|
|
141
|
+
|
|
142
|
+
it("countTokensSync uses anthropic ratio (3.5) when provider is 'anthropic'", () => {
|
|
143
|
+
const text = "A".repeat(350);
|
|
144
|
+
// anthropic: ceil(350 / 3.5) = 100
|
|
145
|
+
// openai/unknown: ceil(350 / 4.0) = 88
|
|
146
|
+
// These are different — the provider must matter.
|
|
147
|
+
const anthropicEstimate = estimateTokensForProvider(text, "anthropic");
|
|
148
|
+
const unknownEstimate = estimateTokensForProvider(text, "unknown");
|
|
149
|
+
assert.equal(anthropicEstimate, 100, "anthropic ratio should give 100 tokens for 350 chars");
|
|
150
|
+
assert.equal(unknownEstimate, 88, "unknown ratio should give 88 tokens for 350 chars");
|
|
151
|
+
assert.notEqual(
|
|
152
|
+
anthropicEstimate,
|
|
153
|
+
unknownEstimate,
|
|
154
|
+
"anthropic and unknown estimates must differ — if they are equal the provider is being ignored",
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
// Actually call countTokensSync with the anthropic provider.
|
|
158
|
+
// When tiktoken is not loaded, this must return the provider-aware estimate (100).
|
|
159
|
+
// When tiktoken is loaded, it returns the tiktoken count (which is also > 0 and
|
|
160
|
+
// will be in the range [88, 120] for 350 "A" characters with cl100k_base).
|
|
161
|
+
const syncResult = countTokensSync(text, "anthropic");
|
|
162
|
+
assert.ok(typeof syncResult === "number", "countTokensSync must return a number");
|
|
163
|
+
assert.ok(syncResult > 0, "countTokensSync must return a positive count");
|
|
164
|
+
// If tiktoken is unavailable the result must exactly match the anthropic heuristic.
|
|
165
|
+
// If tiktoken is available we cannot assert the exact value, but we know it will
|
|
166
|
+
// not equal the unknown-provider heuristic (88) for 350 identical characters.
|
|
167
|
+
const tiktokenAvailable = syncResult !== anthropicEstimate;
|
|
168
|
+
if (!tiktokenAvailable) {
|
|
169
|
+
assert.equal(
|
|
170
|
+
syncResult,
|
|
171
|
+
anthropicEstimate,
|
|
172
|
+
`countTokensSync with 'anthropic' provider must return ${anthropicEstimate} (not the unknown-provider value ${unknownEstimate}) when tiktoken is unavailable`,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("countTokens uses anthropic ratio when provider='anthropic' and tiktoken unavailable", async () => {
|
|
178
|
+
const text = "A".repeat(350);
|
|
179
|
+
// anthropic heuristic: ceil(350 / 3.5) = 100
|
|
180
|
+
// unknown/hardcoded-4 heuristic: ceil(350 / 4.0) = 88
|
|
181
|
+
const anthropicEstimate = estimateTokensForProvider(text, "anthropic"); // 100
|
|
182
|
+
const unknownEstimate = estimateTokensForProvider(text, "unknown"); // 88
|
|
183
|
+
const hardcodedFallback = Math.ceil(text.length / 4); // 88
|
|
184
|
+
|
|
185
|
+
// The anthropic heuristic must produce more tokens than the old /4 fallback.
|
|
186
|
+
assert.equal(anthropicEstimate, 100, "anthropic heuristic should give 100 tokens for 350 chars");
|
|
187
|
+
assert.ok(
|
|
188
|
+
anthropicEstimate > hardcodedFallback,
|
|
189
|
+
`anthropic estimate (${anthropicEstimate}) must exceed the hardcoded /4 fallback (${hardcodedFallback})`,
|
|
190
|
+
);
|
|
191
|
+
assert.notEqual(
|
|
192
|
+
anthropicEstimate,
|
|
193
|
+
unknownEstimate,
|
|
194
|
+
"anthropic and unknown estimates must differ — provider is being ignored if equal",
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
// Call countTokens with the anthropic provider and verify the result.
|
|
198
|
+
const result = await countTokens(text, "anthropic");
|
|
199
|
+
assert.ok(typeof result === "number", "should return a number");
|
|
200
|
+
assert.ok(result > 0, "should return a positive token count");
|
|
201
|
+
|
|
202
|
+
// When tiktoken is unavailable: result must equal the anthropic heuristic (100),
|
|
203
|
+
// NOT the unknown-provider heuristic (88). This is the core regression guard for #4529.
|
|
204
|
+
// When tiktoken IS available: result is the tiktoken count, which will differ from
|
|
205
|
+
// the heuristic — but it must never equal the wrong (unknown) heuristic for this text.
|
|
206
|
+
if (result === anthropicEstimate || result === unknownEstimate) {
|
|
207
|
+
// We are on the heuristic path — assert the correct provider ratio was used.
|
|
208
|
+
assert.equal(
|
|
209
|
+
result,
|
|
210
|
+
anthropicEstimate,
|
|
211
|
+
`countTokens with 'anthropic' provider returned ${result} but expected ${anthropicEstimate} (anthropic heuristic) not ${unknownEstimate} (unknown/hardcoded heuristic)`,
|
|
212
|
+
);
|
|
213
|
+
} else {
|
|
214
|
+
// tiktoken is active — result is an exact BPE count.
|
|
215
|
+
// For 350 identical "A" characters cl100k_base produces a count in [80, 130].
|
|
216
|
+
assert.ok(
|
|
217
|
+
result >= 80 && result <= 130,
|
|
218
|
+
`tiktoken count ${result} for 350 "A" chars is outside expected range [80, 130]`,
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("countTokens with provider='anthropic' yields more tokens than provider='openai' (heuristic)", () => {
|
|
224
|
+
const text = "A".repeat(400);
|
|
225
|
+
// anthropic: ceil(400/3.5) = 115, openai: ceil(400/4.0) = 100
|
|
226
|
+
const anthropic = estimateTokensForProvider(text, "anthropic");
|
|
227
|
+
const openai = estimateTokensForProvider(text, "openai");
|
|
228
|
+
assert.ok(
|
|
229
|
+
anthropic > openai,
|
|
230
|
+
`anthropic estimate (${anthropic}) must exceed openai estimate (${openai}) for same text`,
|
|
231
|
+
);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
@@ -14,6 +14,7 @@ import assert from "node:assert/strict";
|
|
|
14
14
|
import { readFileSync } from "node:fs";
|
|
15
15
|
import { join, dirname } from "node:path";
|
|
16
16
|
import { fileURLToPath } from "node:url";
|
|
17
|
+
import { extractSourceRegion } from "./test-helpers.ts";
|
|
17
18
|
|
|
18
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
20
|
|
|
@@ -127,7 +128,13 @@ test("profile: balanced profile skips research, reassess, and slice research (AD
|
|
|
127
128
|
|
|
128
129
|
test("profile: quality profile skips research, slice research, and reassess (ADR-003)", () => {
|
|
129
130
|
const qualityIdx = preferencesSrc.indexOf('case "quality":');
|
|
130
|
-
|
|
131
|
+
// preferencesSrc is concatenated from multiple modules — bound the region
|
|
132
|
+
// with the next case marker so the assertion stays tightly scoped.
|
|
133
|
+
const qualityBlock = extractSourceRegion(
|
|
134
|
+
preferencesSrc,
|
|
135
|
+
'case "quality":',
|
|
136
|
+
'case "burn-max":',
|
|
137
|
+
);
|
|
131
138
|
assert.ok(qualityBlock.includes("skip_research: true"), "quality should skip research");
|
|
132
139
|
assert.ok(qualityBlock.includes("skip_slice_research: true"), "quality should skip slice research");
|
|
133
140
|
assert.ok(qualityBlock.includes("skip_reassess: true"), "quality should skip reassess");
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
isToolCompatibleWithProvider,
|
|
15
15
|
filterToolsForProvider,
|
|
16
16
|
adjustToolSet,
|
|
17
|
+
GROQ_MAX_TOOLS,
|
|
17
18
|
} from "../model-router.js";
|
|
18
19
|
|
|
19
20
|
import {
|
|
@@ -197,3 +198,109 @@ describe("adjustToolSet", () => {
|
|
|
197
198
|
assert.deepEqual(removedTools, ["mcp_complex"]);
|
|
198
199
|
});
|
|
199
200
|
});
|
|
201
|
+
|
|
202
|
+
// ─── GROQ_MAX_TOOLS constant ─────────────────────────────────────────────────
|
|
203
|
+
|
|
204
|
+
describe("GROQ_MAX_TOOLS", () => {
|
|
205
|
+
test("equals 128", () => {
|
|
206
|
+
assert.equal(GROQ_MAX_TOOLS, 128);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// ─── Groq tool-count cap (#4376) ────────────────────────────────────────────
|
|
211
|
+
|
|
212
|
+
describe("filterToolsForProvider — Groq 128-tool cap", () => {
|
|
213
|
+
beforeEach(() => {
|
|
214
|
+
resetToolCompatibilityRegistry();
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test("does not cap when provider is not groq", () => {
|
|
218
|
+
const toolNames = Array.from({ length: 200 }, (_, i) => `tool_${i}`);
|
|
219
|
+
const { compatible, filtered } = filterToolsForProvider(toolNames, "openai-completions");
|
|
220
|
+
assert.equal(compatible.length, 200);
|
|
221
|
+
assert.equal(filtered.length, 0);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("does not cap when <= 128 tools with groq provider", () => {
|
|
225
|
+
const toolNames = Array.from({ length: 128 }, (_, i) => `tool_${i}`);
|
|
226
|
+
const { compatible, filtered } = filterToolsForProvider(toolNames, "openai-completions", "groq");
|
|
227
|
+
assert.equal(compatible.length, 128);
|
|
228
|
+
assert.equal(filtered.length, 0);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("caps to 128 when >128 tools with groq provider", () => {
|
|
232
|
+
const toolNames = Array.from({ length: 200 }, (_, i) => `tool_${i}`);
|
|
233
|
+
const { compatible, filtered } = filterToolsForProvider(toolNames, "openai-completions", "groq");
|
|
234
|
+
assert.equal(compatible.length, 128);
|
|
235
|
+
assert.equal(filtered.length, 72);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test("keeps the first 128 tools when capping", () => {
|
|
239
|
+
const toolNames = Array.from({ length: 200 }, (_, i) => `tool_${i}`);
|
|
240
|
+
const { compatible } = filterToolsForProvider(toolNames, "openai-completions", "groq");
|
|
241
|
+
assert.equal(compatible[0], "tool_0");
|
|
242
|
+
assert.equal(compatible[127], "tool_127");
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test("trimmed tools appear in filtered list", () => {
|
|
246
|
+
const toolNames = Array.from({ length: 130 }, (_, i) => `tool_${i}`);
|
|
247
|
+
const { filtered } = filterToolsForProvider(toolNames, "openai-completions", "groq");
|
|
248
|
+
assert.equal(filtered.length, 2);
|
|
249
|
+
assert.equal(filtered[0], "tool_128");
|
|
250
|
+
assert.equal(filtered[1], "tool_129");
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("emits a warning when tools are trimmed", () => {
|
|
254
|
+
const warnings: string[] = [];
|
|
255
|
+
const original = console.warn;
|
|
256
|
+
console.warn = (...args: unknown[]) => { warnings.push(String(args[0])); };
|
|
257
|
+
try {
|
|
258
|
+
const toolNames = Array.from({ length: 129 }, (_, i) => `tool_${i}`);
|
|
259
|
+
filterToolsForProvider(toolNames, "openai-completions", "groq");
|
|
260
|
+
assert.equal(warnings.length, 1);
|
|
261
|
+
assert.ok(warnings[0].includes("128"), "warning mentions Groq limit");
|
|
262
|
+
} finally {
|
|
263
|
+
console.warn = original;
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
test("does not warn when tools are at the limit", () => {
|
|
268
|
+
const warnings: string[] = [];
|
|
269
|
+
const original = console.warn;
|
|
270
|
+
console.warn = (...args: unknown[]) => { warnings.push(String(args[0])); };
|
|
271
|
+
try {
|
|
272
|
+
const toolNames = Array.from({ length: 128 }, (_, i) => `tool_${i}`);
|
|
273
|
+
filterToolsForProvider(toolNames, "openai-completions", "groq");
|
|
274
|
+
assert.equal(warnings.length, 0);
|
|
275
|
+
} finally {
|
|
276
|
+
console.warn = original;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
describe("adjustToolSet — Groq 128-tool cap", () => {
|
|
282
|
+
beforeEach(() => {
|
|
283
|
+
resetToolCompatibilityRegistry();
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("caps to 128 tools when provider is groq and >128 tools active", () => {
|
|
287
|
+
const toolNames = Array.from({ length: 150 }, (_, i) => `tool_${i}`);
|
|
288
|
+
const { toolNames: result, removedTools } = adjustToolSet(toolNames, "openai-completions", "groq");
|
|
289
|
+
assert.equal(result.length, 128);
|
|
290
|
+
assert.equal(removedTools.length, 22);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
test("does not cap for non-groq providers even with >128 tools", () => {
|
|
294
|
+
const toolNames = Array.from({ length: 150 }, (_, i) => `tool_${i}`);
|
|
295
|
+
const { toolNames: result, removedTools } = adjustToolSet(toolNames, "openai-completions", "openai");
|
|
296
|
+
assert.equal(result.length, 150);
|
|
297
|
+
assert.equal(removedTools.length, 0);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test("does not cap when provider is omitted", () => {
|
|
301
|
+
const toolNames = Array.from({ length: 150 }, (_, i) => `tool_${i}`);
|
|
302
|
+
const { toolNames: result, removedTools } = adjustToolSet(toolNames, "openai-completions");
|
|
303
|
+
assert.equal(result.length, 150);
|
|
304
|
+
assert.equal(removedTools.length, 0);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
@@ -44,7 +44,19 @@ describe("#2883: tool invocation error tracking on AutoSession", () => {
|
|
|
44
44
|
|
|
45
45
|
// ─── isToolInvocationError classifier ────────────────────────────────────
|
|
46
46
|
|
|
47
|
-
import {
|
|
47
|
+
import {
|
|
48
|
+
isDeterministicPolicyError,
|
|
49
|
+
isToolInvocationError,
|
|
50
|
+
isQueuedUserMessageSkip,
|
|
51
|
+
} from "../auto-tool-tracking.ts";
|
|
52
|
+
import {
|
|
53
|
+
shouldBlockContextWrite,
|
|
54
|
+
shouldBlockPendingGateInSnapshot,
|
|
55
|
+
shouldBlockQueueExecutionInSnapshot,
|
|
56
|
+
resetWriteGateState,
|
|
57
|
+
type WriteGateSnapshot,
|
|
58
|
+
} from "../bootstrap/write-gate.ts";
|
|
59
|
+
import { BLOCKED_WRITE_ERROR } from "../write-intercept.ts";
|
|
48
60
|
|
|
49
61
|
describe("#2883: isToolInvocationError classification", () => {
|
|
50
62
|
test("detects JSON validation failure pattern", () => {
|
|
@@ -89,11 +101,59 @@ describe("#2883: isToolInvocationError classification", () => {
|
|
|
89
101
|
);
|
|
90
102
|
});
|
|
91
103
|
|
|
104
|
+
test("detects raw write-gate CONTEXT failures for non-GSD write tools", () => {
|
|
105
|
+
resetWriteGateState();
|
|
106
|
+
const result = shouldBlockContextWrite(
|
|
107
|
+
"write",
|
|
108
|
+
"/tmp/project/.gsd/milestones/M001/M001-CONTEXT.md",
|
|
109
|
+
"M001",
|
|
110
|
+
false,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
assert.equal(result.block, true);
|
|
114
|
+
assert.equal(isDeterministicPolicyError(result.reason ?? ""), true);
|
|
115
|
+
assert.equal(isToolInvocationError(result.reason ?? ""), true);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("detects raw pending-gate failures for non-GSD write tools", () => {
|
|
119
|
+
const snapshot: WriteGateSnapshot = {
|
|
120
|
+
verifiedDepthMilestones: [],
|
|
121
|
+
activeQueuePhase: false,
|
|
122
|
+
pendingGateId: "depth_verification_M001",
|
|
123
|
+
};
|
|
124
|
+
const result = shouldBlockPendingGateInSnapshot(snapshot, "write", "M001", false);
|
|
125
|
+
|
|
126
|
+
assert.equal(result.block, true);
|
|
127
|
+
assert.equal(isDeterministicPolicyError(result.reason ?? ""), true);
|
|
128
|
+
assert.equal(isToolInvocationError(result.reason ?? ""), true);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("detects queue-mode policy blocks for raw write/edit/bash tools", () => {
|
|
132
|
+
const snapshot: WriteGateSnapshot = {
|
|
133
|
+
verifiedDepthMilestones: [],
|
|
134
|
+
activeQueuePhase: true,
|
|
135
|
+
pendingGateId: null,
|
|
136
|
+
};
|
|
137
|
+
const writeResult = shouldBlockQueueExecutionInSnapshot(snapshot, "write", "src/app.ts", true);
|
|
138
|
+
const bashResult = shouldBlockQueueExecutionInSnapshot(snapshot, "bash", "npm run build", true);
|
|
139
|
+
|
|
140
|
+
assert.equal(writeResult.block, true);
|
|
141
|
+
assert.equal(bashResult.block, true);
|
|
142
|
+
assert.equal(isDeterministicPolicyError(writeResult.reason ?? ""), true);
|
|
143
|
+
assert.equal(isToolInvocationError(bashResult.reason ?? ""), true);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("detects direct STATE.md/gsd.db write-intercept policy blocks", () => {
|
|
147
|
+
assert.equal(isDeterministicPolicyError(BLOCKED_WRITE_ERROR), true);
|
|
148
|
+
assert.equal(isToolInvocationError(BLOCKED_WRITE_ERROR), true);
|
|
149
|
+
});
|
|
150
|
+
|
|
92
151
|
test("returns false for normal tool errors (business logic)", () => {
|
|
93
152
|
assert.equal(
|
|
94
153
|
isToolInvocationError("Slice S01 is already complete"),
|
|
95
154
|
false,
|
|
96
155
|
);
|
|
156
|
+
assert.equal(isDeterministicPolicyError("Slice S01 is already complete"), false);
|
|
97
157
|
});
|
|
98
158
|
|
|
99
159
|
test("returns false for empty string", () => {
|
|
@@ -36,6 +36,9 @@ const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
|
|
|
36
36
|
{ canonical: "gsd_reassess_roadmap", alias: "gsd_roadmap_reassess" },
|
|
37
37
|
{ canonical: "gsd_complete_milestone", alias: "gsd_milestone_complete" },
|
|
38
38
|
{ canonical: "gsd_validate_milestone", alias: "gsd_milestone_validate" },
|
|
39
|
+
{ canonical: "gsd_task_reopen", alias: "gsd_reopen_task" },
|
|
40
|
+
{ canonical: "gsd_slice_reopen", alias: "gsd_reopen_slice" },
|
|
41
|
+
{ canonical: "gsd_milestone_reopen", alias: "gsd_reopen_milestone" },
|
|
39
42
|
];
|
|
40
43
|
|
|
41
44
|
// ─── Registration count ──────────────────────────────────────────────────────
|
|
@@ -45,7 +48,11 @@ console.log('\n── Tool naming: registration count ──');
|
|
|
45
48
|
const pi = makeMockPi();
|
|
46
49
|
registerDbTools(pi);
|
|
47
50
|
|
|
48
|
-
assert.deepStrictEqual(
|
|
51
|
+
assert.deepStrictEqual(
|
|
52
|
+
pi.tools.length,
|
|
53
|
+
RENAME_MAP.length * 2 + 2,
|
|
54
|
+
'Should register canonical/alias tool pairs plus 1 gate tool and 1 gsd_skip_slice',
|
|
55
|
+
);
|
|
49
56
|
|
|
50
57
|
// ─── Both names exist for each pair ──────────────────────────────────────────
|
|
51
58
|
|