@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.0-dev.5fc22c6f
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 +11 -11
- package/dist/cli.js +17 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -1
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +61 -50
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +431 -0
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +32 -11
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +83 -25
- package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
- package/dist/resources/extensions/gsd/auto-start.js +4 -3
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
- package/dist/resources/extensions/gsd/auto.js +32 -10
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +147 -23
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +56 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +29 -5
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +154 -2
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/engine.js +4 -1
- package/dist/resources/extensions/gsd/db/queries.js +39 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +55 -3
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +227 -5
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +14 -4
- package/dist/resources/extensions/gsd/flat-phase-migration.js +119 -23
- package/dist/resources/extensions/gsd/git-service.js +61 -8
- package/dist/resources/extensions/gsd/gitignore.js +4 -1
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
- package/dist/resources/extensions/gsd/guided-flow.js +40 -2
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +3 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +27 -15
- package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/metrics.js +4 -4
- package/dist/resources/extensions/gsd/migrate-external.js +22 -5
- package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
- package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
- package/dist/resources/extensions/gsd/preferences.js +29 -2
- package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
- package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
- package/dist/resources/extensions/gsd/state.js +12 -611
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
- package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
- package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
- package/dist/resources/extensions/gsd/tools/plan-task.js +103 -12
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/undo.js +43 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +11 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/verification-gate.js +7 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-manager.js +140 -5
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
- 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_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 +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- 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/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/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -841
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -2
- 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/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +67 -49
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +159 -0
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +468 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +34 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +80 -25
- package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
- package/src/resources/extensions/gsd/auto-start.ts +4 -3
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
- package/src/resources/extensions/gsd/auto.ts +36 -8
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +171 -23
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +60 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -5
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +136 -2
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/engine.ts +8 -1
- package/src/resources/extensions/gsd/db/queries.ts +40 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +61 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +275 -5
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
- package/src/resources/extensions/gsd/doctor-types.ts +8 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +13 -4
- package/src/resources/extensions/gsd/flat-phase-migration.ts +142 -22
- package/src/resources/extensions/gsd/git-service.ts +70 -9
- package/src/resources/extensions/gsd/gitignore.ts +4 -1
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
- package/src/resources/extensions/gsd/guided-flow.ts +45 -2
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +2 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +27 -17
- package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/metrics.ts +4 -4
- package/src/resources/extensions/gsd/migrate-external.ts +17 -4
- package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
- package/src/resources/extensions/gsd/preferences.ts +38 -4
- package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
- package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
- package/src/resources/extensions/gsd/state.ts +32 -732
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +296 -2
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +74 -2
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +307 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +214 -6
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
- package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
- package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
- package/src/resources/extensions/gsd/tools/plan-task.ts +135 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/undo.ts +47 -6
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +11 -3
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/verification-gate.ts +8 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +183 -5
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
- package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_ssgManifest.js +0 -0
|
@@ -9,7 +9,7 @@ import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd
|
|
|
9
9
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
10
10
|
import { isClosedStatus } from "./status-guards.js";
|
|
11
11
|
import { loadFile } from "./files.js";
|
|
12
|
-
import { runVerificationGate, runVerificationGateForTargets, formatFailureContext, captureRuntimeErrors, runDependencyAudit, } from "./verification-gate.js";
|
|
12
|
+
import { runVerificationGate, runVerificationGateForTargets, formatFailureContext, formatFailureSignature, captureRuntimeErrors, runDependencyAudit, } from "./verification-gate.js";
|
|
13
13
|
import { writeVerificationJSON } from "./verification-evidence.js";
|
|
14
14
|
import { logWarning } from "./workflow-logger.js";
|
|
15
15
|
import { runPostExecutionChecks } from "./post-execution-checks.js";
|
|
@@ -686,10 +686,13 @@ export async function runPostUnitVerification(vctx, pauseAuto) {
|
|
|
686
686
|
ctx.ui.notify(`Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) during verification retry; keeping verification failure as the authoritative blocker.`, "warning");
|
|
687
687
|
}
|
|
688
688
|
const nextAttempt = attempt + 1;
|
|
689
|
+
const failureContext = verdict.failureContext || formatFailureContext(result);
|
|
690
|
+
const failureSignature = formatFailureSignature(result);
|
|
689
691
|
s.verificationRetryCount.set(retryKey, nextAttempt);
|
|
690
692
|
s.pendingVerificationRetry = {
|
|
691
693
|
unitId: s.currentUnit.id,
|
|
692
|
-
failureContext
|
|
694
|
+
failureContext,
|
|
695
|
+
...(failureSignature ? { signature: failureSignature } : {}),
|
|
693
696
|
attempt: nextAttempt,
|
|
694
697
|
};
|
|
695
698
|
const failedCmds = result.checks
|
|
@@ -986,10 +986,10 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
986
986
|
const branch = autoWorktreeBranch(milestoneId);
|
|
987
987
|
const { preserveBranch = false, preserveWorktree = false } = opts;
|
|
988
988
|
const previousCwd = safeCwd(originalBasePath);
|
|
989
|
+
let clearActiveWorkspace = true;
|
|
989
990
|
// Wrap the entire teardown body in a single try/finally so activeWorkspace
|
|
990
|
-
// is
|
|
991
|
-
// was deleted before teardown ran).
|
|
992
|
-
// removeWorktree, leaving the registry stale on a chdir failure (H3 fix).
|
|
991
|
+
// is cleared on completion or irrecoverable failure — even if process.chdir
|
|
992
|
+
// throws (e.g. originalBasePath was deleted before teardown ran).
|
|
993
993
|
try {
|
|
994
994
|
try {
|
|
995
995
|
process.chdir(originalBasePath);
|
|
@@ -1026,17 +1026,23 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
1026
1026
|
// 3. Remove the worktree unless this exit path explicitly preserves it
|
|
1027
1027
|
// (slice-parallel dispatch stops the parent loop but keeps the parent
|
|
1028
1028
|
// milestone worktree for restart/re-entry).
|
|
1029
|
+
let worktreeRemoved = preserveWorktree;
|
|
1029
1030
|
if (!preserveWorktree) {
|
|
1030
|
-
removeWorktree(originalBasePath, milestoneId, {
|
|
1031
|
+
worktreeRemoved = removeWorktree(originalBasePath, milestoneId, {
|
|
1031
1032
|
branch,
|
|
1032
1033
|
deleteBranch: !preserveBranch,
|
|
1033
1034
|
});
|
|
1035
|
+
if (!worktreeRemoved) {
|
|
1036
|
+
logWarning("worktree", `Worktree removal aborted for ${milestoneId}; uncommitted work was preserved. ` +
|
|
1037
|
+
`Manual quarantine recovery may be needed before retrying teardown.`, { worktree: milestoneId });
|
|
1038
|
+
clearActiveWorkspace = false;
|
|
1039
|
+
}
|
|
1034
1040
|
}
|
|
1035
1041
|
// Verify cleanup succeeded — warn if the worktree directory is still on disk.
|
|
1036
1042
|
// On Windows, bash-based cleanup can silently fail when paths contain
|
|
1037
1043
|
// backslashes (#1436), leaving ~1 GB+ orphaned directories.
|
|
1038
1044
|
const wtDir = worktreePath(originalBasePath, milestoneId);
|
|
1039
|
-
if (!preserveWorktree && existsSync(wtDir)) {
|
|
1045
|
+
if (!preserveWorktree && worktreeRemoved && existsSync(wtDir)) {
|
|
1040
1046
|
logWarning("reconcile", `Worktree directory still exists after teardown: ${wtDir}. ` +
|
|
1041
1047
|
`This is likely an orphaned directory consuming disk space. ` +
|
|
1042
1048
|
`Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`, { worktree: milestoneId });
|
|
@@ -1057,10 +1063,12 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
1057
1063
|
}
|
|
1058
1064
|
}
|
|
1059
1065
|
finally {
|
|
1060
|
-
// Clear module state
|
|
1061
|
-
//
|
|
1062
|
-
//
|
|
1063
|
-
|
|
1066
|
+
// Clear module state when teardown completed or failed irrecoverably.
|
|
1067
|
+
// When removeWorktree returns false (quarantine failure), preserve the
|
|
1068
|
+
// registry so recovery logic still sees the active milestone worktree.
|
|
1069
|
+
if (clearActiveWorkspace) {
|
|
1070
|
+
setActiveWorkspace(null);
|
|
1071
|
+
}
|
|
1064
1072
|
}
|
|
1065
1073
|
}
|
|
1066
1074
|
/**
|
|
@@ -1491,15 +1499,28 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1491
1499
|
catch (err) {
|
|
1492
1500
|
logWarning("worktree", `clearProjectRootStateFiles failed during already-merged cleanup: ${err instanceof Error ? err.message : String(err)}`);
|
|
1493
1501
|
}
|
|
1502
|
+
let worktreeRemoved = true;
|
|
1494
1503
|
try {
|
|
1495
|
-
removeWorktree(originalBasePath_, milestoneId, {
|
|
1504
|
+
worktreeRemoved = removeWorktree(originalBasePath_, milestoneId, {
|
|
1496
1505
|
branch: milestoneBranch,
|
|
1497
1506
|
deleteBranch: false,
|
|
1498
1507
|
});
|
|
1499
1508
|
}
|
|
1500
1509
|
catch (err) {
|
|
1510
|
+
worktreeRemoved = false;
|
|
1501
1511
|
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1502
1512
|
}
|
|
1513
|
+
if (!worktreeRemoved) {
|
|
1514
|
+
logWarning("worktree", `Skipping milestone branch deletion for ${milestoneBranch}; worktree removal was aborted to preserve uncommitted milestone work.`);
|
|
1515
|
+
nudgeGitBranchCache(previousCwd);
|
|
1516
|
+
try {
|
|
1517
|
+
process.chdir(originalBasePath_);
|
|
1518
|
+
}
|
|
1519
|
+
catch (err) {
|
|
1520
|
+
logWarning("worktree", `chdir to project root after already-merged cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1521
|
+
}
|
|
1522
|
+
return { commitMessage, pushed: false, prCreated: false, codeFilesChanged: true };
|
|
1523
|
+
}
|
|
1503
1524
|
try {
|
|
1504
1525
|
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
1505
1526
|
}
|
|
@@ -1932,16 +1953,22 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1932
1953
|
}
|
|
1933
1954
|
const finalizeMilestoneCleanup = () => {
|
|
1934
1955
|
// 12. Remove worktree directory first (must happen before branch deletion)
|
|
1956
|
+
let worktreeRemoved = true;
|
|
1935
1957
|
try {
|
|
1936
|
-
removeWorktree(originalBasePath_, milestoneId, {
|
|
1958
|
+
worktreeRemoved = removeWorktree(originalBasePath_, milestoneId, {
|
|
1937
1959
|
branch: milestoneBranch,
|
|
1938
1960
|
deleteBranch: false,
|
|
1939
1961
|
});
|
|
1940
1962
|
}
|
|
1941
1963
|
catch (err) {
|
|
1964
|
+
worktreeRemoved = false;
|
|
1942
1965
|
// Best-effort -- worktree dir may already be gone
|
|
1943
1966
|
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1944
1967
|
}
|
|
1968
|
+
if (!worktreeRemoved) {
|
|
1969
|
+
logWarning("worktree", `Skipping milestone branch deletion for ${milestoneBranch}; worktree removal was aborted to preserve uncommitted milestone work.`);
|
|
1970
|
+
return;
|
|
1971
|
+
}
|
|
1945
1972
|
// 13. Delete milestone branch (after worktree removal so ref is unlocked)
|
|
1946
1973
|
try {
|
|
1947
1974
|
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
@@ -27,7 +27,7 @@ import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProces
|
|
|
27
27
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
28
28
|
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, loadEffectiveGSDPreferencesWithRegistry, resolveProfileAnchorProvider, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
|
|
29
29
|
import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
|
|
30
|
-
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
|
|
30
|
+
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, HARD_CONTEXT_REROOT_THRESHOLD_PERCENT, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, shouldWarnStepSessionForContext, } from "./auto-budget.js";
|
|
31
31
|
import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, isToolInvocationError, isQueuedUserMessageSkip, isDeterministicPolicyError, } from "./auto-tool-tracking.js";
|
|
32
32
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
33
33
|
import { selectAndApplyModel, resolveModelId, clearToolBaseline } from "./auto-model-selection.js";
|
|
@@ -369,7 +369,7 @@ function getEffectiveUnitIsolationMode(basePath) {
|
|
|
369
369
|
* running suspiciously long (e.g., a Bash command hung because `&` kept stdout open).
|
|
370
370
|
*/
|
|
371
371
|
// Re-export budget utilities for external consumers
|
|
372
|
-
export { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, getContextPauseAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
|
|
372
|
+
export { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, getContextPauseAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, shouldWarnStepSessionForContext, } from "./auto-budget.js";
|
|
373
373
|
function closeOutSignalInterruptedUnit(currentBasePath) {
|
|
374
374
|
const currentUnit = s.currentUnit;
|
|
375
375
|
if (!currentUnit)
|
|
@@ -651,6 +651,11 @@ export function stopAutoRemote(projectRoot) {
|
|
|
651
651
|
* The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
|
|
652
652
|
* this path is only for the explicit "Force start" action.
|
|
653
653
|
*/
|
|
654
|
+
// Grace window between SIGTERM and SIGKILL so the target can run its cleanup
|
|
655
|
+
// handler (lock release, DB snapshot flush, worktree teardown). Polled so a
|
|
656
|
+
// process that exits early is not made to wait the full window.
|
|
657
|
+
const FORCE_STOP_GRACE_MS = 3000;
|
|
658
|
+
const FORCE_STOP_POLL_MS = 100;
|
|
654
659
|
export function forceStopAutoRemote(projectRoot) {
|
|
655
660
|
const lock = readCrashLock(projectRoot);
|
|
656
661
|
if (!lock)
|
|
@@ -665,6 +670,14 @@ export function forceStopAutoRemote(projectRoot) {
|
|
|
665
670
|
}
|
|
666
671
|
try {
|
|
667
672
|
process.kill(lock.pid, "SIGTERM");
|
|
673
|
+
// Poll for graceful exit before escalating. Synchronous sleep keeps this
|
|
674
|
+
// function sync for its callers (Atomics.wait times out with no notify).
|
|
675
|
+
const deadline = Date.now() + FORCE_STOP_GRACE_MS;
|
|
676
|
+
while (Date.now() < deadline) {
|
|
677
|
+
if (!isLockProcessAlive(lock))
|
|
678
|
+
break;
|
|
679
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, FORCE_STOP_POLL_MS);
|
|
680
|
+
}
|
|
668
681
|
if (isLockProcessAlive(lock)) {
|
|
669
682
|
process.kill(lock.pid, "SIGKILL");
|
|
670
683
|
}
|
|
@@ -904,9 +917,10 @@ export async function rerootCommandSession(cmdCtx, workspaceRoot) {
|
|
|
904
917
|
}
|
|
905
918
|
}
|
|
906
919
|
/**
|
|
907
|
-
* After a completed step-mode unit,
|
|
908
|
-
*
|
|
909
|
-
* re-
|
|
920
|
+
* After a completed step-mode unit, warn when usage reaches the configurable
|
|
921
|
+
* soft context threshold. At the fixed hard boundary, write a context-mode
|
|
922
|
+
* snapshot and re-root the visible command session while leaving the NEXT
|
|
923
|
+
* progress surface.
|
|
910
924
|
*/
|
|
911
925
|
export async function maybeRerootStepSessionForHighContext(ctx, workspaceRoot, cmdCtx, originalBasePath) {
|
|
912
926
|
if (!cmdCtx)
|
|
@@ -915,18 +929,24 @@ export async function maybeRerootStepSessionForHighContext(ctx, workspaceRoot, c
|
|
|
915
929
|
const { loadEffectiveGSDPreferences } = await import("./preferences.js");
|
|
916
930
|
const prefs = loadEffectiveGSDPreferences(workspaceRoot);
|
|
917
931
|
const compactionThreshold = prefs?.preferences.context_management?.compaction_threshold_percent;
|
|
918
|
-
|
|
932
|
+
const shouldWarn = shouldWarnStepSessionForContext(contextPercent, compactionThreshold);
|
|
933
|
+
const shouldReroot = shouldRerootStepSessionForContext(contextPercent);
|
|
934
|
+
if (!shouldWarn && !shouldReroot) {
|
|
935
|
+
return { rerooted: false };
|
|
936
|
+
}
|
|
937
|
+
const displayPercent = contextPercent.toFixed(1);
|
|
938
|
+
const thresholdDisplay = resolveCompactionThresholdPercent(compactionThreshold).toFixed(0);
|
|
939
|
+
if (!shouldReroot) {
|
|
940
|
+
ctx.ui.notify(`Step complete — context at ${displayPercent}% (soft threshold: ${thresholdDisplay}%). Use /compact when convenient; continuing in this session is still safe.`, "info");
|
|
919
941
|
return { rerooted: false };
|
|
920
942
|
}
|
|
921
943
|
const { resolveWorktreeProjectRoot } = await import("./worktree-root.js");
|
|
922
944
|
const snapshotBase = resolveWorktreeProjectRoot(workspaceRoot, originalBasePath);
|
|
923
945
|
const { writeContextModeCompactionSnapshot } = await import("./context-mode-snapshot.js");
|
|
924
946
|
await writeContextModeCompactionSnapshot(snapshotBase);
|
|
925
|
-
const displayPercent = contextPercent.toFixed(1);
|
|
926
|
-
const thresholdDisplay = resolveCompactionThresholdPercent(compactionThreshold).toFixed(0);
|
|
927
947
|
const result = await rerootCommandSession(cmdCtx, workspaceRoot);
|
|
928
948
|
if (result.status === "ok") {
|
|
929
|
-
ctx.ui.notify(`Step complete — context at ${displayPercent}% (threshold: ${
|
|
949
|
+
ctx.ui.notify(`Step complete — context at ${displayPercent}% (hard threshold: ${HARD_CONTEXT_REROOT_THRESHOLD_PERCENT}%). Fresh session ready for /gsd next.`, "info");
|
|
930
950
|
return { rerooted: true };
|
|
931
951
|
}
|
|
932
952
|
if (result.status === "cancelled") {
|
|
@@ -1545,7 +1565,7 @@ export function _selectStopAutoWorktreeExit(args) {
|
|
|
1545
1565
|
/**
|
|
1546
1566
|
* Pause auto-mode without destroying state. Context is preserved.
|
|
1547
1567
|
* The user can interact with the agent, then `/gsd auto` resumes
|
|
1548
|
-
* from disk state. Called when the user presses Escape
|
|
1568
|
+
* from disk state. Called when the user presses Escape or runs `/gsd pause`.
|
|
1549
1569
|
*/
|
|
1550
1570
|
export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
1551
1571
|
if (!s.active)
|
|
@@ -1564,6 +1584,8 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1564
1584
|
].filter((path) => Boolean(path)));
|
|
1565
1585
|
s.active = false;
|
|
1566
1586
|
s.paused = true;
|
|
1587
|
+
if (options.abortActiveTurn && ctx && !ctx.isIdle())
|
|
1588
|
+
ctx.abort();
|
|
1567
1589
|
clearUnitTimeout();
|
|
1568
1590
|
stopAutoCommandPolling();
|
|
1569
1591
|
// Flush queued follow-up messages (#3512).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Canonical core session tool surface shared by auto-mode scoping and loop guards.
|
|
3
|
+
/** Base tools available during auto-mode execution before unit-specific GSD tools are added. */
|
|
4
|
+
export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
|
|
5
|
+
"ask_user_questions",
|
|
6
|
+
"bash",
|
|
7
|
+
"bg_shell",
|
|
8
|
+
"edit",
|
|
9
|
+
"find",
|
|
10
|
+
"glob",
|
|
11
|
+
"grep",
|
|
12
|
+
"fetch_page",
|
|
13
|
+
"search-the-web",
|
|
14
|
+
"ls",
|
|
15
|
+
"read",
|
|
16
|
+
"subagent",
|
|
17
|
+
"write",
|
|
18
|
+
"ToolSearch",
|
|
19
|
+
];
|
|
20
|
+
/** Tools excluded from the high per-turn loop-guard cap (strict or orchestration). */
|
|
21
|
+
const NON_REPEATABLE_FROM_MINIMAL_BASE = new Set([
|
|
22
|
+
"ask_user_questions",
|
|
23
|
+
"subagent",
|
|
24
|
+
"ToolSearch",
|
|
25
|
+
]);
|
|
26
|
+
/** Additional core tools not in MINIMAL_AUTO_BASE but routinely multi-called per turn. */
|
|
27
|
+
const EXTRA_INHERENTLY_REPEATABLE = [
|
|
28
|
+
"gsd_exec",
|
|
29
|
+
"multi_edit",
|
|
30
|
+
"todo_write",
|
|
31
|
+
"notebook_edit",
|
|
32
|
+
"search_and_read",
|
|
33
|
+
];
|
|
34
|
+
/** Core session tools that may be invoked many times per agent turn. */
|
|
35
|
+
export const INHERENTLY_REPEATABLE_TOOL_NAMES = [
|
|
36
|
+
...MINIMAL_AUTO_BASE_TOOL_NAMES.filter((name) => !NON_REPEATABLE_FROM_MINIMAL_BASE.has(name)),
|
|
37
|
+
...EXTRA_INHERENTLY_REPEATABLE,
|
|
38
|
+
];
|
|
39
|
+
export const INHERENTLY_REPEATABLE_TOOL_SET = new Set(INHERENTLY_REPEATABLE_TOOL_NAMES);
|
|
@@ -654,8 +654,9 @@ export function registerDbTools(pi) {
|
|
|
654
654
|
promptSnippet: "Plan a slice via DB write + PLAN render + cache invalidation",
|
|
655
655
|
promptGuidelines: [
|
|
656
656
|
"Use gsd_plan_slice for slice planning instead of writing S##-PLAN.md or task PLAN files directly.",
|
|
657
|
-
"
|
|
658
|
-
"
|
|
657
|
+
"For incremental planning, call gsd_plan_slice with slice metadata only, then call gsd_plan_task once per task.",
|
|
658
|
+
"When tasks is omitted or empty, the tool writes only slice planning metadata and preserves existing tasks.",
|
|
659
|
+
"When tasks is non-empty, the tool validates input, requires an existing parent slice, writes slice/task planning data, renders PLAN.md and task plan files from DB, and clears both state and parse caches after success.",
|
|
659
660
|
"Use the canonical name gsd_plan_slice; gsd_slice_plan is only an alias.",
|
|
660
661
|
],
|
|
661
662
|
parameters: Type.Object({
|
|
@@ -663,7 +664,7 @@ export function registerDbTools(pi) {
|
|
|
663
664
|
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
664
665
|
sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
|
|
665
666
|
goal: Type.String({ description: "Slice goal" }),
|
|
666
|
-
tasks: Type.Array(Type.Object({
|
|
667
|
+
tasks: Type.Optional(Type.Array(Type.Object({
|
|
667
668
|
taskId: Type.String({ description: "Task ID (e.g. T01)" }),
|
|
668
669
|
title: Type.String({ description: "Task title" }),
|
|
669
670
|
description: Type.String({ description: "Task description / steps block" }),
|
|
@@ -673,12 +674,14 @@ export function registerDbTools(pi) {
|
|
|
673
674
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
674
675
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
675
676
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
676
|
-
|
|
677
|
+
targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Repository id(s) this task touches (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
|
|
678
|
+
}), { description: "Optional full task replacement for the slice. Omit for incremental planning, then call gsd_plan_task once per task." })),
|
|
677
679
|
// ── Enrichment metadata (optional — defaults to empty) ────────────
|
|
678
680
|
successCriteria: Type.Optional(Type.String({ description: "Slice success criteria block" })),
|
|
679
681
|
proofLevel: Type.Optional(Type.String({ description: "Slice proof level" })),
|
|
680
682
|
integrationClosure: Type.Optional(Type.String({ description: "Slice integration closure" })),
|
|
681
683
|
observabilityImpact: Type.Optional(Type.String({ description: "Slice observability impact" })),
|
|
684
|
+
targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Slice-wide default repository id(s) (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
|
|
682
685
|
// Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
|
|
683
686
|
actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
|
|
684
687
|
triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
|
|
@@ -748,6 +751,7 @@ export function registerDbTools(pi) {
|
|
|
748
751
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
749
752
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
750
753
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
754
|
+
targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Repository id(s) this task touches (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
|
|
751
755
|
// Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
|
|
752
756
|
actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
|
|
753
757
|
triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
|
|
@@ -14,6 +14,7 @@ import { registerShortcuts } from "./register-shortcuts.js";
|
|
|
14
14
|
import { writeCrashLog } from "./crash-log.js";
|
|
15
15
|
import { logWarning, isGsdExtensionStderrEnabled } from "../workflow-logger.js";
|
|
16
16
|
import { UNIT_TOOL_CONTRACTS } from "../unit-tool-contracts.js";
|
|
17
|
+
import { installManifestFlushOnProcessTeardown } from "../workflow-manifest.js";
|
|
17
18
|
// Static import so cmux event listeners are registered synchronously during
|
|
18
19
|
// extension bootstrap. Prior implementation used `void import().then()` which
|
|
19
20
|
// queued listener registration as a microtask — any CMUX_CHANNELS emit fired
|
|
@@ -177,6 +178,7 @@ export function registerGsdExtension(pi) {
|
|
|
177
178
|
process.stderr.write(`[gsd] Failed to bootstrap hook-emitter bridge: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
|
|
178
179
|
});
|
|
179
180
|
installEpipeGuard();
|
|
181
|
+
installManifestFlushOnProcessTeardown();
|
|
180
182
|
// Ecosystem handlers captured by the GSDExtensionAPI wrapper for the
|
|
181
183
|
// GSD-owned `before_agent_start` dispatch step (#3338).
|
|
182
184
|
const ecosystemHandlers = [];
|
|
@@ -13,8 +13,10 @@ import { resolveManifest } from "../unit-context-manifest.js";
|
|
|
13
13
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
14
14
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
15
15
|
import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, isInteractiveElicitationInFlight, markToolEnd, markToolStart, recordAutoToolSurfaceSnapshot, recordToolInvocationError, } from "../auto-runtime-state.js";
|
|
16
|
+
import { isDeterministicPolicyError, isQueuedUserMessageSkip, isToolInvocationError, isToolUnavailableError, } from "../auto-tool-tracking.js";
|
|
16
17
|
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
17
|
-
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
18
|
+
import { checkToolCallLoop, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
19
|
+
import { MINIMAL_AUTO_BASE_TOOL_NAMES } from "./core-session-tools.js";
|
|
18
20
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
19
21
|
import { saveActivityLog } from "../activity-log.js";
|
|
20
22
|
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
|
|
@@ -42,7 +44,15 @@ import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
|
42
44
|
import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
43
45
|
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
44
46
|
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
47
|
+
import { flushAllManifests } from "../workflow-manifest.js";
|
|
48
|
+
import { recordUnitHarnessAbort } from "../unit-runtime.js";
|
|
45
49
|
let approvalQuestionAbortInFlight = false;
|
|
50
|
+
function recordCurrentUnitHarnessAbort(abort) {
|
|
51
|
+
const dash = getAutoRuntimeSnapshot();
|
|
52
|
+
if (!dash.active || !dash.basePath || !dash.currentUnit)
|
|
53
|
+
return;
|
|
54
|
+
recordUnitHarnessAbort(dash.basePath, dash.currentUnit.type, dash.currentUnit.id, dash.currentUnit.startedAt, abort);
|
|
55
|
+
}
|
|
46
56
|
async function loadWelcomeScreenModule() {
|
|
47
57
|
const candidates = [];
|
|
48
58
|
const gsdBinPath = process.env.GSD_BIN_PATH;
|
|
@@ -138,22 +148,7 @@ export const MINIMAL_GSD_TOOL_NAMES = [
|
|
|
138
148
|
"capture_thought",
|
|
139
149
|
"gsd_capture_thought",
|
|
140
150
|
];
|
|
141
|
-
export
|
|
142
|
-
"ask_user_questions",
|
|
143
|
-
"bash",
|
|
144
|
-
"bg_shell",
|
|
145
|
-
"edit",
|
|
146
|
-
"find",
|
|
147
|
-
"glob",
|
|
148
|
-
"grep",
|
|
149
|
-
"fetch_page",
|
|
150
|
-
"search-the-web",
|
|
151
|
-
"ls",
|
|
152
|
-
"read",
|
|
153
|
-
"subagent",
|
|
154
|
-
"write",
|
|
155
|
-
"ToolSearch",
|
|
156
|
-
];
|
|
151
|
+
export { MINIMAL_AUTO_BASE_TOOL_NAMES } from "./core-session-tools.js";
|
|
157
152
|
function withPreservedShimTools(toolNames) {
|
|
158
153
|
return [...new Set([...toolNames, ...ALWAYS_PRESERVED_SHIM_TOOL_NAMES])];
|
|
159
154
|
}
|
|
@@ -173,9 +168,23 @@ const WORKFLOW_GSD_TOOL_NAMES = [
|
|
|
173
168
|
...MINIMAL_GSD_TOOL_NAMES,
|
|
174
169
|
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
175
170
|
].filter(isGsdManagedTool);
|
|
171
|
+
const WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES = [
|
|
172
|
+
"find",
|
|
173
|
+
"glob",
|
|
174
|
+
"grep",
|
|
175
|
+
"ls",
|
|
176
|
+
"read",
|
|
177
|
+
"subagent",
|
|
178
|
+
];
|
|
176
179
|
function isGsdManagedTool(name) {
|
|
177
180
|
return name.startsWith("gsd_") || name === "memory_query" || name === "capture_thought" || name === "gsd_graph";
|
|
178
181
|
}
|
|
182
|
+
function autoBaseToolNamesForUnit(unitType) {
|
|
183
|
+
const manifest = unitType ? resolveManifest(unitType) : null;
|
|
184
|
+
return manifest?.tools.mode === "workflow-only"
|
|
185
|
+
? WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES
|
|
186
|
+
: MINIMAL_AUTO_BASE_TOOL_NAMES;
|
|
187
|
+
}
|
|
179
188
|
/**
|
|
180
189
|
* Resolves requested tool names against active tools using exact and MCP-scoped matches.
|
|
181
190
|
*
|
|
@@ -226,7 +235,7 @@ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registered
|
|
|
226
235
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
227
236
|
}
|
|
228
237
|
const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
|
|
229
|
-
const autoBaseTools = new Set(
|
|
238
|
+
const autoBaseTools = new Set(autoBaseToolNamesForUnit(unitType));
|
|
230
239
|
const availableBaseTools = registeredToolNames.filter((name) => autoBaseTools.has(name));
|
|
231
240
|
const preserved = [...new Set([
|
|
232
241
|
...activeToolNames.filter((name) => autoBaseTools.has(name)),
|
|
@@ -449,6 +458,85 @@ function deferApprovalGateFromSnapshot(gateId, basePath, snapshot) {
|
|
|
449
458
|
function contextBasePath(ctx) {
|
|
450
459
|
return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
|
|
451
460
|
}
|
|
461
|
+
const LOOP_GUARD_INTERACTIVE_INSTRUCTIONS = [
|
|
462
|
+
"Do not retry this tool or call other tools this turn — stop and respond to the user in text.",
|
|
463
|
+
"Do not retry this tool or pivot to other tools this turn — stop and respond to the user in text.",
|
|
464
|
+
];
|
|
465
|
+
const LOOP_GUARD_AUTO_INSTRUCTION = "Do not re-issue this blocked tool. In /gsd auto, stop tool calls for this turn and return control to the auto-mode recovery/replan path.";
|
|
466
|
+
function formatLoopGuardBlockReason(reason) {
|
|
467
|
+
if (!reason || !getAutoRuntimeSnapshot().active)
|
|
468
|
+
return reason;
|
|
469
|
+
return LOOP_GUARD_INTERACTIVE_INSTRUCTIONS.reduce((formatted, instruction) => formatted.replace(instruction, LOOP_GUARD_AUTO_INSTRUCTION), reason);
|
|
470
|
+
}
|
|
471
|
+
function isGateResultPersistenceTool(toolName) {
|
|
472
|
+
return toolName === "gsd_save_gate_result" || toolName === "gsd_uat_result_save";
|
|
473
|
+
}
|
|
474
|
+
function resultDetails(result) {
|
|
475
|
+
if (!result || typeof result !== "object")
|
|
476
|
+
return {};
|
|
477
|
+
const details = result.details;
|
|
478
|
+
return details && typeof details === "object" ? details : {};
|
|
479
|
+
}
|
|
480
|
+
function isAbortedExecutionToolResult(toolName, result) {
|
|
481
|
+
if (toolName !== "gsd_exec" && toolName !== "gsd_uat_exec")
|
|
482
|
+
return false;
|
|
483
|
+
const details = resultDetails(result);
|
|
484
|
+
return details.aborted === true || details.force_resolved === true || details.timed_out === true;
|
|
485
|
+
}
|
|
486
|
+
function isRetryableHarnessToolError(toolName, result, errorText) {
|
|
487
|
+
if (isGateResultPersistenceTool(toolName))
|
|
488
|
+
return false;
|
|
489
|
+
if (isDeterministicPolicyError(errorText))
|
|
490
|
+
return false;
|
|
491
|
+
if (toolName === "gsd_exec" || toolName === "gsd_uat_exec") {
|
|
492
|
+
if (isAbortedExecutionToolResult(toolName, result))
|
|
493
|
+
return true;
|
|
494
|
+
if (isToolUnavailableError(errorText))
|
|
495
|
+
return true;
|
|
496
|
+
if (isQueuedUserMessageSkip(errorText))
|
|
497
|
+
return true;
|
|
498
|
+
return isToolInvocationError(errorText);
|
|
499
|
+
}
|
|
500
|
+
if (isToolUnavailableError(errorText))
|
|
501
|
+
return true;
|
|
502
|
+
if (isQueuedUserMessageSkip(errorText))
|
|
503
|
+
return true;
|
|
504
|
+
return false;
|
|
505
|
+
}
|
|
506
|
+
function recordRetryableHarnessToolError(toolName, result, errorText) {
|
|
507
|
+
if (!isRetryableHarnessToolError(toolName, result, errorText))
|
|
508
|
+
return;
|
|
509
|
+
recordCurrentUnitHarnessAbort({
|
|
510
|
+
kind: "tool-error",
|
|
511
|
+
reason: errorText || "Tool execution failed before the unit could complete its gate evaluation.",
|
|
512
|
+
toolName,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
function recordRetryableTurnAbort(event) {
|
|
516
|
+
const origin = typeof event.abortOrigin === "string" ? event.abortOrigin : undefined;
|
|
517
|
+
if (origin === "session-transition")
|
|
518
|
+
return;
|
|
519
|
+
const messages = Array.isArray(event.messages) ? event.messages : [];
|
|
520
|
+
const lastMsg = messages[messages.length - 1];
|
|
521
|
+
const stopReason = lastMsg && typeof lastMsg === "object"
|
|
522
|
+
? lastMsg.stopReason
|
|
523
|
+
: undefined;
|
|
524
|
+
if (stopReason !== "aborted" && stopReason !== "error")
|
|
525
|
+
return;
|
|
526
|
+
const errorMessage = lastMsg && typeof lastMsg === "object"
|
|
527
|
+
? lastMsg.errorMessage
|
|
528
|
+
: undefined;
|
|
529
|
+
const reason = [
|
|
530
|
+
"Agent turn aborted before the unit could complete its gate evaluation.",
|
|
531
|
+
origin ? `origin=${origin}` : undefined,
|
|
532
|
+
typeof stopReason === "string" ? `stopReason=${stopReason}` : undefined,
|
|
533
|
+
typeof errorMessage === "string" && errorMessage.trim() ? `error=${errorMessage.trim()}` : undefined,
|
|
534
|
+
].filter(Boolean).join(" ");
|
|
535
|
+
recordCurrentUnitHarnessAbort({
|
|
536
|
+
kind: "turn-abort",
|
|
537
|
+
reason,
|
|
538
|
+
});
|
|
539
|
+
}
|
|
452
540
|
function beginSourceObservationStoreForCurrentUnit(ctx) {
|
|
453
541
|
if (!isAutoActive())
|
|
454
542
|
return null;
|
|
@@ -699,8 +787,8 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
699
787
|
await applyCompactionThresholdOverride(ctx);
|
|
700
788
|
await prepareWorkflowMcpForHookContext(ctx, basePath);
|
|
701
789
|
// Migrate legacy .gsd/milestones/ to flat-phase .gsd/phases/ when detected.
|
|
702
|
-
//
|
|
703
|
-
//
|
|
790
|
+
// Fail closed on migration errors: resolvers assume flat-phase paths after
|
|
791
|
+
// startup, so continuing with nested disk state corrupts later checks.
|
|
704
792
|
try {
|
|
705
793
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
706
794
|
if (!isInAutoWorktree(basePath)) {
|
|
@@ -713,13 +801,27 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
713
801
|
await migrateToFlatPhase(basePath);
|
|
714
802
|
}
|
|
715
803
|
else {
|
|
716
|
-
safetyLogWarning("bootstrap", "flat-phase migration
|
|
804
|
+
safetyLogWarning("bootstrap", "flat-phase migration required: legacy .gsd/milestones/ layout detected but the workflow database could not be opened — fix database access before starting GSD");
|
|
805
|
+
throw new Error("flat-phase migration required but the workflow database could not be opened; fix database access before starting GSD");
|
|
717
806
|
}
|
|
718
807
|
}
|
|
719
808
|
}
|
|
720
809
|
}
|
|
721
810
|
catch (err) {
|
|
722
|
-
|
|
811
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
812
|
+
safetyLogWarning("bootstrap", `flat-phase migration failed: ${message}`);
|
|
813
|
+
throw new Error(`flat-phase migration failed: ${message}`);
|
|
814
|
+
}
|
|
815
|
+
try {
|
|
816
|
+
const projectRoot = resolveWorktreeProjectRoot(basePath);
|
|
817
|
+
const { pruneStaleFlatPhaseBackups } = await import("../flat-phase-migration.js");
|
|
818
|
+
const pruned = pruneStaleFlatPhaseBackups(projectRoot);
|
|
819
|
+
if (pruned > 0) {
|
|
820
|
+
safetyLogWarning("bootstrap", `pruned ${pruned} stale flat-phase migration backup(s) from .gsd-backups/ (retention exceeded)`);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
catch (err) {
|
|
824
|
+
safetyLogWarning("bootstrap", `flat-phase backup pruning: ${err instanceof Error ? err.message : String(err)}`);
|
|
723
825
|
}
|
|
724
826
|
// Apply show_token_cost preference (#1515)
|
|
725
827
|
try {
|
|
@@ -868,12 +970,24 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
868
970
|
});
|
|
869
971
|
pi.on("agent_end", async (event, ctx) => {
|
|
870
972
|
approvalQuestionAbortInFlight = false;
|
|
973
|
+
recordRetryableTurnAbort(event);
|
|
871
974
|
resetToolCallLoopGuard();
|
|
872
975
|
resetPendingGatePauseGuard();
|
|
873
976
|
await resetAskUserQuestionsTurnCache();
|
|
874
977
|
const { handleAgentEnd } = await import("./agent-end-recovery.js");
|
|
875
978
|
const agentEndBasePath = contextBasePath(ctx);
|
|
876
979
|
try {
|
|
980
|
+
// The manifest is a non-critical projection (the append-only event log is
|
|
981
|
+
// the authoritative recovery source), so a flush failure must not skip
|
|
982
|
+
// agent_end recovery. drainManifestWrites still propagates write failures
|
|
983
|
+
// to explicit flush callers; here we deliberately log and continue so
|
|
984
|
+
// handleAgentEnd (and the finally below) always run.
|
|
985
|
+
try {
|
|
986
|
+
await flushAllManifests();
|
|
987
|
+
}
|
|
988
|
+
catch (err) {
|
|
989
|
+
safetyLogWarning("manifest", `flushAllManifests on agent_end failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
990
|
+
}
|
|
877
991
|
await handleAgentEnd(pi, event, ctx);
|
|
878
992
|
}
|
|
879
993
|
finally {
|
|
@@ -1063,7 +1177,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1063
1177
|
// ── Loop guard: block repeated identical tool calls ──
|
|
1064
1178
|
const loopCheck = checkToolCallLoop(toolName, event.input);
|
|
1065
1179
|
if (loopCheck.block) {
|
|
1066
|
-
|
|
1180
|
+
recordCurrentUnitHarnessAbort({
|
|
1181
|
+
kind: "tool-loop-guard",
|
|
1182
|
+
reason: loopCheck.reason ?? "Tool-call loop guard blocked a repeated tool call.",
|
|
1183
|
+
toolName,
|
|
1184
|
+
count: loopCheck.count,
|
|
1185
|
+
});
|
|
1186
|
+
return { block: true, reason: formatLoopGuardBlockReason(loopCheck.reason) };
|
|
1067
1187
|
}
|
|
1068
1188
|
const deferredGateGuard = shouldBlockDeferredApprovalTool(toolName, event.input, discussionBasePath);
|
|
1069
1189
|
if (deferredGateGuard.block) {
|
|
@@ -1269,6 +1389,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1269
1389
|
}
|
|
1270
1390
|
}
|
|
1271
1391
|
if (!event.isError) {
|
|
1392
|
+
recordToolCallLoopMutation(toolName);
|
|
1272
1393
|
refreshSourceObservationAfterMutation(toolName, event.input, ctx);
|
|
1273
1394
|
clearSourceObservationsAfterShell(toolName);
|
|
1274
1395
|
}
|
|
@@ -1284,6 +1405,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1284
1405
|
// Let recordToolInvocationError classify the failure so non-gsd_ harness
|
|
1285
1406
|
// errors and deterministic policy rejections are handled consistently.
|
|
1286
1407
|
recordToolInvocationError(event.toolName, errorText);
|
|
1408
|
+
recordRetryableHarnessToolError(toolName, resultPayload, errorText);
|
|
1287
1409
|
}
|
|
1288
1410
|
else if (isAutoActive()) {
|
|
1289
1411
|
clearToolInvocationError();
|
|
@@ -1451,6 +1573,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1451
1573
|
// for every finalized tool call on every engine, so error classification
|
|
1452
1574
|
// and evidence persistence here cover external engines that skip tool_result.
|
|
1453
1575
|
pi.on("tool_execution_end", async (event) => {
|
|
1576
|
+
const toolName = canonicalToolName(event.toolName);
|
|
1454
1577
|
markToolEnd(event.toolCallId);
|
|
1455
1578
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
1456
1579
|
// so postUnitPreVerification can break the retry loop instead of re-dispatching.
|
|
@@ -1461,6 +1584,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1461
1584
|
// Let recordToolInvocationError classify the failure so non-gsd_ harness
|
|
1462
1585
|
// errors and deterministic policy rejections are handled consistently.
|
|
1463
1586
|
recordToolInvocationError(event.toolName, errorText);
|
|
1587
|
+
recordRetryableHarnessToolError(toolName, event.result, errorText);
|
|
1464
1588
|
}
|
|
1465
1589
|
else if (isAutoActive()) {
|
|
1466
1590
|
clearToolInvocationError();
|