gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0
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 +35 -59
- package/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
- package/dist/resources/extensions/gsd/auto/phases.js +282 -132
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
- package/dist/resources/extensions/gsd/auto/session.js +9 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +112 -78
- package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
- package/dist/resources/extensions/gsd/auto-start.js +252 -14
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
- package/dist/resources/extensions/gsd/auto.js +264 -86
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +73 -5
- package/dist/resources/extensions/gsd/gsd-db.js +46 -13
- package/dist/resources/extensions/gsd/guided-flow.js +119 -42
- package/dist/resources/extensions/gsd/health-widget.js +3 -0
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
- package/dist/resources/extensions/gsd/tool-contract.js +50 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- 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 +14 -14
- 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 +2 -2
- 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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- 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 +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 +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.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/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +9 -2
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +43 -11
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +31 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +52 -11
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +26 -10
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/types.ts +3 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
- 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-tool-refresh.test.js +30 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -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 +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
- 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/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
- 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 +155 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -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 +25 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +18 -8
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +7 -0
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -11
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
- package/src/resources/extensions/gsd/auto/phases.ts +393 -200
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
- package/src/resources/extensions/gsd/auto/session.ts +9 -1
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +124 -80
- package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
- package/src/resources/extensions/gsd/auto-start.ts +319 -19
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
- package/src/resources/extensions/gsd/auto.ts +324 -88
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +87 -10
- package/src/resources/extensions/gsd/gsd-db.ts +50 -13
- package/src/resources/extensions/gsd/guided-flow.ts +148 -49
- package/src/resources/extensions/gsd/health-widget.ts +3 -0
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +543 -40
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_ssgManifest.js +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
4
4
|
|
|
5
|
+
import type { AgentEndEvent, ErrorContext } from "../auto/types.js";
|
|
5
6
|
import { logWarning } from "../workflow-logger.js";
|
|
6
7
|
import {
|
|
7
8
|
checkDeepProjectSetupAfterTurn,
|
|
@@ -14,7 +15,13 @@ import { clearPathCache } from "../paths.js";
|
|
|
14
15
|
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
|
|
15
16
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
16
17
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
17
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
isSessionSwitchAbortGraceActive,
|
|
20
|
+
isSessionSwitchInFlight,
|
|
21
|
+
resolveAgentEnd,
|
|
22
|
+
resolveAgentEndCancelled,
|
|
23
|
+
} from "../auto/resolve.js";
|
|
24
|
+
import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js";
|
|
18
25
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
19
26
|
import { resolveProjectRoot } from "../worktree.js";
|
|
20
27
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
@@ -30,6 +37,10 @@ import { blockModel, isModelBlocked } from "../blocked-models.js";
|
|
|
30
37
|
|
|
31
38
|
const retryState = createRetryState();
|
|
32
39
|
const MAX_NETWORK_RETRIES = 2;
|
|
40
|
+
|
|
41
|
+
function isObjectRecord(value: unknown): value is Record<string, unknown> {
|
|
42
|
+
return !!value && typeof value === "object";
|
|
43
|
+
}
|
|
33
44
|
/**
|
|
34
45
|
* Cap on auto-resume attempts for sustained transient-provider errors.
|
|
35
46
|
*
|
|
@@ -76,6 +87,111 @@ export function isUserInitiatedAbortMessage(message: string | undefined | null):
|
|
|
76
87
|
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
77
88
|
}
|
|
78
89
|
|
|
90
|
+
function isBareClaudeCodeSessionSwitchAbortMarker(message: string | undefined | null): boolean {
|
|
91
|
+
if (!message) return false;
|
|
92
|
+
const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
|
|
93
|
+
return normalized === "claude code process aborted by user"
|
|
94
|
+
|| normalized === "request aborted by user"
|
|
95
|
+
|| normalized === "process aborted by user"
|
|
96
|
+
|| normalized === "claude code stream aborted by caller";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function readAssistantTextContent(content: unknown): string {
|
|
100
|
+
if (!Array.isArray(content)) return "";
|
|
101
|
+
return content
|
|
102
|
+
.map((block) => {
|
|
103
|
+
if (!block || typeof block !== "object") return "";
|
|
104
|
+
const text = (block as { text?: unknown }).text;
|
|
105
|
+
return typeof text === "string" ? text : "";
|
|
106
|
+
})
|
|
107
|
+
.filter(Boolean)
|
|
108
|
+
.join("\n");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function isClaudeCodeSessionSwitchAbortMessage(lastMsg: unknown): boolean {
|
|
112
|
+
if (!lastMsg || typeof lastMsg !== "object") return false;
|
|
113
|
+
const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
|
|
114
|
+
const carriers = [
|
|
115
|
+
m.errorMessage ? String(m.errorMessage) : "",
|
|
116
|
+
readAssistantTextContent(m.content),
|
|
117
|
+
].filter((value) => value.trim().length > 0);
|
|
118
|
+
|
|
119
|
+
if ((m.stopReason === "error" || m.stopReason === "aborted") && carriers.length > 0) {
|
|
120
|
+
return carriers.every(isBareClaudeCodeSessionSwitchAbortMarker);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function isBareClaudeCodeStreamAbortPlaceholder(lastMsg: unknown): boolean {
|
|
127
|
+
if (!lastMsg || typeof lastMsg !== "object") return false;
|
|
128
|
+
const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
|
|
129
|
+
if (m.stopReason !== "aborted" || m.errorMessage) return false;
|
|
130
|
+
const text = readAssistantTextContent(m.content).trim().replace(/\s+/g, " ").toLowerCase();
|
|
131
|
+
return text === "claude code stream aborted by caller";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolve an agent_end event observed while a session switch is in flight.
|
|
136
|
+
*
|
|
137
|
+
* #5538-followup: When `newSession()` aborts an in-flight stream as part of a
|
|
138
|
+
* session transition (run-unit.ts:63 → _settleCurrentTurnForSessionTransition
|
|
139
|
+
* → agent.abort()), the SDK emits "Claude Code process aborted by user" or
|
|
140
|
+
* "Request aborted by user" against the previous unit's turn. The previous
|
|
141
|
+
* code path treated that as a user cancellation and propagated it to the next
|
|
142
|
+
* unit via the pending-switch-cancellation queue, killing auto-mode with
|
|
143
|
+
* "Auto-mode stopped — Unit aborted: Claude Code process aborted by user"
|
|
144
|
+
* even though no user input occurred.
|
|
145
|
+
*
|
|
146
|
+
* Claude Code abort markers are intentionally ignored when the abort fires
|
|
147
|
+
* while the session-switch is in flight: the abort is the expected side-effect
|
|
148
|
+
* of the transition, not a user signal. Other branches (genuine `stopReason
|
|
149
|
+
* === "aborted"` with diagnostic content/errorMessage) preserve the prior
|
|
150
|
+
* behavior.
|
|
151
|
+
*/
|
|
152
|
+
export function _handleSessionSwitchAgentEnd(
|
|
153
|
+
lastMsg: unknown,
|
|
154
|
+
resolveCancelled: (ctx: ErrorContext) => boolean,
|
|
155
|
+
): void {
|
|
156
|
+
if (!lastMsg || typeof lastMsg !== "object") return;
|
|
157
|
+
const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
|
|
158
|
+
|
|
159
|
+
if (isClaudeCodeSessionSwitchAbortMessage(m)) {
|
|
160
|
+
// Internal abort from in-flight session transition — drop on the floor.
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (m.stopReason === "error") {
|
|
165
|
+
const rawErrorMsg = m.errorMessage ? String(m.errorMessage) : "";
|
|
166
|
+
if (isBareClaudeCodeSessionSwitchAbortMarker(rawErrorMsg)) {
|
|
167
|
+
// Internal abort from in-flight session transition — drop on the floor.
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (m.stopReason === "aborted") {
|
|
174
|
+
const content = m.content;
|
|
175
|
+
const hasEmptyContent = Array.isArray(content) && content.length === 0;
|
|
176
|
+
const hasErrorMessage = !!m.errorMessage;
|
|
177
|
+
if (!hasEmptyContent || hasErrorMessage) {
|
|
178
|
+
resolveCancelled(_buildAbortedPauseContext(m as { errorMessage?: unknown }));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function resolveAgentEndErrorDisplay(
|
|
184
|
+
rawErrorMsg: string,
|
|
185
|
+
content: unknown,
|
|
186
|
+
): string {
|
|
187
|
+
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
188
|
+
if (isUseless && Array.isArray(content)) {
|
|
189
|
+
const textBlock = content.find((b: any) => b.type === "text" && b.text);
|
|
190
|
+
if (textBlock) return (textBlock as any).text.slice(0, 300);
|
|
191
|
+
}
|
|
192
|
+
return rawErrorMsg;
|
|
193
|
+
}
|
|
194
|
+
|
|
79
195
|
async function pauseTransientWithBackoff(
|
|
80
196
|
cls: ErrorClass,
|
|
81
197
|
pi: ExtensionAPI,
|
|
@@ -112,7 +228,7 @@ async function pauseTransientWithBackoff(
|
|
|
112
228
|
|
|
113
229
|
export async function handleAgentEnd(
|
|
114
230
|
pi: ExtensionAPI,
|
|
115
|
-
event:
|
|
231
|
+
event: AgentEndEvent,
|
|
116
232
|
ctx: ExtensionContext,
|
|
117
233
|
): Promise<void> {
|
|
118
234
|
// #4648 — Invalidate the directory-listing cache before any artifact-existence
|
|
@@ -153,10 +269,32 @@ export async function handleAgentEnd(
|
|
|
153
269
|
if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
|
|
154
270
|
|
|
155
271
|
if (!isAutoActive()) return;
|
|
156
|
-
|
|
272
|
+
|
|
273
|
+
if (shouldIgnoreAgentEndForActiveUnit(event)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
157
276
|
|
|
158
277
|
const lastMsg = event.messages[event.messages.length - 1];
|
|
159
|
-
if (
|
|
278
|
+
if (isSessionSwitchInFlight()) {
|
|
279
|
+
_handleSessionSwitchAgentEnd(lastMsg, resolveAgentEndCancelled);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (isSessionSwitchAbortGraceActive() && isClaudeCodeSessionSwitchAbortMessage(lastMsg)) {
|
|
284
|
+
// Claude Code can report the abort from `newSession()` a few hundred ms
|
|
285
|
+
// after the guard drops. That event belongs to the old turn; do not let it
|
|
286
|
+
// cancel the freshly-dispatched unit.
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (isBareClaudeCodeStreamAbortPlaceholder(lastMsg)) {
|
|
291
|
+
// The Claude Code adapter can emit this placeholder after a prior turn has
|
|
292
|
+
// already completed and the next unit is active. It has no user/provider
|
|
293
|
+
// diagnostic value and must not cancel the newly-dispatched unit.
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (isObjectRecord(lastMsg) && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
|
|
160
298
|
// Empty content with aborted stopReason is a non-fatal agent stop (the LLM
|
|
161
299
|
// chose to end without producing output). Only pause on genuine fatal aborts
|
|
162
300
|
// that carry error context — e.g. errorMessage field or non-empty content
|
|
@@ -182,7 +320,7 @@ export async function handleAgentEnd(
|
|
|
182
320
|
await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg as { errorMessage?: unknown }));
|
|
183
321
|
return;
|
|
184
322
|
}
|
|
185
|
-
if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
|
|
323
|
+
if (isObjectRecord(lastMsg) && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
|
|
186
324
|
// #3588: errorMessage can be useless (e.g. "success") while the real error
|
|
187
325
|
// is in the assistant message text content. Fall back to content when
|
|
188
326
|
// errorMessage looks uninformative.
|
|
@@ -195,15 +333,13 @@ export async function handleAgentEnd(
|
|
|
195
333
|
});
|
|
196
334
|
return;
|
|
197
335
|
}
|
|
198
|
-
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
199
336
|
// #3588: When errorMessage is uninformative, extract the real error from
|
|
200
337
|
// the assistant message text content for display purposes only.
|
|
201
338
|
// Classification still uses rawErrorMsg to avoid false positives from prose.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
339
|
+
const displayMsg = resolveAgentEndErrorDisplay(
|
|
340
|
+
rawErrorMsg,
|
|
341
|
+
"content" in lastMsg ? lastMsg.content : undefined,
|
|
342
|
+
);
|
|
207
343
|
const errorDetail = displayMsg ? `: ${displayMsg}` : "";
|
|
208
344
|
const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
|
|
209
345
|
|
|
@@ -5,7 +5,7 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
|
5
5
|
import { Text } from "@gsd/pi-tui";
|
|
6
6
|
|
|
7
7
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
8
|
-
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
8
|
+
import { ensureDbOpen, resolveCtxCwd } from "./dynamic-tools.js";
|
|
9
9
|
import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
|
|
10
10
|
import { StringEnum } from "@gsd/pi-ai";
|
|
11
11
|
import { logError } from "../workflow-logger.js";
|
|
@@ -16,6 +16,7 @@ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow
|
|
|
16
16
|
return import("../tools/workflow-tool-executors.js");
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
|
|
19
20
|
/**
|
|
20
21
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
21
22
|
* The alias description and promptGuidelines direct the LLM to prefer the canonical name.
|
|
@@ -38,8 +39,8 @@ function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canoni
|
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
function requirementRootWriteGuard(operation: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
|
|
42
|
-
const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(
|
|
42
|
+
function requirementRootWriteGuard(operation: string, basePath: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
|
|
43
|
+
const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
|
|
43
44
|
if (!guard.block) return null;
|
|
44
45
|
return {
|
|
45
46
|
content: [{ type: "text", text: `Error ${operation} requirement: ${guard.reason ?? "requirements write blocked"}` }],
|
|
@@ -65,7 +66,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
65
66
|
// ─── gsd_decision_save (formerly gsd_save_decision) ─────────────────────
|
|
66
67
|
|
|
67
68
|
const decisionSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
68
|
-
const
|
|
69
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
70
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
69
71
|
if (!dbAvailable) {
|
|
70
72
|
return {
|
|
71
73
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save decision." }],
|
|
@@ -84,7 +86,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
84
86
|
when_context: params.when_context,
|
|
85
87
|
made_by: params.made_by,
|
|
86
88
|
},
|
|
87
|
-
|
|
89
|
+
basePath,
|
|
88
90
|
);
|
|
89
91
|
return {
|
|
90
92
|
content: [{ type: "text" as const, text: `Saved decision ${id}` }],
|
|
@@ -152,9 +154,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
152
154
|
// ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
|
|
153
155
|
|
|
154
156
|
const requirementUpdateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
155
|
-
const
|
|
157
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
158
|
+
const gateBlock = requirementRootWriteGuard("update_requirement", basePath);
|
|
156
159
|
if (gateBlock) return gateBlock;
|
|
157
|
-
const dbAvailable = await ensureDbOpen();
|
|
160
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
158
161
|
if (!dbAvailable) {
|
|
159
162
|
return {
|
|
160
163
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot update requirement." }],
|
|
@@ -170,7 +173,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
170
173
|
if (params.description !== undefined) updates.description = params.description;
|
|
171
174
|
if (params.primary_owner !== undefined) updates.primary_owner = params.primary_owner;
|
|
172
175
|
if (params.supporting_slices !== undefined) updates.supporting_slices = params.supporting_slices;
|
|
173
|
-
await updateRequirementInDb(params.id, updates,
|
|
176
|
+
await updateRequirementInDb(params.id, updates, basePath);
|
|
174
177
|
return {
|
|
175
178
|
content: [{ type: "text" as const, text: `Updated requirement ${params.id}` }],
|
|
176
179
|
details: { operation: "update_requirement", id: params.id } as any,
|
|
@@ -232,9 +235,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
232
235
|
// ─── gsd_requirement_save ─────────────────────────────────────────────
|
|
233
236
|
|
|
234
237
|
const requirementSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
235
|
-
const
|
|
238
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
239
|
+
const gateBlock = requirementRootWriteGuard("save_requirement", basePath);
|
|
236
240
|
if (gateBlock) return gateBlock;
|
|
237
|
-
const dbAvailable = await ensureDbOpen();
|
|
241
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
238
242
|
if (!dbAvailable) {
|
|
239
243
|
return {
|
|
240
244
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save requirement." }],
|
|
@@ -255,7 +259,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
255
259
|
validation: params.validation,
|
|
256
260
|
notes: params.notes,
|
|
257
261
|
},
|
|
258
|
-
|
|
262
|
+
basePath,
|
|
259
263
|
);
|
|
260
264
|
return {
|
|
261
265
|
content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }],
|
|
@@ -335,7 +339,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
335
339
|
|
|
336
340
|
const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
337
341
|
const { executeSummarySave } = await loadWorkflowExecutors();
|
|
338
|
-
return executeSummarySave(params,
|
|
342
|
+
return executeSummarySave(params, resolveCtxCwd(_ctx));
|
|
339
343
|
};
|
|
340
344
|
|
|
341
345
|
const summarySaveTool = {
|
|
@@ -386,24 +390,24 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
386
390
|
|
|
387
391
|
const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
388
392
|
try {
|
|
393
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
389
394
|
// Claim a reserved ID if the guided-flow already previewed one to the user.
|
|
390
395
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
391
396
|
const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
|
|
392
397
|
const reserved = claimReservedId();
|
|
393
398
|
if (reserved) {
|
|
394
|
-
await ensureMilestoneDbRow(reserved);
|
|
399
|
+
await ensureMilestoneDbRow(reserved, basePath);
|
|
395
400
|
return {
|
|
396
401
|
content: [{ type: "text" as const, text: reserved }],
|
|
397
402
|
details: { operation: "generate_milestone_id", id: reserved, source: "reserved" } as any,
|
|
398
403
|
};
|
|
399
404
|
}
|
|
400
405
|
|
|
401
|
-
const basePath = process.cwd();
|
|
402
406
|
const existingIds = findMilestoneIds(basePath);
|
|
403
|
-
const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
407
|
+
const uniqueEnabled = !!loadEffectiveGSDPreferences(basePath)?.preferences?.unique_milestone_ids;
|
|
404
408
|
const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
|
|
405
409
|
const newId = nextMilestoneId(allIds, uniqueEnabled);
|
|
406
|
-
await ensureMilestoneDbRow(newId);
|
|
410
|
+
await ensureMilestoneDbRow(newId, basePath);
|
|
407
411
|
return {
|
|
408
412
|
content: [{ type: "text" as const, text: newId }],
|
|
409
413
|
details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled } as any,
|
|
@@ -423,8 +427,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
423
427
|
* later writes the full row. Silently skips if the DB isn't available yet
|
|
424
428
|
* (pre-migration).
|
|
425
429
|
*/
|
|
426
|
-
async function ensureMilestoneDbRow(milestoneId: string): Promise<void> {
|
|
427
|
-
const dbAvailable = await ensureDbOpen();
|
|
430
|
+
async function ensureMilestoneDbRow(milestoneId: string, basePath: string): Promise<void> {
|
|
431
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
428
432
|
if (!dbAvailable) return;
|
|
429
433
|
try {
|
|
430
434
|
const { insertMilestone } = await import("../gsd-db.js");
|
|
@@ -471,7 +475,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
471
475
|
|
|
472
476
|
const planMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
473
477
|
const { executePlanMilestone } = await loadWorkflowExecutors();
|
|
474
|
-
return executePlanMilestone(params,
|
|
478
|
+
return executePlanMilestone(params, resolveCtxCwd(_ctx));
|
|
475
479
|
};
|
|
476
480
|
|
|
477
481
|
const planMilestoneTool = {
|
|
@@ -541,7 +545,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
541
545
|
|
|
542
546
|
const planSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
543
547
|
const { executePlanSlice } = await loadWorkflowExecutors();
|
|
544
|
-
return executePlanSlice(params,
|
|
548
|
+
return executePlanSlice(params, resolveCtxCwd(_ctx));
|
|
545
549
|
};
|
|
546
550
|
|
|
547
551
|
const planSliceTool = {
|
|
@@ -590,7 +594,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
590
594
|
// ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
|
|
591
595
|
|
|
592
596
|
const planTaskExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
593
|
-
const
|
|
597
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
598
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
594
599
|
if (!dbAvailable) {
|
|
595
600
|
return {
|
|
596
601
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot plan task." }],
|
|
@@ -599,7 +604,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
599
604
|
}
|
|
600
605
|
try {
|
|
601
606
|
const { handlePlanTask } = await import("../tools/plan-task.js");
|
|
602
|
-
const result = await handlePlanTask(params,
|
|
607
|
+
const result = await handlePlanTask(params, basePath);
|
|
603
608
|
if ("error" in result) {
|
|
604
609
|
return {
|
|
605
610
|
content: [{ type: "text" as const, text: `Error planning task: ${result.error}` }],
|
|
@@ -664,7 +669,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
664
669
|
|
|
665
670
|
const taskCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
666
671
|
const { executeTaskComplete } = await loadWorkflowExecutors();
|
|
667
|
-
return executeTaskComplete(params,
|
|
672
|
+
return executeTaskComplete(params, resolveCtxCwd(_ctx));
|
|
668
673
|
};
|
|
669
674
|
|
|
670
675
|
const taskCompleteTool = {
|
|
@@ -735,7 +740,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
735
740
|
|
|
736
741
|
const sliceCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
737
742
|
const { executeSliceComplete } = await loadWorkflowExecutors();
|
|
738
|
-
return executeSliceComplete(params,
|
|
743
|
+
return executeSliceComplete(params, resolveCtxCwd(_ctx));
|
|
739
744
|
};
|
|
740
745
|
|
|
741
746
|
const sliceCompleteTool = {
|
|
@@ -835,7 +840,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
835
840
|
// ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
|
|
836
841
|
|
|
837
842
|
const skipSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
838
|
-
const
|
|
843
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
844
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
839
845
|
if (!dbAvailable) {
|
|
840
846
|
return {
|
|
841
847
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot skip slice." }],
|
|
@@ -868,7 +874,6 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
868
874
|
// Rebuild STATE.md so it reflects the skip immediately (#3477).
|
|
869
875
|
// Without this, /gsd auto reads stale STATE.md and resumes the skipped slice.
|
|
870
876
|
try {
|
|
871
|
-
const basePath = process.cwd();
|
|
872
877
|
const { rebuildState } = await import("../doctor.js");
|
|
873
878
|
await rebuildState(basePath);
|
|
874
879
|
} catch (err) {
|
|
@@ -928,7 +933,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
928
933
|
|
|
929
934
|
const milestoneCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
930
935
|
const { executeCompleteMilestone } = await loadWorkflowExecutors();
|
|
931
|
-
return executeCompleteMilestone(params,
|
|
936
|
+
return executeCompleteMilestone(params, resolveCtxCwd(_ctx));
|
|
932
937
|
};
|
|
933
938
|
|
|
934
939
|
const milestoneCompleteTool = {
|
|
@@ -974,7 +979,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
974
979
|
|
|
975
980
|
const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
976
981
|
const { executeValidateMilestone } = await loadWorkflowExecutors();
|
|
977
|
-
return executeValidateMilestone(params,
|
|
982
|
+
return executeValidateMilestone(params, resolveCtxCwd(_ctx));
|
|
978
983
|
};
|
|
979
984
|
|
|
980
985
|
const milestoneValidateTool = {
|
|
@@ -1012,7 +1017,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1012
1017
|
|
|
1013
1018
|
const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1014
1019
|
const { executeReplanSlice } = await loadWorkflowExecutors();
|
|
1015
|
-
return executeReplanSlice(params,
|
|
1020
|
+
return executeReplanSlice(params, resolveCtxCwd(_ctx));
|
|
1016
1021
|
};
|
|
1017
1022
|
|
|
1018
1023
|
const replanSliceTool = {
|
|
@@ -1063,7 +1068,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1063
1068
|
|
|
1064
1069
|
const reassessRoadmapExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1065
1070
|
const { executeReassessRoadmap } = await loadWorkflowExecutors();
|
|
1066
|
-
return executeReassessRoadmap(params,
|
|
1071
|
+
return executeReassessRoadmap(params, resolveCtxCwd(_ctx));
|
|
1067
1072
|
};
|
|
1068
1073
|
|
|
1069
1074
|
const reassessRoadmapTool = {
|
|
@@ -1122,7 +1127,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1122
1127
|
// Single-writer v3, Stream 3: reversibility tools for closed units.
|
|
1123
1128
|
|
|
1124
1129
|
const reopenTaskExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1125
|
-
const
|
|
1130
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
1131
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
1126
1132
|
if (!dbAvailable) {
|
|
1127
1133
|
return {
|
|
1128
1134
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen task." }],
|
|
@@ -1131,7 +1137,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1131
1137
|
}
|
|
1132
1138
|
try {
|
|
1133
1139
|
const { handleReopenTask } = await import("../tools/reopen-task.js");
|
|
1134
|
-
const result = await handleReopenTask(params,
|
|
1140
|
+
const result = await handleReopenTask(params, basePath);
|
|
1135
1141
|
if ("error" in result) {
|
|
1136
1142
|
return {
|
|
1137
1143
|
content: [{ type: "text" as const, text: `Error reopening task: ${result.error}` }],
|
|
@@ -1188,7 +1194,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1188
1194
|
// ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
|
|
1189
1195
|
|
|
1190
1196
|
const reopenSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1191
|
-
const
|
|
1197
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
1198
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
1192
1199
|
if (!dbAvailable) {
|
|
1193
1200
|
return {
|
|
1194
1201
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen slice." }],
|
|
@@ -1197,7 +1204,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1197
1204
|
}
|
|
1198
1205
|
try {
|
|
1199
1206
|
const { handleReopenSlice } = await import("../tools/reopen-slice.js");
|
|
1200
|
-
const result = await handleReopenSlice(params,
|
|
1207
|
+
const result = await handleReopenSlice(params, basePath);
|
|
1201
1208
|
if ("error" in result) {
|
|
1202
1209
|
return {
|
|
1203
1210
|
content: [{ type: "text" as const, text: `Error reopening slice: ${result.error}` }],
|
|
@@ -1254,7 +1261,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1254
1261
|
// ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
|
|
1255
1262
|
|
|
1256
1263
|
const reopenMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1257
|
-
const
|
|
1264
|
+
const basePath = resolveCtxCwd(_ctx);
|
|
1265
|
+
const dbAvailable = await ensureDbOpen(basePath);
|
|
1258
1266
|
if (!dbAvailable) {
|
|
1259
1267
|
return {
|
|
1260
1268
|
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen milestone." }],
|
|
@@ -1263,7 +1271,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1263
1271
|
}
|
|
1264
1272
|
try {
|
|
1265
1273
|
const { handleReopenMilestone } = await import("../tools/reopen-milestone.js");
|
|
1266
|
-
const result = await handleReopenMilestone(params,
|
|
1274
|
+
const result = await handleReopenMilestone(params, basePath);
|
|
1267
1275
|
if ("error" in result) {
|
|
1268
1276
|
return {
|
|
1269
1277
|
content: [{ type: "text" as const, text: `Error reopening milestone: ${result.error}` }],
|
|
@@ -1319,7 +1327,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1319
1327
|
|
|
1320
1328
|
const saveGateResultExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1321
1329
|
const { executeSaveGateResult } = await loadWorkflowExecutors();
|
|
1322
|
-
return executeSaveGateResult(params,
|
|
1330
|
+
return executeSaveGateResult(params, resolveCtxCwd(_ctx));
|
|
1323
1331
|
};
|
|
1324
1332
|
|
|
1325
1333
|
const saveGateResultTool = {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Registers workspace-aware dynamic filesystem and shell tools.
|
|
1
3
|
import { existsSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
2
5
|
import { dirname } from "node:path";
|
|
3
6
|
|
|
4
7
|
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
@@ -8,6 +11,24 @@ import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
|
|
|
8
11
|
import { setLogBasePath, logWarning } from "../workflow-logger.js";
|
|
9
12
|
import { resolveGsdPathContract } from "../paths.js";
|
|
10
13
|
|
|
14
|
+
export function safeWorkspaceCwd(): string {
|
|
15
|
+
try {
|
|
16
|
+
return process.cwd();
|
|
17
|
+
} catch {
|
|
18
|
+
const projectRoot = process.env.GSD_PROJECT_ROOT;
|
|
19
|
+
if (projectRoot && existsSync(projectRoot)) return projectRoot;
|
|
20
|
+
return homedir();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function resolveCtxCwd(ctx?: unknown): string {
|
|
25
|
+
if (ctx && typeof ctx === "object" && typeof (ctx as { cwd?: unknown }).cwd === "string") {
|
|
26
|
+
const cwd = (ctx as { cwd: string }).cwd;
|
|
27
|
+
if (existsSync(cwd)) return cwd;
|
|
28
|
+
}
|
|
29
|
+
return safeWorkspaceCwd();
|
|
30
|
+
}
|
|
31
|
+
|
|
11
32
|
/**
|
|
12
33
|
* Resolve the correct DB path for the current working directory.
|
|
13
34
|
* If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
|
|
@@ -18,7 +39,7 @@ export function resolveProjectRootDbPath(basePath: string): string {
|
|
|
18
39
|
return resolveGsdPathContract(basePath).projectDb;
|
|
19
40
|
}
|
|
20
41
|
|
|
21
|
-
export async function ensureDbOpen(basePath: string =
|
|
42
|
+
export async function ensureDbOpen(basePath: string = safeWorkspaceCwd()): Promise<boolean> {
|
|
22
43
|
try {
|
|
23
44
|
const db = await import("../gsd-db.js");
|
|
24
45
|
const contract = resolveGsdPathContract(basePath);
|
|
@@ -50,8 +71,9 @@ export async function ensureDbOpen(basePath: string = process.cwd()): Promise<bo
|
|
|
50
71
|
}
|
|
51
72
|
|
|
52
73
|
export function registerDynamicTools(pi: ExtensionAPI): void {
|
|
53
|
-
const
|
|
54
|
-
|
|
74
|
+
const fallbackRoot = safeWorkspaceCwd();
|
|
75
|
+
const baseBash = createBashTool(fallbackRoot, {
|
|
76
|
+
spawnHook: (ctx) => ctx,
|
|
55
77
|
});
|
|
56
78
|
const dynamicBash = {
|
|
57
79
|
...baseBash,
|
|
@@ -62,16 +84,20 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
|
|
|
62
84
|
onUpdate?: unknown,
|
|
63
85
|
ctx?: unknown,
|
|
64
86
|
) => {
|
|
87
|
+
const basePath = resolveCtxCwd(ctx);
|
|
88
|
+
const fresh = createBashTool(basePath, {
|
|
89
|
+
spawnHook: (spawnCtx) => ({ ...spawnCtx, cwd: basePath }),
|
|
90
|
+
});
|
|
65
91
|
const paramsWithTimeout = {
|
|
66
92
|
...params,
|
|
67
93
|
timeout: params.timeout ?? DEFAULT_BASH_TIMEOUT_SECS,
|
|
68
94
|
};
|
|
69
|
-
return (
|
|
95
|
+
return (fresh as any).execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
|
|
70
96
|
},
|
|
71
97
|
};
|
|
72
98
|
pi.registerTool(dynamicBash as any);
|
|
73
99
|
|
|
74
|
-
const baseWrite = createWriteTool(
|
|
100
|
+
const baseWrite = createWriteTool(fallbackRoot);
|
|
75
101
|
pi.registerTool({
|
|
76
102
|
...baseWrite,
|
|
77
103
|
execute: async (
|
|
@@ -81,12 +107,12 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
|
|
|
81
107
|
onUpdate?: unknown,
|
|
82
108
|
ctx?: unknown,
|
|
83
109
|
) => {
|
|
84
|
-
const fresh = createWriteTool(
|
|
110
|
+
const fresh = createWriteTool(resolveCtxCwd(ctx));
|
|
85
111
|
return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
|
|
86
112
|
},
|
|
87
113
|
} as any);
|
|
88
114
|
|
|
89
|
-
const baseRead = createReadTool(
|
|
115
|
+
const baseRead = createReadTool(fallbackRoot);
|
|
90
116
|
pi.registerTool({
|
|
91
117
|
...baseRead,
|
|
92
118
|
execute: async (
|
|
@@ -96,12 +122,12 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
|
|
|
96
122
|
onUpdate?: unknown,
|
|
97
123
|
ctx?: unknown,
|
|
98
124
|
) => {
|
|
99
|
-
const fresh = createReadTool(
|
|
125
|
+
const fresh = createReadTool(resolveCtxCwd(ctx));
|
|
100
126
|
return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
|
|
101
127
|
},
|
|
102
128
|
} as any);
|
|
103
129
|
|
|
104
|
-
const baseEdit = createEditTool(
|
|
130
|
+
const baseEdit = createEditTool(fallbackRoot);
|
|
105
131
|
pi.registerTool({
|
|
106
132
|
...baseEdit,
|
|
107
133
|
execute: async (
|
|
@@ -111,7 +137,7 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
|
|
|
111
137
|
onUpdate?: unknown,
|
|
112
138
|
ctx?: unknown,
|
|
113
139
|
) => {
|
|
114
|
-
const fresh = createEditTool(
|
|
140
|
+
const fresh = createEditTool(resolveCtxCwd(ctx));
|
|
115
141
|
return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
|
|
116
142
|
},
|
|
117
143
|
} as any);
|