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
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import test, { mock } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { resolve } from "node:path";
|
|
5
3
|
|
|
6
4
|
import {
|
|
7
5
|
resolveAgentEnd,
|
|
@@ -10,12 +8,14 @@ import {
|
|
|
10
8
|
autoLoop,
|
|
11
9
|
detectStuck,
|
|
12
10
|
_resetPendingResolve,
|
|
11
|
+
_hasPendingResolveForTest,
|
|
13
12
|
_setActiveSession,
|
|
14
13
|
isSessionSwitchInFlight,
|
|
15
14
|
type UnitResult,
|
|
16
15
|
type AgentEndEvent,
|
|
17
16
|
type LoopDeps,
|
|
18
17
|
} from "../auto-loop.js";
|
|
18
|
+
import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
|
|
19
19
|
import type { SessionLockStatus } from "../session-lock.js";
|
|
20
20
|
|
|
21
21
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
@@ -35,12 +35,15 @@ function makeMockSession(opts?: {
|
|
|
35
35
|
newSessionDelayMs?: number;
|
|
36
36
|
onNewSessionStart?: (session: any) => void;
|
|
37
37
|
onNewSessionSettle?: (session: any) => void;
|
|
38
|
+
/** Called after the delay with the aborted state of any passed abortSignal.
|
|
39
|
+
* Used to verify that runUnit passes an aborted signal on late resolution (#3731). */
|
|
40
|
+
onSignalCheck?: (aborted: boolean) => void;
|
|
38
41
|
}) {
|
|
39
42
|
const session = {
|
|
40
43
|
active: true,
|
|
41
44
|
verbose: false,
|
|
42
45
|
cmdCtx: {
|
|
43
|
-
newSession: () => {
|
|
46
|
+
newSession: (options?: { abortSignal?: AbortSignal }) => {
|
|
44
47
|
opts?.onNewSessionStart?.(session);
|
|
45
48
|
if (opts?.newSessionThrows) {
|
|
46
49
|
return Promise.reject(new Error(opts.newSessionThrows));
|
|
@@ -50,11 +53,17 @@ function makeMockSession(opts?: {
|
|
|
50
53
|
if (delay > 0) {
|
|
51
54
|
return new Promise<{ cancelled: boolean }>((res) =>
|
|
52
55
|
setTimeout(() => {
|
|
56
|
+
// Simulate AgentSession.newSession() checking abortSignal after
|
|
57
|
+
// its internal async work (abort()) completes — this is where the
|
|
58
|
+
// real code captures process.cwd() and rebuilds the tool runtime.
|
|
59
|
+
// If the signal is aborted, the real code discards the session.
|
|
60
|
+
opts?.onSignalCheck?.(options?.abortSignal?.aborted ?? false);
|
|
53
61
|
opts?.onNewSessionSettle?.(session);
|
|
54
62
|
res(result);
|
|
55
63
|
}, delay),
|
|
56
64
|
);
|
|
57
65
|
}
|
|
66
|
+
opts?.onSignalCheck?.(options?.abortSignal?.aborted ?? false);
|
|
58
67
|
opts?.onNewSessionSettle?.(session);
|
|
59
68
|
return Promise.resolve(result);
|
|
60
69
|
},
|
|
@@ -349,6 +358,182 @@ test("runUnit cancels before dispatch when model restore fails after newSession"
|
|
|
349
358
|
]);
|
|
350
359
|
});
|
|
351
360
|
|
|
361
|
+
test("runUnit cancels before dispatch when provider is not request-ready (#4555)", async () => {
|
|
362
|
+
_resetPendingResolve();
|
|
363
|
+
|
|
364
|
+
const ctx = makeMockCtx();
|
|
365
|
+
ctx.model = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
366
|
+
ctx.modelRegistry = {
|
|
367
|
+
isProviderRequestReady: (_provider: string) => false,
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
const pi = makeMockPi();
|
|
371
|
+
const s = makeMockSession();
|
|
372
|
+
|
|
373
|
+
const result = await runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
374
|
+
|
|
375
|
+
assert.equal(result.status, "cancelled");
|
|
376
|
+
assert.equal(result.errorContext?.category, "provider");
|
|
377
|
+
assert.match(
|
|
378
|
+
result.errorContext?.message ?? "",
|
|
379
|
+
/Provider anthropic is not request-ready/,
|
|
380
|
+
);
|
|
381
|
+
assert.equal(pi.calls.length, 0, "sendMessage must not be called when provider is not ready");
|
|
382
|
+
assert.equal(_hasPendingResolveForTest(), false, "provider cancellation must clear the pending resolver");
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
test("runUnit cancels before dispatch using currentUnitModel provider when set (#4555)", async () => {
|
|
386
|
+
_resetPendingResolve();
|
|
387
|
+
|
|
388
|
+
const ctx = makeMockCtx();
|
|
389
|
+
// ctx.model uses "openai" which IS ready — if the code ignores currentUnitModel
|
|
390
|
+
// and falls back to ctx.model.provider, the unit would NOT be cancelled. The
|
|
391
|
+
// test therefore differentiates: only a bug (wrong provider lookup) would pass.
|
|
392
|
+
ctx.model = { provider: "openai", id: "gpt-4o" };
|
|
393
|
+
// modelRegistry says anthropic is not ready but openai is
|
|
394
|
+
ctx.modelRegistry = {
|
|
395
|
+
isProviderRequestReady: (provider: string) => provider === "openai",
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
const pi = makeMockPi();
|
|
399
|
+
const s = makeMockSession();
|
|
400
|
+
// currentUnitModel overrides the provider used in the readiness check
|
|
401
|
+
s.currentUnitModel = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
402
|
+
|
|
403
|
+
const result = await runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
404
|
+
|
|
405
|
+
assert.equal(result.status, "cancelled");
|
|
406
|
+
assert.equal(result.errorContext?.category, "provider");
|
|
407
|
+
assert.match(
|
|
408
|
+
result.errorContext?.message ?? "",
|
|
409
|
+
/Provider anthropic is not request-ready/,
|
|
410
|
+
);
|
|
411
|
+
assert.equal(pi.calls.length, 0, "sendMessage must not be called — anthropic (currentUnitModel) is not ready");
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
test("runUnit does not cancel before dispatch when provider is request-ready (#4555)", async () => {
|
|
415
|
+
_resetPendingResolve();
|
|
416
|
+
|
|
417
|
+
const ctx = makeMockCtx();
|
|
418
|
+
ctx.model = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
419
|
+
ctx.modelRegistry = {
|
|
420
|
+
isProviderRequestReady: (_provider: string) => true,
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
const pi = makeMockPi();
|
|
424
|
+
const s = makeMockSession();
|
|
425
|
+
|
|
426
|
+
const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
427
|
+
|
|
428
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
429
|
+
resolveAgentEnd(makeEvent());
|
|
430
|
+
|
|
431
|
+
const result = await resultPromise;
|
|
432
|
+
assert.equal(result.status, "completed");
|
|
433
|
+
assert.equal(pi.calls.length, 1, "sendMessage must be called when provider is ready");
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test("runUnit proceeds when modelRegistry is absent (no readiness check available) (#4555)", async () => {
|
|
437
|
+
_resetPendingResolve();
|
|
438
|
+
|
|
439
|
+
const ctx = makeMockCtx();
|
|
440
|
+
ctx.model = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
441
|
+
// No modelRegistry on ctx — pre-check should be skipped
|
|
442
|
+
|
|
443
|
+
const pi = makeMockPi();
|
|
444
|
+
const s = makeMockSession();
|
|
445
|
+
|
|
446
|
+
const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
447
|
+
|
|
448
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
449
|
+
resolveAgentEnd(makeEvent());
|
|
450
|
+
|
|
451
|
+
const result = await resultPromise;
|
|
452
|
+
assert.equal(result.status, "completed");
|
|
453
|
+
assert.equal(pi.calls.length, 1);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
test("runUnit proceeds when isProviderRequestReady throws (defensive) (#4555)", async () => {
|
|
457
|
+
_resetPendingResolve();
|
|
458
|
+
|
|
459
|
+
const ctx = makeMockCtx();
|
|
460
|
+
ctx.model = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
461
|
+
ctx.modelRegistry = {
|
|
462
|
+
isProviderRequestReady: (_provider: string) => {
|
|
463
|
+
throw new Error("registry error");
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
const pi = makeMockPi();
|
|
468
|
+
const s = makeMockSession();
|
|
469
|
+
|
|
470
|
+
const result = await runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
471
|
+
|
|
472
|
+
// When the readyCheck throws, ready=false → unit cancelled
|
|
473
|
+
assert.equal(result.status, "cancelled");
|
|
474
|
+
assert.equal(result.errorContext?.category, "provider");
|
|
475
|
+
assert.equal(pi.calls.length, 0);
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
test("late-resolving newSession() after timeout receives aborted signal so tool runtime is not configured with root cwd (#3731)", async () => {
|
|
479
|
+
// When newSession() times out in runUnit(), auto-mode restores cwd to project
|
|
480
|
+
// root. If newSession() later resolves, it must NOT use process.cwd() to
|
|
481
|
+
// configure the tool runtime (which would give it root cwd, not worktree cwd).
|
|
482
|
+
//
|
|
483
|
+
// The fix: runUnit creates an AbortController, aborts it on timeout, and passes
|
|
484
|
+
// the signal to newSession(). AgentSession.newSession() checks the signal after
|
|
485
|
+
// its internal await this.abort() completes and returns early (discards) if aborted.
|
|
486
|
+
//
|
|
487
|
+
// This test uses mock.timers to control timing precisely.
|
|
488
|
+
_resetPendingResolve();
|
|
489
|
+
mock.timers.enable();
|
|
490
|
+
|
|
491
|
+
try {
|
|
492
|
+
let abortedWhenLateSessionSettled: boolean | null = null;
|
|
493
|
+
|
|
494
|
+
// newSession mock simulates AgentSession.newSession() behavior:
|
|
495
|
+
// after an internal delay (representing await this.abort()), it checks the
|
|
496
|
+
// abortSignal — that's where the real code would capture process.cwd() and
|
|
497
|
+
// call _buildRuntime. If aborted, the real code must discard the session.
|
|
498
|
+
const s = makeMockSession({
|
|
499
|
+
newSessionDelayMs: 200_000, // longer than NEW_SESSION_TIMEOUT_MS (120s)
|
|
500
|
+
onSignalCheck: (aborted) => {
|
|
501
|
+
abortedWhenLateSessionSettled = aborted;
|
|
502
|
+
},
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
const ctx = makeMockCtx();
|
|
506
|
+
const pi = makeMockPi();
|
|
507
|
+
|
|
508
|
+
const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
509
|
+
|
|
510
|
+
// Tick past the 120s NEW_SESSION_TIMEOUT_MS — runUnit returns cancelled
|
|
511
|
+
mock.timers.tick(121_000);
|
|
512
|
+
await Promise.resolve();
|
|
513
|
+
|
|
514
|
+
const result = await resultPromise;
|
|
515
|
+
assert.equal(result.status, "cancelled", "runUnit must return cancelled on session timeout");
|
|
516
|
+
|
|
517
|
+
// Tick past the delayed newSession (200s total) — the late newSession resolves
|
|
518
|
+
mock.timers.tick(80_000);
|
|
519
|
+
// Drain microtask queue so the .finally() and setTimeout callbacks run
|
|
520
|
+
await Promise.resolve();
|
|
521
|
+
await Promise.resolve();
|
|
522
|
+
|
|
523
|
+
// The key assertion: when the late newSession() resolves, runUnit must have
|
|
524
|
+
// passed an aborted AbortSignal. Without the fix, no signal is passed and
|
|
525
|
+
// abortedWhenLateSessionSettled would be false (or null, if signal not passed at all).
|
|
526
|
+
assert.equal(
|
|
527
|
+
abortedWhenLateSessionSettled,
|
|
528
|
+
true,
|
|
529
|
+
"runUnit must pass an aborted AbortSignal to newSession() when it resolves after the session-creation timeout (#3731). " +
|
|
530
|
+
"Without this, AgentSession.newSession() captures root process.cwd() and rebuilds the tool runtime with wrong cwd.",
|
|
531
|
+
);
|
|
532
|
+
} finally {
|
|
533
|
+
mock.timers.reset();
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
|
|
352
537
|
// ─── Structural assertions ───────────────────────────────────────────────────
|
|
353
538
|
|
|
354
539
|
test("auto-loop.ts exports autoLoop, runUnit, resolveAgentEnd", async () => {
|
|
@@ -370,65 +555,15 @@ test("auto-loop.ts exports autoLoop, runUnit, resolveAgentEnd", async () => {
|
|
|
370
555
|
);
|
|
371
556
|
});
|
|
372
557
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
test("auto/resolve.ts one-shot pattern: _currentResolve is nulled before calling resolver", () => {
|
|
385
|
-
const src = readFileSync(
|
|
386
|
-
resolve(import.meta.dirname, "..", "auto", "resolve.ts"),
|
|
387
|
-
"utf-8",
|
|
388
|
-
);
|
|
389
|
-
// The one-shot pattern requires: save ref, null the variable, then call
|
|
390
|
-
const resolveBlock = src.slice(
|
|
391
|
-
src.indexOf("export function resolveAgentEnd"),
|
|
392
|
-
src.indexOf("export function resolveAgentEnd") + 600,
|
|
393
|
-
);
|
|
394
|
-
const nullIdx = resolveBlock.indexOf("_currentResolve = null");
|
|
395
|
-
const callIdx = resolveBlock.indexOf("r({");
|
|
396
|
-
assert.ok(nullIdx > 0, "should null _currentResolve in resolveAgentEnd");
|
|
397
|
-
assert.ok(callIdx > 0, "should call resolver in resolveAgentEnd");
|
|
398
|
-
assert.ok(
|
|
399
|
-
nullIdx < callIdx,
|
|
400
|
-
"_currentResolve should be nulled before calling the resolver (one-shot)",
|
|
401
|
-
);
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
test("auto/phases.ts: selectAndApplyModel called exactly once and before updateProgressWidget (#2907)", () => {
|
|
405
|
-
const src = readFileSync(
|
|
406
|
-
resolve(import.meta.dirname, "..", "auto", "phases.ts"),
|
|
407
|
-
"utf-8",
|
|
408
|
-
);
|
|
409
|
-
// Extract the runUnitPhase function body
|
|
410
|
-
const fnStart = src.indexOf("export async function runUnitPhase");
|
|
411
|
-
assert.ok(fnStart > 0, "runUnitPhase should exist in phases.ts");
|
|
412
|
-
const fnBody = src.slice(fnStart, fnStart + 12000);
|
|
413
|
-
|
|
414
|
-
// selectAndApplyModel must appear exactly once
|
|
415
|
-
const allOccurrences = [...fnBody.matchAll(/selectAndApplyModel\(/g)];
|
|
416
|
-
assert.equal(
|
|
417
|
-
allOccurrences.length,
|
|
418
|
-
1,
|
|
419
|
-
`selectAndApplyModel should be called exactly once in runUnitPhase, found ${allOccurrences.length} calls`,
|
|
420
|
-
);
|
|
421
|
-
|
|
422
|
-
// selectAndApplyModel must appear BEFORE updateProgressWidget
|
|
423
|
-
const modelIdx = fnBody.indexOf("selectAndApplyModel(");
|
|
424
|
-
const widgetIdx = fnBody.indexOf("updateProgressWidget(");
|
|
425
|
-
assert.ok(modelIdx > 0, "selectAndApplyModel should exist in runUnitPhase");
|
|
426
|
-
assert.ok(widgetIdx > 0, "updateProgressWidget should exist in runUnitPhase");
|
|
427
|
-
assert.ok(
|
|
428
|
-
modelIdx < widgetIdx,
|
|
429
|
-
"selectAndApplyModel must be called BEFORE updateProgressWidget (#2899/#2907)",
|
|
430
|
-
);
|
|
431
|
-
});
|
|
558
|
+
// NOTE: the "while keyword", "one-shot null-before-resolve", and
|
|
559
|
+
// "selectAndApplyModel before updateProgressWidget" source-grep tests
|
|
560
|
+
// previously here were deleted as tautological (readFileSync + substring
|
|
561
|
+
// match). The one-shot pattern is already covered behaviourally by the
|
|
562
|
+
// "double resolveAgentEnd only resolves once" test above, which drives the
|
|
563
|
+
// real resolveAgentEnd/runUnit flow and asserts on the observable promise
|
|
564
|
+
// outcome. The phases.ts ordering contract is tracked via a follow-up
|
|
565
|
+
// issue proposing extraction of a pure `dispatchOrder` helper (per the
|
|
566
|
+
// #4832/PR #4859 precedent) so it can be tested behaviourally.
|
|
432
567
|
|
|
433
568
|
// ─── autoLoop tests (T02) ─────────────────────────────────────────────────
|
|
434
569
|
|
|
@@ -497,6 +632,8 @@ function makeMockDeps(
|
|
|
497
632
|
autoWorktreeBranch: () => "auto/M001",
|
|
498
633
|
resolveMilestoneFile: () => null,
|
|
499
634
|
reconcileMergeState: () => "clean",
|
|
635
|
+
preflightCleanRoot: () => ({ stashPushed: false, summary: "" }),
|
|
636
|
+
postflightPopStash: () => {},
|
|
500
637
|
getLedger: () => null,
|
|
501
638
|
getProjectTotals: () => ({ cost: 0 }),
|
|
502
639
|
formatCost: (c: number) => `$${c.toFixed(2)}`,
|
|
@@ -663,6 +800,45 @@ test("autoLoop exits on terminal complete state", async (t) => {
|
|
|
663
800
|
);
|
|
664
801
|
});
|
|
665
802
|
|
|
803
|
+
test("autoLoop pauses when provider readiness cancels before dispatch", async () => {
|
|
804
|
+
_resetPendingResolve();
|
|
805
|
+
|
|
806
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
807
|
+
const ctx = makeMockCtx();
|
|
808
|
+
ctx.ui.setStatus = () => {};
|
|
809
|
+
ctx.ui.notify = (message: string, level?: string) => {
|
|
810
|
+
notifications.push({ message, level });
|
|
811
|
+
};
|
|
812
|
+
ctx.model = { provider: "anthropic", id: "claude-opus-4-6" };
|
|
813
|
+
ctx.modelRegistry = {
|
|
814
|
+
getProviderAuthMode: () => "api-key",
|
|
815
|
+
isProviderRequestReady: () => false,
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
const pi = makeMockPi();
|
|
819
|
+
const s = makeLoopSession();
|
|
820
|
+
const deps = makeMockDeps({
|
|
821
|
+
selectAndApplyModel: async () => ({
|
|
822
|
+
routing: null,
|
|
823
|
+
appliedModel: { provider: "anthropic", id: "claude-opus-4-6" },
|
|
824
|
+
}),
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
await autoLoop(ctx, pi, s, deps);
|
|
828
|
+
|
|
829
|
+
assert.equal(pi.calls.length, 0, "provider readiness cancellation must not dispatch a message");
|
|
830
|
+
assert.ok(deps.callLog.includes("pauseAuto"), "provider readiness cancellation should pause auto-mode");
|
|
831
|
+
assert.ok(!deps.callLog.includes("stopAuto"), "provider readiness cancellation should not hard-stop auto-mode");
|
|
832
|
+
assert.ok(
|
|
833
|
+
!deps.callLog.includes("postUnitPreVerification"),
|
|
834
|
+
"post-unit verification must not run after pre-dispatch provider cancellation",
|
|
835
|
+
);
|
|
836
|
+
assert.ok(
|
|
837
|
+
notifications.some(n => /Provider anthropic is not request-ready/.test(n.message)),
|
|
838
|
+
"provider pause should notify with the readiness failure",
|
|
839
|
+
);
|
|
840
|
+
});
|
|
841
|
+
|
|
666
842
|
test("autoLoop passes structured session-lock failure details to the handler", async () => {
|
|
667
843
|
_resetPendingResolve();
|
|
668
844
|
|
|
@@ -1224,210 +1400,18 @@ test("autoLoop exits when no active milestone found", async (t) => {
|
|
|
1224
1400
|
);
|
|
1225
1401
|
});
|
|
1226
1402
|
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
const src = readFileSync(
|
|
1240
|
-
resolve(import.meta.dirname, "..", "auto", "loop.ts"),
|
|
1241
|
-
"utf-8",
|
|
1242
|
-
);
|
|
1243
|
-
assert.ok(
|
|
1244
|
-
src.includes("deps: LoopDeps"),
|
|
1245
|
-
"autoLoop should accept a deps: LoopDeps parameter",
|
|
1246
|
-
);
|
|
1247
|
-
});
|
|
1248
|
-
|
|
1249
|
-
test("autoLoop contains while (s.active) loop", () => {
|
|
1250
|
-
const src = readFileSync(
|
|
1251
|
-
resolve(import.meta.dirname, "..", "auto", "loop.ts"),
|
|
1252
|
-
"utf-8",
|
|
1253
|
-
);
|
|
1254
|
-
assert.ok(
|
|
1255
|
-
src.includes("while (s.active)"),
|
|
1256
|
-
"autoLoop should contain a while (s.active) loop",
|
|
1257
|
-
);
|
|
1258
|
-
});
|
|
1259
|
-
|
|
1260
|
-
// ── T03: End-to-end wiring structural assertions ─────────────────────────────
|
|
1261
|
-
|
|
1262
|
-
test("auto-loop.ts barrel re-exports autoLoop, runUnit, and resolveAgentEnd", () => {
|
|
1263
|
-
const barrel = readFileSync(
|
|
1264
|
-
resolve(import.meta.dirname, "..", "auto-loop.ts"),
|
|
1265
|
-
"utf-8",
|
|
1266
|
-
);
|
|
1267
|
-
assert.ok(
|
|
1268
|
-
barrel.includes("autoLoop"),
|
|
1269
|
-
"barrel must re-export autoLoop",
|
|
1270
|
-
);
|
|
1271
|
-
assert.ok(
|
|
1272
|
-
barrel.includes("runUnit"),
|
|
1273
|
-
"barrel must re-export runUnit",
|
|
1274
|
-
);
|
|
1275
|
-
assert.ok(
|
|
1276
|
-
barrel.includes("resolveAgentEnd"),
|
|
1277
|
-
"barrel must re-export resolveAgentEnd",
|
|
1278
|
-
);
|
|
1279
|
-
// Verify the actual function declarations exist in the submodules
|
|
1280
|
-
const loopSrc = readFileSync(
|
|
1281
|
-
resolve(import.meta.dirname, "..", "auto", "loop.ts"),
|
|
1282
|
-
"utf-8",
|
|
1283
|
-
);
|
|
1284
|
-
assert.ok(
|
|
1285
|
-
loopSrc.includes("export async function autoLoop"),
|
|
1286
|
-
"auto/loop.ts must define autoLoop",
|
|
1287
|
-
);
|
|
1288
|
-
const runUnitSrc = readFileSync(
|
|
1289
|
-
resolve(import.meta.dirname, "..", "auto", "run-unit.ts"),
|
|
1290
|
-
"utf-8",
|
|
1291
|
-
);
|
|
1292
|
-
assert.ok(
|
|
1293
|
-
runUnitSrc.includes("export async function runUnit"),
|
|
1294
|
-
"auto/run-unit.ts must define runUnit",
|
|
1295
|
-
);
|
|
1296
|
-
const resolveSrc = readFileSync(
|
|
1297
|
-
resolve(import.meta.dirname, "..", "auto", "resolve.ts"),
|
|
1298
|
-
"utf-8",
|
|
1299
|
-
);
|
|
1300
|
-
assert.ok(
|
|
1301
|
-
resolveSrc.includes("export function resolveAgentEnd"),
|
|
1302
|
-
"auto/resolve.ts must define resolveAgentEnd",
|
|
1303
|
-
);
|
|
1304
|
-
});
|
|
1305
|
-
|
|
1306
|
-
test("auto.ts startAuto dispatches through the UOK kernel wrapper with explicit kernel and legacy paths", () => {
|
|
1307
|
-
const src = readFileSync(
|
|
1308
|
-
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1309
|
-
"utf-8",
|
|
1310
|
-
);
|
|
1311
|
-
// Find the startAuto function body
|
|
1312
|
-
const fnIdx = src.indexOf("export async function startAuto");
|
|
1313
|
-
assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
|
|
1314
|
-
const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
|
|
1315
|
-
const fnBlock =
|
|
1316
|
-
fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
|
|
1317
|
-
assert.ok(
|
|
1318
|
-
fnBlock.includes("runAutoLoopWithUok("),
|
|
1319
|
-
"startAuto must dispatch through runAutoLoopWithUok()",
|
|
1320
|
-
);
|
|
1321
|
-
assert.ok(
|
|
1322
|
-
fnBlock.includes("runKernelLoop: runUokKernelLoop"),
|
|
1323
|
-
"startAuto must wire the explicit UOK kernel loop path",
|
|
1324
|
-
);
|
|
1325
|
-
assert.ok(
|
|
1326
|
-
fnBlock.includes("runLegacyLoop: runLegacyAutoLoop"),
|
|
1327
|
-
"startAuto must preserve explicit legacy fallback dispatch",
|
|
1328
|
-
);
|
|
1329
|
-
});
|
|
1330
|
-
|
|
1331
|
-
test("startAuto calls selfHealRuntimeRecords before autoLoop (#1727)", { skip: "selfHealRuntimeRecords moved to crash-recovery pipeline in v3" }, () => {
|
|
1332
|
-
const src = readFileSync(
|
|
1333
|
-
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1334
|
-
"utf-8",
|
|
1335
|
-
);
|
|
1336
|
-
const fnIdx = src.indexOf("export async function startAuto");
|
|
1337
|
-
assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
|
|
1338
|
-
const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
|
|
1339
|
-
const fnBlock =
|
|
1340
|
-
fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
|
|
1341
|
-
|
|
1342
|
-
// Both autoLoop call sites must be preceded by selfHealRuntimeRecords
|
|
1343
|
-
const healIdx = fnBlock.indexOf("selfHealRuntimeRecords");
|
|
1344
|
-
const loopIdx = fnBlock.indexOf("autoLoop(");
|
|
1345
|
-
assert.ok(healIdx > -1, "startAuto must call selfHealRuntimeRecords");
|
|
1346
|
-
assert.ok(healIdx < loopIdx, "selfHealRuntimeRecords must be called before autoLoop");
|
|
1347
|
-
|
|
1348
|
-
// Verify the second autoLoop call site also has selfHeal before it (if present)
|
|
1349
|
-
const secondLoopIdx = fnBlock.indexOf("autoLoop(", loopIdx + 1);
|
|
1350
|
-
const secondHealIdx = fnBlock.indexOf("selfHealRuntimeRecords", healIdx + 1);
|
|
1351
|
-
assert.ok(
|
|
1352
|
-
secondLoopIdx === -1 || (secondHealIdx > -1 && secondHealIdx < secondLoopIdx),
|
|
1353
|
-
"if a second autoLoop call exists, it must also be preceded by selfHealRuntimeRecords",
|
|
1354
|
-
);
|
|
1355
|
-
});
|
|
1356
|
-
|
|
1357
|
-
test("startAuto guards against concurrent invocation (#2923)", () => {
|
|
1358
|
-
const src = readFileSync(
|
|
1359
|
-
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1360
|
-
"utf-8",
|
|
1361
|
-
);
|
|
1362
|
-
const fnIdx = src.indexOf("export async function startAuto");
|
|
1363
|
-
assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
|
|
1364
|
-
// The guard must appear before any other logic in the function body
|
|
1365
|
-
const fnBody = src.slice(fnIdx, fnIdx + 500);
|
|
1366
|
-
const activeGuard = fnBody.indexOf("if (s.active)");
|
|
1367
|
-
assert.ok(activeGuard > -1, "startAuto must check s.active to prevent concurrent auto-loops");
|
|
1368
|
-
const returnIdx = fnBody.indexOf("return;", activeGuard);
|
|
1369
|
-
assert.ok(
|
|
1370
|
-
returnIdx > -1 && returnIdx < activeGuard + 120,
|
|
1371
|
-
"s.active guard must early-return to prevent a second concurrent loop",
|
|
1372
|
-
);
|
|
1373
|
-
});
|
|
1374
|
-
|
|
1375
|
-
test("agent_end handler calls resolveAgentEnd (not the legacy auto.ts path)", () => {
|
|
1376
|
-
const hooksSrc = readFileSync(
|
|
1377
|
-
resolve(import.meta.dirname, "..", "bootstrap", "register-hooks.ts"),
|
|
1378
|
-
"utf-8",
|
|
1379
|
-
);
|
|
1380
|
-
// Verify the agent_end hook is registered
|
|
1381
|
-
const handlerIdx = hooksSrc.indexOf('pi.on("agent_end"');
|
|
1382
|
-
assert.ok(handlerIdx > -1, "register-hooks.ts must have an agent_end handler");
|
|
1383
|
-
|
|
1384
|
-
const recoverySrc = readFileSync(
|
|
1385
|
-
resolve(import.meta.dirname, "..", "bootstrap", "agent-end-recovery.ts"),
|
|
1386
|
-
"utf-8",
|
|
1387
|
-
);
|
|
1388
|
-
assert.ok(
|
|
1389
|
-
recoverySrc.includes("resolveAgentEnd(event)"),
|
|
1390
|
-
"agent_end success path must call resolveAgentEnd(event) instead of legacy wrappers",
|
|
1391
|
-
);
|
|
1392
|
-
assert.ok(
|
|
1393
|
-
recoverySrc.includes("isSessionSwitchInFlight()"),
|
|
1394
|
-
"agent_end handler must ignore session-switch agent_end events from cmdCtx.newSession()",
|
|
1395
|
-
);
|
|
1396
|
-
});
|
|
1397
|
-
|
|
1398
|
-
test("auto-verification.ts runPostUnitVerification does not take dispatchNextUnit callback", () => {
|
|
1399
|
-
const src = readFileSync(
|
|
1400
|
-
resolve(import.meta.dirname, "..", "auto-verification.ts"),
|
|
1401
|
-
"utf-8",
|
|
1402
|
-
);
|
|
1403
|
-
const fnIdx = src.indexOf("export async function runPostUnitVerification");
|
|
1404
|
-
assert.ok(fnIdx > -1, "runPostUnitVerification must exist");
|
|
1405
|
-
const sigEnd = src.indexOf("): Promise<VerificationResult>", fnIdx);
|
|
1406
|
-
const signature = src.slice(fnIdx, sigEnd);
|
|
1407
|
-
assert.ok(
|
|
1408
|
-
!signature.includes("dispatchNextUnit"),
|
|
1409
|
-
"runPostUnitVerification must not take a dispatchNextUnit callback parameter",
|
|
1410
|
-
);
|
|
1411
|
-
assert.ok(
|
|
1412
|
-
!signature.includes("startDispatchGapWatchdog"),
|
|
1413
|
-
"runPostUnitVerification must not take a startDispatchGapWatchdog callback parameter",
|
|
1414
|
-
);
|
|
1415
|
-
});
|
|
1416
|
-
|
|
1417
|
-
test("auto-timeout-recovery.ts calls resolveAgentEnd instead of dispatchNextUnit", () => {
|
|
1418
|
-
const src = readFileSync(
|
|
1419
|
-
resolve(import.meta.dirname, "..", "auto-timeout-recovery.ts"),
|
|
1420
|
-
"utf-8",
|
|
1421
|
-
);
|
|
1422
|
-
assert.ok(
|
|
1423
|
-
!src.includes("await dispatchNextUnit"),
|
|
1424
|
-
"auto-timeout-recovery.ts must not call dispatchNextUnit",
|
|
1425
|
-
);
|
|
1426
|
-
assert.ok(
|
|
1427
|
-
src.includes("resolveAgentEnd("),
|
|
1428
|
-
"auto-timeout-recovery.ts must call resolveAgentEnd to re-iterate the loop on timeout recovery",
|
|
1429
|
-
);
|
|
1430
|
-
});
|
|
1403
|
+
// NOTE: The T03 "wiring structural assertions" block (barrel re-exports,
|
|
1404
|
+
// LoopDeps-interface-declared, while-loop keyword, UOK kernel wrapper,
|
|
1405
|
+
// selfHeal ordering, s.active concurrent guard, agent_end handler call
|
|
1406
|
+
// shape, runPostUnitVerification signature, auto-timeout-recovery call
|
|
1407
|
+
// shape) was a pure source-grep chain — readFileSync + includes/indexOf —
|
|
1408
|
+
// so it asserted on code shape rather than runtime behaviour. The symbols
|
|
1409
|
+
// named in those assertions are ALREADY imported at the top of this file;
|
|
1410
|
+
// if the production barrel drops any of them, this file fails to import
|
|
1411
|
+
// and every test here fails cold. That import-time check is the real
|
|
1412
|
+
// behavioural contract. The ordering/signature contracts (UOK dispatch,
|
|
1413
|
+
// concurrent guard, agent_end wiring) are tracked as follow-up issues for
|
|
1414
|
+
// pure-helper extraction per the #4832/PR #4859 precedent.
|
|
1431
1415
|
|
|
1432
1416
|
// ── Stuck counter tests ──────────────────────────────────────────────────────
|
|
1433
1417
|
|
|
@@ -1726,26 +1710,10 @@ test("detectStuck: truncates long error strings", () => {
|
|
|
1726
1710
|
assert.ok(result!.reason.length < 300, "reason should be truncated");
|
|
1727
1711
|
});
|
|
1728
1712
|
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
resolve(import.meta.dirname, "..", "auto", "phases.ts"),
|
|
1734
|
-
"utf-8",
|
|
1735
|
-
);
|
|
1736
|
-
assert.ok(
|
|
1737
|
-
src.includes('"stuck-detected"'),
|
|
1738
|
-
"auto/phases.ts must log phase: 'stuck-detected' when stuck detection fires",
|
|
1739
|
-
);
|
|
1740
|
-
assert.ok(
|
|
1741
|
-
src.includes('"stuck-counter-reset"'),
|
|
1742
|
-
"auto/phases.ts must log phase: 'stuck-counter-reset' when recovery resets on new unit",
|
|
1743
|
-
);
|
|
1744
|
-
assert.ok(
|
|
1745
|
-
src.includes("detectStuck"),
|
|
1746
|
-
"auto/phases.ts must use detectStuck for sliding window analysis",
|
|
1747
|
-
);
|
|
1748
|
-
});
|
|
1713
|
+
// NOTE: the "stuck-detected" / "stuck-counter-reset" debug-log grep was
|
|
1714
|
+
// removed — that string test never exercised the detector. detectStuck
|
|
1715
|
+
// itself is tested behaviourally above against the real implementation
|
|
1716
|
+
// imported from auto-loop.js.
|
|
1749
1717
|
|
|
1750
1718
|
// ── Lifecycle test (S05/T02) ─────────────────────────────────────────────────
|
|
1751
1719
|
|
|
@@ -2392,3 +2360,71 @@ test("autoLoop warns but proceeds for greenfield project (no project files) (#18
|
|
|
2392
2360
|
"should warn about greenfield project (no project files)",
|
|
2393
2361
|
);
|
|
2394
2362
|
});
|
|
2363
|
+
|
|
2364
|
+
// ─── #4850: pre-send model-policy block is non-retryable ────────────────────
|
|
2365
|
+
test("autoLoop classifies ModelPolicyDispatchBlockedError as blocked, not a retryable error", async () => {
|
|
2366
|
+
_resetPendingResolve();
|
|
2367
|
+
|
|
2368
|
+
const ctx = makeMockCtx();
|
|
2369
|
+
ctx.ui.setStatus = () => {};
|
|
2370
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
2371
|
+
ctx.ui.notify = (m: string, l?: string) => { notifications.push({ message: m, level: l }); };
|
|
2372
|
+
|
|
2373
|
+
const pi = makeMockPi();
|
|
2374
|
+
const s = makeLoopSession();
|
|
2375
|
+
|
|
2376
|
+
const journalEvents: Array<{ eventType: string; data?: any }> = [];
|
|
2377
|
+
let pauseAutoCalls = 0;
|
|
2378
|
+
let stopAutoCalls = 0;
|
|
2379
|
+
// Capture onTurnResult to assert blocked-unit identity is propagated to
|
|
2380
|
+
// the uokObserver. Without the fix, observedUnitType/Id are unset because
|
|
2381
|
+
// the throw happens inside dispatch before the success-path assignments
|
|
2382
|
+
// at loop.ts:453/631/647 (#4959 / CodeRabbit Minor).
|
|
2383
|
+
const turnResults: Array<{ unitType?: string; unitId?: string; status: string }> = [];
|
|
2384
|
+
|
|
2385
|
+
const deps = makeMockDeps({
|
|
2386
|
+
selectAndApplyModel: async () => {
|
|
2387
|
+
throw new ModelPolicyDispatchBlockedError(
|
|
2388
|
+
"research-slice",
|
|
2389
|
+
"M001/S01",
|
|
2390
|
+
[{ provider: "openai", modelId: "gpt-4o", reason: "tool policy denied (web_search) for openai-completions" }],
|
|
2391
|
+
);
|
|
2392
|
+
},
|
|
2393
|
+
pauseAuto: async () => { pauseAutoCalls++; },
|
|
2394
|
+
stopAuto: async () => { stopAutoCalls++; },
|
|
2395
|
+
emitJournalEvent: (entry: any) => { journalEvents.push(entry); },
|
|
2396
|
+
uokObserver: {
|
|
2397
|
+
onTurnStart: () => {},
|
|
2398
|
+
onPhaseResult: () => {},
|
|
2399
|
+
onTurnResult: (res: any) => { turnResults.push({ unitType: res.unitType, unitId: res.unitId, status: res.status }); },
|
|
2400
|
+
} as any,
|
|
2401
|
+
});
|
|
2402
|
+
|
|
2403
|
+
await autoLoop(ctx, pi, s, deps);
|
|
2404
|
+
|
|
2405
|
+
// The unit-end event with status: "blocked" must be emitted.
|
|
2406
|
+
const unitEnd = journalEvents.find(
|
|
2407
|
+
e => e.eventType === "unit-end" && e.data?.status === "blocked",
|
|
2408
|
+
);
|
|
2409
|
+
assert.ok(unitEnd, "should emit unit-end with status=blocked");
|
|
2410
|
+
assert.equal(unitEnd!.data.reason, "model-policy-dispatch-blocked");
|
|
2411
|
+
|
|
2412
|
+
// Loop must pause for manual attention, NOT retry until 3-strike hard stop.
|
|
2413
|
+
assert.equal(pauseAutoCalls, 1, "should pause once on policy block");
|
|
2414
|
+
assert.equal(stopAutoCalls, 0, "should NOT call stopAuto — pre-send block is not a retryable iteration error");
|
|
2415
|
+
|
|
2416
|
+
// The notification should surface the per-model deny reason from the typed error.
|
|
2417
|
+
const blockedNotice = notifications.find(
|
|
2418
|
+
n => n.message.includes("model-policy denied dispatch")
|
|
2419
|
+
&& n.message.includes("tool policy denied (web_search)"),
|
|
2420
|
+
);
|
|
2421
|
+
assert.ok(blockedNotice, "user-facing notification should name the policy block + deny reason");
|
|
2422
|
+
|
|
2423
|
+
// Blocked-unit identity must reach uokObserver.onTurnResult — the typed
|
|
2424
|
+
// error already carries it, the loop must thread it into observedUnitType/Id
|
|
2425
|
+
// before finishTurn is called (#4959 / CodeRabbit Minor).
|
|
2426
|
+
const pausedTurn = turnResults.find(r => r.status === "paused");
|
|
2427
|
+
assert.ok(pausedTurn, "uokObserver should observe a paused turn for the blocked unit");
|
|
2428
|
+
assert.equal(pausedTurn!.unitType, "research-slice", "onTurnResult must receive the blocked unitType from the typed error");
|
|
2429
|
+
assert.equal(pausedTurn!.unitId, "M001/S01", "onTurnResult must receive the blocked unitId from the typed error");
|
|
2430
|
+
});
|