gsd-pi 2.81.0-dev.72a81bdf3 → 2.82.0-dev.20138ae42

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 (463) hide show
  1. package/README.md +50 -31
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  7. package/dist/resources/extensions/cmux/index.js +5 -0
  8. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  9. package/dist/resources/extensions/gsd/auto/loop.js +5 -5
  10. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  11. package/dist/resources/extensions/gsd/auto/phases.js +30 -1
  12. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +13 -6
  15. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  16. package/dist/resources/extensions/gsd/auto-post-unit.js +233 -127
  17. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  18. package/dist/resources/extensions/gsd/auto-recovery.js +31 -1
  19. package/dist/resources/extensions/gsd/auto-start.js +85 -12
  20. package/dist/resources/extensions/gsd/auto-verification.js +28 -22
  21. package/dist/resources/extensions/gsd/auto-worktree.js +111 -1
  22. package/dist/resources/extensions/gsd/auto.js +158 -55
  23. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +25 -6
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +9 -8
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -2
  26. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  27. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  28. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -2
  29. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  30. package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
  31. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -1
  32. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  33. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  34. package/dist/resources/extensions/gsd/context-store.js +112 -0
  35. package/dist/resources/extensions/gsd/crash-recovery.js +31 -5
  36. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  37. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  38. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  40. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  41. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  42. package/dist/resources/extensions/gsd/doctor.js +2 -28
  43. package/dist/resources/extensions/gsd/export-html.js +27 -425
  44. package/dist/resources/extensions/gsd/git-service.js +39 -1
  45. package/dist/resources/extensions/gsd/gsd-db.js +1 -0
  46. package/dist/resources/extensions/gsd/guided-flow.js +93 -111
  47. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  48. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  49. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  50. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  51. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  52. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -1
  53. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  54. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  55. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  56. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  57. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  58. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  59. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  60. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  62. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  63. package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
  64. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  65. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  66. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  67. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  68. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  69. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  70. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  71. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  72. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  73. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  74. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  75. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  76. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  77. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  79. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  80. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  81. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  82. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  83. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  84. package/dist/resources/extensions/gsd/status-guards.js +4 -0
  85. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  86. package/dist/resources/extensions/gsd/templates/plan.md +8 -5
  87. package/dist/resources/extensions/gsd/templates/task-plan.md +4 -2
  88. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  89. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  90. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  91. package/dist/resources/extensions/gsd/tools/plan-slice.js +89 -14
  92. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  93. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  94. package/dist/resources/extensions/gsd/validation.js +23 -1
  95. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  96. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  97. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  98. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  99. package/dist/resources/extensions/shared/html-shell.js +388 -0
  100. package/dist/resources/extensions/subagent/index.js +448 -78
  101. package/dist/resources/extensions/subagent/launch.js +77 -0
  102. package/dist/resources/extensions/subagent/run-store.js +148 -0
  103. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  104. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  105. package/dist/resources/extensions/visual-brief/index.js +5 -0
  106. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  107. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  108. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  109. package/dist/web/standalone/.next/BUILD_ID +1 -1
  110. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  111. package/dist/web/standalone/.next/build-manifest.json +3 -3
  112. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  113. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  114. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  124. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  134. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/index.html +1 -1
  136. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  137. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  139. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  141. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  142. package/dist/web/standalone/.next/server/app/page.js +2 -2
  143. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  146. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  147. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  151. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  152. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  153. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  154. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  155. package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
  156. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  157. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-9a4db269f9ed63ad.js} +1 -1
  158. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  159. package/package.json +6 -5
  160. package/packages/contracts/dist/rpc.test.js +7 -0
  161. package/packages/contracts/dist/rpc.test.js.map +1 -1
  162. package/packages/contracts/dist/workflow.d.ts +21 -0
  163. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  164. package/packages/contracts/dist/workflow.js +24 -0
  165. package/packages/contracts/dist/workflow.js.map +1 -1
  166. package/packages/contracts/src/rpc.test.ts +8 -0
  167. package/packages/contracts/src/workflow.ts +24 -0
  168. package/packages/daemon/package.json +2 -2
  169. package/packages/mcp-server/README.md +14 -3
  170. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  171. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  172. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  173. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  174. package/packages/mcp-server/package.json +2 -2
  175. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  176. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  177. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  178. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  179. package/packages/native/package.json +1 -1
  180. package/packages/native/tsconfig.json +2 -1
  181. package/packages/native/tsconfig.tsbuildinfo +1 -1
  182. package/packages/pi-agent-core/package.json +1 -1
  183. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  184. package/packages/pi-ai/dist/index.d.ts +2 -2
  185. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  186. package/packages/pi-ai/dist/index.js +1 -1
  187. package/packages/pi-ai/dist/index.js.map +1 -1
  188. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  189. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  190. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  191. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  192. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  193. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  194. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  195. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  196. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  197. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  198. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  199. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  200. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  201. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  202. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  203. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  204. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  205. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  206. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  207. package/packages/pi-ai/package.json +1 -1
  208. package/packages/pi-ai/src/index.ts +7 -2
  209. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  210. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  211. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  212. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  213. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  214. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  215. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  218. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  220. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  222. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  225. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  227. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  228. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  229. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  230. package/packages/pi-coding-agent/package.json +1 -1
  231. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  232. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  233. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  234. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  235. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  236. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  237. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  238. package/packages/pi-tui/dist/tui.js +5 -0
  239. package/packages/pi-tui/dist/tui.js.map +1 -1
  240. package/packages/pi-tui/package.json +1 -1
  241. package/packages/pi-tui/src/tui.ts +6 -0
  242. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  243. package/packages/rpc-client/package.json +1 -1
  244. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  245. package/pkg/package.json +1 -1
  246. package/src/resources/GSD-WORKFLOW.md +10 -1
  247. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  248. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  249. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  250. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  251. package/src/resources/extensions/cmux/index.ts +6 -0
  252. package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
  253. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  254. package/src/resources/extensions/gsd/auto/loop.ts +8 -5
  255. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  256. package/src/resources/extensions/gsd/auto/phases.ts +36 -1
  257. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  258. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  259. package/src/resources/extensions/gsd/auto-dispatch.ts +14 -6
  260. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  261. package/src/resources/extensions/gsd/auto-post-unit.ts +266 -139
  262. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  263. package/src/resources/extensions/gsd/auto-recovery.ts +29 -0
  264. package/src/resources/extensions/gsd/auto-start.ts +92 -9
  265. package/src/resources/extensions/gsd/auto-verification.ts +36 -34
  266. package/src/resources/extensions/gsd/auto-worktree.ts +119 -1
  267. package/src/resources/extensions/gsd/auto.ts +167 -53
  268. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +33 -6
  269. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +9 -8
  270. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -2
  271. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  272. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  273. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -3
  274. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  275. package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
  276. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -1
  277. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  278. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  279. package/src/resources/extensions/gsd/context-store.ts +120 -1
  280. package/src/resources/extensions/gsd/crash-recovery.ts +30 -4
  281. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  282. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  283. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  284. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  285. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  286. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  287. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  288. package/src/resources/extensions/gsd/doctor.ts +2 -27
  289. package/src/resources/extensions/gsd/export-html.ts +27 -427
  290. package/src/resources/extensions/gsd/git-service.ts +45 -1
  291. package/src/resources/extensions/gsd/gsd-db.ts +3 -0
  292. package/src/resources/extensions/gsd/guided-flow.ts +126 -128
  293. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  294. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  295. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  296. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  297. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  298. package/src/resources/extensions/gsd/markdown-renderer.ts +6 -1
  299. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  300. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  301. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  302. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  303. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  304. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  305. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  306. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  307. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  308. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  309. package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
  310. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  311. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  312. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  313. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  314. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  315. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  316. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  317. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  318. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  319. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  320. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  321. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  322. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  323. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  324. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  325. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  326. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  327. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  328. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  329. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  330. package/src/resources/extensions/gsd/status-guards.ts +5 -0
  331. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  332. package/src/resources/extensions/gsd/templates/plan.md +8 -5
  333. package/src/resources/extensions/gsd/templates/task-plan.md +4 -2
  334. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  335. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  336. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +129 -0
  337. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
  338. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +12 -11
  339. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  340. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +12 -1
  341. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +15 -1
  342. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  343. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  344. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  345. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  346. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  347. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  348. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  349. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  350. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  351. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  352. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  353. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  354. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +43 -2
  355. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  356. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  357. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  358. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  359. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
  360. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +39 -0
  361. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  362. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  363. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  364. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  365. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  366. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  367. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  368. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  369. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  370. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  371. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  372. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  373. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  374. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  375. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  376. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  377. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +103 -1
  378. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  379. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  380. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  381. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  382. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  383. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  384. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  385. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  386. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  387. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  388. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  389. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  390. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  391. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  392. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  393. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  394. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  395. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  396. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  397. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +225 -1
  398. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  399. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  400. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  401. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  402. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  403. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  404. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  405. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +20 -1
  406. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  407. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +46 -2
  408. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  409. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  410. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  411. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  412. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  413. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  414. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  415. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  416. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +86 -7
  417. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  418. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  419. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
  420. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  421. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  422. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  423. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  424. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  425. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
  426. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  427. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  428. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  429. package/src/resources/extensions/gsd/tools/plan-slice.ts +98 -12
  430. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  431. package/src/resources/extensions/gsd/types.ts +1 -1
  432. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  433. package/src/resources/extensions/gsd/validation.ts +23 -1
  434. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  435. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  436. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  437. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  438. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  439. package/src/resources/extensions/shared/html-shell.ts +412 -0
  440. package/src/resources/extensions/subagent/index.ts +567 -103
  441. package/src/resources/extensions/subagent/launch.ts +131 -0
  442. package/src/resources/extensions/subagent/run-store.ts +218 -0
  443. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  444. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  445. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  446. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  447. package/src/resources/extensions/visual-brief/index.ts +8 -0
  448. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  449. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  450. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  451. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  452. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  453. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  454. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  455. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  456. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  457. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  458. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  459. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  460. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  461. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  462. /package/dist/web/standalone/.next/static/{rIkMv4YSNlfSeqmGqWVns → xRy4LqKSNKdT7y6ATYyEl}/_buildManifest.js +0 -0
  463. /package/dist/web/standalone/.next/static/{rIkMv4YSNlfSeqmGqWVns → xRy4LqKSNKdT7y6ATYyEl}/_ssgManifest.js +0 -0
@@ -58,6 +58,7 @@ import {
58
58
  import {
59
59
  writeLock,
60
60
  clearLock,
61
+ clearStaleWorkerLock,
61
62
  readCrashLock,
62
63
  isLockProcessAlive,
63
64
  formatCrashInfo,
@@ -240,12 +241,14 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
240
241
  import { resolveUokFlags } from "./uok/flags.js";
241
242
  import { validateDirectory } from "./validate-directory.js";
242
243
  import { createAutoOrchestrator } from "./auto/orchestrator.js";
243
- import type { AutoOrchestrationModule, AutoOrchestratorDeps } from "./auto/contracts.js";
244
+ import type { AutoAdvanceResult, AutoOrchestrationModule, AutoOrchestratorDeps, DispatchAdapter } from "./auto/contracts.js";
244
245
  import { reconcileBeforeDispatch } from "./state-reconciliation.js";
245
246
  import { compileUnitToolContract } from "./tool-contract.js";
246
247
  import { createWorktreeSafetyModule } from "./worktree-safety.js";
247
248
  import { resolveManifest } from "./unit-context-manifest.js";
248
249
  import { classifyFailure } from "./recovery-classification.js";
250
+ import { supportsStructuredQuestions } from "./workflow-mcp.js";
251
+ import type { MinimalModelRegistry } from "./context-budget.js";
249
252
  // Slice-level parallelism (#2340)
250
253
  import { getEligibleSlices } from "./slice-parallel-eligibility.js";
251
254
  import { startSliceParallel } from "./slice-parallel-orchestrator.js";
@@ -1042,19 +1045,18 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
1042
1045
  // visible so the user still has a resumable auto-mode signal on screen.
1043
1046
  if (!s.paused) {
1044
1047
  ctx.ui.setStatus("gsd-auto", undefined);
1048
+ ctx.ui.setWidget("gsd-progress", undefined);
1045
1049
  if (s.completionStopInProgress) {
1046
1050
  s.completionStopInProgress = false;
1047
1051
  }
1048
1052
  initHealthWidget(ctx);
1049
1053
  }
1050
1054
 
1051
- // ADR-016 phase 3 (#5693): the stop-path basePath restore routes through
1052
- // `Lifecycle.restoreToProjectRoot()`, the sole owner of `s.basePath`
1053
- // mutation. The verb assigns `s.basePath` before any throwable work
1054
- // (rebuildGitService, cache invalidation), so a thrown error still leaves
1055
- // basePath restored no fallback assignment needed at the call site.
1056
- // The chdir stays here because `restoreToProjectRoot` is a pure
1057
- // session-state mutation.
1055
+ // ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
1056
+ // through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
1057
+ // `s.basePath` mutation and the paired `process.chdir` for auto-loop
1058
+ // transitions. The verb assigns `s.basePath` before any throwable work, so
1059
+ // a thrown error still leaves basePath restored.
1058
1060
  if (s.originalBasePath) {
1059
1061
  try {
1060
1062
  buildLifecycle().restoreToProjectRoot();
@@ -1065,11 +1067,6 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
1065
1067
  { file: "auto.ts" },
1066
1068
  );
1067
1069
  }
1068
- try {
1069
- process.chdir(s.originalBasePath);
1070
- } catch (err) {
1071
- logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1072
- }
1073
1070
  }
1074
1071
 
1075
1072
  if (s.originalBasePath && s.cmdCtx) {
@@ -1384,20 +1381,14 @@ export async function stopAuto(
1384
1381
  }
1385
1382
 
1386
1383
  // ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
1387
- // `restoreToProjectRoot` assigns s.basePath before any throwable work;
1388
- // no fallback assignment is needed at the call site.
1384
+ // `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
1385
+ // no paired chdir is needed at the call site.
1389
1386
  if (s.originalBasePath) {
1390
1387
  try {
1391
1388
  buildLifecycle().restoreToProjectRoot();
1392
1389
  } catch (e) {
1393
1390
  debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1394
1391
  }
1395
- try {
1396
- process.chdir(s.basePath);
1397
- } catch (err) {
1398
- /* best-effort */
1399
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1400
- }
1401
1392
  }
1402
1393
 
1403
1394
  // Re-root the active command session/tool runtime after worktree teardown.
@@ -1792,6 +1783,82 @@ function buildLifecycle(): WorktreeLifecycle {
1792
1783
  return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
1793
1784
  }
1794
1785
 
1786
+ /**
1787
+ * Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
1788
+ *
1789
+ * Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
1790
+ * the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
1791
+ * `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
1792
+ */
1793
+ export function createWiredDispatchAdapter(
1794
+ ctx: ExtensionContext,
1795
+ pi: ExtensionAPI,
1796
+ dispatchBasePath: string,
1797
+ ): DispatchAdapter {
1798
+ return {
1799
+ async decideNextUnit(input) {
1800
+ const state = input.stateSnapshot;
1801
+ const active = state.activeMilestone;
1802
+ if (!active) return null;
1803
+
1804
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1805
+
1806
+ // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
1807
+ // (#5789). Prefer caller-supplied values when present so test harnesses and
1808
+ // alternative wirings can inject deterministic snapshots; otherwise pull from
1809
+ // the captured pi/ctx references.
1810
+ const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
1811
+ const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
1812
+ const modelRegistry = input.modelRegistry ?? (ctx.modelRegistry as MinimalModelRegistry | undefined);
1813
+ const authMode =
1814
+ sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1815
+ ? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
1816
+ : undefined;
1817
+ const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
1818
+ // Mirrors runDispatch: deep-planning keeps approval gates in plain chat
1819
+ // because structured questions can be cancelled outside the chat turn on
1820
+ // some transports.
1821
+ const structuredQuestionsAvailable =
1822
+ input.structuredQuestionsAvailable ??
1823
+ (prefs?.planning_depth === "deep"
1824
+ ? "false"
1825
+ : supportsStructuredQuestions(activeTools, {
1826
+ authMode,
1827
+ baseUrl: ctx.model?.baseUrl,
1828
+ })
1829
+ ? "true"
1830
+ : "false");
1831
+
1832
+ const action = await resolveDispatch({
1833
+ basePath: dispatchBasePath,
1834
+ mid: active.id,
1835
+ midTitle: active.title,
1836
+ state,
1837
+ prefs,
1838
+ structuredQuestionsAvailable,
1839
+ sessionContextWindow,
1840
+ sessionProvider,
1841
+ modelRegistry,
1842
+ });
1843
+
1844
+ if (action.action === "stop") {
1845
+ return {
1846
+ kind: "blocked",
1847
+ reason: action.reason,
1848
+ action: action.level === "warning" ? "pause" : "stop",
1849
+ };
1850
+ }
1851
+ if (action.action !== "dispatch") return null;
1852
+ return {
1853
+ unitType: action.unitType,
1854
+ unitId: action.unitId,
1855
+ reason: action.matchedRule ?? "dispatch",
1856
+ preconditions: [],
1857
+ };
1858
+ },
1859
+ };
1860
+ }
1861
+
1795
1862
  /**
1796
1863
  * Thin entry glue for the new Auto Orchestration module.
1797
1864
  *
@@ -1801,7 +1868,7 @@ function buildLifecycle(): WorktreeLifecycle {
1801
1868
  */
1802
1869
  export function createWiredAutoOrchestrationModule(
1803
1870
  ctx: ExtensionContext,
1804
- _pi: ExtensionAPI,
1871
+ pi: ExtensionAPI,
1805
1872
  dispatchBasePath: string,
1806
1873
  runtimeBasePath = resolveProjectRoot(dispatchBasePath),
1807
1874
  ): AutoOrchestrationModule {
@@ -1830,30 +1897,7 @@ export function createWiredAutoOrchestrationModule(
1830
1897
  };
1831
1898
  },
1832
1899
  },
1833
- dispatch: {
1834
- async decideNextUnit(input) {
1835
- const state = input.stateSnapshot;
1836
- const active = state.activeMilestone;
1837
- if (!active) return null;
1838
-
1839
- const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1840
- const action = await resolveDispatch({
1841
- basePath: dispatchBasePath,
1842
- mid: active.id,
1843
- midTitle: active.title,
1844
- state,
1845
- prefs,
1846
- });
1847
-
1848
- if (action.action !== "dispatch") return null;
1849
- return {
1850
- unitType: action.unitType,
1851
- unitId: action.unitId,
1852
- reason: action.matchedRule ?? "dispatch",
1853
- preconditions: [],
1854
- };
1855
- },
1856
- },
1900
+ dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
1857
1901
  recovery: {
1858
1902
  async classifyAndRecover(input) {
1859
1903
  const recovery = classifyFailure(input);
@@ -1902,12 +1946,25 @@ export function createWiredAutoOrchestrationModule(
1902
1946
  async cleanupOnStop() {},
1903
1947
  },
1904
1948
  health: {
1949
+ checkResourcesStale() {
1950
+ return checkResourcesStale(s.resourceVersionOnStart);
1951
+ },
1905
1952
  async preAdvanceGate() {
1906
- const gate = await preDispatchHealthGate(dispatchBasePath);
1907
- return {
1908
- allow: gate.proceed,
1909
- reason: gate.reason,
1910
- };
1953
+ try {
1954
+ const gate = await preDispatchHealthGate(dispatchBasePath);
1955
+ if (gate.proceed) {
1956
+ return {
1957
+ kind: "pass",
1958
+ fixesApplied: gate.fixesApplied,
1959
+ };
1960
+ }
1961
+ return {
1962
+ kind: "fail",
1963
+ reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
1964
+ };
1965
+ } catch (error) {
1966
+ return { kind: "threw", error };
1967
+ }
1911
1968
  },
1912
1969
  async postAdvanceRecord(result) {
1913
1970
  if (result.kind === "error") {
@@ -1975,11 +2032,60 @@ export function createWiredAutoOrchestrationModule(
1975
2032
  }
1976
2033
  },
1977
2034
  },
2035
+ uokGate: {
2036
+ async emit(input) {
2037
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
2038
+ const uokFlags = resolveUokFlags(prefs);
2039
+ if (!uokFlags.gates) return;
2040
+ const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
2041
+ try {
2042
+ const { UokGateRunner } = await import("./uok/gate-runner.js");
2043
+ const runner = new UokGateRunner();
2044
+ runner.register({
2045
+ id: input.gateId,
2046
+ type: input.gateType,
2047
+ execute: async () => ({
2048
+ outcome: input.outcome,
2049
+ failureClass: input.failureClass,
2050
+ rationale: input.rationale,
2051
+ findings: input.findings ?? "",
2052
+ }),
2053
+ });
2054
+ await runner.run(input.gateId, {
2055
+ basePath: dispatchBasePath,
2056
+ traceId: `pre-dispatch:${flowId}`,
2057
+ turnId: `orch-${seq}`,
2058
+ milestoneId,
2059
+ unitType: "pre-dispatch",
2060
+ unitId: `orch-${seq}`,
2061
+ });
2062
+ } catch (err) {
2063
+ logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
2064
+ file: "auto.ts",
2065
+ gateId: input.gateId,
2066
+ gateType: input.gateType,
2067
+ ...(milestoneId ? { milestoneId } : {}),
2068
+ });
2069
+ }
2070
+ },
2071
+ },
1978
2072
  };
1979
2073
 
1980
2074
  return createAutoOrchestrator(deps);
1981
2075
  }
1982
2076
 
2077
+ function notifyResumeBlocked(ctx: ExtensionContext, result: Extract<AutoAdvanceResult, { kind: "blocked" }>): void {
2078
+ const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
2079
+ ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
2080
+ setLifecycleOutcome(ctx, {
2081
+ status: "blocked",
2082
+ title: "Auto-mode blocked",
2083
+ detail: result.reason,
2084
+ nextAction: `Fix the blocker, then run ${resumeCmd} to resume.`,
2085
+ commands: ["/gsd status for overview", `${resumeCmd} to resume`, "/gsd doctor to diagnose"],
2086
+ });
2087
+ }
2088
+
1983
2089
  function ensureOrchestrationModule(ctx: ExtensionContext, pi: ExtensionAPI, basePath: string): void {
1984
2090
  s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
1985
2091
  }
@@ -2317,7 +2423,7 @@ export async function startAuto(
2317
2423
  // This closes the journal gap reported in #3348 where the worker wrote side
2318
2424
  // effects (SUMMARY.md, DB updates) but died before emitting unit-end.
2319
2425
  emitCrashRecoveredUnitEnd(base, freshStartAssessment.lock);
2320
- clearLock(base);
2426
+ clearStaleWorkerLock(base);
2321
2427
  }
2322
2428
 
2323
2429
  if (!s.paused) {
@@ -2388,6 +2494,8 @@ export async function startAuto(
2388
2494
  s.unitLifetimeDispatches.clear();
2389
2495
  if (!getLedger()) initMetrics(base);
2390
2496
  if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
2497
+ await openProjectDbIfPresent(base);
2498
+ registerAutoWorkerForSession(s, base);
2391
2499
 
2392
2500
  // Re-register health level notification callback lost across process restart
2393
2501
  setLevelChangeCallback((_from, to, summary) => {
@@ -2495,7 +2603,12 @@ export async function startAuto(
2495
2603
  pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
2496
2604
 
2497
2605
  try {
2498
- await s.orchestration?.resume();
2606
+ const resumeResult = await s.orchestration?.resume();
2607
+ if (resumeResult?.kind === "blocked") {
2608
+ notifyResumeBlocked(ctx, resumeResult);
2609
+ await cleanupAfterLoopExit(ctx);
2610
+ return;
2611
+ }
2499
2612
  } catch (err) {
2500
2613
  debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
2501
2614
  }
@@ -2516,6 +2629,7 @@ export async function startAuto(
2516
2629
  const bootstrapDeps: BootstrapDeps = {
2517
2630
  shouldUseWorktreeIsolation,
2518
2631
  registerSigtermHandler,
2632
+ registerAutoWorkerForSession: (projectRoot) => registerAutoWorkerForSession(s, projectRoot),
2519
2633
  lockBase,
2520
2634
  buildLifecycle,
2521
2635
  };
@@ -32,6 +32,7 @@ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js
32
32
  import { resolveModelId } from "../auto-model-selection.js";
33
33
  import { resolveProjectRoot } from "../worktree.js";
34
34
  import { clearDiscussionFlowState } from "./write-gate.js";
35
+ import { clearGuidedUnitContext } from "../guided-unit-context.js";
35
36
  import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
36
37
  import {
37
38
  classifyError,
@@ -48,6 +49,11 @@ const MAX_NETWORK_RETRIES = 2;
48
49
  function isObjectRecord(value: unknown): value is Record<string, unknown> {
49
50
  return !!value && typeof value === "object";
50
51
  }
52
+
53
+ export function _hasEmptyAgentEndContent(content: unknown): boolean {
54
+ return content == null || (Array.isArray(content) && content.length === 0);
55
+ }
56
+
51
57
  /**
52
58
  * Cap on auto-resume attempts for sustained transient-provider errors.
53
59
  *
@@ -196,6 +202,14 @@ export function resolveAgentEndErrorDisplay(
196
202
  return rawErrorMsg;
197
203
  }
198
204
 
205
+ export function isTerminalDeletedWorktreeProviderError(
206
+ message: string | undefined | null,
207
+ ): boolean {
208
+ if (!message) return false;
209
+ if (!/\bdoes not exist\b/i.test(message)) return false;
210
+ return /[/\\]\.gsd[/\\](?:projects[/\\][^/\\]+[/\\])?worktrees[/\\][^/\\\s"']+/i.test(message);
211
+ }
212
+
199
213
  async function pauseTransientWithBackoff(
200
214
  cls: ErrorClass,
201
215
  pi: ExtensionAPI,
@@ -244,9 +258,11 @@ export async function handleAgentEnd(
244
258
  // falsely report files as missing — producing a spurious "ready signal
245
259
  // rejected" loop even though the files are on disk.
246
260
  clearPathCache();
261
+ const basePath = resolveAgentEndBasePath();
262
+ clearGuidedUnitContext(basePath);
247
263
 
248
264
  try {
249
- if (await checkDeepProjectSetupAfterTurn(event, ctx, resolveAgentEndBasePath())) {
265
+ if (await checkDeepProjectSetupAfterTurn(event, ctx, basePath)) {
250
266
  return;
251
267
  }
252
268
  } catch (err) {
@@ -254,8 +270,8 @@ export async function handleAgentEnd(
254
270
  logWarning("bootstrap", `checkDeepProjectSetupAfterTurn failed: ${message}`);
255
271
  }
256
272
 
257
- if (checkAutoStartAfterDiscuss()) {
258
- clearDiscussionFlowState(resolveAgentEndBasePath() ?? process.cwd());
273
+ if (checkAutoStartAfterDiscuss(basePath)) {
274
+ clearDiscussionFlowState(basePath ?? process.cwd());
259
275
  return;
260
276
  }
261
277
 
@@ -263,14 +279,14 @@ export async function handleAgentEnd(
263
279
  // are missing, `checkAutoStartAfterDiscuss` returns false silently. Surface
264
280
  // that and nudge the LLM to complete the writes before the user hits the
265
281
  // downstream "All milestones complete" warning loop.
266
- if (maybeHandleReadyPhraseWithoutFiles(event)) return;
282
+ if (maybeHandleReadyPhraseWithoutFiles(event, basePath)) return;
267
283
 
268
284
  // #4573 — Empty-turn recovery: if the LLM announced intent in prose but
269
285
  // emitted no tool calls, nudge it to execute. Fires only when auto-mode is
270
286
  // active or a discussion autostart is pending (non-auto interactive discuss
271
287
  // is user-driven). Runs before `isAutoActive` early return so pending
272
288
  // discussions (where isAutoActive may be false) still get recovered.
273
- if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
289
+ if (maybeHandleEmptyIntentTurn(event, isAutoActive(), basePath)) return;
274
290
 
275
291
  if (!isAutoActive()) return;
276
292
 
@@ -310,7 +326,7 @@ export async function handleAgentEnd(
310
326
  // that carry error context — e.g. errorMessage field or non-empty content
311
327
  // indicating a mid-stream failure. (#2695)
312
328
  const content = "content" in lastMsg ? lastMsg.content : undefined;
313
- const hasEmptyContent = Array.isArray(content) && content.length === 0;
329
+ const hasEmptyContent = _hasEmptyAgentEndContent(content);
314
330
  const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
315
331
 
316
332
  if (hasEmptyContent && !hasErrorMessage) {
@@ -355,6 +371,17 @@ export async function handleAgentEnd(
355
371
  rawErrorMsg,
356
372
  "content" in lastMsg ? lastMsg.content : undefined,
357
373
  );
374
+ if (
375
+ isAutoCompletionStopInProgress() &&
376
+ isTerminalDeletedWorktreeProviderError(`${rawErrorMsg}\n${displayMsg}`)
377
+ ) {
378
+ resetRetryState(retryState);
379
+ logWarning(
380
+ "bootstrap",
381
+ `Ignoring stale deleted-worktree provider error during terminal completion reroot: ${displayMsg || rawErrorMsg}`,
382
+ );
383
+ return;
384
+ }
358
385
  const errorDetail = displayMsg ? `: ${displayMsg}` : "";
359
386
  const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
360
387
 
@@ -487,17 +487,18 @@ export function registerDbTools(pi: ExtensionAPI): void {
487
487
  promptGuidelines: [
488
488
  "Use gsd_plan_milestone for milestone planning instead of writing ROADMAP.md directly.",
489
489
  "Keep parameters flat and provide the full milestone planning payload, including slices.",
490
+ "Milestone and slice titles must not contain forward slash (/), en dash, or em dash characters.",
490
491
  "The tool validates input, writes milestone and slice planning data transactionally, renders ROADMAP.md from DB, and clears both state and parse caches after success.",
491
492
  "Use the canonical name gsd_plan_milestone; gsd_milestone_plan is only an alias.",
492
493
  ],
493
494
  parameters: Type.Object({
494
495
  // ── Core identification + content (required) ──────────────────────
495
496
  milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
496
- title: Type.String({ description: "Milestone title" }),
497
+ title: Type.String({ description: "Milestone title; must not contain forward slash (/), en dash, or em dash characters" }),
497
498
  vision: Type.String({ description: "Milestone vision" }),
498
499
  slices: Type.Array(Type.Object({
499
500
  sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
500
- title: Type.String({ description: "Slice title" }),
501
+ title: Type.String({ description: "Slice title; must not contain forward slash (/), en dash, or em dash characters" }),
501
502
  risk: Type.String({ description: "Slice risk" }),
502
503
  depends: Type.Array(Type.String(), { description: "Slice dependency IDs" }),
503
504
  demo: Type.String({ description: "Roadmap demo text / After this" }),
@@ -570,10 +571,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
570
571
  title: Type.String({ description: "Task title" }),
571
572
  description: Type.String({ description: "Task description / steps block" }),
572
573
  estimate: Type.String({ description: "Task estimate string" }),
573
- files: Type.Array(Type.String(), { description: "Files likely touched" }),
574
+ files: Type.Array(Type.String(), { description: "Array<string> of files likely touched; pass [\"path\"] or [], never a single string" }),
574
575
  verify: Type.String({ description: "Verification command or block" }),
575
- inputs: Type.Array(Type.String(), { description: "Input files or references" }),
576
- expectedOutput: Type.Array(Type.String(), { description: "Expected output files or artifacts" }),
576
+ inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
577
+ expectedOutput: Type.Array(Type.String(), { description: "Array<string> of expected output files or artifacts; pass [\"path\"] or [], never a single string" }),
577
578
  observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
578
579
  }), { description: "Planned tasks for the slice" }),
579
580
  // ── Enrichment metadata (optional — defaults to empty) ────────────
@@ -650,10 +651,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
650
651
  title: Type.String({ description: "Task title" }),
651
652
  description: Type.String({ description: "Task description / steps block" }),
652
653
  estimate: Type.String({ description: "Task estimate string" }),
653
- files: Type.Array(Type.String(), { description: "Files likely touched" }),
654
+ files: Type.Array(Type.String(), { description: "Array<string> of files likely touched; pass [\"path\"] or [], never a single string" }),
654
655
  verify: Type.String({ description: "Verification command or block" }),
655
- inputs: Type.Array(Type.String(), { description: "Input files or references" }),
656
- expectedOutput: Type.Array(Type.String(), { description: "Expected output files or artifacts" }),
656
+ inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
657
+ expectedOutput: Type.Array(Type.String(), { description: "Array<string> of expected output files or artifacts; pass [\"path\"] or [], never a single string" }),
657
658
  observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
658
659
  // Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
659
660
  actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
@@ -31,6 +31,7 @@ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
31
31
  import { extractSubagentAgentClasses } from "./subagent-input.js";
32
32
  import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
33
33
  import { resolveSkillManifest } from "../skill-manifest.js";
34
+ import { getGuidedUnitContext } from "../guided-unit-context.js";
34
35
 
35
36
  let approvalQuestionAbortInFlight = false;
36
37
 
@@ -423,6 +424,10 @@ export function registerHooks(
423
424
  pi: ExtensionAPI,
424
425
  ecosystemHandlers: GSDEcosystemBeforeAgentStartHandler[],
425
426
  ): void {
427
+ // ADR-005 Phase 3b: surface pi-ai ProviderSwitchReport via audit, notification, and counter.
428
+ // Idempotent — only the first registerHooks call installs.
429
+ void import("../provider-switch-observer.js").then((m) => m.installProviderSwitchObserver());
430
+
426
431
  pi.on("session_start", async (_event, ctx) => {
427
432
  const basePath = contextBasePath(ctx);
428
433
  initSessionNotifications(ctx);
@@ -480,6 +485,8 @@ export function registerHooks(
480
485
  }
481
486
  await loadToolApiKeysForSession();
482
487
  if (!isAutoActive()) {
488
+ ctx.ui.setWidget("gsd-progress", undefined);
489
+ ctx.ui.setWidget("gsd-outcome", undefined);
483
490
  const { initHealthWidget } = await import("../health-widget.js");
484
491
  initHealthWidget(ctx);
485
492
  } else {
@@ -766,7 +773,8 @@ export function registerHooks(
766
773
  // subagent dispatch. Closes the b23 bug class where a discuss-milestone
767
774
  // turn used the host Edit tool to modify user source files.
768
775
  const dash = getAutoRuntimeSnapshot();
769
- const activeUnitType = dash.currentUnit?.type;
776
+ const guidedUnit = getGuidedUnitContext(discussionBasePath);
777
+ const activeUnitType = dash.currentUnit?.type ?? guidedUnit?.unitType;
770
778
  if (activeUnitType) {
771
779
  const manifest = resolveManifest(activeUnitType);
772
780
  if (manifest) {
@@ -785,7 +793,7 @@ export function registerHooks(
785
793
  const planningGuard = shouldBlockPlanningUnit(
786
794
  event.toolName,
787
795
  planningInput,
788
- dash.basePath || discussionBasePath,
796
+ dash.basePath || guidedUnit?.basePath || discussionBasePath,
789
797
  activeUnitType,
790
798
  manifest.tools,
791
799
  agentClasses,
@@ -1,20 +1,32 @@
1
1
  export function extractSubagentAgentClasses(input: unknown): string[] {
2
2
  if (!input || typeof input !== "object") return [];
3
3
 
4
- const record = input as Record<string, unknown>;
5
4
  const agentClasses: string[] = [];
5
+ const visited = new WeakSet<object>();
6
6
  const addAgentClass = (value: unknown): void => {
7
- if (typeof value === "string" && value.trim().length > 0) agentClasses.push(value.trim());
7
+ if (typeof value !== "string") return;
8
+ const normalized = value.trim().replace(/\.md$/i, "");
9
+ if (normalized.length > 0) agentClasses.push(normalized);
8
10
  };
9
- const addFromItems = (value: unknown): void => {
11
+
12
+ const visitItems = (value: unknown): void => {
10
13
  if (!Array.isArray(value)) return;
11
14
  for (const item of value) {
12
- if (item && typeof item === "object") addAgentClass((item as Record<string, unknown>).agent);
15
+ visit(item);
13
16
  }
14
17
  };
15
18
 
16
- addAgentClass(record.agent);
17
- addFromItems(record.tasks);
18
- addFromItems(record.chain);
19
+ const visit = (value: unknown): void => {
20
+ if (!value || typeof value !== "object") return;
21
+ if (visited.has(value)) return;
22
+ visited.add(value);
23
+ const record = value as Record<string, unknown>;
24
+ addAgentClass(record.agent);
25
+ visitItems(record.tasks);
26
+ visitItems(record.chain);
27
+ visitItems(record.parallel);
28
+ };
29
+
30
+ visit(input);
19
31
  return agentClasses;
20
32
  }