@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.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 +10 -10
- 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/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/gsd/artifact-verification.js +427 -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 +17 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +8 -24
- 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-timeout-recovery.js +3 -3
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto.js +19 -10
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -18
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +48 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +15 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/db/engine.js +4 -1
- 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/docs/preferences-reference.md +2 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +8 -2
- package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
- package/dist/resources/extensions/gsd/git-service.js +57 -0
- package/dist/resources/extensions/gsd/gitignore.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
- package/dist/resources/extensions/gsd/json-persistence.js +20 -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 +2 -7
- 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 +11 -2
- 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/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 +3 -3
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- 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/references/commands.md +1 -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 +28 -5
- package/dist/resources/extensions/gsd/undo.js +43 -6
- package/dist/resources/extensions/gsd/unit-registry.js +11 -3
- 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/worktree-manager.js +44 -2
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- 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/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/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/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 +4 -4
- 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 +10 -10
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- 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/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/_not-found/page-49f565245e1e4afe.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-4ae2d68984392bbf.js → layout-b35cbfff38aaf4cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-90d1d8d5e5d2dc6b.js → main-app-590a74400e35f685.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +1 -0
- 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/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +6 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- 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/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 +258 -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 +23 -5
- 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/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/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- 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/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/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
- package/src/resources/extensions/gsd/artifact-verification.ts +464 -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 +17 -7
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +7 -23
- 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-timeout-recovery.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto.ts +23 -8
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +43 -18
- 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 +50 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +16 -4
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/db/engine.ts +8 -1
- 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/docs/preferences-reference.md +2 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
- package/src/resources/extensions/gsd/doctor-types.ts +3 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +7 -2
- package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
- package/src/resources/extensions/gsd/git-service.ts +64 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
- package/src/resources/extensions/gsd/json-persistence.ts +20 -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 +2 -10
- 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 +8 -2
- 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/orphan-stash-audit.ts +108 -20
- 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 +3 -3
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- 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/references/commands.md +1 -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-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-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
- 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-scope-db-unavailable.test.ts +239 -2
- 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 +37 -2
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -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/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/plan-slice-prompt.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- 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/register-hooks-loop-guard-auto.test.ts +103 -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 +56 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +140 -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/uok-gitops-turn-action.test.ts +38 -0
- 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 +6 -5
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -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 +30 -5
- package/src/resources/extensions/gsd/undo.ts +47 -6
- package/src/resources/extensions/gsd/unit-registry.ts +11 -3
- 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/worktree-manager.ts +41 -1
- 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/app/_not-found/page-a6fb1847f67f167c.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6644fc6ee8ca1247.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → zQLcXm0Za8lexoXtgDpMG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → zQLcXm0Za8lexoXtgDpMG}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -28,16 +28,16 @@ See [CHANGELOG.md](./CHANGELOG.md) for release-by-release fixes and [Legacy Rele
|
|
|
28
28
|
## Latest Release Highlights
|
|
29
29
|
|
|
30
30
|
<!-- release-highlights:start -->
|
|
31
|
-
Latest release: **v1.
|
|
31
|
+
Latest release: **v1.4.0**
|
|
32
32
|
|
|
33
|
-
- **
|
|
34
|
-
- **
|
|
35
|
-
- **
|
|
36
|
-
- **
|
|
37
|
-
- **
|
|
38
|
-
- **
|
|
39
|
-
- **
|
|
40
|
-
- **
|
|
33
|
+
- **models:** Add Claude Sonnet 5.
|
|
34
|
+
- **Added:** Add Hermes plugin installer.
|
|
35
|
+
- **compat:** Report .planning/ drift in /gsd sync and doctor.
|
|
36
|
+
- **compat:** Project to .planning/ inside renderAllFromDb.
|
|
37
|
+
- **compat:** Add external-planning-edit drift handler.
|
|
38
|
+
- **compat:** Add DB → .planning/ projection writer.
|
|
39
|
+
- **compat:** Extract .planning/ layout detector.
|
|
40
|
+
- **compat:** Extend marker schema 1→2 with planning field.
|
|
41
41
|
|
|
42
42
|
<!-- release-highlights:end -->
|
|
43
43
|
|
|
@@ -158,7 +158,7 @@ Need help choosing settings? Use the [GSD Pi web configurator](https://pi.opengs
|
|
|
158
158
|
gsd
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
Run the setup flow, choose your preferred model provider, and open a project directory. GSD stores project planning and runtime state in `.gsd
|
|
161
|
+
Run the setup flow, choose your preferred model provider, and open a project directory. GSD stores project planning and runtime state in `.gsd/`, with gitignored sibling runtime directories such as `.gsd-backups/` for migration snapshots. Stale `.gsd-backups/migrate-*` snapshots are pruned after 30 days once the flat-phase `.gsd/phases/` migration is complete.
|
|
162
162
|
|
|
163
163
|
For a full first-run walkthrough, see [Getting Started With gsd-pi](./docs/user-docs/getting-started.md).
|
|
164
164
|
|
package/dist/cli.js
CHANGED
|
@@ -22,15 +22,23 @@ import { markStartup, printStartupTimings } from './startup-timings.js';
|
|
|
22
22
|
import { applyRtkProcessEnv, GSD_RTK_DISABLED_ENV, isTruthy } from './rtk-shared.js';
|
|
23
23
|
let piCodingAgentModulePromise;
|
|
24
24
|
let agentCoreModulePromise;
|
|
25
|
-
let
|
|
25
|
+
let interactiveModeModulePromise;
|
|
26
|
+
let printModeModulePromise;
|
|
27
|
+
let rpcModeModulePromise;
|
|
26
28
|
function loadPiCodingAgentModule() {
|
|
27
29
|
return (piCodingAgentModulePromise ??= import('@gsd/pi-coding-agent'));
|
|
28
30
|
}
|
|
29
31
|
function loadAgentCoreModule() {
|
|
30
32
|
return (agentCoreModulePromise ??= import('@gsd/agent-core'));
|
|
31
33
|
}
|
|
32
|
-
function
|
|
33
|
-
return (
|
|
34
|
+
function loadInteractiveModeModule() {
|
|
35
|
+
return (interactiveModeModulePromise ??= import('@gsd/agent-modes/modes/interactive/interactive-mode.js'));
|
|
36
|
+
}
|
|
37
|
+
function loadPrintModeModule() {
|
|
38
|
+
return (printModeModulePromise ??= import('@gsd/agent-modes/modes/print-mode.js'));
|
|
39
|
+
}
|
|
40
|
+
function loadRpcModeModule() {
|
|
41
|
+
return (rpcModeModulePromise ??= import('@gsd/agent-modes/modes/rpc/rpc-mode.js'));
|
|
34
42
|
}
|
|
35
43
|
// ---------------------------------------------------------------------------
|
|
36
44
|
// V8 compile cache — Node 22+ can cache compiled bytecode across runs,
|
|
@@ -511,7 +519,6 @@ if (!isPrintMode &&
|
|
|
511
519
|
}
|
|
512
520
|
const { AuthStorage, DefaultResourceLoader, ModelRegistry, SettingsManager, SessionManager, } = await loadPiCodingAgentModule();
|
|
513
521
|
const { createAgentSession } = await loadAgentCoreModule();
|
|
514
|
-
const { InteractiveMode, runPrintMode, runRpcMode } = await loadAgentModesModule();
|
|
515
522
|
markStartup('loadPiCodingAgent');
|
|
516
523
|
// Pi's tool bootstrap can mis-detect already-installed fd/rg on some systems
|
|
517
524
|
// because spawnSync(..., ["--version"]) returns EPERM despite a zero exit code.
|
|
@@ -530,6 +537,9 @@ markStartup('ModelRegistry');
|
|
|
530
537
|
const settingsManager = SettingsManager.create(process.cwd(), agentDir);
|
|
531
538
|
applySecurityOverrides(settingsManager);
|
|
532
539
|
markStartup('SettingsManager.create');
|
|
540
|
+
const { configureHttpDispatcher } = await import('@gsd/pi-coding-agent/core/http-dispatcher.js');
|
|
541
|
+
configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());
|
|
542
|
+
markStartup('configureHttpDispatcher');
|
|
533
543
|
// Run onboarding wizard on first launch (no LLM provider configured)
|
|
534
544
|
if (!isPrintMode && shouldRunOnboarding(authStorage, settingsManager.getDefaultProvider())) {
|
|
535
545
|
await runOnboarding(authStorage);
|
|
@@ -651,6 +661,7 @@ if (isPrintMode) {
|
|
|
651
661
|
applyModelOverride(session, modelRegistry, cliFlags.model);
|
|
652
662
|
const mode = cliFlags.mode || 'text';
|
|
653
663
|
if (mode === 'rpc') {
|
|
664
|
+
const { runRpcMode } = await loadRpcModeModule();
|
|
654
665
|
printStartupTimings();
|
|
655
666
|
await runRpcMode(session);
|
|
656
667
|
process.exit(0);
|
|
@@ -674,6 +685,7 @@ if (isPrintMode) {
|
|
|
674
685
|
// MCP server runs until the transport closes; keep alive
|
|
675
686
|
await new Promise(() => { });
|
|
676
687
|
}
|
|
688
|
+
const { runPrintMode } = await loadPrintModeModule();
|
|
677
689
|
printStartupTimings();
|
|
678
690
|
await runPrintMode(session, {
|
|
679
691
|
mode: mode,
|
|
@@ -809,6 +821,7 @@ if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
|
809
821
|
: 'stdout is';
|
|
810
822
|
printNonTtyErrorAndExit(missing, true);
|
|
811
823
|
}
|
|
824
|
+
const { InteractiveMode } = await loadInteractiveModeModule();
|
|
812
825
|
const interactiveMode = new InteractiveMode(session);
|
|
813
826
|
markStartup('InteractiveMode');
|
|
814
827
|
printStartupTimings();
|
package/dist/headless-answers.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* default auto-responder or supervised mode.
|
|
7
7
|
*/
|
|
8
8
|
import { readFileSync } from 'node:fs';
|
|
9
|
-
import { serializeJsonLine } from '@gsd/agent-modes';
|
|
9
|
+
import { serializeJsonLine } from '@gsd/agent-modes/modes/rpc/jsonl.js';
|
|
10
10
|
import { canonicalHeadlessToolName } from './headless-events.js';
|
|
11
11
|
export function normalizeQuestionId(id) {
|
|
12
12
|
return id.trim().toLowerCase().replace(/[-\s]+/g, '_').replace(/_confirm$/, '');
|
package/dist/headless-ui.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* formats progress events for stderr output, and reads orchestrator
|
|
6
6
|
* commands from stdin in supervised mode.
|
|
7
7
|
*/
|
|
8
|
-
import { RpcClient } from '@gsd/agent-modes';
|
|
8
|
+
import type { RpcClient } from '@gsd/agent-modes/modes/rpc/rpc-client.js';
|
|
9
9
|
interface ExtensionUIRequest {
|
|
10
10
|
type: 'extension_ui_request';
|
|
11
11
|
id: string;
|
package/dist/headless-ui.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* formats progress events for stderr output, and reads orchestrator
|
|
6
6
|
* commands from stdin in supervised mode.
|
|
7
7
|
*/
|
|
8
|
-
import { attachJsonlLineReader } from '@gsd/agent-modes';
|
|
8
|
+
import { attachJsonlLineReader } from '@gsd/agent-modes/modes/rpc/jsonl.js';
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
10
|
// ANSI Color Helpers
|
|
11
11
|
// ---------------------------------------------------------------------------
|
package/dist/headless.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import { existsSync, mkdirSync, writeFileSync, writeSync } from 'node:fs';
|
|
15
15
|
import { join } from 'node:path';
|
|
16
16
|
import { resolve } from 'node:path';
|
|
17
|
-
import { RpcClient } from '@gsd/agent-modes';
|
|
17
|
+
import { RpcClient } from '@gsd/agent-modes/modes/rpc/rpc-client.js';
|
|
18
18
|
import { SessionManager } from '@gsd/pi-coding-agent';
|
|
19
19
|
import { getProjectSessionsDir } from './project-sessions.js';
|
|
20
20
|
import { loadAndValidateAnswerFile, AnswerInjector } from './headless-answers.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
6cd0d33f2832351c
|
|
@@ -46,6 +46,15 @@ export const CLAUDE_CODE_MODELS = [
|
|
|
46
46
|
contextWindow: 1_000_000,
|
|
47
47
|
maxTokens: 128_000,
|
|
48
48
|
},
|
|
49
|
+
{
|
|
50
|
+
id: "claude-sonnet-5",
|
|
51
|
+
name: "Claude Sonnet 5 (via Claude Code)",
|
|
52
|
+
reasoning: true,
|
|
53
|
+
input: ["text", "image"],
|
|
54
|
+
cost: ZERO_COST,
|
|
55
|
+
contextWindow: 1_000_000,
|
|
56
|
+
maxTokens: 128_000,
|
|
57
|
+
},
|
|
49
58
|
{
|
|
50
59
|
id: "claude-sonnet-4-6",
|
|
51
60
|
name: "Claude Sonnet 4.6 (via Claude Code)",
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Auto-mode artifact verification and worktree path fallbacks.
|
|
3
|
+
import { parseUnitId } from "./unit-id.js";
|
|
4
|
+
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
5
|
+
import { clearParseCache } from "./files.js";
|
|
6
|
+
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
7
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGatesForTurn, } from "./gsd-db.js";
|
|
8
|
+
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
9
|
+
import { isValidationTerminal } from "./state.js";
|
|
10
|
+
import { getErrorMessage } from "./error-utils.js";
|
|
11
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
12
|
+
import { resolveSlicePath, resolveSliceFile, resolveTasksDir, resolveTaskFiles, relSliceFile, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { execFileSync } from "node:child_process";
|
|
15
|
+
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
16
|
+
import { dirname, join, resolve } from "node:path";
|
|
17
|
+
import { resolveExpectedArtifactPath, resolveExistingSliceResearchPath, } from "./auto-artifact-paths.js";
|
|
18
|
+
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
19
|
+
import { hasVerdict } from "./verdict-parser.js";
|
|
20
|
+
import { validateArtifact } from "./schemas/validate.js";
|
|
21
|
+
import { getProjectResearchStatus } from "./project-research-policy.js";
|
|
22
|
+
import { isGsdWorktreePath } from "./worktree-root.js";
|
|
23
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
24
|
+
import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
25
|
+
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
26
|
+
import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
|
|
27
|
+
import { proveMilestoneCloseout } from "./milestone-closeout-proof.js";
|
|
28
|
+
/**
|
|
29
|
+
* Optional override for the legacy roadmap parser used by verifyExpectedArtifact.
|
|
30
|
+
* Production leaves this null so the real parseLegacyRoadmap runs; tests inject
|
|
31
|
+
* a throwing function to deterministically exercise the parse-failure catches.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
let _roadmapParserFn = null;
|
|
35
|
+
/**
|
|
36
|
+
* Inject an override for the legacy roadmap parser, returning a function that
|
|
37
|
+
* restores the default (real parser) behavior. No production caller.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export function _setRoadmapParserFnForTests(fn) {
|
|
41
|
+
const previous = _roadmapParserFn;
|
|
42
|
+
_roadmapParserFn = fn;
|
|
43
|
+
return () => { _roadmapParserFn = previous; };
|
|
44
|
+
}
|
|
45
|
+
function parseRoadmapForRecovery(content) {
|
|
46
|
+
if (_roadmapParserFn)
|
|
47
|
+
return _roadmapParserFn(content);
|
|
48
|
+
return parseLegacyRoadmap(content);
|
|
49
|
+
}
|
|
50
|
+
export function diagnoseWorktreeIntegrityFailure(basePath) {
|
|
51
|
+
if (!isGsdWorktreePath(basePath))
|
|
52
|
+
return null;
|
|
53
|
+
if (!existsSync(basePath)) {
|
|
54
|
+
return `Worktree integrity failure: ${basePath} does not exist. Repair or recreate the worktree before retrying.`;
|
|
55
|
+
}
|
|
56
|
+
const gitPath = join(basePath, ".git");
|
|
57
|
+
if (!existsSync(gitPath)) {
|
|
58
|
+
return `Worktree integrity failure: ${basePath} is not a valid git worktree (.git missing). Repair or recreate the worktree before retrying.`;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
execFileSync("git", ["rev-parse", "--git-dir"], {
|
|
62
|
+
cwd: basePath,
|
|
63
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
64
|
+
encoding: "utf-8",
|
|
65
|
+
});
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
return `Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${getErrorMessage(err).split("\n")[0]}). Repair or recreate the worktree before retrying.`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function resolveArtifactVerificationBase(unitId, base) {
|
|
73
|
+
const { milestone } = parseUnitId(unitId);
|
|
74
|
+
if (!MILESTONE_ID_RE.test(milestone))
|
|
75
|
+
return base;
|
|
76
|
+
return resolveCanonicalMilestoneRoot(base, milestone);
|
|
77
|
+
}
|
|
78
|
+
function hasCapturedWorkflowPrefs(base) {
|
|
79
|
+
const prefsPath = resolveExpectedArtifactPath("workflow-preferences", "WORKFLOW-PREFS", base);
|
|
80
|
+
if (!prefsPath || !existsSync(prefsPath))
|
|
81
|
+
return false;
|
|
82
|
+
const content = readFileSync(prefsPath, "utf-8");
|
|
83
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
84
|
+
return !!match && /^workflow_prefs_captured:\s*true\s*$/m.test(match[1]);
|
|
85
|
+
}
|
|
86
|
+
function hasValidResearchDecision(base) {
|
|
87
|
+
const decisionPath = resolveExpectedArtifactPath("research-decision", "RESEARCH-DECISION", base);
|
|
88
|
+
if (!decisionPath || !existsSync(decisionPath))
|
|
89
|
+
return false;
|
|
90
|
+
try {
|
|
91
|
+
const cfg = JSON.parse(readFileSync(decisionPath, "utf-8"));
|
|
92
|
+
return cfg.decision === "research" || cfg.decision === "skip";
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function hasCompleteProjectResearch(base) {
|
|
99
|
+
return getProjectResearchStatus(base).complete;
|
|
100
|
+
}
|
|
101
|
+
function escapeRegExp(value) {
|
|
102
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
103
|
+
}
|
|
104
|
+
function hasCheckedTaskCompletionOnDisk(base, mid, sid, tid) {
|
|
105
|
+
const slicePath = resolveSlicePath(base, mid, sid);
|
|
106
|
+
if (!slicePath)
|
|
107
|
+
return false;
|
|
108
|
+
const planAbs = resolveSliceFile(base, mid, sid, "PLAN");
|
|
109
|
+
if (!planAbs || !existsSync(planAbs))
|
|
110
|
+
return false;
|
|
111
|
+
const planContent = readFileSync(planAbs, "utf-8");
|
|
112
|
+
const cbRe = new RegExp(`^\\s*-\\s+\\[[xX]\\]\\s+\\*\\*${escapeRegExp(tid)}(?:\\*\\*)?:`, "m");
|
|
113
|
+
return cbRe.test(planContent);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check whether the expected artifact(s) for a unit exist on disk.
|
|
117
|
+
* Returns true if all required artifacts exist, or if the unit type has no
|
|
118
|
+
* single verifiable artifact (e.g., replan-slice).
|
|
119
|
+
*/
|
|
120
|
+
export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
121
|
+
if (unitType.startsWith("hook/"))
|
|
122
|
+
return true;
|
|
123
|
+
clearPathCache();
|
|
124
|
+
clearParseCache();
|
|
125
|
+
if (unitType === "rewrite-docs") {
|
|
126
|
+
const overridesPath = resolveGsdRootFile(base, "OVERRIDES");
|
|
127
|
+
if (!existsSync(overridesPath))
|
|
128
|
+
return true;
|
|
129
|
+
const content = readFileSync(overridesPath, "utf-8");
|
|
130
|
+
return !content.includes("**Scope:** active");
|
|
131
|
+
}
|
|
132
|
+
if (unitType === "workflow-preferences") {
|
|
133
|
+
return hasCapturedWorkflowPrefs(base);
|
|
134
|
+
}
|
|
135
|
+
if (unitType === "triage-captures") {
|
|
136
|
+
const pending = loadPendingCaptures(base);
|
|
137
|
+
if (pending.length === 0)
|
|
138
|
+
return true;
|
|
139
|
+
logWarning("recovery", `verify-fail triage-captures ${unitId}: ${pending.length} pending capture(s) remain in CAPTURES.md`);
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
if (unitType === "quick-task") {
|
|
143
|
+
const { slice: captureId } = parseUnitId(unitId);
|
|
144
|
+
const capture = captureId ? loadAllCaptures(base).find((entry) => entry.id === captureId) : undefined;
|
|
145
|
+
if (capture?.executed === true)
|
|
146
|
+
return true;
|
|
147
|
+
logWarning("recovery", `verify-fail quick-task ${unitId}: capture ${captureId ?? "(missing capture id)"} not found or not marked executed`);
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
if (unitType === "discuss-project") {
|
|
151
|
+
const projectPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
152
|
+
return !!projectPath && existsSync(projectPath) && validateArtifact(projectPath, "project").ok;
|
|
153
|
+
}
|
|
154
|
+
if (unitType === "discuss-requirements") {
|
|
155
|
+
const requirementsPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
156
|
+
return !!requirementsPath && existsSync(requirementsPath) && validateArtifact(requirementsPath, "requirements").ok;
|
|
157
|
+
}
|
|
158
|
+
if (unitType === "research-decision") {
|
|
159
|
+
return hasValidResearchDecision(base);
|
|
160
|
+
}
|
|
161
|
+
if (unitType === "research-project") {
|
|
162
|
+
return hasCompleteProjectResearch(base);
|
|
163
|
+
}
|
|
164
|
+
if (unitType === "reactive-execute") {
|
|
165
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
166
|
+
if (!mid || !sid || !batchPart)
|
|
167
|
+
return false;
|
|
168
|
+
const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
169
|
+
if (blockerPath && existsSync(blockerPath)) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
const slicePath = resolveSlicePath(base, mid, sid);
|
|
173
|
+
if (!slicePath)
|
|
174
|
+
return false;
|
|
175
|
+
const plusIdx = batchPart.indexOf("+");
|
|
176
|
+
if (plusIdx === -1) {
|
|
177
|
+
const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
|
|
178
|
+
const summaryFiles = resolveTaskFiles(tDir, "SUMMARY");
|
|
179
|
+
return summaryFiles.length > 0;
|
|
180
|
+
}
|
|
181
|
+
const batchIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
|
|
182
|
+
if (batchIds.length === 0)
|
|
183
|
+
return false;
|
|
184
|
+
const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
|
|
185
|
+
const existingSummaries = new Set(resolveTaskFiles(tDir, "SUMMARY").map((f) => f.replace(/-SUMMARY\.md$/i, "").toUpperCase()));
|
|
186
|
+
for (const tid of batchIds) {
|
|
187
|
+
if (!existingSummaries.has(tid.toUpperCase()))
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
if (unitType === "gate-evaluate") {
|
|
193
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
194
|
+
if (!mid || !sid || !batchPart)
|
|
195
|
+
return false;
|
|
196
|
+
const plusIdx = batchPart.indexOf("+");
|
|
197
|
+
if (plusIdx === -1)
|
|
198
|
+
return true;
|
|
199
|
+
const gateIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
|
|
200
|
+
if (gateIds.length === 0)
|
|
201
|
+
return true;
|
|
202
|
+
try {
|
|
203
|
+
if (!isDbAvailable())
|
|
204
|
+
return false;
|
|
205
|
+
const pending = getPendingGatesForTurn(mid, sid, "gate-evaluate");
|
|
206
|
+
const pendingIds = new Set(pending.map((g) => g.gate_id));
|
|
207
|
+
for (const gid of gateIds) {
|
|
208
|
+
if (pendingIds.has(gid))
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
|
|
218
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
219
|
+
if (!mid)
|
|
220
|
+
return false;
|
|
221
|
+
const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
222
|
+
if (blockerPath && existsSync(blockerPath)) {
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
const roadmapFile = resolveExpectedArtifactPath("plan-milestone", mid, base);
|
|
226
|
+
if (!roadmapFile || !existsSync(roadmapFile)) {
|
|
227
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const roadmap = parseRoadmapForRecovery(readFileSync(roadmapFile, "utf-8"));
|
|
232
|
+
const milestoneResearchFile = resolveExpectedArtifactPath("research-milestone", mid, base);
|
|
233
|
+
const hasMilestoneResearch = !!milestoneResearchFile && existsSync(milestoneResearchFile);
|
|
234
|
+
for (const slice of roadmap.slices) {
|
|
235
|
+
if (slice.done)
|
|
236
|
+
continue;
|
|
237
|
+
if (hasMilestoneResearch && slice.id === "S01")
|
|
238
|
+
continue;
|
|
239
|
+
const depsComplete = (slice.depends ?? []).every((depId) => {
|
|
240
|
+
const summaryPath = resolveExpectedArtifactPath("complete-slice", `${mid}/${depId}`, base);
|
|
241
|
+
return !!summaryPath && existsSync(summaryPath);
|
|
242
|
+
});
|
|
243
|
+
if (!depsComplete)
|
|
244
|
+
continue;
|
|
245
|
+
if (!resolveExistingSliceResearchPath(base, mid, slice.id)) {
|
|
246
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: slice ${slice.id} missing RESEARCH`);
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
logWarning("recovery", `parallel-research verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const artifactBase = resolveArtifactVerificationBase(unitId, base);
|
|
258
|
+
let absPath = resolveExpectedArtifactPath(unitType, unitId, artifactBase);
|
|
259
|
+
if (!absPath || !existsSync(absPath)) {
|
|
260
|
+
const projectRoot = resolve(resolveWorktreeProjectRoot(artifactBase));
|
|
261
|
+
if (projectRoot && projectRoot !== artifactBase) {
|
|
262
|
+
const projectPath = resolveExpectedArtifactPath(unitType, unitId, projectRoot);
|
|
263
|
+
if (projectPath && existsSync(projectPath)) {
|
|
264
|
+
absPath = projectPath;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!absPath) {
|
|
269
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveExpectedArtifactPath returned null (no artifact contract registered for this unit type)`);
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
if (!existsSync(absPath)) {
|
|
273
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(artifactBase);
|
|
274
|
+
if (worktreeFailure) {
|
|
275
|
+
logError("recovery", `${worktreeFailure} Unit: ${unitType} ${unitId}.`);
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
if (unitType === "validate-milestone") {
|
|
282
|
+
const validationContent = readFileSync(absPath, "utf-8");
|
|
283
|
+
if (!isValidationTerminal(validationContent)) {
|
|
284
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: validation not terminal (len=${validationContent.length}) at ${absPath}`);
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (unitType === "run-uat") {
|
|
289
|
+
const assessmentContent = readFileSync(absPath, "utf-8");
|
|
290
|
+
if (!hasVerdict(assessmentContent)) {
|
|
291
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: assessment missing verdict at ${absPath}`);
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (unitType === "plan-milestone") {
|
|
296
|
+
try {
|
|
297
|
+
const roadmap = parseRoadmapForRecovery(readFileSync(absPath, "utf-8"));
|
|
298
|
+
if (roadmap.slices.length === 0) {
|
|
299
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (unitType === "plan-slice") {
|
|
309
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
310
|
+
if (mid && sid) {
|
|
311
|
+
try {
|
|
312
|
+
let taskIds = null;
|
|
313
|
+
let dbPrimary = false;
|
|
314
|
+
if (isDbAvailable()) {
|
|
315
|
+
const refreshed = refreshWorkflowDatabaseFromDisk();
|
|
316
|
+
if (refreshed) {
|
|
317
|
+
const tasks = getSliceTasks(mid, sid);
|
|
318
|
+
if (tasks.length > 0) {
|
|
319
|
+
taskIds = tasks.map(t => t.id);
|
|
320
|
+
dbPrimary = true;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (!taskIds) {
|
|
325
|
+
const planContent = readFileSync(absPath, "utf-8");
|
|
326
|
+
const hasCheckboxTask = /^\s*- \[[xX ]\] \*\*T\d+/m.test(planContent);
|
|
327
|
+
const hasHeadingTask = /^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
328
|
+
if (!hasCheckboxTask && !hasHeadingTask) {
|
|
329
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
const plan = parseLegacyPlan(planContent);
|
|
333
|
+
if (plan.tasks.length > 0)
|
|
334
|
+
taskIds = plan.tasks.map((t) => t.id);
|
|
335
|
+
}
|
|
336
|
+
if (taskIds && taskIds.length > 0) {
|
|
337
|
+
const tasksDir = join(dirname(absPath), "tasks");
|
|
338
|
+
if (existsSync(tasksDir)) {
|
|
339
|
+
for (const tid of taskIds) {
|
|
340
|
+
const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
|
|
341
|
+
if (!existsSync(taskPlanFile)) {
|
|
342
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: task plan missing ${taskPlanFile}`);
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else if (!dbPrimary && !absPath.replace(/\\/g, "/").includes(`.gsd/${LAYOUT_SEGMENTS.level1}`)) {
|
|
348
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: tasks dir missing at ${tasksDir}`);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (unitType === "execute-task") {
|
|
359
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
360
|
+
if (mid && sid && tid) {
|
|
361
|
+
const dbTask = getTask(mid, sid, tid);
|
|
362
|
+
if (dbTask) {
|
|
363
|
+
if (dbTask.status !== "complete" && dbTask.status !== "done" && !hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
else if (!isDbAvailable()) {
|
|
368
|
+
if (!hasCheckedTaskCompletionOnDisk(base, mid, sid, tid))
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (unitType === "complete-slice") {
|
|
377
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
378
|
+
if (mid && sid) {
|
|
379
|
+
const uatPath = resolveSliceFile(base, mid, sid, "UAT")
|
|
380
|
+
?? join(base, relSliceFile(base, mid, sid, "UAT"));
|
|
381
|
+
if (!existsSync(uatPath))
|
|
382
|
+
return false;
|
|
383
|
+
const dbSlice = getSlice(mid, sid);
|
|
384
|
+
if (dbSlice) {
|
|
385
|
+
if (dbSlice.status !== "complete")
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
else if (!isDbAvailable()) {
|
|
389
|
+
const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
390
|
+
if (roadmapFile && existsSync(roadmapFile)) {
|
|
391
|
+
try {
|
|
392
|
+
const roadmapContent = readFileSync(roadmapFile, "utf-8");
|
|
393
|
+
const roadmap = parseRoadmapForRecovery(roadmapContent);
|
|
394
|
+
const slice = roadmap.slices.find((s) => s.id === sid);
|
|
395
|
+
if (slice && !slice.done)
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
catch (e) {
|
|
399
|
+
logWarning("recovery", `roadmap parse failed: ${e.message}`);
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (unitType === "complete-milestone") {
|
|
407
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
408
|
+
if (!mid)
|
|
409
|
+
return false;
|
|
410
|
+
const closeoutProof = proveMilestoneCloseout(mid, {
|
|
411
|
+
refreshFromDisk: true,
|
|
412
|
+
summaryArtifactBasePath: artifactBase,
|
|
413
|
+
implementationEvidence: {
|
|
414
|
+
basePath: base,
|
|
415
|
+
requirement: "not-absent",
|
|
416
|
+
},
|
|
417
|
+
});
|
|
418
|
+
if (!closeoutProof.ok) {
|
|
419
|
+
if (!isDbAvailable() && closeoutProof.reason === "db-unavailable") {
|
|
420
|
+
const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
|
|
421
|
+
return summaryOutcome !== "failure" && hasImplementationArtifacts(base, mid) !== "absent";
|
|
422
|
+
}
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
@@ -78,6 +78,8 @@ export class AutoSession {
|
|
|
78
78
|
currentUnitRouting = null;
|
|
79
79
|
currentMilestoneId = null;
|
|
80
80
|
sourceObservations = new SourceObservationStore();
|
|
81
|
+
/** Live tool-surface snapshot for dashboard / runtime telemetry while auto is active. */
|
|
82
|
+
toolSurfaceSnapshot = null;
|
|
81
83
|
// ── Model state ──────────────────────────────────────────────────────────
|
|
82
84
|
autoModeStartModel = null;
|
|
83
85
|
/** Explicit /gsd model pin captured at bootstrap (session-scoped policy override). */
|
|
@@ -122,6 +124,13 @@ export class AutoSession {
|
|
|
122
124
|
* the issues after MAX_PRE_EXEC_RETRIES re-attempts.
|
|
123
125
|
*/
|
|
124
126
|
preExecRetryCount = new Map();
|
|
127
|
+
/**
|
|
128
|
+
* Tracks how many times each slice unit has been re-dispatched to plan-slice
|
|
129
|
+
* because task plan files were missing. Keyed by unitId (e.g. "M001/S01").
|
|
130
|
+
* Separate from preExecRetryCount so pre-exec gate failures do not block or
|
|
131
|
+
* conflate with missing-task-plan recovery.
|
|
132
|
+
*/
|
|
133
|
+
missingTaskPlanRetryCount = new Map();
|
|
125
134
|
// ── Tool invocation errors (#2883) ──────────────────────────────────
|
|
126
135
|
/** Set when a GSD tool execution ends with isError due to malformed/truncated
|
|
127
136
|
* JSON arguments. Checked by postUnitPreVerification to break retry loops. */
|
|
@@ -270,6 +279,7 @@ export class AutoSession {
|
|
|
270
279
|
this.unitRecoveryCount.clear();
|
|
271
280
|
// Unit
|
|
272
281
|
this.clearCurrentUnit();
|
|
282
|
+
this.toolSurfaceSnapshot = null;
|
|
273
283
|
this.currentTraceId = null;
|
|
274
284
|
this.currentTurnId = null;
|
|
275
285
|
this.currentUnitRouting = null;
|
|
@@ -307,6 +317,7 @@ export class AutoSession {
|
|
|
307
317
|
this.consecutiveCompleteBootstraps = 0;
|
|
308
318
|
this.lastPreExecFailure = null;
|
|
309
319
|
this.preExecRetryCount.clear();
|
|
320
|
+
this.missingTaskPlanRetryCount.clear();
|
|
310
321
|
this.lastToolInvocationError = null;
|
|
311
322
|
this.toolUnavailableRetries = 0;
|
|
312
323
|
this.lastUnitAgentEndMessages = null;
|
|
@@ -25,7 +25,7 @@ export function decideVerificationRetry(input) {
|
|
|
25
25
|
return { action: "pause", reason: "missing-retry-context" };
|
|
26
26
|
}
|
|
27
27
|
const key = verificationRetryKey(unitType, retryInfo.unitId);
|
|
28
|
-
const failureHash = hashVerificationFailureContext(retryInfo.failureContext);
|
|
28
|
+
const failureHash = hashVerificationFailureContext(retryInfo.signature ?? retryInfo.failureContext);
|
|
29
29
|
if (input.previousFailureHash === failureHash) {
|
|
30
30
|
return {
|
|
31
31
|
action: "pause",
|