@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.
Files changed (550) hide show
  1. package/README.md +11 -11
  2. package/dist/cli.js +17 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-ui.d.ts +1 -1
  5. package/dist/headless-ui.js +1 -1
  6. package/dist/headless.js +1 -1
  7. package/dist/onboarding.js +11 -0
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/GSD-WORKFLOW.md +20 -25
  10. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  11. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +61 -50
  12. package/dist/resources/extensions/cursor-cli/index.js +16 -0
  13. package/dist/resources/extensions/cursor-cli/models.js +63 -0
  14. package/dist/resources/extensions/cursor-cli/package.json +11 -0
  15. package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
  16. package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
  17. package/dist/resources/extensions/gsd/activity-log.js +4 -1
  18. package/dist/resources/extensions/gsd/artifact-verification.js +431 -0
  19. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  20. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  22. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +32 -11
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  26. package/dist/resources/extensions/gsd/auto-prompts.js +83 -25
  27. package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
  28. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  29. package/dist/resources/extensions/gsd/auto-start.js +4 -3
  30. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
  33. package/dist/resources/extensions/gsd/auto.js +32 -10
  34. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -4
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +147 -23
  38. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +56 -36
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +29 -5
  40. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  41. package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
  42. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  43. package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +154 -2
  45. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  46. package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
  47. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  48. package/dist/resources/extensions/gsd/db/queries.js +39 -0
  49. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  50. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  51. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  52. package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  54. package/dist/resources/extensions/gsd/doctor-engine-checks.js +227 -5
  55. package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  57. package/dist/resources/extensions/gsd/doctor.js +93 -3
  58. package/dist/resources/extensions/gsd/exec-sandbox.js +14 -4
  59. package/dist/resources/extensions/gsd/flat-phase-migration.js +119 -23
  60. package/dist/resources/extensions/gsd/git-service.js +61 -8
  61. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  62. package/dist/resources/extensions/gsd/guidance.js +1 -0
  63. package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
  64. package/dist/resources/extensions/gsd/guided-flow.js +40 -2
  65. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  66. package/dist/resources/extensions/gsd/key-manager.js +1 -0
  67. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  68. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  69. package/dist/resources/extensions/gsd/markdown-renderer.js +27 -15
  70. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  71. package/dist/resources/extensions/gsd/metrics.js +4 -4
  72. package/dist/resources/extensions/gsd/migrate-external.js +22 -5
  73. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  74. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  75. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  76. package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
  77. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  78. package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
  79. package/dist/resources/extensions/gsd/preferences.js +29 -2
  80. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  81. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  82. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  83. package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
  84. package/dist/resources/extensions/gsd/repository-registry.js +6 -1
  85. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  86. package/dist/resources/extensions/gsd/safe-fs.js +23 -2
  87. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  88. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  89. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  90. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  91. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
  92. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  93. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  94. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  95. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  96. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  97. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
  98. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  99. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  100. package/dist/resources/extensions/gsd/state.js +12 -611
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
  104. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  105. package/dist/resources/extensions/gsd/tools/plan-task.js +103 -12
  106. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
  107. package/dist/resources/extensions/gsd/undo.js +43 -6
  108. package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
  109. package/dist/resources/extensions/gsd/unit-registry.js +11 -3
  110. package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
  111. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  112. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  113. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  114. package/dist/resources/extensions/gsd/workspace.js +26 -8
  115. package/dist/resources/extensions/gsd/worktree-manager.js +140 -5
  116. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  117. package/dist/web/standalone/.next/BUILD_ID +1 -1
  118. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  119. package/dist/web/standalone/.next/build-manifest.json +3 -3
  120. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  121. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  122. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/index.html +1 -1
  142. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  144. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  145. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  150. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  151. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  154. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  155. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  156. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  157. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  158. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  159. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  160. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  161. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  162. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  163. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  164. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  165. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  166. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  167. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  168. package/dist/wizard.d.ts +8 -0
  169. package/dist/wizard.js +8 -1
  170. package/integrations/hermes/__init__.py +31 -0
  171. package/integrations/hermes/tests/test_directory_loader.py +37 -0
  172. package/package.json +8 -8
  173. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
  174. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
  175. package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
  176. package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
  177. package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
  178. package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
  179. package/packages/cloud-mcp-gateway/package.json +2 -2
  180. package/packages/contracts/package.json +1 -1
  181. package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
  182. package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
  183. package/packages/daemon/dist/cloud-runtime.js +25 -1
  184. package/packages/daemon/dist/cloud-runtime.js.map +1 -1
  185. package/packages/daemon/dist/cloud-runtime.test.js +51 -0
  186. package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
  187. package/packages/daemon/dist/message-batcher.d.ts +7 -0
  188. package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
  189. package/packages/daemon/dist/message-batcher.js +13 -0
  190. package/packages/daemon/dist/message-batcher.js.map +1 -1
  191. package/packages/daemon/dist/message-batcher.test.js +48 -0
  192. package/packages/daemon/dist/message-batcher.test.js.map +1 -1
  193. package/packages/daemon/package.json +5 -5
  194. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  195. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  196. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  197. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  198. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
  199. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  200. package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
  201. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  202. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  203. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  204. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  205. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  206. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  207. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  208. package/packages/gsd-agent-core/dist/index.js +2 -0
  209. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  210. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  211. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  212. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  213. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  214. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  215. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  216. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  217. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  218. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  219. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  220. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  221. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  222. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  223. package/packages/gsd-agent-core/package.json +5 -5
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  228. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  229. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  233. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -841
  235. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  238. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  241. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  270. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  272. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
  275. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  281. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  282. package/packages/mcp-server/package.json +4 -4
  283. package/packages/native/package.json +1 -1
  284. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  285. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  286. package/packages/pi-agent-core/package.json +1 -1
  287. package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/env-api-keys.js +3 -0
  289. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  290. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  291. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/models.generated.js +38 -0
  293. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  294. package/packages/pi-ai/dist/types.d.ts +2 -2
  295. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/types.js.map +1 -1
  297. package/packages/pi-ai/package.json +1 -1
  298. package/packages/pi-coding-agent/README.md +3 -2
  299. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  301. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  303. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  305. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  307. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  308. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  309. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  310. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  311. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  312. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  313. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  314. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  315. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  317. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  319. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  321. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  323. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  325. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  328. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  329. package/packages/pi-coding-agent/package.json +7 -7
  330. package/packages/pi-tui/package.json +2 -2
  331. package/packages/rpc-client/dist/rpc-client.js +1 -1
  332. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  333. package/packages/rpc-client/package.json +2 -2
  334. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  335. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  336. package/pkg/dist/theme/theme-schema.js +1 -1
  337. package/pkg/dist/theme/theme-schema.js.map +1 -1
  338. package/pkg/dist/theme/theme.d.ts.map +1 -1
  339. package/pkg/dist/theme/theme.js +11 -7
  340. package/pkg/dist/theme/theme.js.map +1 -1
  341. package/pkg/package.json +1 -1
  342. package/scripts/link-workspace-packages.cjs +14 -4
  343. package/src/resources/GSD-WORKFLOW.md +20 -25
  344. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  345. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +67 -49
  346. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  347. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +159 -0
  348. package/src/resources/extensions/cursor-cli/index.ts +18 -0
  349. package/src/resources/extensions/cursor-cli/models.ts +65 -0
  350. package/src/resources/extensions/cursor-cli/package.json +11 -0
  351. package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
  352. package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
  353. package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
  354. package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
  355. package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
  356. package/src/resources/extensions/gsd/activity-log.ts +4 -1
  357. package/src/resources/extensions/gsd/artifact-verification.ts +468 -0
  358. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  360. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  361. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  362. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  363. package/src/resources/extensions/gsd/auto-dispatch.ts +34 -12
  364. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
  365. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  366. package/src/resources/extensions/gsd/auto-prompts.ts +80 -25
  367. package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
  368. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  369. package/src/resources/extensions/gsd/auto-start.ts +4 -3
  370. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
  371. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  372. package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
  373. package/src/resources/extensions/gsd/auto.ts +36 -8
  374. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  375. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -4
  376. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  377. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +171 -23
  378. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
  379. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +60 -37
  380. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -5
  381. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  382. package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
  383. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  384. package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
  385. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +136 -2
  386. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  387. package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
  388. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  389. package/src/resources/extensions/gsd/db/queries.ts +40 -0
  390. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  391. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  392. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  393. package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
  394. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  395. package/src/resources/extensions/gsd/doctor-engine-checks.ts +275 -5
  396. package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
  397. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  398. package/src/resources/extensions/gsd/doctor-types.ts +8 -1
  399. package/src/resources/extensions/gsd/doctor.ts +95 -3
  400. package/src/resources/extensions/gsd/exec-sandbox.ts +13 -4
  401. package/src/resources/extensions/gsd/flat-phase-migration.ts +142 -22
  402. package/src/resources/extensions/gsd/git-service.ts +70 -9
  403. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  404. package/src/resources/extensions/gsd/guidance.ts +2 -0
  405. package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
  406. package/src/resources/extensions/gsd/guided-flow.ts +45 -2
  407. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  408. package/src/resources/extensions/gsd/key-manager.ts +1 -0
  409. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  410. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  411. package/src/resources/extensions/gsd/markdown-renderer.ts +27 -17
  412. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  413. package/src/resources/extensions/gsd/metrics.ts +4 -4
  414. package/src/resources/extensions/gsd/migrate-external.ts +17 -4
  415. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  416. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  417. package/src/resources/extensions/gsd/model-router.ts +4 -5
  418. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  419. package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
  420. package/src/resources/extensions/gsd/preferences-models.ts +6 -3
  421. package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
  422. package/src/resources/extensions/gsd/preferences.ts +38 -4
  423. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  424. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  426. package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
  427. package/src/resources/extensions/gsd/repository-registry.ts +7 -1
  428. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  429. package/src/resources/extensions/gsd/safe-fs.ts +22 -2
  430. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  431. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  432. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  433. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  434. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
  435. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  436. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  437. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  438. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  439. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  440. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
  441. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  442. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  443. package/src/resources/extensions/gsd/state.ts +32 -732
  444. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  445. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  446. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  447. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
  448. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
  449. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  450. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  451. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
  452. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
  453. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  454. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
  455. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
  456. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
  457. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
  458. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
  459. package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
  460. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
  461. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
  462. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  463. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
  464. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  465. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  466. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  467. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  468. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  470. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
  471. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +296 -2
  472. package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  474. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  475. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +74 -2
  476. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
  477. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
  478. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  479. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
  480. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
  481. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  482. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  483. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  484. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
  485. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  486. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  487. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  488. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  489. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  490. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  491. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  492. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  493. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
  494. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
  495. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  496. package/src/resources/extensions/gsd/tests/plan-task.test.ts +307 -1
  497. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  498. package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
  499. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
  500. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  501. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  502. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  503. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
  504. package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
  505. package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
  506. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
  507. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
  508. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
  509. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  511. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
  512. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
  513. package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
  514. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  515. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +203 -0
  516. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
  517. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  518. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
  519. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
  520. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +90 -0
  521. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
  522. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  523. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  524. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  526. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +214 -6
  527. package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
  528. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
  530. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
  531. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  532. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
  533. package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
  534. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  535. package/src/resources/extensions/gsd/tools/plan-task.ts +135 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
  537. package/src/resources/extensions/gsd/undo.ts +47 -6
  538. package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
  539. package/src/resources/extensions/gsd/unit-registry.ts +11 -3
  540. package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
  541. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  542. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  543. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  544. package/src/resources/extensions/gsd/workspace.ts +42 -8
  545. package/src/resources/extensions/gsd/worktree-manager.ts +183 -5
  546. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
  548. package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
  549. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_buildManifest.js +0 -0
  550. /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: verdict.failureContext || formatFailureContext(result),
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 ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
991
- // was deleted before teardown ran). Previously the finally only covered
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 unconditionally regardless of which step above
1061
- // failed. A stale activeWorkspace causes getActiveAutoWorktreeContext()
1062
- // to return wrong data for subsequent operations.
1063
- setActiveWorkspace(null);
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, reclaim context headroom when usage is at
908
- * or above the compaction threshold. Writes a context-mode snapshot first, then
909
- * re-roots the visible command session while leaving the NEXT progress surface.
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
- if (!shouldRerootStepSessionForContext(contextPercent, compactionThreshold)) {
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: ${thresholdDisplay}%). Fresh session ready for /gsd next.`, "info");
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 during auto-mode.
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
- "Keep parameters flat and provide the full slice planning payload, including tasks.",
658
- "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.",
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
- }), { description: "Planned tasks for the slice" }),
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 const MINIMAL_AUTO_BASE_TOOL_NAMES = [
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(MINIMAL_AUTO_BASE_TOOL_NAMES);
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
- // Best-effort never blocks session startup. Skipped inside auto-worktrees
703
- // (migration already ran on the project root before the worktree was created).
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 deferred: legacy .gsd/milestones/ layout detected but the workflow database could not be opened — will retry on next session");
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
- safetyLogWarning("bootstrap", `flat-phase migration: ${err instanceof Error ? err.message : String(err)}`);
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
- return { block: true, reason: loopCheck.reason };
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();