@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.738160b9

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 (488) hide show
  1. package/README.md +1 -1
  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/resources/.managed-resources-content-hash +1 -1
  8. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +11 -2
  10. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  11. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -3
  13. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  14. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  15. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  16. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +34 -20
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  19. package/dist/resources/extensions/gsd/auto-prompts.js +29 -14
  20. package/dist/resources/extensions/gsd/auto-recovery.js +9 -510
  21. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  22. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  23. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  24. package/dist/resources/extensions/gsd/auto.js +19 -10
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
  26. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  27. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
  28. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -21
  31. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
  32. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  34. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  35. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  36. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +17 -11
  38. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  39. package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
  40. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -3
  41. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  42. package/dist/resources/extensions/gsd/db/queries.js +60 -0
  43. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  44. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  45. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  46. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  47. package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
  48. package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  50. package/dist/resources/extensions/gsd/exec-sandbox.js +53 -11
  51. package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
  52. package/dist/resources/extensions/gsd/forensics.js +2 -32
  53. package/dist/resources/extensions/gsd/git-service.js +61 -4
  54. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  55. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  56. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  57. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  59. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  60. package/dist/resources/extensions/gsd/markdown-renderer.js +8 -9
  61. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  62. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  63. package/dist/resources/extensions/gsd/metrics.js +4 -4
  64. package/dist/resources/extensions/gsd/migrate-external.js +11 -2
  65. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  66. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  67. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  68. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  69. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  70. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  71. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  72. package/dist/resources/extensions/gsd/quick.js +45 -2
  73. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  74. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  75. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  76. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  77. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  78. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  79. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  80. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  81. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  82. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  83. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  84. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +45 -2
  85. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  86. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  87. package/dist/resources/extensions/gsd/state.js +12 -611
  88. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  89. package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +43 -14
  91. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  92. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  93. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -5
  94. package/dist/resources/extensions/gsd/undo.js +43 -6
  95. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  96. package/dist/resources/extensions/gsd/unit-registry.js +36 -6
  97. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +33 -3
  98. package/dist/resources/extensions/gsd/validation-block-guard.js +9 -4
  99. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  100. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  101. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  102. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  103. package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
  104. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  105. package/dist/web/standalone/.next/BUILD_ID +1 -1
  106. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  107. package/dist/web/standalone/.next/build-manifest.json +3 -3
  108. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  109. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  110. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/index.html +1 -1
  130. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  132. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  133. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  138. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  139. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  142. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  143. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  144. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  146. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  147. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  148. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  149. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  150. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  151. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  152. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  153. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  154. package/package.json +1 -1
  155. package/packages/cloud-mcp-gateway/package.json +2 -2
  156. package/packages/contracts/dist/workflow.d.ts +1 -0
  157. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  158. package/packages/contracts/dist/workflow.js +2 -0
  159. package/packages/contracts/dist/workflow.js.map +1 -1
  160. package/packages/contracts/package.json +1 -1
  161. package/packages/daemon/package.json +4 -4
  162. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  163. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  164. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  165. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  166. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  167. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  168. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  169. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  170. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  171. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  172. package/packages/gsd-agent-core/dist/index.js +2 -0
  173. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  174. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  175. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  176. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  177. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  178. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  179. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  180. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  181. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  182. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  183. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  184. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  185. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  186. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  187. package/packages/gsd-agent-core/package.json +5 -5
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  193. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  195. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  196. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  197. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  198. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  199. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  201. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  202. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  203. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  204. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  205. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  206. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  207. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  209. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  211. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  213. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  214. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  215. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  226. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  227. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  228. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  229. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  234. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  236. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  237. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
  239. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  242. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  243. package/packages/gsd-agent-modes/package.json +7 -7
  244. package/packages/mcp-server/README.md +1 -1
  245. package/packages/mcp-server/dist/server.d.ts +1 -1
  246. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  247. package/packages/mcp-server/dist/server.js +3 -3
  248. package/packages/mcp-server/dist/server.js.map +1 -1
  249. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  250. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  251. package/packages/mcp-server/dist/workflow-tools.js +35 -21
  252. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  253. package/packages/mcp-server/package.json +4 -4
  254. package/packages/native/package.json +1 -1
  255. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  256. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  257. package/packages/pi-agent-core/package.json +1 -1
  258. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  259. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/models.generated.js +38 -0
  261. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  262. package/packages/pi-ai/package.json +1 -1
  263. package/packages/pi-coding-agent/README.md +3 -2
  264. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  265. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  266. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  267. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  268. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  269. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  270. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  271. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  272. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  273. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  274. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  275. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  276. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  277. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  278. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  279. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  280. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  281. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  283. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  285. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  287. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  290. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  291. package/packages/pi-coding-agent/package.json +7 -7
  292. package/packages/pi-tui/package.json +2 -2
  293. package/packages/rpc-client/package.json +2 -2
  294. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  295. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  296. package/pkg/dist/theme/theme-schema.js +1 -1
  297. package/pkg/dist/theme/theme-schema.js.map +1 -1
  298. package/pkg/dist/theme/theme.d.ts.map +1 -1
  299. package/pkg/dist/theme/theme.js +11 -7
  300. package/pkg/dist/theme/theme.js.map +1 -1
  301. package/pkg/package.json +1 -1
  302. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  303. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
  304. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  305. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +80 -0
  306. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  307. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  308. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  309. package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
  310. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  311. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  312. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  313. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  314. package/src/resources/extensions/gsd/auto-dispatch.ts +35 -24
  315. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  316. package/src/resources/extensions/gsd/auto-prompts.ts +41 -15
  317. package/src/resources/extensions/gsd/auto-recovery.ts +13 -511
  318. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  319. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  320. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  321. package/src/resources/extensions/gsd/auto.ts +23 -8
  322. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
  323. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  324. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
  325. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  326. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  327. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -21
  328. package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
  329. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
  330. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  331. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  332. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  333. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  334. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -10
  335. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  336. package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
  337. package/src/resources/extensions/gsd/dashboard-overlay.ts +32 -3
  338. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  339. package/src/resources/extensions/gsd/db/queries.ts +79 -0
  340. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  341. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  342. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  343. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  344. package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
  345. package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
  346. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  347. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  348. package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
  349. package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
  350. package/src/resources/extensions/gsd/forensics.ts +2 -33
  351. package/src/resources/extensions/gsd/git-service.ts +69 -5
  352. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  353. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  354. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  355. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  356. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  357. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  358. package/src/resources/extensions/gsd/markdown-renderer.ts +8 -11
  359. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  360. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  361. package/src/resources/extensions/gsd/metrics.ts +4 -4
  362. package/src/resources/extensions/gsd/migrate-external.ts +8 -2
  363. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  364. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  365. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  366. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  367. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  368. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  369. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  370. package/src/resources/extensions/gsd/quick.ts +43 -2
  371. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  372. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  373. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  374. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  375. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  376. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  377. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  378. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  379. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  380. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  381. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  382. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +81 -7
  383. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  384. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  385. package/src/resources/extensions/gsd/state.ts +32 -732
  386. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  387. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  388. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  389. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  390. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  391. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
  392. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  393. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  394. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  395. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  396. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  397. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  398. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  400. package/src/resources/extensions/gsd/tests/complete-task.test.ts +75 -0
  401. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +55 -2
  402. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  403. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  404. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  405. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  406. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  407. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  408. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
  409. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
  410. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  411. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  412. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  413. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  414. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +37 -2
  415. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  416. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  417. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  418. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  419. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
  420. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  421. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  422. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  423. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  424. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +14 -0
  425. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  426. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  427. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  428. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  429. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  430. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  431. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  432. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +43 -1
  433. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  434. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  435. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  436. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  437. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
  438. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  439. package/src/resources/extensions/gsd/tests/plan-task.test.ts +44 -1
  440. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  441. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
  442. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  443. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  444. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  445. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +195 -1
  446. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  447. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +87 -0
  448. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
  449. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  450. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  451. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  452. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  453. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +208 -0
  454. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
  455. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  456. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +193 -14
  457. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +25 -0
  458. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +38 -0
  459. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +79 -0
  460. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  461. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +66 -0
  462. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  463. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  464. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  465. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +6 -5
  466. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  467. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  468. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  469. package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
  470. package/src/resources/extensions/gsd/tools/complete-task.ts +53 -15
  471. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  472. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  473. package/src/resources/extensions/gsd/tools/plan-task.ts +30 -5
  474. package/src/resources/extensions/gsd/undo.ts +47 -6
  475. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  476. package/src/resources/extensions/gsd/unit-registry.ts +36 -6
  477. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +41 -5
  478. package/src/resources/extensions/gsd/validation-block-guard.ts +13 -7
  479. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  480. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  481. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  482. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  483. package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
  484. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  486. package/dist/web/standalone/.next/static/chunks/webpack-f46ea08200a0227e.js +0 -1
  487. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_buildManifest.js +0 -0
  488. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_ssgManifest.js +0 -0
@@ -76,6 +76,8 @@ import { join } from "node:path";
76
76
  import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
77
77
  import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
78
78
 
79
+ type UokFlags = ReturnType<typeof resolveUokFlags>;
80
+
79
81
  function now(): number {
80
82
  return Date.now();
81
83
  }
@@ -517,15 +519,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
517
519
 
518
520
  // ── UokGateAdapter (folded) ──────────────────────────────────────────────
519
521
 
520
- private async emitUokGate(input: {
521
- gateId: string;
522
- gateType: "policy" | "execution";
523
- outcome: "pass" | "fail" | "manual-attention";
524
- failureClass: "none" | "policy" | "manual-attention";
525
- rationale: string;
526
- findings?: string;
527
- milestoneId?: string;
528
- }): Promise<void> {
522
+ private resolveUokGateContext(): { activeBasePath: string; uokFlags: UokFlags } {
529
523
  const activeBasePath = this.getLiveDispatchBasePath();
530
524
  const prefs = loadEffectiveGSDPreferencesWithRegistry(
531
525
  this.ctx.modelRegistry,
@@ -535,8 +529,22 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
535
529
  ? `${this.s.autoModeStartModel.provider}/${this.s.autoModeStartModel.id}`
536
530
  : undefined,
537
531
  )?.preferences;
538
- const uokFlags = resolveUokFlags(prefs);
539
- if (!uokFlags.gates) return;
532
+ return { activeBasePath, uokFlags: resolveUokFlags(prefs) };
533
+ }
534
+
535
+ private async emitUokGate(input: {
536
+ gateId: string;
537
+ gateType: "policy" | "execution";
538
+ outcome: "pass" | "fail" | "manual-attention";
539
+ failureClass: "none" | "policy" | "manual-attention";
540
+ rationale: string;
541
+ findings?: string;
542
+ milestoneId?: string;
543
+ activeBasePath: string;
544
+ uokFlags: UokFlags;
545
+ }): Promise<void> {
546
+ if (!input.uokFlags.gates) return;
547
+ const activeBasePath = input.activeBasePath;
540
548
  const milestoneId = input.milestoneId ?? this.s.currentMilestoneId ?? undefined;
541
549
  try {
542
550
  const { UokGateRunner } = await import("../uok/gate-runner.js");
@@ -943,10 +951,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
943
951
  const stopAdvanceTimer = debugTime("orchestrator-advance");
944
952
  try {
945
953
  this.ensureLockOwnership();
954
+ const uokGateContext = this.resolveUokGateContext();
946
955
 
947
956
  const staleMsg = this.checkResourcesStale();
948
957
  if (staleMsg) {
949
958
  await this.emitUokGate({
959
+ ...uokGateContext,
950
960
  gateId: "resource-version-guard",
951
961
  gateType: "policy",
952
962
  outcome: "fail",
@@ -960,6 +970,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
960
970
  return blocked;
961
971
  }
962
972
  await this.emitUokGate({
973
+ ...uokGateContext,
963
974
  gateId: "resource-version-guard",
964
975
  gateType: "policy",
965
976
  outcome: "pass",
@@ -970,6 +981,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
970
981
  const gate = await this.preAdvanceGate();
971
982
  if (gate.kind === "fail") {
972
983
  await this.emitUokGate({
984
+ ...uokGateContext,
973
985
  gateId: "pre-dispatch-health-gate",
974
986
  gateType: "execution",
975
987
  outcome: "manual-attention",
@@ -988,6 +1000,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
988
1000
  }
989
1001
  if (gate.kind === "threw") {
990
1002
  await this.emitUokGate({
1003
+ ...uokGateContext,
991
1004
  gateId: "pre-dispatch-health-gate",
992
1005
  gateType: "execution",
993
1006
  outcome: "manual-attention",
@@ -998,6 +1011,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
998
1011
  // intentional fall-through: matches runPreDispatch behaviour
999
1012
  } else {
1000
1013
  await this.emitUokGate({
1014
+ ...uokGateContext,
1001
1015
  gateId: "pre-dispatch-health-gate",
1002
1016
  gateType: "execution",
1003
1017
  outcome: "pass",
@@ -30,6 +30,7 @@ import { normalizeRealPath } from "../paths.js";
30
30
  import type { MilestoneScope } from "../workspace.js";
31
31
  import type { RootDirtySnapshot } from "../root-write-leak-guard.js";
32
32
  import type { MilestoneSettlementOutcome } from "../milestone-settlement.js";
33
+ import type { ToolSurfaceSnapshot } from "../tool-surface-snapshot.js";
33
34
 
34
35
  // ─── Exported Types ──────────────────────────────────────────────────────────
35
36
 
@@ -55,6 +56,7 @@ export type ThinkingLevelSnapshot = ReturnType<ExtensionAPI["getThinkingLevel"]>
55
56
  export interface PendingVerificationRetry {
56
57
  unitId: string;
57
58
  failureContext: string;
59
+ signature?: string;
58
60
  attempt: number;
59
61
  }
60
62
 
@@ -160,6 +162,9 @@ export class AutoSession {
160
162
  currentMilestoneId: string | null = null;
161
163
  readonly sourceObservations = new SourceObservationStore();
162
164
 
165
+ /** Live tool-surface snapshot for dashboard / runtime telemetry while auto is active. */
166
+ toolSurfaceSnapshot: ToolSurfaceSnapshot | null = null;
167
+
163
168
  // ── Model state ──────────────────────────────────────────────────────────
164
169
  autoModeStartModel: StartModel | null = null;
165
170
  /** Explicit /gsd model pin captured at bootstrap (session-scoped policy override). */
@@ -207,6 +212,13 @@ export class AutoSession {
207
212
  * the issues after MAX_PRE_EXEC_RETRIES re-attempts.
208
213
  */
209
214
  readonly preExecRetryCount: Map<string, number> = new Map();
215
+ /**
216
+ * Tracks how many times each slice unit has been re-dispatched to plan-slice
217
+ * because task plan files were missing. Keyed by unitId (e.g. "M001/S01").
218
+ * Separate from preExecRetryCount so pre-exec gate failures do not block or
219
+ * conflate with missing-task-plan recovery.
220
+ */
221
+ readonly missingTaskPlanRetryCount: Map<string, number> = new Map();
210
222
 
211
223
  // ── Tool invocation errors (#2883) ──────────────────────────────────
212
224
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
@@ -367,6 +379,7 @@ export class AutoSession {
367
379
 
368
380
  // Unit
369
381
  this.clearCurrentUnit();
382
+ this.toolSurfaceSnapshot = null;
370
383
  this.currentTraceId = null;
371
384
  this.currentTurnId = null;
372
385
  this.currentUnitRouting = null;
@@ -407,6 +420,7 @@ export class AutoSession {
407
420
  this.consecutiveCompleteBootstraps = 0;
408
421
  this.lastPreExecFailure = null;
409
422
  this.preExecRetryCount.clear();
423
+ this.missingTaskPlanRetryCount.clear();
410
424
  this.lastToolInvocationError = null;
411
425
  this.toolUnavailableRetries = 0;
412
426
  this.lastUnitAgentEndMessages = null;
@@ -63,7 +63,9 @@ export function decideVerificationRetry(input: {
63
63
  }
64
64
 
65
65
  const key = verificationRetryKey(unitType, retryInfo.unitId);
66
- const failureHash = hashVerificationFailureContext(retryInfo.failureContext);
66
+ const failureHash = hashVerificationFailureContext(
67
+ retryInfo.signature ?? retryInfo.failureContext,
68
+ );
67
69
  if (input.previousFailureHash === failureHash) {
68
70
  return {
69
71
  action: "pause",
@@ -22,7 +22,8 @@ import {
22
22
  } from "./paths.js";
23
23
  import { milestoneIdToPhaseNum } from "./layout-policy.js";
24
24
  import { parseUnitId } from "./unit-id.js";
25
- import { dirname, join } from "node:path";
25
+ import { dirname, join, relative } from "node:path";
26
+ import { existsSync } from "node:fs";
26
27
 
27
28
  function resolveMilestoneArtifactPath(
28
29
  base: string,
@@ -314,3 +315,48 @@ export function diagnoseExpectedArtifact(
314
315
  return null;
315
316
  }
316
317
  }
318
+
319
+ export interface SliceResearchLocation {
320
+ /** Absolute path when research exists; null when missing. */
321
+ absolutePath: string | null;
322
+ /** Prompt-friendly relative path when research exists. */
323
+ relativePath: string | null;
324
+ }
325
+
326
+ /**
327
+ * Resolve slice RESEARCH with worktree projection first, then canonical
328
+ * project-root path. Shared by dispatch rules, execute-task prompts, and
329
+ * artifact verification.
330
+ */
331
+ export function resolveSliceResearchLocation(
332
+ basePath: string,
333
+ mid: string,
334
+ sid: string,
335
+ ): SliceResearchLocation {
336
+ const projectedFile = resolveSliceFile(basePath, mid, sid, "RESEARCH");
337
+ if (projectedFile) {
338
+ return {
339
+ absolutePath: projectedFile,
340
+ relativePath: relSliceFile(basePath, mid, sid, "RESEARCH"),
341
+ };
342
+ }
343
+
344
+ const canonicalPath = resolveExpectedArtifactPath("research-slice", `${mid}/${sid}`, basePath);
345
+ if (canonicalPath && existsSync(canonicalPath)) {
346
+ return {
347
+ absolutePath: canonicalPath,
348
+ relativePath: relative(basePath, canonicalPath),
349
+ };
350
+ }
351
+
352
+ return { absolutePath: null, relativePath: null };
353
+ }
354
+
355
+ /** Returns the absolute RESEARCH path when it exists, otherwise null. */
356
+ export function resolveExistingSliceResearchPath(
357
+ basePath: string,
358
+ mid: string,
359
+ sid: string,
360
+ ): string | null {
361
+ return resolveSliceResearchLocation(basePath, mid, sid).absolutePath;
362
+ }
@@ -79,7 +79,9 @@ export function resolveCompactionThresholdPercent(raw: number | undefined): numb
79
79
  return value <= 1 ? value * 100 : value;
80
80
  }
81
81
 
82
- export function shouldRerootStepSessionForContext(
82
+ export const HARD_CONTEXT_REROOT_THRESHOLD_PERCENT = 90;
83
+
84
+ export function shouldWarnStepSessionForContext(
83
85
  contextPercent: number | null | undefined,
84
86
  compactionThresholdPercent?: number,
85
87
  ): boolean {
@@ -88,3 +90,12 @@ export function shouldRerootStepSessionForContext(
88
90
  resolveCompactionThresholdPercent(compactionThresholdPercent),
89
91
  ) === "pause";
90
92
  }
93
+
94
+ export function shouldRerootStepSessionForContext(
95
+ contextPercent: number | null | undefined,
96
+ ): boolean {
97
+ return getContextPauseAction(
98
+ contextPercent,
99
+ HARD_CONTEXT_REROOT_THRESHOLD_PERCENT,
100
+ ) === "pause";
101
+ }
@@ -30,6 +30,7 @@ import {
30
30
  setSliceSketchFlag,
31
31
  transaction,
32
32
  getAssessment,
33
+ getSliceRunUatAssessment,
33
34
  } from "./gsd-db.js";
34
35
  import { isClosedStatus } from "./status-guards.js";
35
36
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
@@ -113,7 +114,7 @@ import { detectWorktreeName } from "./worktree.js";
113
114
  import { probeGitConflictState } from "./git-conflict-state.js";
114
115
  import { runTurnGitAction } from "./git-service.js";
115
116
  import { parseUnitId } from "./unit-id.js";
116
- import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
117
+ import { resolveExpectedArtifactPath, resolveExistingSliceResearchPath } from "./auto-artifact-paths.js";
117
118
  import {
118
119
  formatCloseoutProofBlock,
119
120
  proveMilestoneCloseout,
@@ -322,6 +323,19 @@ export async function readUatGateVerdict(
322
323
  }
323
324
  }
324
325
 
326
+ // ADR-017 DB fallback: when the ASSESSMENT markdown is missing or orphaned
327
+ // from its canonical path (e.g. after a milestone artifact-layout migration
328
+ // moves slice artifacts from `phases/…` to `milestones/…`), consult the
329
+ // authoritative assessments table by (mid, slice) identity instead of path.
330
+ // `gsd_uat_result_save` always writes this row, so it is the source of truth.
331
+ const runUatAssessment = getSliceRunUatAssessment(mid, sliceId);
332
+ if (runUatAssessment?.status) {
333
+ return {
334
+ verdict: runUatAssessment.status,
335
+ uatType: uatType ?? extractUatType(runUatAssessment.fullContent),
336
+ };
337
+ }
338
+
325
339
  return null;
326
340
  }
327
341
 
@@ -1142,18 +1156,15 @@ export const DISPATCH_RULES: DispatchRule[] = [
1142
1156
  const dbSlices = getMilestoneSliceSummaries(mid);
1143
1157
  if (dbSlices.length === 0) return null;
1144
1158
 
1145
- // Find slices that need research (no RESEARCH file, dependencies done)
1146
- const milestoneResearchFile =
1147
- resolveExistingExpectedArtifact("research-milestone", mid, basePath) ??
1148
- resolveMilestoneFile(basePath, mid, "RESEARCH");
1159
+ // Find slices that need research (no RESEARCH file, dependencies done).
1160
+ // Milestone research informs slice research; it does not satisfy the
1161
+ // per-slice RESEARCH artifact contract.
1149
1162
  const researchReadySlices: Array<{ id: string; title: string }> = [];
1150
1163
 
1151
1164
  for (const slice of dbSlices) {
1152
1165
  if (slice.done) continue;
1153
- // Skip S01 when milestone research exists
1154
- if (milestoneResearchFile && slice.id === "S01") continue;
1155
1166
  // Skip if already has research
1156
- if (resolveExistingExpectedArtifact("research-slice", `${mid}/${slice.id}`, basePath)) continue;
1167
+ if (resolveExistingSliceResearchPath(basePath, mid, slice.id)) continue;
1157
1168
  // Skip if dependencies aren't done (check for SUMMARY files)
1158
1169
  const depsComplete = slice.depends.every((depId) =>
1159
1170
  !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath),
@@ -1190,7 +1201,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1190
1201
  },
1191
1202
  },
1192
1203
  {
1193
- name: "planning (no research, not S01) → research-slice",
1204
+ name: "planning (no research) → research-slice",
1194
1205
  match: async ({ state, mid, midTitle, basePath, prefs }) => {
1195
1206
  if (state.phase !== "planning") return null;
1196
1207
  // Phase skip: skip research when preference or profile says so
@@ -1201,20 +1212,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1201
1212
  if (!state.activeSlice) return missingSliceStop(mid, state.phase);
1202
1213
  const sid = state.activeSlice!.id;
1203
1214
  const sTitle = state.activeSlice!.title;
1204
- const researchFile =
1205
- resolveExistingExpectedArtifact("research-slice", `${mid}/${sid}`, basePath) ??
1206
- resolveSliceFile(basePath, mid, sid, "RESEARCH");
1207
- if (researchFile) return null; // has research, fall through
1208
- // Skip slice research for S01 when milestone research already exists —
1209
- // the milestone research already covers the same ground for the first slice.
1210
- const milestoneResearchFile =
1211
- resolveExistingExpectedArtifact("research-milestone", mid, basePath) ??
1212
- resolveMilestoneFile(
1213
- basePath,
1214
- mid,
1215
- "RESEARCH",
1216
- );
1217
- if (milestoneResearchFile && sid === "S01") return null; // fall through to plan-slice
1215
+ if (resolveExistingSliceResearchPath(basePath, mid, sid)) return null; // has research, fall through
1218
1216
  return {
1219
1217
  action: "dispatch",
1220
1218
  unitType: "research-slice",
@@ -1525,6 +1523,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1525
1523
  const sid = state.activeSlice!.id;
1526
1524
  const sTitle = state.activeSlice!.title;
1527
1525
  const tid = state.activeTask.id;
1526
+ const unitId = `${mid}/${sid}`;
1528
1527
  const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
1529
1528
 
1530
1529
  // Guard: if the slice plan exists but the individual task plan files are
@@ -1564,6 +1563,17 @@ export const DISPATCH_RULES: DispatchRule[] = [
1564
1563
  !existsSync(projectionTaskPlanPath) &&
1565
1564
  !tasksEmbeddedInSlicePlan
1566
1565
  ) {
1566
+ const MAX_MISSING_TASK_PLAN_RETRIES = 2;
1567
+ const retryCount = session?.missingTaskPlanRetryCount?.get(unitId) ?? 0;
1568
+ if (retryCount >= MAX_MISSING_TASK_PLAN_RETRIES) {
1569
+ session?.missingTaskPlanRetryCount?.delete(unitId);
1570
+ return {
1571
+ action: "stop",
1572
+ reason: `Missing task-plan recovery failed ${retryCount} times for ${unitId} - manual intervention required. Task plan ${tid} is still missing after regenerating the slice plan. Fix the task-plan files manually, then run /gsd auto to resume.`,
1573
+ level: "error",
1574
+ };
1575
+ }
1576
+ session?.missingTaskPlanRetryCount?.set(unitId, retryCount + 1);
1567
1577
  if (isDebugEnabled()) {
1568
1578
  const expectedTaskPlanPath = join(artifactBasePath, relTaskFile(artifactBasePath, mid, sid, tid, "PLAN"));
1569
1579
  const originalProjectRoot = session?.originalBasePath || basePath;
@@ -1587,7 +1597,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1587
1597
  return {
1588
1598
  action: "dispatch",
1589
1599
  unitType: "plan-slice",
1590
- unitId: `${mid}/${sid}`,
1600
+ unitId,
1591
1601
  prompt: await buildPlanSlicePrompt(
1592
1602
  mid,
1593
1603
  midTitle,
@@ -1600,6 +1610,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
1600
1610
  };
1601
1611
  }
1602
1612
 
1613
+ session?.missingTaskPlanRetryCount?.delete(unitId);
1603
1614
  return null;
1604
1615
  },
1605
1616
  },
@@ -2212,7 +2212,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2212
2212
  saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
2213
2213
  s.pendingVerificationRetry = {
2214
2214
  unitId: s.currentUnit.id,
2215
- failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
2215
+ failureContext: failureDetails,
2216
2216
  attempt,
2217
2217
  };
2218
2218
  debugLog("postUnit", { phase: "artifact-verify-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
@@ -17,14 +17,14 @@ import {
17
17
  resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
18
18
  resolveTasksDir, resolveTaskFiles, resolveTaskFile,
19
19
  relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath,
20
- resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile,
20
+ relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile,
21
21
  } from "./paths.js";
22
22
  import { resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
23
23
  import { isContextModeEnabled } from "./preferences-types.js";
24
24
  import { parseRoadmap } from "./parsers-legacy.js";
25
25
  import type { GSDState, InlineLevel } from "./types.js";
26
26
  import type { GSDPreferences } from "./preferences.js";
27
- import { join, basename } from "node:path";
27
+ import { join, basename, relative } from "node:path";
28
28
  import { existsSync } from "node:fs";
29
29
  import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary, type MinimalModelRegistry } from "./context-budget.js";
30
30
  import { getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
@@ -48,6 +48,7 @@ import {
48
48
  type ExcerptResolver,
49
49
  } from "./unit-context-composer.js";
50
50
  import { resolveManifest, type ArtifactKey } from "./unit-context-manifest.js";
51
+ import { resolveSliceResearchLocation } from "./auto-artifact-paths.js";
51
52
  import { compileUnitContextContract, type UnitPromptContextContract } from "./tool-contract.js";
52
53
  import { readCompactionSnapshot } from "./compaction-snapshot.js";
53
54
  import { logWarning } from "./workflow-logger.js";
@@ -323,19 +324,37 @@ function requireComposedArtifactBlock(
323
324
  return block.body;
324
325
  }
325
326
 
327
+ interface ExecuteTaskOnDemandResult {
328
+ /** Rendered block for the prompt; empty string when not shown. */
329
+ text: string;
330
+ /**
331
+ * Telemetry skip reason when the block was suppressed; null when the block
332
+ * is included. Callers pass this directly to `trackPromptContext`.
333
+ */
334
+ skipReason: string | null;
335
+ }
336
+
326
337
  function renderExecuteTaskOnDemandContext(
327
338
  base: string,
328
339
  mid: string,
329
340
  sid: string,
330
341
  artifacts: readonly ArtifactKey[],
331
- ): string {
332
- if (!artifacts.includes("slice-research")) return "";
333
- const researchPath = relSliceFile(base, mid, sid, "RESEARCH");
334
- return [
335
- "## On-demand Context",
336
- "",
337
- `Slice research is available at \`${researchPath}\`. Read it only if the inlined task plan, slice plan excerpt, and carry-forward context do not explain a required implementation detail.`,
338
- ].join("\n");
342
+ ): ExecuteTaskOnDemandResult {
343
+ if (!artifacts.includes("slice-research")) {
344
+ return { text: "", skipReason: "not declared by contract" };
345
+ }
346
+ const research = resolveSliceResearchLocation(base, mid, sid);
347
+ if (!research.absolutePath || !research.relativePath) {
348
+ return { text: "", skipReason: "missing" };
349
+ }
350
+ return {
351
+ text: [
352
+ "## On-demand Context",
353
+ "",
354
+ `Slice research is available at \`${research.relativePath}\`. Read it only if the inlined task plan, slice plan excerpt, and carry-forward context do not explain a required implementation detail.`,
355
+ ].join("\n"),
356
+ skipReason: null,
357
+ };
339
358
  }
340
359
 
341
360
  // ─── Executor Constraints ─────────────────────────────────────────────────────
@@ -1691,7 +1710,13 @@ export async function buildDiscussMilestonePrompt(
1691
1710
  const draftContent = draftPath ? await loadFile(draftPath) : null;
1692
1711
 
1693
1712
  if (includeDraftSeed && draftContent) {
1694
- return `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${draftContent}`;
1713
+ const draftRelPath = relMilestoneFile(base, mid, "CONTEXT-DRAFT");
1714
+ const draftSeed = `### Prior Discussion Draft\nSource: \`${draftRelPath}\`\n\n${draftContent.trim()}`;
1715
+ const cappedDraftSeed = capPreamble(draftSeed);
1716
+ const truncationNote = cappedDraftSeed !== draftSeed
1717
+ ? `\n\n_(Draft seed truncated; read the full draft at \`${draftRelPath}\` if needed.)_`
1718
+ : "";
1719
+ return `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${cappedDraftSeed}${truncationNote}`;
1695
1720
  }
1696
1721
 
1697
1722
  return promptWithContextMode;
@@ -2637,7 +2662,7 @@ export async function buildExecuteTaskPrompt(
2637
2662
 
2638
2663
  const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
2639
2664
  const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
2640
- const taskPlanRelPath = relSlicePath(base, mid, sid) + `/tasks/${tid}-PLAN.md`;
2665
+ const taskPlanRelPath = relTaskFile(base, mid, sid, tid, "PLAN");
2641
2666
  const taskPlanContext = taskPlanContent
2642
2667
  ? [
2643
2668
  "## Inlined Task Plan (authoritative local execution contract)",
@@ -2807,13 +2832,14 @@ export async function buildExecuteTaskPrompt(
2807
2832
  const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2808
2833
  const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
2809
2834
  const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2810
- const onDemandContext = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
2835
+ const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
2836
+ const onDemandContext = onDemandResult.text;
2811
2837
  trackPromptContext(
2812
2838
  contextTelemetry,
2813
2839
  "slice-research",
2814
2840
  onDemandContext ? "on-demand" : "skipped",
2815
2841
  onDemandContext,
2816
- onDemandContext ? undefined : "not declared by contract",
2842
+ onDemandContext ? undefined : onDemandResult.skipReason ?? undefined,
2817
2843
  );
2818
2844
 
2819
2845
  const prompt = loadPrompt("execute-task", {
@@ -3875,7 +3901,7 @@ export async function buildReactiveExecutePrompt(
3875
3901
 
3876
3902
  const taskPlanPath = resolveTaskFile(base, mid, sid, tid, "PLAN");
3877
3903
  const taskPlanContent = taskPlanPath ? await loadFile(taskPlanPath) : null;
3878
- const taskPlanRelPath = `${relSlicePath(base, mid, sid)}/tasks/${tid}-PLAN.md`;
3904
+ const taskPlanRelPath = relTaskFile(base, mid, sid, tid, "PLAN");
3879
3905
  const taskPlanInline = taskPlanContent
3880
3906
  ? [
3881
3907
  "## Inlined Task Plan (authoritative local execution contract)",