gsd-pi 2.77.0 → 2.78.0-dev.aeeb2ca00
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -33
- package/dist/claude-cli-check.js +46 -10
- 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/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 +72 -16
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +552 -67
- 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 +124 -2
- package/dist/resources/extensions/gsd/auto/phases.js +57 -39
- package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
- package/dist/resources/extensions/gsd/auto/session.js +6 -2
- package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +201 -38
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +215 -64
- package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
- package/dist/resources/extensions/gsd/auto-recovery.js +210 -24
- package/dist/resources/extensions/gsd/auto-start.js +122 -30
- 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 +180 -34
- package/dist/resources/extensions/gsd/auto.js +107 -35
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
- 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 +7 -3
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
- 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/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 +1 -0
- package/dist/resources/extensions/gsd/gsd-db.js +6 -3
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow.js +39 -13
- package/dist/resources/extensions/gsd/journal.js +17 -2
- 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 +6 -0
- 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/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 +6 -2
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- 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/git-checkpoint.js +11 -0
- 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/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 +10 -4
- 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 +86 -7
- 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/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- 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/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- 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/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- 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/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- 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/server.d.ts +24 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +111 -87
- package/packages/mcp-server/dist/server.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 +7 -2
- 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 +25 -3
- 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/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +158 -105
- 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.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/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/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/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/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
- 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/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/types.d.ts +7 -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/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/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 +105 -13
- 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 -37
- 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/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/types.ts +8 -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/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/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 +119 -13
- 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 +75 -16
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +602 -73
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1028 -91
- 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 +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +142 -2
- package/src/resources/extensions/gsd/auto/phases.ts +62 -38
- package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
- package/src/resources/extensions/gsd/auto/session.ts +7 -2
- 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 +214 -37
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +226 -73
- package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
- package/src/resources/extensions/gsd/auto-recovery.ts +240 -25
- package/src/resources/extensions/gsd/auto-start.ts +146 -14
- 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 +190 -31
- package/src/resources/extensions/gsd/auto.ts +127 -41
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
- 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 +7 -3
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
- 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/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 +1 -0
- package/src/resources/extensions/gsd/gsd-db.ts +6 -3
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +57 -14
- package/src/resources/extensions/gsd/journal.ts +38 -3
- 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 +6 -0
- 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/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 +6 -2
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- 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/git-checkpoint.ts +15 -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 +135 -285
- 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-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +166 -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-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/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/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 +25 -0
- 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-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 +159 -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/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/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-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/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-recovery.test.ts +20 -0
- 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 +3 -2
- 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/journal-integration.test.ts +64 -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/memory-extractor.test.ts +5 -15
- 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 +273 -130
- 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/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/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 +75 -2
- 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 +6 -3
- 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/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/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/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-profile.test.ts +8 -1
- 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 +19 -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/worktree-db.test.ts +226 -266
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- 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 +7 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- 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 +13 -5
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +22 -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 +96 -9
- 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/dist/web/standalone/.next/server/chunks/7461.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- 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/{pV-mPo7rYGb5JBC09C8GG → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
|
@@ -34,6 +34,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
34
34
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
35
35
|
import { join } from "node:path";
|
|
36
36
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
37
|
+
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
37
38
|
import {
|
|
38
39
|
buildDiscussMilestonePrompt,
|
|
39
40
|
buildResearchMilestonePrompt,
|
|
@@ -58,6 +59,10 @@ import {
|
|
|
58
59
|
import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
|
|
59
60
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
60
61
|
import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
|
|
62
|
+
import { getMilestonePipelineVariant } from "./milestone-scope-classifier.js";
|
|
63
|
+
import { EXECUTION_ENTRY_PHASES, hasFinalizedMilestoneContext } from "./uok/plan-v2.js";
|
|
64
|
+
import { isAutoActive } from "./auto.js";
|
|
65
|
+
import { markDepthVerified } from "./bootstrap/write-gate.js";
|
|
61
66
|
|
|
62
67
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
63
68
|
|
|
@@ -88,6 +93,18 @@ export interface DispatchContext {
|
|
|
88
93
|
modelRegistry?: MinimalModelRegistry;
|
|
89
94
|
}
|
|
90
95
|
|
|
96
|
+
type ReassessmentChecker = typeof checkNeedsReassessment;
|
|
97
|
+
|
|
98
|
+
let reassessmentChecker: ReassessmentChecker = checkNeedsReassessment;
|
|
99
|
+
|
|
100
|
+
export function setReassessmentCheckerForTest(checker: ReassessmentChecker): () => void {
|
|
101
|
+
const previous = reassessmentChecker;
|
|
102
|
+
reassessmentChecker = checker;
|
|
103
|
+
return () => {
|
|
104
|
+
reassessmentChecker = previous;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
91
108
|
export interface DispatchRule {
|
|
92
109
|
/** Human-readable name for debugging and test identification */
|
|
93
110
|
name: string;
|
|
@@ -95,6 +112,38 @@ export interface DispatchRule {
|
|
|
95
112
|
match: (ctx: DispatchContext) => Promise<DispatchAction | null>;
|
|
96
113
|
}
|
|
97
114
|
|
|
115
|
+
async function readUatGateVerdict(
|
|
116
|
+
basePath: string,
|
|
117
|
+
mid: string,
|
|
118
|
+
sliceId: string,
|
|
119
|
+
): Promise<{ verdict: string; uatType: UatType | undefined } | null> {
|
|
120
|
+
const uatFile = resolveSliceFile(basePath, mid, sliceId, "UAT");
|
|
121
|
+
const assessmentFile = resolveSliceFile(basePath, mid, sliceId, "ASSESSMENT");
|
|
122
|
+
|
|
123
|
+
const uatContent = uatFile ? await loadFile(uatFile) : null;
|
|
124
|
+
const uatType = uatContent ? extractUatType(uatContent) : undefined;
|
|
125
|
+
|
|
126
|
+
const assessmentContent = assessmentFile ? await loadFile(assessmentFile) : null;
|
|
127
|
+
if (assessmentContent) {
|
|
128
|
+
const assessmentVerdict = extractVerdict(assessmentContent);
|
|
129
|
+
if (assessmentVerdict) {
|
|
130
|
+
return {
|
|
131
|
+
verdict: assessmentVerdict,
|
|
132
|
+
uatType: uatType ?? extractUatType(assessmentContent),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (uatContent) {
|
|
138
|
+
const legacyUatVerdict = extractVerdict(uatContent);
|
|
139
|
+
if (legacyUatVerdict) {
|
|
140
|
+
return { verdict: legacyUatVerdict, uatType };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
98
147
|
function missingSliceStop(mid: string, phase: string): DispatchAction {
|
|
99
148
|
return {
|
|
100
149
|
action: "stop",
|
|
@@ -242,6 +291,48 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
242
291
|
};
|
|
243
292
|
},
|
|
244
293
|
},
|
|
294
|
+
{
|
|
295
|
+
// #4671 — Recovery path for execution-entry phases with missing CONTEXT.md.
|
|
296
|
+
//
|
|
297
|
+
// Once `deriveStateFromDb` returns an execution-entry phase (executing /
|
|
298
|
+
// summarizing / validating-milestone / completing-milestone), the
|
|
299
|
+
// pre-planning guard at `pre-planning (no context) → discuss-milestone`
|
|
300
|
+
// no longer fires. The plan-v2 gate correctly detects the missing context
|
|
301
|
+
// but can only block — it cannot redispatch. Without this rule the
|
|
302
|
+
// milestone is stuck until `/gsd doctor heal` repairs it (and heal
|
|
303
|
+
// historically missed this check too).
|
|
304
|
+
//
|
|
305
|
+
// Fire BEFORE the execution-entry phase rules so we redispatch to
|
|
306
|
+
// `discuss-milestone` instead of hitting the plan-v2 gate.
|
|
307
|
+
name: "execution-entry phase (no context) → discuss-milestone",
|
|
308
|
+
match: async ({ state, mid, midTitle, basePath, structuredQuestionsAvailable }) => {
|
|
309
|
+
if (!EXECUTION_ENTRY_PHASES.has(state.phase)) return null;
|
|
310
|
+
// Align with the plan-v2 gate's lookup semantics: whitespace-only counts
|
|
311
|
+
// as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
|
|
312
|
+
if (hasFinalizedMilestoneContext(basePath, mid)) return null;
|
|
313
|
+
// H6 fix (#4973): In auto-mode there is no human to answer the
|
|
314
|
+
// depth-verification ask_user_questions, so the write-gate deadlocks.
|
|
315
|
+
// Pre-mark the milestone as depth-verified so gsd_summary_save({artifact_type:"CONTEXT"})
|
|
316
|
+
// is not blocked. Safe ordering: session_switch fires clearDiscussionFlowState()
|
|
317
|
+
// (register-hooks.ts:106) before before_agent_start, which fires before resolveDispatch
|
|
318
|
+
// reaches this match fn — so this call always happens after any session-switch reset.
|
|
319
|
+
// Interactive sessions (isAutoActive()===false) are unaffected.
|
|
320
|
+
if (isAutoActive()) {
|
|
321
|
+
markDepthVerified(mid, basePath);
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
action: "dispatch",
|
|
325
|
+
unitType: "discuss-milestone",
|
|
326
|
+
unitId: mid,
|
|
327
|
+
prompt: await buildDiscussMilestonePrompt(
|
|
328
|
+
mid,
|
|
329
|
+
midTitle,
|
|
330
|
+
basePath,
|
|
331
|
+
structuredQuestionsAvailable,
|
|
332
|
+
),
|
|
333
|
+
};
|
|
334
|
+
},
|
|
335
|
+
},
|
|
245
336
|
{
|
|
246
337
|
name: "summarizing → complete-slice",
|
|
247
338
|
match: async ({ state, mid, midTitle, basePath }) => {
|
|
@@ -302,27 +393,28 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
302
393
|
// Only applies when UAT dispatch is enabled
|
|
303
394
|
if (!prefs?.uat_dispatch) return null;
|
|
304
395
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
// DB-first: get completed slices from DB
|
|
308
|
-
let completedSliceIds: string[];
|
|
396
|
+
// DB-first: prefer closed slices from DB; fall back to ROADMAP on disk.
|
|
397
|
+
let closedSliceIds: string[];
|
|
309
398
|
if (isDbAvailable()) {
|
|
310
|
-
|
|
311
|
-
.filter(s => s.status
|
|
399
|
+
closedSliceIds = getMilestoneSlices(mid)
|
|
400
|
+
.filter(s => isClosedStatus(s.status))
|
|
312
401
|
.map(s => s.id);
|
|
313
402
|
} else {
|
|
314
|
-
|
|
403
|
+
// Filesystem fallback for degraded / unmigrated projects.
|
|
404
|
+
// `slice.done` in the parsed ROADMAP is the disk-level closed signal.
|
|
405
|
+
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
406
|
+
const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
407
|
+
if (!roadmapContent) return null;
|
|
408
|
+
const roadmap = parseRoadmap(roadmapContent);
|
|
409
|
+
closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
|
|
315
410
|
}
|
|
316
411
|
|
|
317
|
-
for (const sliceId of
|
|
318
|
-
const
|
|
319
|
-
if (!
|
|
320
|
-
const
|
|
321
|
-
if (!content) continue;
|
|
322
|
-
const verdict = extractVerdict(content);
|
|
323
|
-
const uatType = extractUatType(content);
|
|
412
|
+
for (const sliceId of closedSliceIds) {
|
|
413
|
+
const result = await readUatGateVerdict(basePath, mid, sliceId);
|
|
414
|
+
if (!result) continue;
|
|
415
|
+
const { verdict, uatType } = result;
|
|
324
416
|
|
|
325
|
-
if (
|
|
417
|
+
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
326
418
|
return {
|
|
327
419
|
action: "stop" as const,
|
|
328
420
|
reason: `UAT verdict for ${sliceId} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
|
|
@@ -337,11 +429,15 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
337
429
|
name: "reassess-roadmap (post-completion)",
|
|
338
430
|
match: async ({ state, mid, midTitle, basePath, prefs }) => {
|
|
339
431
|
if (prefs?.phases?.skip_reassess) return null;
|
|
340
|
-
// Default reassess_after_slice to
|
|
341
|
-
// is
|
|
342
|
-
|
|
432
|
+
// Default reassess_after_slice to false per ADR-003 §4 — most reassess
|
|
433
|
+
// units conclude "roadmap is fine" and burn a session for no change.
|
|
434
|
+
// The plan-slice prompt now carries a reassessment preamble so the
|
|
435
|
+
// next slice's planner does JIT roadmap verification at zero extra
|
|
436
|
+
// cost. Opt-in via explicit `reassess_after_slice: true` (e.g.
|
|
437
|
+
// burn-max profile) when you want the dedicated reassess session.
|
|
438
|
+
const reassessEnabled = prefs?.phases?.reassess_after_slice ?? false;
|
|
343
439
|
if (!reassessEnabled) return null;
|
|
344
|
-
const needsReassess = await
|
|
440
|
+
const needsReassess = await reassessmentChecker(basePath, mid, state);
|
|
345
441
|
if (!needsReassess) return null;
|
|
346
442
|
return {
|
|
347
443
|
action: "dispatch",
|
|
@@ -360,6 +456,12 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
360
456
|
name: "needs-discussion → discuss-milestone",
|
|
361
457
|
match: async ({ state, mid, midTitle, basePath, structuredQuestionsAvailable }) => {
|
|
362
458
|
if (state.phase !== "needs-discussion") return null;
|
|
459
|
+
// H6 fix (#4973): auto-mark depth-verified so the write-gate does not
|
|
460
|
+
// deadlock in non-interactive (auto-mode) runs. See ordering note at
|
|
461
|
+
// "execution-entry phase (no context) → discuss-milestone" above.
|
|
462
|
+
if (isAutoActive()) {
|
|
463
|
+
markDepthVerified(mid, basePath);
|
|
464
|
+
}
|
|
363
465
|
return {
|
|
364
466
|
action: "dispatch",
|
|
365
467
|
unitType: "discuss-milestone",
|
|
@@ -380,6 +482,12 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
380
482
|
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
381
483
|
const hasContext = !!(contextFile && (await loadFile(contextFile)));
|
|
382
484
|
if (hasContext) return null; // fall through to next rule
|
|
485
|
+
// H6 fix (#4973): auto-mark depth-verified so the write-gate does not
|
|
486
|
+
// deadlock in non-interactive (auto-mode) runs. See ordering note at
|
|
487
|
+
// "execution-entry phase (no context) → discuss-milestone" above.
|
|
488
|
+
if (isAutoActive()) {
|
|
489
|
+
markDepthVerified(mid, basePath);
|
|
490
|
+
}
|
|
383
491
|
return {
|
|
384
492
|
action: "dispatch",
|
|
385
493
|
unitType: "discuss-milestone",
|
|
@@ -421,6 +529,26 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
421
529
|
};
|
|
422
530
|
},
|
|
423
531
|
},
|
|
532
|
+
{
|
|
533
|
+
name: "planning (require_slice_discussion) → pause for discussion (#3454)",
|
|
534
|
+
match: async ({ state, mid, basePath, prefs }) => {
|
|
535
|
+
if (state.phase !== "planning") return null;
|
|
536
|
+
if (!prefs?.phases?.require_slice_discussion) return null;
|
|
537
|
+
if (!state.activeSlice) return null;
|
|
538
|
+
// Only pause if the slice has no context file yet (discussion not done).
|
|
539
|
+
// resolveSliceFile returns null when the file does not exist on disk,
|
|
540
|
+
// but cachedReaddir could return a stale hit — verify with existsSync
|
|
541
|
+
// so the guard is defence-in-depth and the contract is explicit at the
|
|
542
|
+
// call site.
|
|
543
|
+
const sliceContextFile = resolveSliceFile(basePath, mid, state.activeSlice.id, "CONTEXT");
|
|
544
|
+
if (sliceContextFile && existsSync(sliceContextFile)) return null; // discussion already done, proceed
|
|
545
|
+
return {
|
|
546
|
+
action: "stop" as const,
|
|
547
|
+
reason: `Slice ${state.activeSlice.id} requires discussion before planning (require_slice_discussion is enabled). Run /gsd discuss to discuss this slice, then /gsd auto to resume.`,
|
|
548
|
+
level: "info" as const,
|
|
549
|
+
};
|
|
550
|
+
},
|
|
551
|
+
},
|
|
424
552
|
{
|
|
425
553
|
// Keep this rule before the single-slice research rule so the multi-slice
|
|
426
554
|
// path wins whenever 2+ slices are ready.
|
|
@@ -428,6 +556,11 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
428
556
|
match: async ({ state, mid, midTitle, basePath, prefs }) => {
|
|
429
557
|
if (state.phase !== "planning") return null;
|
|
430
558
|
if (prefs?.phases?.skip_research || prefs?.phases?.skip_slice_research) return null;
|
|
559
|
+
// #4781 phase 2: trivial-scope milestones skip dedicated slice research.
|
|
560
|
+
// plan-slice absorbs the lightweight discovery a trivial deliverable
|
|
561
|
+
// needs. Null result (DB unavailable / unknown) falls through to today's
|
|
562
|
+
// behavior.
|
|
563
|
+
if (await getMilestonePipelineVariant(mid) === "trivial") return null;
|
|
431
564
|
|
|
432
565
|
// Load roadmap to find all slices
|
|
433
566
|
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
@@ -484,6 +617,8 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
484
617
|
// Phase skip: skip research when preference or profile says so
|
|
485
618
|
if (prefs?.phases?.skip_research || prefs?.phases?.skip_slice_research)
|
|
486
619
|
return null;
|
|
620
|
+
// #4781 phase 2: trivial-scope milestones skip dedicated slice research.
|
|
621
|
+
if (await getMilestonePipelineVariant(mid) === "trivial") return null;
|
|
487
622
|
if (!state.activeSlice) return missingSliceStop(mid, state.phase);
|
|
488
623
|
const sid = state.activeSlice!.id;
|
|
489
624
|
const sTitle = state.activeSlice!.title;
|
|
@@ -836,8 +971,13 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
836
971
|
};
|
|
837
972
|
}
|
|
838
973
|
|
|
839
|
-
//
|
|
840
|
-
|
|
974
|
+
// #4781 phase 2: trivial-scope milestones skip the dedicated validate
|
|
975
|
+
// unit — complete-milestone's own verification steps (3/4/5 in the
|
|
976
|
+
// closer prompt) are sufficient proof for contained deliverables.
|
|
977
|
+
const trivialVariant = await getMilestonePipelineVariant(mid) === "trivial";
|
|
978
|
+
|
|
979
|
+
// Skip preference OR trivial scope: write a minimal pass-through VALIDATION file.
|
|
980
|
+
if (prefs?.phases?.skip_milestone_validation || trivialVariant) {
|
|
841
981
|
const mDir = resolveMilestonePath(basePath, mid);
|
|
842
982
|
if (mDir) {
|
|
843
983
|
if (!existsSync(mDir)) mkdirSync(mDir, { recursive: true });
|
|
@@ -845,15 +985,18 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
845
985
|
mDir,
|
|
846
986
|
buildMilestoneFileName(mid, "VALIDATION"),
|
|
847
987
|
);
|
|
988
|
+
const skipSource = trivialVariant
|
|
989
|
+
? "trivial-scope pipeline variant (#4781)"
|
|
990
|
+
: "`skip_milestone_validation` preference";
|
|
848
991
|
const content = [
|
|
849
992
|
"---",
|
|
850
993
|
"verdict: pass",
|
|
851
994
|
"remediation_round: 0",
|
|
852
995
|
"---",
|
|
853
996
|
"",
|
|
854
|
-
"# Milestone Validation (skipped
|
|
997
|
+
"# Milestone Validation (skipped)",
|
|
855
998
|
"",
|
|
856
|
-
|
|
999
|
+
`Milestone validation was skipped via ${skipSource}.`,
|
|
857
1000
|
].join("\n");
|
|
858
1001
|
writeFileSync(validationPath, content, "utf-8");
|
|
859
1002
|
}
|
|
@@ -883,21 +1026,13 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
883
1026
|
}
|
|
884
1027
|
}
|
|
885
1028
|
|
|
886
|
-
// Reconciliation guard (#4324): when the SUMMARY file already exists
|
|
887
|
-
// on disk but the DB says the milestone is not complete, the DB is
|
|
888
|
-
// out of sync (e.g. journal reset, partial merge, crash recovery).
|
|
889
|
-
// Reconcile the DB status directly instead of re-dispatching the
|
|
890
|
-
// tool, which would overwrite the richer on-disk SUMMARY with a
|
|
891
|
-
// thinner regenerated version — causing silent data loss.
|
|
892
1029
|
const existingSummary = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
logWarning("dispatch", `Failed to reconcile milestone ${mid} status: ${err instanceof Error ? err.message : String(err)}`);
|
|
1030
|
+
let summaryOutcome: "success" | "failure" | "unknown" = "unknown";
|
|
1031
|
+
if (existingSummary) {
|
|
1032
|
+
const summaryContent = await loadFile(existingSummary);
|
|
1033
|
+
if (summaryContent) {
|
|
1034
|
+
summaryOutcome = classifyMilestoneSummaryContent(summaryContent);
|
|
899
1035
|
}
|
|
900
|
-
return { action: "skip" };
|
|
901
1036
|
}
|
|
902
1037
|
|
|
903
1038
|
// Safety guard (#2675): block completion when VALIDATION verdict is
|
|
@@ -932,7 +1067,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
932
1067
|
// Safety guard (#1703): verify the milestone produced implementation
|
|
933
1068
|
// artifacts (non-.gsd/ files). A milestone with only plan files and
|
|
934
1069
|
// zero implementation code should not be marked complete.
|
|
935
|
-
const artifactCheck = hasImplementationArtifacts(basePath);
|
|
1070
|
+
const artifactCheck = hasImplementationArtifacts(basePath, mid);
|
|
936
1071
|
if (artifactCheck === "absent") {
|
|
937
1072
|
return {
|
|
938
1073
|
action: "stop",
|
|
@@ -982,6 +1117,48 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
982
1117
|
logWarning("dispatch", `verification class check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
983
1118
|
}
|
|
984
1119
|
|
|
1120
|
+
// Disk/DB mismatch handling (#4658): SUMMARY presence alone is not enough.
|
|
1121
|
+
// Apply post-gate policy:
|
|
1122
|
+
// - success summary: reconcile DB and skip re-dispatch
|
|
1123
|
+
// - failure summary: pause/fail-closed
|
|
1124
|
+
// - unknown summary: pause/fail-closed
|
|
1125
|
+
if (existingSummary) {
|
|
1126
|
+
const milestone = isDbAvailable() ? getMilestone(mid) : null;
|
|
1127
|
+
const status = milestone?.status ?? (isDbAvailable() ? "missing" : "unavailable");
|
|
1128
|
+
|
|
1129
|
+
if (summaryOutcome === "success") {
|
|
1130
|
+
if (!isDbAvailable()) {
|
|
1131
|
+
logWarning("dispatch", `Milestone ${mid} SUMMARY indicates completion while DB is unavailable — skipping duplicate complete-milestone dispatch`);
|
|
1132
|
+
return { action: "skip" };
|
|
1133
|
+
}
|
|
1134
|
+
try {
|
|
1135
|
+
updateMilestoneStatus(mid, "complete", new Date().toISOString());
|
|
1136
|
+
logWarning("dispatch", `Milestone ${mid} SUMMARY indicates completion while DB status was "${status}" — reconciled DB to complete (#4658)`);
|
|
1137
|
+
return { action: "skip" };
|
|
1138
|
+
} catch (err) {
|
|
1139
|
+
return {
|
|
1140
|
+
action: "stop",
|
|
1141
|
+
level: "warning",
|
|
1142
|
+
reason: `Milestone ${mid} SUMMARY indicates completion but DB reconciliation failed (${err instanceof Error ? err.message : String(err)}). Auto-mode paused for manual review.`,
|
|
1143
|
+
};
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
if (summaryOutcome === "failure") {
|
|
1148
|
+
return {
|
|
1149
|
+
action: "stop",
|
|
1150
|
+
level: "warning",
|
|
1151
|
+
reason: `Milestone ${mid} has a failure-path SUMMARY while DB status is "${status}". Auto-mode will not promote completion from failure artifacts. Re-run complete-milestone only after blockers are resolved and verification passes.`,
|
|
1152
|
+
};
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
return {
|
|
1156
|
+
action: "stop",
|
|
1157
|
+
level: "warning",
|
|
1158
|
+
reason: `Milestone ${mid} has an ambiguous SUMMARY while DB status is "${status}". Auto-mode paused instead of promoting completion from file presence alone.`,
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
1161
|
+
|
|
985
1162
|
return {
|
|
986
1163
|
action: "dispatch",
|
|
987
1164
|
unitType: "complete-milestone",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
export { autoLoop, runUokKernelLoop, runLegacyAutoLoop } from "./auto/loop.js";
|
|
11
11
|
export { isInfrastructureError, INFRA_ERROR_CODES } from "./auto/infra-errors.js";
|
|
12
|
-
export { resolveAgentEnd, resolveAgentEndCancelled, isSessionSwitchInFlight, _resetPendingResolve, _setActiveSession } from "./auto/resolve.js";
|
|
12
|
+
export { resolveAgentEnd, resolveAgentEndCancelled, isSessionSwitchInFlight, _hasPendingResolveForTest, _resetPendingResolve, _setActiveSession } from "./auto/resolve.js";
|
|
13
13
|
export { detectStuck } from "./auto/detect-stuck.js";
|
|
14
14
|
export { runUnit } from "./auto/run-unit.js";
|
|
15
15
|
export type { LoopDeps } from "./auto/loop-deps.js";
|
|
@@ -19,6 +19,38 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
19
19
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
20
20
|
import { applyModelPolicyFilter } from "./uok/model-policy.js";
|
|
21
21
|
import { isModelBlocked } from "./blocked-models.js";
|
|
22
|
+
import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Thrown when the model-policy gate rejects every candidate model for a unit
|
|
26
|
+
* dispatch (#4959 / #4681 / #4850). The auto-loop catches this specifically
|
|
27
|
+
* to classify the unit as `blocked` rather than counting it as a retryable
|
|
28
|
+
* iteration error — pre-send policy denial is a configuration problem, not a
|
|
29
|
+
* transient runtime failure, so retrying just burns the consecutive-error
|
|
30
|
+
* budget toward a hard stop.
|
|
31
|
+
*/
|
|
32
|
+
export class ModelPolicyDispatchBlockedError extends Error {
|
|
33
|
+
readonly unitType: string;
|
|
34
|
+
readonly unitId: string;
|
|
35
|
+
readonly reasons: ReadonlyArray<{ provider: string; modelId: string; reason: string }>;
|
|
36
|
+
constructor(
|
|
37
|
+
unitType: string,
|
|
38
|
+
unitId: string,
|
|
39
|
+
reasons: ReadonlyArray<{ provider: string; modelId: string; reason: string }>,
|
|
40
|
+
) {
|
|
41
|
+
const summary = reasons.length === 0
|
|
42
|
+
? "no candidate models"
|
|
43
|
+
: reasons
|
|
44
|
+
.slice(0, 4)
|
|
45
|
+
.map((r) => `${r.provider}/${r.modelId} (${r.reason})`)
|
|
46
|
+
.join("; ");
|
|
47
|
+
super(`Model policy denied dispatch for ${unitType}/${unitId} before prompt send. Rejected: ${summary}`);
|
|
48
|
+
this.name = "ModelPolicyDispatchBlockedError";
|
|
49
|
+
this.unitType = unitType;
|
|
50
|
+
this.unitId = unitId;
|
|
51
|
+
this.reasons = reasons;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
22
54
|
|
|
23
55
|
export interface ModelSelectionResult {
|
|
24
56
|
/** Routing metadata for metrics recording */
|
|
@@ -33,6 +65,51 @@ export interface PreferredModelConfig {
|
|
|
33
65
|
source: "explicit" | "synthesized";
|
|
34
66
|
}
|
|
35
67
|
|
|
68
|
+
// Baseline active-tool set per-`pi` instance, captured the first time
|
|
69
|
+
// `selectAndApplyModel` runs against that instance during an auto session
|
|
70
|
+
// and re-applied before each subsequent dispatch. WeakMap so that test
|
|
71
|
+
// fakes / disposed sessions are garbage-collected normally. See
|
|
72
|
+
// #4959 / #4681 cross-unit poisoning notes at the call site below.
|
|
73
|
+
//
|
|
74
|
+
// LIFECYCLE: the baseline is tied to a single auto session, NOT to the
|
|
75
|
+
// lifetime of the `pi` instance (which can outlive many auto runs and have
|
|
76
|
+
// the user mutate tools between them). `clearToolBaseline` MUST be called
|
|
77
|
+
// at auto start AND auto stop so that a second `/gsd auto` run on the same
|
|
78
|
+
// `pi` does not silently restore a stale snapshot from the prior run and
|
|
79
|
+
// undo any tool changes the user made between sessions.
|
|
80
|
+
const TOOL_BASELINE = new WeakMap<object, string[]>();
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Drop the captured tool baseline for `pi` so the next `selectAndApplyModel`
|
|
84
|
+
* call re-captures from the live active set. Wired into `startAuto` and
|
|
85
|
+
* `stopAuto` in `auto.ts` to bound the baseline to a single auto session.
|
|
86
|
+
*
|
|
87
|
+
* Safe to call when no baseline is recorded (no-op).
|
|
88
|
+
*/
|
|
89
|
+
export function clearToolBaseline(pi: ExtensionAPI | object): void {
|
|
90
|
+
TOOL_BASELINE.delete(pi as unknown as object);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function restoreToolBaseline(pi: ExtensionAPI): void {
|
|
94
|
+
const key = pi as unknown as object;
|
|
95
|
+
const baseline = TOOL_BASELINE.get(key);
|
|
96
|
+
if (baseline === undefined) {
|
|
97
|
+
// First call: capture the canonical pre-dispatch tool set. At auto-mode
|
|
98
|
+
// start the active set has not yet been narrowed for any provider.
|
|
99
|
+
// Guarded against test fakes that omit getActiveTools — record an empty
|
|
100
|
+
// baseline so subsequent calls don't keep re-probing.
|
|
101
|
+
const initial = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
|
|
102
|
+
TOOL_BASELINE.set(key, [...initial]);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Restore baseline before the next unit reads getActiveTools / applies
|
|
106
|
+
// post-selection adjustToolSet. Older fakes that omit setActiveTools are
|
|
107
|
+
// tolerated — the test asserts call order on real fakes.
|
|
108
|
+
if (typeof pi.setActiveTools === "function") {
|
|
109
|
+
pi.setActiveTools([...baseline]);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
36
113
|
function reapplyThinkingLevel(
|
|
37
114
|
pi: ExtensionAPI,
|
|
38
115
|
level: ReturnType<ExtensionAPI["getThinkingLevel"]> | null | undefined,
|
|
@@ -129,6 +206,29 @@ export async function selectAndApplyModel(
|
|
|
129
206
|
let routing: { tier: string; modelDowngraded: boolean } | null = null;
|
|
130
207
|
let appliedModel: Model<Api> | null = null;
|
|
131
208
|
|
|
209
|
+
// ── Restore active-tool baseline before policy evaluation (#4959, #4681, #4850) ──
|
|
210
|
+
// Per-unit narrowing at the bottom of this function (line ~417) calls
|
|
211
|
+
// `pi.setActiveTools(finalToolNames)` and monotonically narrows the active
|
|
212
|
+
// set across units. Without restoration, a previously-dispatched unit on a
|
|
213
|
+
// narrow-API provider (e.g. openai-completions) leaves the active set
|
|
214
|
+
// missing tools that the next unit's selected model fully supports, but
|
|
215
|
+
// `pi.getActiveTools()` snapshot-as-hard-gate (the old behaviour) blocked
|
|
216
|
+
// dispatch with "tool policy denied" anyway.
|
|
217
|
+
//
|
|
218
|
+
// The baseline is captured once per `pi` instance via a WeakMap and
|
|
219
|
+
// re-applied here so each unit starts from a clean slate. Soft adaptation
|
|
220
|
+
// (adjustToolSet at the bottom of this function) still trims for the
|
|
221
|
+
// selected model.
|
|
222
|
+
//
|
|
223
|
+
// Auto-mode only (#4965): `guided-flow.ts:dispatchWorkflow` also calls
|
|
224
|
+
// `selectAndApplyModel` with `isAutoMode=false`. Guided-flow has its own
|
|
225
|
+
// narrow/restore via discuss-tool-scoping (guided-flow.ts:587-622) and no
|
|
226
|
+
// baseline-clear hook of its own, so an unconditional restore here would
|
|
227
|
+
// resurrect an auto-era baseline on guided-flow dispatches — silently
|
|
228
|
+
// overwriting any tool changes made interactively between auto sessions.
|
|
229
|
+
// The baseline is structurally an auto-mode concept; gate it accordingly.
|
|
230
|
+
if (isAutoMode) restoreToolBaseline(pi);
|
|
231
|
+
|
|
132
232
|
if (modelConfig) {
|
|
133
233
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
134
234
|
const modelPolicyTraceId = `model:${ctx.sessionManager.getSessionId()}:${Date.now()}`;
|
|
@@ -160,7 +260,16 @@ export async function selectAndApplyModel(
|
|
|
160
260
|
? extractTaskMetadata(unitId, basePath)
|
|
161
261
|
: undefined;
|
|
162
262
|
|
|
263
|
+
let policyDenyReasons: Array<{ provider: string; modelId: string; reason: string }> = [];
|
|
163
264
|
if (uokFlags.modelPolicy) {
|
|
265
|
+
// Use the workflow-spec required-tool subset for the unit type rather
|
|
266
|
+
// than the live `pi.getActiveTools()` snapshot (#4959). The active set
|
|
267
|
+
// is poisoned by per-unit narrowing for narrow-API providers — using it
|
|
268
|
+
// as a hard gate promotes soft adaptation (adjustToolSet at line ~417)
|
|
269
|
+
// into a layering violation that throws before dispatch. The smaller
|
|
270
|
+
// workflow-required subset reflects what the unit actually needs; soft
|
|
271
|
+
// adaptation post-selection still trims provider-incompatible tools.
|
|
272
|
+
const requiredTools = getRequiredWorkflowToolsForAutoUnit(unitType);
|
|
164
273
|
const policy = applyModelPolicyFilter(
|
|
165
274
|
availableModels,
|
|
166
275
|
{
|
|
@@ -171,15 +280,18 @@ export async function selectAndApplyModel(
|
|
|
171
280
|
taskMetadata: taskMetadataForPolicy,
|
|
172
281
|
currentProvider: ctx.model?.provider,
|
|
173
282
|
allowCrossProvider: routingConfig.cross_provider !== false,
|
|
174
|
-
requiredTools
|
|
283
|
+
requiredTools,
|
|
175
284
|
},
|
|
176
285
|
);
|
|
177
286
|
routingEligibleModels = policy.eligible;
|
|
178
287
|
policyAllowedModelKeys = new Set(
|
|
179
288
|
policy.eligible.map((m) => `${m.provider.toLowerCase()}/${m.id.toLowerCase()}`),
|
|
180
289
|
);
|
|
290
|
+
policyDenyReasons = policy.decisions
|
|
291
|
+
.filter((d) => !d.allowed)
|
|
292
|
+
.map((d) => ({ provider: d.provider, modelId: d.modelId, reason: d.reason }));
|
|
181
293
|
if (routingEligibleModels.length === 0) {
|
|
182
|
-
throw new
|
|
294
|
+
throw new ModelPolicyDispatchBlockedError(unitType, unitId, policyDenyReasons);
|
|
183
295
|
}
|
|
184
296
|
}
|
|
185
297
|
|
|
@@ -235,7 +347,11 @@ export async function selectAndApplyModel(
|
|
|
235
347
|
);
|
|
236
348
|
const availableModelIds = routingEligibleModels.map(m => `${m.provider}/${m.id}`);
|
|
237
349
|
|
|
238
|
-
// Escalate tier on retry when escalate_on_failure is enabled (default: true)
|
|
350
|
+
// Escalate tier on retry when escalate_on_failure is enabled (default: true).
|
|
351
|
+
// #4973: Deterministic policy errors are short-circuited at the postUnit
|
|
352
|
+
// level (auto-post-unit.ts writes a placeholder and returns "continue"),
|
|
353
|
+
// so this code path only runs for legitimate model-quality retries where
|
|
354
|
+
// tier escalation is the right response.
|
|
239
355
|
if (
|
|
240
356
|
retryContext?.isRetry &&
|
|
241
357
|
retryContext.previousTier &&
|
|
@@ -249,6 +365,17 @@ export async function selectAndApplyModel(
|
|
|
249
365
|
`Tier escalation: ${retryContext.previousTier} → ${escalated} (retry after failure)`,
|
|
250
366
|
"info",
|
|
251
367
|
);
|
|
368
|
+
} else {
|
|
369
|
+
// #4973: Already at max tier — keep previousTier rather than letting
|
|
370
|
+
// fresh classification silently downgrade the model back to a lower tier.
|
|
371
|
+
// Without this, a light-start unit on retry 3 would revert to the light
|
|
372
|
+
// model after escalating to heavy on retries 1 and 2.
|
|
373
|
+
const tierOrder: Record<string, number> = { light: 0, standard: 1, heavy: 2 };
|
|
374
|
+
const prevOrder = tierOrder[retryContext.previousTier] ?? 0;
|
|
375
|
+
const freshOrder = tierOrder[classification.tier] ?? 0;
|
|
376
|
+
if (prevOrder > freshOrder) {
|
|
377
|
+
classification = { ...classification, tier: retryContext.previousTier as ComplexityTier, reason: "retained escalated tier from retry" };
|
|
378
|
+
}
|
|
252
379
|
}
|
|
253
380
|
}
|
|
254
381
|
|
|
@@ -443,7 +570,7 @@ export async function selectAndApplyModel(
|
|
|
443
570
|
}
|
|
444
571
|
|
|
445
572
|
if (uokFlags.modelPolicy && policyAllowedModelKeys && !attemptedPolicyEligible) {
|
|
446
|
-
throw new
|
|
573
|
+
throw new ModelPolicyDispatchBlockedError(unitType, unitId, policyDenyReasons);
|
|
447
574
|
}
|
|
448
575
|
} else if (autoModeStartModel) {
|
|
449
576
|
// No model preference for this unit type — re-apply the model captured
|